2012-05-05 15 views
25

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

答えて

33

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オブジェクトを返す、独自の機能を必要としています。

+0

Avaris、ありがとうございました! – archlight

+12

これをfillnaのオプションとして組み込むことをお勧めします。 – DanB

+1

補間ステップで一定(別個)に保持する別のディメンション(またはカテゴリ)がある場合はどうなりますか?つまり、私は素晴らしいソリューションをグループバイとどのように組み合わせることができますか?現在、インデックスの値が重複している場合(たとえば、グループ化したい異なるカテゴリ間で同一の場合)、reindex()のステップは失敗し、「一意のインデックスオブジェクトでのみ有効です」と主張します。 (たぶんこれは新しい質問になるはずですか?) – CPBL

6

古いスレッドですが、私の解を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 
+0

美しい解決策です。私のために非常にうまく動作します。投稿していただきありがとうございます! – HeinzKurt