如何在 Pandas DataFrame 上计算滚动累积乘积
Posted
技术标签:
【中文标题】如何在 Pandas DataFrame 上计算滚动累积乘积【英文标题】:How to calculate rolling cumulative product on Pandas DataFrame 【发布时间】:2013-02-24 01:58:41 【问题描述】:我在 pandas DataFrame 中有一个时间序列的回报、滚动 beta 和滚动 alpha。如何计算 DataFrame 的 alpha 列的滚动年化 alpha? (我想做相当于=PRODUCT(1+[trailing 12 months])-1 in excel)
SPX Index BBOEGEUS Index Beta Alpha
2006-07-31 0.005086 0.001910 1.177977 -0.004081
2006-08-31 0.021274 0.028854 1.167670 0.004012
2006-09-30 0.024566 0.009769 1.101618 -0.017293
2006-10-31 0.031508 0.030692 1.060355 -0.002717
2006-11-30 0.016467 0.031720 1.127585 0.013153
我很惊讶地发现 pandas 中没有为此内置“滚动”功能,但我希望有人可以提供一个功能,然后我可以使用 pd.rolling_apply 将其应用于 df['Alpha'] 列.
提前感谢您提供的任何帮助。
【问题讨论】:
【参考方案1】:rolling_apply
已在 pandas 中被删除,取而代之的是更通用的
window methods(例如rolling()
等)
# Both agg and apply will give you the same answer
(1+df).rolling(window=12).agg(np.prod) - 1
# BUT apply(raw=True) will be much FASTER!
(1+df).rolling(window=12).apply(np.prod, raw=True) - 1
【讨论】:
有更快的方法吗?也许使用cumprod()
并将窗口中的最后一个元素除以窗口中的第一个元素?【参考方案2】:
这样可以吗?
import pandas as pd
import numpy as np
# your DataFrame; df = ...
pd.rolling_apply(df, 12, lambda x: np.prod(1 + x) - 1)
【讨论】:
此功能似乎已被弃用。这里有更多最新的解决方案:***.com/questions/35365545/…【参考方案3】:如果你将那些 +/-1 移出df
,它会快一点,像这样:
cumprod = (1.+df).rolling(window=12).agg(lambda x : x.prod()) -1
【讨论】:
【参考方案4】:rolling_apply 已弃用,因此效果最佳:
(1 + df).cumprod() - 1
【讨论】:
这个答案没有考虑滚动窗口的大小 - 它假设它是 1。以上是关于如何在 Pandas DataFrame 上计算滚动累积乘积的主要内容,如果未能解决你的问题,请参考以下文章
Pandas-Dataframe:如何计算变量在 1 分钟内重复的次数
如何计算 pandas DataFrame 中的 nan 值?
如何使用 pandas DataFrame 计算列表的字典?
如何在 pandas DataFrame 中忽略滚动平均值计算的 NaN 值?