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

Python数据预处理 - 缺失值处理 - 拉格朗日插值法 - 代码实现

程序员文章站 2022-06-07 09:47:10
...

目录

缺失值处理

拉格朗日差值法的理论基础

拉格朗日插值法代码实现

其他数据预处理方法


缺失值处理

处理缺失值常用的办法可分为三类:删除记录、数据插补、不处理。

其中常见的数据插补法有:

Python数据预处理 - 缺失值处理 - 拉格朗日插值法 - 代码实现

如果通过删除小部分的数据就可以达到既定的目标,且不会影响结果的准确性,那么这无疑是最简单有效的。但是,在不了解情况的时候还是不要这样冒险比较好,因为删除数据是所有老板最不愿意看见的,不但浪费了很大的资源,也丢弃了大量有可能隐藏在缺失值记录中的信息。

这里我们主要说一说拉格朗日插值法,主要讲这个方法,是因为大学数值分析课上,认为这个方法最好,哈哈,其他方法有兴趣的同学也可以试一试。除了拉格朗日插值法,还有牛顿插值法、Hermite插值法、分段插值法和样条插值法。

拉格朗日插值法在理论分析中很方便,因为他的公式结构紧凑。但是在实际应用中,如果存在差值节点经常增减变化时,拉格朗日插值法的插值多项式也需要随之变化,遇见数据源比较大的时候,这难免有些浪费时间,这个时候,其实牛顿插值法更加适用。

 

拉格朗日差值法的理论基础

Python数据预处理 - 缺失值处理 - 拉格朗日插值法 - 代码实现

Python数据预处理 - 缺失值处理 - 拉格朗日插值法 - 代码实现

偷懒不愿敲公式,所以直接抛了一个截图,见谅见谅。

 

拉格朗日插值法代码实现

数据源大概是这样的:

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值是更加符合业务实际情况的。

Python数据预处理 - 缺失值处理 - 拉格朗日插值法 - 代码实现

 

其他数据预处理方法

连续数据离散化(等宽、等频、聚类离散)

清洗重复数据

数据预处理 - 归一化与标准化