【问题标题】:Interpolation on DataFrame in pandasPandas 中 DataFrame 的插值
【发布时间】:2018-01-19 06:37:06
【问题描述】:

我有一个 DataFrame,比如说一个波动率表面,索引为时间,列为罢工。如何进行二维插值?我可以reindex 但我该如何处理NaN?我知道我们可以fillna(method='pad') 但它甚至不是线性插值。有没有办法我们可以插入我们自己的方法来进行插值?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以使用DataFrame.interpolate 获得线性插值。

    In : df = pandas.DataFrame(numpy.random.randn(5,3), index=['a','c','d','e','g'])
    
    In : df
    Out:
              0         1         2
    a -1.987879 -2.028572  0.024493
    c  2.092605 -1.429537  0.204811
    d  0.767215  1.077814  0.565666
    e -1.027733  1.330702 -0.490780
    g -1.632493  0.938456  0.492695
    
    In : df2 = df.reindex(['a','b','c','d','e','f','g'])
    
    In : df2
    Out:
              0         1         2
    a -1.987879 -2.028572  0.024493
    b       NaN       NaN       NaN
    c  2.092605 -1.429537  0.204811
    d  0.767215  1.077814  0.565666
    e -1.027733  1.330702 -0.490780
    f       NaN       NaN       NaN
    g -1.632493  0.938456  0.492695
    
    In : df2.interpolate()
    Out:
              0         1         2
    a -1.987879 -2.028572  0.024493
    b  0.052363 -1.729055  0.114652
    c  2.092605 -1.429537  0.204811
    d  0.767215  1.077814  0.565666
    e -1.027733  1.330702 -0.490780
    f -1.330113  1.134579  0.000958
    g -1.632493  0.938456  0.492695
    

    对于更复杂的事情,您需要推出自己的函数来处理Series 对象并根据需要填充NaN 值并返回另一个Series 对象。

    【讨论】:

    • Avaris,非常感谢您的回答!
    • 在fillna中加入这个选项是个好主意。
    • 如果插值步骤中有另一个维度(或类别)保持不变(单独)怎么办?即,我如何将您的精彩解决方案与 groupby 结合起来?现在,如果索引有重复的值(例如,它们在我希望分组的不同类别中是相同的),reindex() 步骤将失败,声称“重新索引仅对具有唯一值的索引对象有效”。 (也许这应该是一个新问题?)
    • 这是一个很好但有点晦涩的答案。最好有一个方便的功能,您可以在其中选择要插值的轴
    • 也可以使用DataFrame的插值方法吗? df2.interpolate() 因为df2.interpolate() == df2.apply(pandas.Series.interpolate)(至少对我来说,pandas.__version__ == 0.14
    【解决方案2】:

    旧线程,但我想我会与 2d 外推/插值分享我的解决方案,尊重索引值,这也可以按需工作。代码有点奇怪,如果有更好的解决方案,请告诉我:

    import pandas
    from   numpy import nan
    import numpy
    
    dataGrid = pandas.DataFrame({1: {1: 1, 3: 2},
                                 2: {1: 3, 3: 4}})
    
    
    def getExtrapolatedInterpolatedValue(x, y):
        global dataGrid
        if x not in dataGrid.index:
            dataGrid.ix[x] = nan
            dataGrid = dataGrid.sort()
            dataGrid = dataGrid.interpolate(method='index', axis=0).ffill(axis=0).bfill(axis=0)
    
        if y not in dataGrid.columns.values:
            dataGrid = dataGrid.reindex(columns=numpy.append(dataGrid.columns.values, y))
            dataGrid = dataGrid.sort_index(axis=1)
            dataGrid = dataGrid.interpolate(method='index', axis=1).ffill(axis=1).bfill(axis=1)
    
        return dataGrid[y][x]
    
    
    print getExtrapolatedInterpolatedValue(2, 1.4)
    >>2.3
    

    【讨论】:

    • 漂亮的解决方案。对我来说效果很好。感谢您发布!
    猜你喜欢
    • 1970-01-01
    • 2020-01-04
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多