开展数据分析工作时,数据清理是一个重要的环节,处理缺失值是常见问题。处理方法可分为三类,删除记录、插值和不处理。这里介绍用拉格朗日插值方法以及在python数据分析中的实现。
拉格朗日插值法是根据已知的点求取函数对未知点进行插值,具体细节这里不做具体介绍,想了解的朋友可以去数数值分析的内容。这里以应用为主,介绍scimpy中的lagrange()函数的使用方法。
lagrange(x,w)中两个主要的参数(x,w),把一系列点当成是函数关系y=f(x)其中x对应参数x,而y对应为w。输出结果为函数f,根据函数可以求出对应x对应的y
举例说明:
x = [1,2,4]
y = [2,3,8]
f = lagrange(x,y) f(3) = 6
用该函数可以快速实现数据中空值以及异常值的处理。
实例分析
#-*- coding:utf-8 -*-
import pandas as pd
from scipy.interpolate import lagrange
inputfile = '..\data\catering_sale.xls'
outputfile= '..\data\sales.xls'
data = pd.read_excel(inputfile)#读取excel
data[u'销量'][(data[u'销量']<400)|(data[u'销量']>5000)]=None#异常值变为空值
def ployinterp_column(s,n,k=5):#默认是前后5个
#tem=list(range(n-k,n))+list(range(n+1,n+1+k))
y=s[list(range(n-k,n))+list(range(n+1,n+1+k))]#取数,n的前后5个,这里有可能取到不存在的下标,为空
y=y[y.notnull()]#如果y里面有空值的话就去掉
#teml=lagrange(y.index,list(y))#这里代表的就是参数ai
return lagrange(y.index,list(y))(n)#最后的括号就是我们要插值的n
print(len(data)) # 201 组数据
for i in data.columns:
if i==u'日期':
continue
for j in range(len(data)):
if(data[i].isnull())[j]:#空值进行插值
data[i][j] = ployinterp_column(data[i],j)
data.to_excel(outputfile)