缺失值插入方法——interpolate()

DataFrame对象的interpolate()方法用来计算插值结果并填充缺失值,其完整语法如下:

interpolate(method:'str' = 'linear',axis:'Axis' = 0,
            limit:'int | None' = None,inplace:'bool' = False,
            limit_direction:'str | None' = None,
            limit_area:'str | None' = None,
            downcast:'str | None' = None,**kwargs)

1.interpolate()方法参数详解

(1)method: 'str' = 'linear'
        A:含义:指定插值方法。默认是 'linear'(线性插值),其他可选方法包括 'nearest', 'zero', 'slinear', 'quadratic', 'cubic', 'spline', 'barycentric' 等。
        B:linear: 线性插值,使用线性函数连接两个点。线性插值虽然计算简单且易于实现,但它假设数据点之间的变化是均匀的,这在实际应用中可能并不总是成立。在数据变化较为复杂或需要较高插值精度的情况下,可能需要考虑使用更高级的插值方法,如多项式插值、样条插值等。
        C:nearest:使用最近的非缺失值进行插值。如果左侧和右侧都有非缺失值,将随机选择一个方向。
        D:zero:零阶保持插值,等价于最近邻插值,但此方法在处理时间序列时,更明确地表示为保持最近值不变。
        E:slinear:简化线性插值。使用分段线性函数来连接数据点。
        F:quadratic:二次插值。使用二次多项式函数来近似数据点之间的关系。适用于数据点平滑变化的场景。
        G:cubic:三次插值。使用三次多项式函数连接数据点,适用于需要更高阶平滑度的场景。
        H:spline:样条插值,具体类型如 'spline', 'b-spline', 'krogh' 等。样条插值通常指定阶数,如 spline(n),其中 n 是插值多项式的阶数,最常见的是 spline(3),即三次样条插值。样条插值可以提供高阶连续性和平滑度。
I:barycentric:基于拉格朗日多项式的插值方法,通过计算权重来确定插值点的值。这种方法的计算复杂度随数据点数量线性增长。

(2)axis: 'Axis' = 0
        含义:指定插值的轴。0 或 'index' 表示按行插值,1 或 'columns' 表示按列插值。

(3)limit: 'int | None' = None
        含义:限制连续插值的最大次数。如果缺失值连续超过此限制,将不被插值。

(4)inplace: 'bool' = False
        含义:是否在原地修改 DataFrame。如果为 True,则不会返回新的 DataFrame,而是直接修改原 DataFrame。

(5)limit_direction: 'str | None' = None
        含义:指定插值的方向。可选 'forward', 'backward' 或 None。如果为 'forward',则使用前方非空值插值;如果为 'backward',则使用后方非空值插值。

(6)limit_area: 'str | None' = None
        含义:限制插值的区域。可选 'inside', 'outside', 或 None。'inside' 只对内部缺失值进行插值,'outside' 只对边界缺失值进行插值。

(7)downcast: 'str | None' = None
        含义:指定是否以及如何减少数据类型。例如,从 float64 减少到 float32。

(8)**kwargs
        含义:额外的参数,具体取决于插值方法。例如,'spline' 方法接受 'order' 参数来指定样条的阶数。

2.代码示例

import pandas as pd
import numpy as np

dft = pd.DataFrame([(0.0,np.nan,-1.0,1.0),
                   (np.nan,2.0,np.nan,np.nan),
                   (2.0,3.0,np.nan,9.0),
                   (np.nan,4.0,-4.0,16.0)],
                  columns=list('abcd'))
dft

#线性插值正向或前向填充
dft.interpolate(method='linear',limit_direction='forward',axis=0)

代码运行结果分析(插值过程解释):
(1)列 'a':
        1)行1的缺失值使用行0的值插值,因为行0到行1是线性插值,所以行1的'a'值为 0.0 + (2.0 - 0.0) / 2 = 1.0。
        2)行3的缺失值使用行2的值插值,因为前向插值,所以行3的'a'值为 2.0(直接使用行2的值)。

(2)列 'b':
        由于所有的非缺失值都是连续的,所以不存在插值需求。

(3)列 'c':
        1)行1的缺失值使用行0的值插值,线性插值计算为 -1.0 + (-3.0 + (-1.0)) / 2 = -2.0。
        2)行2的缺失值使用行1的插值结果 -2.0 进行插值,计算为 -2.0 + (-4.0 + (-2.0)) / 2 = -3.0。

(4)列 'd':
        行1的缺失值使用行0的值插值,线性插值计算为 1.0 + (9.0 - 1.0) / 2 = 5.0。

#线性插值反向填充
dft.interpolate(method='linear',limit_direction='backward',axis=0)

