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()
今天好累啊!!!终于写出来了。。。。