python实现拉格朗日插值法——————基于对python数据挖掘和大数据技术的代码修改

 书上这个地方代码错误了。

书上忽略了nan值在series首个和末尾的设置,现在版本超出的索引值不会设为nan,而是报错。所以需要进行筛选。

 

# 利用拉格朗日插值法填充数据
import pandas as pd
import numpy as np
from scipy.interpolate import lagrange

inputfile = 'data.xlsx'   #自己随便创建了一个文件
df = pd.read_excel(inputfile)
data = df.copy()    #运行报警,就加了个copy

# 自定义列向量插值函数
# s为列向量,n为被插值的位置,k为取前后的数据个数,默认为5
def ployinterp_column(s, n, k=4):
    # 取数
    numlist =[]
    for i in  (list(range(n-k, n)) + list(range(n + 1, n + 1 + k))):   #取出该空值上下k个值
        if i >=0 and i<=int(len(data)-1):   #筛选掉负数和超过索引范围的数,
            numlist.append(i)    #处理的新数加入新列表
    a=s[numlist]   #索引出对应的值
    b = ~np.isnan(s[numlist])   #对值进行布尔判断   
    # 因为值类型是numpy,float64,所以不能用pd.isnull(),要用np.isnan() ,~相当于not的意思
    y = a[b]   #筛掉空值
    # 返回拉格朗日函数结果
    return lagrange(y.index, list(y))(n)    

# 逐个元素判断是否需要插值
for i in data.columns:
    for j in range(len(data)):
        if np.isnan(data[i][j]):
            data[i][j] = ployinterp_column(data[i], j)
 

 

你可能感兴趣的:(python,python,数据挖掘)