Python用拉格朗日法进行数据横向插值

在工作中,好多数据存在缺失值,对于Excel 中对数据采用列插值,张良均的《Python数据分析与挖掘实战》已有代码,但是我今天遇到数据需要横向插值。

这里写图片描述

import pandas as pd #导入数据分析库Pandas
from scipy.interpolate import lagrange #导入拉格朗日插值函数

name='北京.xlsx'

df = pd.read_excel(name, sheetname='小区均价')




#lt=['2017-01', '2017-02', '2017-03', '2017-04', '2017-05',
#       '2017-06', '2017-07', '2017-08']

lt=['2015-12', '2016-01', '2016-02', '2016-03', '2016-04', '2016-05',
       '2016-06', '2016-07', '2016-08', '2016-09', '2016-10', '2016-11',
       '2016-12', '2017-01', '2017-02', '2017-03', '2017-04', '2017-05',
       '2017-06', '2017-07', '2017-08']
#自定义列向量插值函数
#s为列向量,n为被插值的位置,k为取前后的数据个数,默认为5

data=df[lt][0:df.shape[0]]
def ployinterp_column(s, n, k=3):
  y = s[list(range(n-k, n)) + list(range(n+1, n+1+k))] #取数
  y = y[y.notnull()] #剔除空值
  if len(y)>k:
   return int(lagrange(y.index, list(y))(n)) #插值并返回插值结果

#逐个元素判断是否需要插值
aa=list(data.columns)
for i in range(len(aa)):
  for j in range(len(data)):
    if (data[aa[i]].isnull())[j]: #如果为空即插值。

      pp=pd.Series(list(data.iloc[j:j+1].values.flatten()))
      data[aa[i]][j] = ployinterp_column(pp, i)

data.to_excel('luoganttcc6.xlsx') #输出结果,写入文件

'''
 dframe = pd.read_excel('c.xlsx', sheetname='小区均价')
 writer = ExcelWriter('lg.xlsx')
 data.to_excel(writer,'Sheet2')
 writer.save()


dindex=data.columns

df[dindex]=data

'''
dindex=data.columns#提取修改数据的标签
df[dindex]=data #将插值修改后的数据赋值给原数据
#由于不知何故,将dataframe赋值后,Excel只有一个数据,索性重新copy,paste
dfcity = pd.read_excel(name, sheetname='城市均价')
dfregion = pd.read_excel(name, sheetname='区域均价')
writer = pd.ExcelWriter(name)

dfcity.to_excel(writer,'城市均价')
dfregion.to_excel(writer,'区域均价')
df.to_excel(writer,'小区均价')
writer.save()

今天好累啊!!!终于写出来了。。。。

代码链接 提取密码ee1z

posted @ 2022-08-19 22:59  luoganttcc  阅读(89)  评论(0编辑  收藏  举报