首页 > 解决方案 > Pandas - 计算可变窗口大小的滚动累积产品

问题描述

我有一些金融时间序列数据,我想计算具有可变窗口大小的滚动累积产品。

我想要完成的是使用以下公式,但不是将窗口固定为 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)

我意识到以错误的方向计算累积产品。我正在努力解决如何让它发挥作用。

任何帮助将不胜感激。

谢谢

标签: pythonpandasdataframe

解决方案



def get_window(row, df):
    return (1 + df).rolling(window=int(row['labels_y'])).apply(np.prod, raw=True).loc[row.name]-1


result = df1.apply(get_window, axis=1, df=df1)

这行得通吗?效率极低,但除了繁琐的 for 循环之外,我没有看到其他方法。


推荐阅读