书上这个地方代码错误了。
书上忽略了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)