KEYERROR问题,关于拉格朗日插值法的代码

原始数据

img


代码如下:

import pandas as pd
from scipy.interpolate import lagrange

inputfile = 'missing_data.xls'
outputfile = 'missing_data_processed.xls'

data = pd.read_excel(inputfile, header=None)  # 表明数据中是否存在列名,如果在第0行,则为0,如果没有,则为None。

# 自定义列向量插值函数
# 取出缺失值前后5个数据(前后数据中遇到数据不存在或者为空的,直接将数据舍去,将仅有的数据组成一组)
# s为列向量,n为被插值的位置,K为取前后的数据个数,默认为5
def ployinterp_column(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)  # 插值并返回插值结果


# 逐个元素判断是否需要插值
dict = {}  # 存放需要插值的数据
for i in data.columns:  # 遍历每一列
    for j in range(len(data)):
        if (data[i].isnull())[j]:  # 如果为空即插值
            data[i][j] = ployinterp_column(data[i], j)
            dict[data[i][j]] = 1  # 主要为存取字典中的key值(需插入的值),value=1为随便的取值

# 输出插值结果
writer = pd.ExcelWriter(outputfile, engine='xlsxwriter')  # 获取writer
df = pd.DataFrame(data)  # 格式化数据
df.to_excel(writer, '插值内容', header=False)  # 建立Excel临时文件
# =================== 在这里添加自定义样式的代码 =======================
workbook1 = writer.book  # 取得工作簿
worksheet = writer.sheets['插值内容']  # 设置sheet名称
cell_format = workbook1.add_format()  # 为工作簿添加一个样式
cell_format.set_font_color('red')  # 设置字体颜色
cell_format.set_bold(True)  # 设置字体加粗
for m in data.columns:  # 遍历每一列
    for n in range(len(data)):
        #当前需要写入Excel中的 值
        currentData = data[m][n]
        #判断当前写的值是否在字典表里面,如果不在里面,则表示不是插值
        if currentData not in dict:
            #不是插值,不设置样式
            worksheet.write(n, m + 1, currentData)
        else:
            #是插值,要设置单元格的样式
            worksheet.write(n, m + 1, currentData, cell_format)
            # 第一个参数表示第几行
            # 第二个参数表示第几列
            # 输出时第一列自动添加行序号,so 写入时每列向后移动一列(m+1)

writer.save() #保存文件
writer.close() #关闭

最后报错KeyError: '[-2, -1] not in index'
请问各位代码哪里出了问题?该如何修改呢?

这个错误提示程序的哪一行出错?

我觉得是某行数据出了异常,建议这样
增加下 try except , 定位一下数据,再针对导致错误的数据做下优化


for i in data.columns:  # 遍历每一列
    for j in range(len(data)):
        try:
            if (data[i].isnull())[j]:  # 如果为空即插值
                data[i][j] = ployinterp_column(data[i], j)
                dict[data[i][j]] = 1  # 主要为存取字典中的key值(需插入的值),value=1为随便的取值
        except Exception as e:
            print('error',repr(e))
            print('data[i][j]',i,j,data[i][j])