实训1:拉格朗日法插补用户用电量数据缺失值
实训任务:
- 读取missing_data.csv表
- 查询缺失值位置
3.使用SciPy库中的interpolate模块下的lagrange对数据进行拉格朗日插值 - 使用数据查看是否存在缺失值,不存在则说明插值成功
查询缺失值位置
isnull=[]for i in df.columns:for j in df.index:if df.isnull().loc[j,i]:isnull.append((j,i))
isnull
输出结果:
[(5, 'A'),(12, 'A'),(3, 'B'),(10, 'B'),(19, 'B'),(20, 'B'),(4, 'C'),(7, 'C'),(10, 'C'),(16, 'C')]
拉格朗日插值
#传入存在缺失值的列,缺失值所在0轴坐标index,按前后k个数来计算拉格朗日插值,返回index的拉格朗日插值
def LagFill(df,i,k):r=0 if (i-k)<0 else (i-k) #python的三目运算符较为特殊l=len(df.index) if (i+1+k)>len(df.index) else (i+1+k)y=df.loc[list(range(r,i))+list(range(i+1,l))] #取index前后k个数据作为y代入拉格朗日函数进行拟合for j in y.index:if y.isnull().loc[j]:y.drop(index=j,inplace=True)x=y.indexlag=lagrange(x.values,y.values)return lag(i)
调用自定义插值函数
for i in isnull:fnum=LagFill(df.loc[:,i[1]],i[0],5)df.loc[i[0],i[1]]=fnum
这样df的缺失值就全部被插补了!