缺失值处理的拉格朗日插值,为什么报错啊


import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import lagrange
df=pd.read_excel(r"C:\Users\89255\Desktop\01-数据和代码\chapter4\demo\data\catering_sale.xls")
df[(df[u"销量"]<400) | (df["销量"]>5000)]=None 

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)

def data_lagrange(data):
    for i in data.columns:  
        data[i] = pd.Series(data[i])
        for j in range(len(data)):
            if (data[i].isnull())[j]: 
                data[i][j]=ployinterp_column(data[i],j)

data_lagrange(df)

之后会报错说
KeyError: '[-5, -4, -3, -2, -1] not in index'

【以下回答由 GPT 生成】

该错误的原因是在拉格朗日插值函数ployinterp_column()中,y的index使用的是相对位置的索引,而不是真实的索引值。当插值需要的索引在数据中不存在时,就会抛出KeyError错误。

解决这个问题的方法是,在ployinterp_column()函数中使用真实的索引值进行插值。具体步骤如下:

  1. 修改ployinterp_column()函数,使其接收真实的索引值作为参数。
  2. data_lagrange()函数中,将ployinterp_column()函数的参数改为真实的索引值。
  3. 修改取出y的索引的方法,使用data.index来获取真实的索引值。

修改后的代码如下:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import lagrange

df = pd.read_excel(r"C:\Users\89255\Desktop\01-数据和代码\chapter4\demo\data\catering_sale.xls")
df[(df['销量'] < 400) | (df['销量'] > 5000)] = None

def ployinterp_column(s, n, k=5):
    y = s.iloc[max(0, n-k):n] + s.iloc[n+1:n+1+k]
    y = y[y.notnull()]
    return lagrange(y.index, list(y))(n)

def data_lagrange(data):
    for i in data.columns:  
        data[i] = pd.Series(data[i])
        for j in range(len(data)):
            if data[i].isnull()[j]: 
                data[i][j] = ployinterp_column(data[i], j)

data_lagrange(df)

这样修改后,就能避免报错并正常执行拉格朗日插值处理缺失值的操作。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

引用 皆我百晓生 小程序回复内容作答:

报错的原因是在插值过程中,lagrange函数的第一个参数中出现了不存在的索引值。
具体来说,问题出现在这一行代码中:

return lagrange(y.index,list(y))(n)

lagrange函数的第一个参数需要传入一系列 x 值,而在这里使用的是 y.index,即索引值。然而,在插值时使用的索引值应该是连续的,但是在这里的索引值可能不是连续的,导致了该错误的出现。

为了解决这个问题,您可以尝试修改代码如下:

return lagrange(np.arange(len(y)), list(y))(n)

将索引值改为连续的数字序列(使用np.arange(len(y))),以保证在 lagrange 函数中传递的参数是正确的。