【问题标题】:Pandas interpolation type when method='index'?方法='索引'时的熊猫插值类型?
【发布时间】:2023-04-04 08:12:01
【问题描述】:

pandasdocumentation表示method='index'时使用索引的数值。但是,我没有发现任何使用的基础插值方法的迹象。看起来它使用线性插值。任何人都可以明确确认这一点或指出我在文档中的说明吗?

【问题讨论】:

    标签: pandas interpolation linear-interpolation


    【解决方案1】:

    因此,对于阅读它的人可能会认为该文档有点误导:

    ‘index’, ‘values’:使用索引的实际数值。

    由于用索引的数值填充NaN值这是不正确的,我们应该将其理解为线性插值使用索引的实际数值

    source code of pandas.DataFrame.interpolate中的method='linear'method='index'的区别主要在以下代码:

    if method == "linear":
    # prior default
        index = np.arange(len(obj.index))
        index = Index(index)
    else:
        index = obj.index
    

    因此,如果您使用默认的RangeIndex 作为数据帧的索引,那么method='linear'method='index' 的插值结果将是相同的,但是如果您指定不同的索引,则结果将不一样,如下示例将清楚地向您展示差异:

    import pandas as pd
    import numpy as np
    
    d = {'val': [1, np.nan, 3]}
    df0 = pd.DataFrame(d)
    df1 = pd.DataFrame(d, [0, 1, 6])
    
    print("df0:\nmethod_index:\n{}\nmethod_linear:\n{}\n".format(df0.interpolate(method='index'), df0.interpolate(method='linear')))
    print("df1:\nmethod_index:\n{}\nmethod_linear:\n{}\n".format(df1.interpolate(method='index'), df1.interpolate(method='linear')))
    

    输出:

    df0:
    method_index:
       val
    0  1.0
    1  2.0
    2  3.0
    method_linear:
       val
    0  1.0
    1  2.0
    2  3.0
    
    df1:
    method_index:
       val
    1  1.000000
    2  1.333333
    6  3.000000
    method_linear:
       val
    1  1.0
    2  2.0
    6  3.0
    

    如您所见,当index=[0, 1, 6]val=[1.0, 2.0, 3.0]时,插值是1.0 + (3.0-1.0) / (6-0) = 1.333333

    按照pandas源代码的运行时间(generic.py -> managers.py -> blocks.py -> missing.py),我们可以发现线性插值的实现使用了实际数值索引

    NP_METHODS = ["linear", "time", "index", "values"]
    
    if method in NP_METHODS:
        # np.interp requires sorted X values, #21037
        indexer = np.argsort(inds[valid])
        result[invalid] = np.interp(
            inds[invalid], inds[valid][indexer], yvalues[valid][indexer]
        )
    

    【讨论】:

    • 所以,您已经确认了我所看到的:即这两种情况似乎都使用线性(即直线)插值,但 x 轴的值不同。我的问题是文档中提到了这一点。
    • 文档没有详细解释,这就是为什么我向您展示源代码的差异,您说“明确地确认这一点或指出我在文档中说明的位置”,我无法指出你在它不存在的地方
    • 您发布的代码显示了两种插值方法中使用的 x 轴值的不同选择,但未显示所应用的插值方法的类型。对于“线性”,使用线性插值似乎很明显。对于“索引”,使用什么插值方法并不明显。我们俩都从经验上看出,在这两种情况下都使用了某种形式的线性插值。你能指出代码中显示method = 'index'时使用线性(直线)插值的地方吗?
    • 我更新你想要的详细实现代码的答案
    猜你喜欢
    • 2019-05-21
    • 2017-10-12
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多