python - 用插值填充多索引 Pandas DataFrame

标签 python pandas interpolation

我想bfillffill 包含NaN 的多索引DataFrame(在本例中ImpVol 字段)使用 interpolate 方法。 DataFrame 的一部分可能如下所示:

Expiration  OptionType  Strike    ImpVol
2014-12-26  call        140.0          NaN
                        145.0          NaN
                        147.0          NaN
                        149.0          NaN
                        150.0          NaN
                        152.5          NaN
                        155.0     0.233631
                        157.5     0.206149
                        160.0     0.149118
                        162.5     0.110867
                        165.0     0.110047
                        167.5          NaN
                        170.0          NaN
                        172.5          NaN
                        175.0          NaN
                        177.5          NaN
                        180.0          NaN
                        187.5          NaN
                        192.5          NaN
            put         132.0          NaN
                        135.0          NaN
                        140.0          NaN
                        141.0          NaN
                        142.0     0.541311
                        143.0          NaN
                        144.0     0.546672
                        145.0     0.504691
                        146.0     0.485586
                        147.0     0.426898
                        148.0     0.418084
                        149.0     0.405254
                        150.0     0.372353
                        152.5     0.311049
                        155.0     0.246892
                        157.5     0.187426
                        160.0     0.132475
                        162.5     0.098377
                        165.0          NaN
                        167.5     0.249519
                        170.0     0.270546
                        180.0          NaN
                        182.5     0.634539
                        185.0     0.656332
                        187.5     0.711593
2015-01-02  call        145.0          NaN
                        146.0          NaN
                        149.0          NaN
                        150.0          NaN
                        152.5          NaN
                        155.0     0.213742
                        157.5     0.205705
                        160.0     0.160824
                        162.5     0.143180
                        165.0     0.129292
                        167.5     0.127415
                        170.0     0.148275
                        172.5          NaN
                        175.0          NaN
                        180.0          NaN
                        182.5          NaN
                        195.0          NaN
            put         135.0     0.493639
                        140.0     0.463828
                        141.0     0.459619
                        142.0     0.442729
                        143.0     0.431823
                        145.0     0.391141
                        147.0     0.313090
                        148.0     0.310796
                        149.0     0.296146
                        150.0     0.280965
                        152.5     0.240727
                        155.0     0.203776
                        157.5     0.175431
                        160.0     0.143198
                        162.5     0.121621
                        165.0     0.105060
                        167.5     0.160085
                        170.0          NaN

对于那些不熟悉该领域的人,我正在插入缺失(或错误)的隐含期权波动率。这些需要在到期日和期权类型组合之间进行插值,不能在整个期权群体中进行插值。例如,我必须分别插入 2014-12-26 call 选项而不是 2014-12-26 put 选项。

我之前选择了一部分值来插入这样的东西:

optype = 'call'
expiry = '2014-12-26'

s = df['ImpVol'][expiry][optype].interpolate().ffill().bfill()

但框架可能非常大,我想避免循环遍历每个索引。如果我使用 interpolate 方法进行填充而不选择切片(即跨越整个帧),interpolate 将在所有子索引之间进行插值,这是我不想要的.例如:

print df['ImpVol'].interpolate().ffill().bfill()

Expiration  OptionType  Strike    ImpVol
2014-12-26  call        140.0     0.233631
                        145.0     0.233631
                        147.0     0.233631
                        149.0     0.233631
                        150.0     0.233631
                        152.5     0.233631
                        155.0     0.233631
                        157.5     0.206149
                        160.0     0.149118
                        162.5     0.110867
                        165.0     0.110047
                        167.5     0.143222
                        170.0     0.176396
                        172.5     0.209570
                        175.0     0.242744
                        177.5     0.275918
                        180.0     0.309092
                        187.5     0.342267
                        192.5     0.375441 <-- interpolates from the 2014-12-26 call...
            put         132.0     0.408615 <-- ... to the 2014-12-26 put, which is bad
                        135.0     0.441789
                        140.0     0.474963
                        141.0     0.508137
                        142.0     0.541311
                        143.0     0.543992
                        144.0     0.546672
                        145.0     0.504691
                        146.0     0.485586
                        147.0     0.426898
                        148.0     0.418084
                        149.0     0.405254
                        150.0     0.372353
                        152.5     0.311049
                        155.0     0.246892
                        157.5     0.187426
                        160.0     0.132475
                        162.5     0.098377
                        165.0     0.173948
                        167.5     0.249519
                        170.0     0.270546
                        180.0     0.452542
                        182.5     0.634539
                        185.0     0.656332
                        187.5     0.711593

那么问题来了,如何根据索引填充多索引数据框的每个子部分?

最佳答案

我会尝试在索引的 OptionType 级别拆分数据框。

df.unstack(level=1)

通过这种方式,您应该获得一个索引数据框,该数据框会将看涨和看跌类别都移动到列中。也许这不是解决问题的最优雅方法,但它应该能解决问题,而不是让看跌期权/看涨期权的行使价重叠。

如果多索引df是最适合进一步计算的,可以使用stack方法恢复原始格式。

关于python - 用插值填充多索引 Pandas DataFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27640202/

相关文章:

python - 在 App Engine 上生成 GUID 的好方法?

python - 将 CSV 导入 Mac 上的 Jupyter Notebook (python)

python - 在 pandas 导入上过滤 pytables 表

javascript - Chart.js 线性插值

python - 在 Python 中使用 FTP 服务器上的 .txt 文件的文本填充变量

python - 如何绘制曲线可能重叠的情节?

python-3.x - 使用 Pandas Dataframe 和列数进行计数或求和

python - 将一个数据框除以另一个数据框,不考虑一列

python - For 循环似乎比 NumPy/SciPy 3D 插值更快

react-native - React Native FontSize 动画锯齿状