我有一些财务时间序列数据,我想计算窗口大小可变的滚动累积产品。
我要完成的工作是使用以下公式,但不是将窗口固定为12,而是要使用存储在标记为“ labels_y”的数据帧的最后一列中的值,该值会随着时间而变化。
df= (1 + df).rolling(window=12).apply(np.prod, raw=True) - 1
数据样本:
Out[102]:
div_yield earn_variab growth ... value volatility labels_y
date ...
2004-02-23 -0.001847 0.003252 -0.001264 ... 0.004368 -0.004490 2.0
2004-02-24 -0.001668 0.007404 0.002108 ... -0.006122 0.008183 2.0
2004-02-25 -0.003272 0.004596 0.001283 ... -0.002057 0.005912 3.0
2004-02-26 0.001818 -0.003397 -0.003190 ... 0.001327 -0.003908 3.0
2004-02-27 -0.002838 0.009879 0.000808 ... 0.000350 0.010557 3.0
[5 rows x 11 columns]
,最终结果应类似于:
Out[104]:
div_yield earn_variab growth ... value volatility labels_y
date ...
2004-02-23 NaN NaN NaN ... NaN NaN NaN
2004-02-24 -0.003512 0.010680 0.000841 ... -0.001781 0.003656 8.0
2004-02-25 -0.006773 0.015325 0.002125 ... -0.003834 0.009589 35.0
2004-02-26 -0.003126 0.008596 0.000193 ... -0.006851 0.010180 47.0
2004-02-27 -0.004294 0.011075 -0.001104 ... -0.000383 0.012559 63.0
[5 rows x 11 columns]
第1行和第2行使用2天的滚动窗口进行计算,第3、4和5行使用3天的窗口进行计算
我尝试使用
def get_window(row):
return (1 + row).rolling(window=int(row['labels_y'])).apply(np.prod, raw=True) - 1
df = df.apply(get_window, axis=1)
我意识到计算错误方向的累积积。我正在努力使它起作用。
任何帮助将不胜感激。
谢谢
答案 0 :(得分:1)
{{1}}
这有用吗?效率极低,但除了繁琐的for循环外,我看不到其他方法。