【发布时间】:2018-01-19 06:37:06
【问题描述】:
我有一个 DataFrame,比如说一个波动率表面,索引为时间,列为罢工。如何进行二维插值?我可以reindex 但我该如何处理NaN?我知道我们可以fillna(method='pad') 但它甚至不是线性插值。有没有办法我们可以插入我们自己的方法来进行插值?
【问题讨论】:
我有一个 DataFrame,比如说一个波动率表面,索引为时间,列为罢工。如何进行二维插值?我可以reindex 但我该如何处理NaN?我知道我们可以fillna(method='pad') 但它甚至不是线性插值。有没有办法我们可以插入我们自己的方法来进行插值?
【问题讨论】:
您可以使用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 对象。
【讨论】:
df2.interpolate() 因为df2.interpolate() == df2.apply(pandas.Series.interpolate)(至少对我来说,pandas.__version__ == 0.14)
旧线程,但我想我会与 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
【讨论】: