30

私はDataFrameを持っています。たとえば、時間はインデックス、ストライクは列のボラティリティサーフェスです。2次元補間を行うにはどうすればよいですか?できますreindexが、どうすれば対処できNaNますか?できることはわかっていますfillna(method='pad')が、線形補間でさえありません。補間を行うために独自のメソッドをプラグインできる方法はありますか?

4

2 に答える 2

39

を使用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ます。

于 2012-05-05T19:16:19.813 に答える
7

古いスレッドですが、インデックス値を尊重して、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
于 2015-06-09T13:48:34.420 に答える