代码运行结果分析(插值过程解释):
(1)列 'a':
        1)行1的缺失值使用行2的值 2.0 插值。
        2)行3的缺失值在后方没有非空值,因此保持为 NaN。

(2)列 'b':
        行0的缺失值使用行1的值 2.0 插值。

(3)列 'c':
        1)行1的缺失值使用行2的值 -3.0 和行0的值 -1.0 进行线性插值,计算结果为 -2.0。
        2)行2的缺失值使用行3的值 -4.0 和行1的插值结果 -2.0 进行线性插值,计算结果为 -3.0。

(4)列 'd':
        行1的缺失值使用行2的值 9.0 和行0的值 1.0 进行线性插值,计算结果为 5.0。

#二次多项式插值
dft['d'].interpolate(method='polynomial',order=2)

代码运行结果分析(插值过程解释):
        在 dft['d'] 列中,只有行1的值是缺失的(NaN)。使用 method='polynomial' 和 order=2(即二次多项式插值)来估计这个缺失值。二次多项式插值意味着找到一个函数 f(x) = ax^2 + bx + c 来拟合已知的点,并用它来估计缺失值。

1.已知点
x=0 时,f(0) = 1.0。
x=2 时,f(2) = 9.0。
x=3 时,f(3) = 16.0。

2.插值计算
为了找到合适的多项式,我们通过解方程组来确定 a, b, 和 c 的值。这些方程由已知点给出:

(1)c = 1.0
(2)4a + 2b + c = 9.0
(3)9a + 3b + c = 16.0
从方程(1)直接得到 c 的值。然后,用 c 的值来解方程(2)和(3),找到 a 和 b。

3.解方程
从方程(2):4a + 2b + 1.0 = 9.0,简化为 4a + 2b = 8.0。
从方程(3):9a + 3b + 1.0 = 16.0,简化为 9a + 3b = 15.0。
通过解这个线性方程组,可以找到 a 和 b 的值。具体解法可以通过代入或消元法找到。但为了简化解释,直接给出多项式函数, f(x) = (x+1)^2。

4.插值结果
插值后,行1处(即 x=1)的值将由找到的多项式函数 f(x) 计算得到。对于 f(1),可以得到 f(1) = (1+1)^2 = 2^2 = 4。

#前向填充2个缺失值
dft.interpolate(method='pad',limit=2)

代码运行结果分析(插值过程解释):
        pad 方法(或 ffill)是向前填充,使用前一个非空值进行填充,直到达到 limit 的限制。
limit 参数限制了连续填充的次数,超过这个次数的缺失值将不被填充。
(1)列 'a'
        1)行1的缺失值被其上方的行0的值 0.0 填充。
        2)行3的缺失值不被填充,因为从行1到行3已经超过了 limit=2 的限制。

(2)列 'b'
        由于没有连续的缺失值,所以没有进行填充。

(3)列 'c'
        行1和行2的缺失值被其上方的行0的值 -1.0 填充,直到 limit=2 达到。

(4)列 'd'
        行1的缺失值被其上方的行0的值 1.0 填充。

#后向填充1个缺失值
dft.interpolate(method='bfill',limit=1)

代码运行结果分析(插值过程解释):
        method='bfill'(或等效的 backfill)表示使用后一个非空值进行填充。
limit=1 表示最多填充连续的1个缺失值。
(1)列 'a'
        1)行1的缺失值被其下方的行2的值 2.0 填充。
        2)行3的缺失值不被填充,因为其后方没有非空值。

(2)列 'b'
        行0的缺失值被其下方的行1的值 2.0 填充。

(3)列 'c'
        1)行1的缺失值不被填充,因为 limit=1 限制了填充,且行2的 'c' 列也是缺失的。
        2)行2的缺失值被其下方的行3的值 -4.0 填充。

(4)列 'd'
        行1的缺失值被其下方的行2的值 9.0 填充。

#最近邻插值
dft.interpolate(method='nearest')

        interpolate(method='nearest') 是一个用于插值的方法,它使用最近邻插值算法来填充缺失值。在这个方法中,缺失值将被替换为最近的已知值。

dft = pd.DataFrame({'A':[1,2,np.nan,np.nan,np.nan,10],
                   'B':[5,8,12,np.nan,np.nan,30]},
                  index=pd.to_datetime(['202205241847','202205241947',
                                       '202205242200','202205251848',
                                       '202205261800','202205300000']))
dft

#线性插值填充缺失值
dft.interpolate(method='linear')

#按时间进行插值填充缺失值
dft.interpolate(method='time')

        method='time' 用于根据时间戳进行插值,它基于时间序列数据的时间差来进行线性插值。这种插值方法特别适用于具有时间序列索引的数据。

插值计算示例:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值