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

拉格朗日插值法在数据分析中的应用——Python插值scimpy,lagrange

程序员文章站 2022-06-07 09:58:44
...

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

用该函数可以快速实现数据中空值以及异常值的处理。

拉格朗日插值法在数据分析中的应用——Python插值scimpy,lagrange

                                                     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()


拉格朗日插值法在数据分析中的应用——Python插值scimpy,lagrange

                                                                                                            虚线为插值后的数据点,实线是插值前的数据点