赞
踩
开展数据分析工作时,数据清理是一个重要的环节,处理缺失值是常见问题。处理方法可分为三类,删除记录、插值和不处理。这里介绍用拉格朗日插值方法以及在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()

虚线为插值后的数据点,实线是插值前的数据点
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。