Pandas 多指标划分

Pandas Multi Index Division

我有一个多索引数据框,看起来像

                            Mid
Strike  Expiration  Symbol  
167.5   2022-02-11  AAPL170 5.4
170     2022-02-11  AAPL170 3.1
        2022-02-18  AAPL170 4.525
        2022-02-25  AAPL170 5.25
        2022-03-04  AAPL170 6.00
172.5   2022-02-11  AAPL172 1.265
        2022-02-18  AAPL172 2.91
175     2022-02-11  AAPL175 0.265
        2022-02-18  AAPL175 1.695

所以它是一个多索引,索引为strike expirationsymbol,然后 mid 只是一个列名,而不是索引。我还有一些其他专栏,但它们现在并不重要。这些是从第一个索引按增加的值排序的,我希望将每个 Mid 行除以它下面的下一行,但仅限于每个单独的 strike 索引。目前,我正在做

df['ratio'] = (df['mid'] / df['mid'].shift(-1))

它可以为我提供所有分区的新列,但我 运行 遇到了问题,例如,167.5 2022-02-11 行被 170 2022-02-11 行,我需要将它们按索引分开。

我的目标是在这个除法完成后,能够搜索任何高于截止值的比率,例如。 0.5,然后输出被划分到一个新的数据帧,所以类似于

Strike  Expirations                Symbol    Ratio
170     2022-02-11 / 2022-02-18    AAPL170   0.685

如果有人可以就这两部分提出建议,我将不胜感激,但我主要需要修复第一部分。

使用 pandas.DataFrame.groupbypct_change 的一种方法:

new_df = df.groupby(level=0).pct_change(-1) + 1
print(new_df)

输出:

                                Mid
Strike Expiration Symbol           
167.5  2022-02-11 AAPL170       NaN
170.0  2022-02-11 AAPL170  0.685083
       2022-02-18 AAPL170  0.861905
       2022-02-25 AAPL170  0.875000
       2022-03-04 AAPL170       NaN
172.5  2022-02-11 AAPL172  0.434708
       2022-02-18 AAPL172       NaN
175.0  2022-02-11 AAPL175  0.156342
       2022-02-18 AAPL175       NaN

对于调试,您可以尝试类似的方法:

for _, d in df.groupby(level=0):
    try:
        d.pct_change()
    except:
        print(d)
        break