Python数据预处理 - 缺失值处理 - 拉格朗日插值法 - 代码实现
程序员文章站
2022-06-07 09:47:10
...
目录
缺失值处理
处理缺失值常用的办法可分为三类:删除记录、数据插补、不处理。
其中常见的数据插补法有:
如果通过删除小部分的数据就可以达到既定的目标,且不会影响结果的准确性,那么这无疑是最简单有效的。但是,在不了解情况的时候还是不要这样冒险比较好,因为删除数据是所有老板最不愿意看见的,不但浪费了很大的资源,也丢弃了大量有可能隐藏在缺失值记录中的信息。
这里我们主要说一说拉格朗日插值法,主要讲这个方法,是因为大学数值分析课上,认为这个方法最好,哈哈,其他方法有兴趣的同学也可以试一试。除了拉格朗日插值法,还有牛顿插值法、Hermite插值法、分段插值法和样条插值法。
拉格朗日插值法在理论分析中很方便,因为他的公式结构紧凑。但是在实际应用中,如果存在差值节点经常增减变化时,拉格朗日插值法的插值多项式也需要随之变化,遇见数据源比较大的时候,这难免有些浪费时间,这个时候,其实牛顿插值法更加适用。
拉格朗日差值法的理论基础
偷懒不愿敲公式,所以直接抛了一个截图,见谅见谅。
拉格朗日插值法代码实现
数据源大概是这样的:
time | count |
2018/5/1 | 106684 |
2018/5/2 | 106644 |
2018/5/3 | 176520 |
2018/5/4 | 152311 |
2018/5/5 | 160264 |
2018/5/6 | |
2018/5/7 | 182263 |
2018/5/8 | 172887 |
2018/5/9 | 160264 |
2018/5/10 | 152704 |
2018/5/11 | 110049 |
2018/5/12 | 136951 |
2018/5/13 | |
2018/5/14 | 143165 |
2018/5/15 | 136951 |
2018/5/16 | |
2018/5/17 | 135287 |
黄色部分是缺失值,需要通过其前后的数据进行插补,下面是代码实现了。
# -*- coding: utf-8 -*-
#拉格朗日法插补空缺值
import pandas as pd #导入pandas库
from scipy.interpolate import lagrange #导入拉格朗日函数
inputfile = u'E:\\pythondata\\cjm5.xlsx'
outputfile = u'E:\\pythondata\\cjm5_1.xlsx'
data= pd.read_excel(inputfile)
data[u'count'][(data[u'count']<100000) | (data[u'count']>200000)] = None #将异常值清空
def ployinterp_column(s,n,k=2): #k=2表示用空值的前后两个数值来拟合曲线,从而预测空值
y = s[list(range(n-k,n)) + list(range(n+1,n+1-k))] #取值,range函数返回一个左闭右开([left,right))的序列数
y = y[y.notnull()]#取上一行中取出数值列表中的非空值,保证y的每行都有数值,便于拟合函数
return lagrange(y.index,list(y))(n) #调用拉格朗日函数,并添加索引
for i in data.columns: #如果i在data的列名中,data.columns生成的是data的全部列名
for j in range(len(data)): #len(data)返回了data的长度,若此长度为5,则range(5)会产生从0开始计数的整数列表
if (data[i].isnull())[j]:#如果data[i][j]为空,则调用函数ployinterp_column为其插值
data[i][j] = ployinterp_column(data[i],j)
data.to_excel(outputfile) #将完成插值后的data写入excel
print("拉格朗日法插补完成,插补后的文件位于:"+str(outputfile))
代码运行结束后会将插补完成的excel文件存在既定的位置(代码中outputfile的位置),我们通过k的值来表示通过缺失值前多少个数值来插补,下面是通过k=2和k=3插补的结果,我们把它画在一个折线图中,直观的判断哪一个k值是更加符合业务实际情况的。
其他数据预处理方法
下一篇: 数值分析之牛顿拉夫森迭代(牛顿法)