Python实现Excel文件拉格朗日插值
实现之前Excel数据缺失情况
实现之后Excel数据插补情况
以下是使用Python实现的代码:
import pandas as pd
from scipy.interpolate import lagrange
inputfile = 'missing_data.xls'
outputfile = 'missing_data_processed.xls'
data = pd.read_excel(inputfile, header=None)
# 自定义列向量插值函数
# 取出缺失值前后5个数据(前后数据中遇到数据不存在或者为空的,直接将数据舍去,将仅有的数据组成一组)
# s为列向量,n为被插值的位置,K为取前后的数据个数,默认为5
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) # 插值并返回插值结果
# 逐个元素判断是否需要插值
dict = {} # 存放需要插值的数据
for i in data.columns: # 遍历每一列
for j in range(len(data)):
if (data[i].isnull())[j]: # 如果为空即插值
data[i][j] = ployinterp_column(data[i], j)
dict[data[i][j]] = 1 # 主要为存取字典中的key值(需插入的值),value=1为随便的取值
# 输出插值结果
writer = pd.ExcelWriter(outputfile, engine='xlsxwriter') # 获取writer
df = pd.DataFrame(data) # 格式化数据
df.to_excel(writer, '插值内容', header=False) # 建立Excel临时文件
# =================== 在这里添加自定义样式的代码 =======================
workbook1 = writer.book # 取得工作簿
worksheet = writer.sheets['插值内容'] # 设置sheet名称
cell_format = workbook1.add_format() # 为工作簿添加一个样式
cell_format.set_font_color('red') # 设置字体颜色
cell_format.set_bold(True) # 设置字体加粗
for m in data.columns: # 遍历每一列
for n in range(len(data)):
#当前需要写入Excel中的 值
currentData = data[m][n]
#判断当前写的值是否在字典表里面,如果不在里面,则表示不是插值
if currentData not in dict:
#不是插值,不设置样式
worksheet.write(n, m + 1, currentData)
else:
#是插值,要设置单元格的样式
worksheet.write(n, m + 1, currentData, cell_format)
# 第一个参数表示第几行
# 第二个参数表示第几列
# 输出时第一列自动添加行序号,so 写入时每列向后移动一列(m+1)
writer.save() #保存文件
writer.close() #关闭