开展数据分析工作时,数据清理是一个重要的环节,处理缺失值是常见问题。处理方法可分为三类,删除记录、插值和不处理。这里介绍用拉格朗日插值方法以及在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
用该函数可以快速实现数据中空值以及异常值的处理。
Por分布直方图,左侧值离群值为异常值
import pandas as pd
import math as ma
#导入函数
from scipy.interpolate import lagrange
import matplotlib.pyplot as plt
#读取文本中的数据,数据有四列,MD,K,和Por这里以Por的异常值为例进行插值处理
df = pd.read_table('d:/data1.txt')
#Por列中<0.05的为异常值,处理为空值
df['Por'][df['Por']<0.05] = None
plt.show()
#n为插值考虑的范围,为前后5个数
n = 5
#搜索第2列(Por列)的异常值并且插值
for i in range(len(df)):
#ma.isnan()判断值是否为空值
if ma.isnan(df.iat[i, 2]):
#插值算法考虑的数据interdf是一个Series从空值算起前后n个
interdf = df.iloc[i-n:i+n+1, 2]
#删除掉里面的空值
interdf = interdf[interdf.notnull()]
#x为数据的索引,也可以为其他列的值
list_x = list(interdf. index)
#y为Series里的值,x,y都转换成列表
list_y = list(interdf. values)
#f为利用拉格朗日法建立的函数关系y=f(x)
f = lagrange(list_x, list_y)
#把插值结果加入到df中
df.iat[i, 2] = f(i)
#插值算法结束----------下面是插值前后数据的对比
df_org = pd.read_table('d:/data1.txt')
#df_org为原始数据,df为插值后数据,改名为New por
df.rename(columns={'Por': 'New Por'}, inplace=True)
#绘图
df['New Por'].plot(style='k--')
df_org['Por'].plot(alpha=0.5)
plt.legend(loc='best')
plt.show()
虚线为插值后的数据点,实线是插值前的数据点