欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-07 21:24:27
...

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

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

相关标签: python 拉格朗日