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
expiration
和 symbol
,然后 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.groupby
和 pct_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
我有一个多索引数据框,看起来像
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
expiration
和 symbol
,然后 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.groupby
和 pct_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