python 時間序列缺失值

此處提供了三種數據填充方法:
# 缺失值處理:補充缺失的數據
# 三種方法:Lagrange插值法和Newton插值法以及Series自帶的interpolate
#1、Lagrange插值法和Newton插值法解決實際問題中關於只提供複雜的離散數據的函數求值問題,通過將所考察的函數簡單化,構造關於離散數據實際函數f(x)的近似函數P(x),從而可以計算未知點出的函數值,是插值法的基本思路。
#2、實際上Lagrange插值法和Newton插值法是同一種方法的兩種變形,其構造擬合函數的思路是相同的,而實驗中兩個實際問題用兩種算法計算出結果是相同的。
#3、實驗所得結果精確度並不高,一方面是因爲所給數據較少,另一方面也是主要方面在Win32中C++中數據類型double精度只有7位,計算機在進行浮點運算時截斷運算會導致誤差。實際問題中,測量數據也可能導致誤差。
#4、在解決實際問題中,更多是利用精確且高效的計算機求解。所以解決問題時不僅要構造可求解的算法,更重要是構造合理的可以編寫成程序由計算機求解的算法,而算法的優化不僅可以節省時間空間,更能得到更爲精確有價值的結果。
# <1> 拉格朗日插值法  
# 自定義列向量插值函數  
# s爲列向量, n爲被插值的位置, k爲取前後的數據個數, 默認爲5  

from scipy.interpolate import lagrange #導入拉格朗日插值函數  
data1 = pd.read_excel(inputfile, header=None,names=['A','B','C'])  
  
def plotinterplate_columns(s, n, k=5):  
    y = s[list(range(n-k,n)) + list(range(n+1, n+1+k))]  
    y = y[y.notnull()]#剔除空值  
    return lagrange(y.index, list(y))(n)#向位置n出插值並返回該插值結果  y.index返回的是費缺失值在原來列表中的位置
  
# 逐個判斷每列是否需要插值  
lagij = []  
for i in data1.columns:  
    for j in range(len(data1)):  
        if (data1[i].isnull())[j]:  
            data1[i][j] = plotinterplate_columns(data1[i],j)  
            lagij.append((i,j,data1[i][j]))  
              
print(data1)  


# <2> 牛頓插值法  
  
import matplotlib.pyplot as plt  
  
""" 
@brief:   計算n階差商 f[x0, x1, x2 ... xn]  
@param:   xi   所有插值節點的橫座標集合                                                        o 
@param:   fi   所有插值節點的縱座標集合                                                      /   \ 
@return:  返回xi的i階差商(i爲xi長度減1)                                                     o     o 
@notice:  a. 必須確保xi與fi長度相等                                                        / \   / \ 
          b. 由於用到了遞歸,所以留意不要爆棧了.                                           o   o o   o 
          c. 遞歸減遞歸(每層遞歸包含兩個遞歸函數), 每層遞歸次數呈二次冪增長,總次數是一個滿二叉樹的所有節點數量(所以極易棧溢出)                                                                                      
"""  
  
def get_order_diff_quot(xi = [], fi = []):  
    if len(xi) > 2 and len(fi) > 2:  
        return (get_order_diff_quot(xi[:len(xi) - 1], fi[:len(fi) - 1]) - get_order_diff_quot(xi[1:len(xi)], fi[1:len(fi)])) / float(xi[0] - xi[-1])  
    return (fi[0] - fi[1]) / float(xi[0] - xi[1])  
""" 
 
@brief:  獲得Wi(x)函數; 
         Wi的含義舉例 W1 = (x - x0); W2 = (x - x0)(x - x1); W3 = (x - x0)(x - x1)(x - x2) 
@param:  i  i階(i次多項式) 
@param:  xi  所有插值節點的橫座標集合 
@return: 返回Wi(x)函數 
"""  
  
def get_Wi(i = 0, xi = []):  
    def Wi(x):  
        result = 1.0  
        for each in range(i):  
            result *= (x - xi[each])  
        return result  
    return Wi  
""" 
@brief: 獲得牛頓插值函數 
"""  
  
def get_Newton_inter(xi = [], fi = []):  
    def Newton_inter(x):  
        result = fi[0]  
        for i in range(2, len(xi)):  
            result += (get_order_diff_quot(xi[:i], fi[:i]) * get_Wi(i-1, xi)(x))  
        return result  
    return Newton_inter  
# 自定義列向量插值函數  
# s爲列向量, n爲被插值的位置,k爲取前後的數據個數, 默認爲5  
def plotnewton_columns(s):  
    y = s[s.notnull()]#剔除空值  
    Nx= get_Newton_inter(y.index, list(y))         #向位置n出插值並返回該插值結果  
    return Nx  
  
import pandas as pd  
from scipy.optimize import newton #導入牛頓插值函數  
inputfile = r'C:\Users\11488\Desktop\圖書配套數據、代碼\chapter6\demo\data\missing_data.xls' #輸入數據  
data2 = pd.read_excel(inputfile, header=None,names=['A','B','C'])  
  
newij = []  
for i in data2.columns:  
    Newton = plotnewton_columns(data2[i])  
    for j in range(len(data1)):  
        if (data2[i].isnull())[j]:  
            data2[i][j] = Newton(j)  
            newij.append((i,j,data2[i][j]))  
newij  


# <3> Series自帶的iterplote  
data3=pd.read_excel(r'C:\Users\11488\Desktop\圖書配套數據、代碼\chapter6\demo\data\missing_data.xls',header=None,names=['A','B','C'])  
  
###利用Pandas中interpolate進行缺失值的補充  
data_out = data3.interpolate()  
  
df = data_out - data3.fillna(0)  
Serij = []  
for i in df.columns:  
    for j in range(len(df)):  
        if df[i][j] != 0:  
            Serij.append((i,j,df[i][j]))  
Serij
  
 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章