python - 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)
我意识到以错误的方向计算累积产品。我正在努力解决如何让它发挥作用。
任何帮助将不胜感激。
谢谢
解决方案
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 循环之外,我没有看到其他方法。
推荐阅读
- python - 在 Windows 10 中通过 ubuntu bash shell 运行 python 代码的问题
- swift - 如何在 Swift 中使用 Realm 获取特定父母的所有孩子和孙子女?
- javascript - 我正在寻求帮助以根据我之前在选择按钮中的选择在我的数据库中显示一个部分
- swift - 当我为相机运行代码时,以 NSException 类型的未捕获异常终止
- kubernetes - 如何在 Kubernetes 集群中创建多个 Mediawiki 实例
- mysql - 获取过去 7 天没有销售的产品
- python - zapier - python - 将字节传递到输出以用于下一个操作
- java - 使用集群管理器时为标记创建自定义信息窗口?
- php - OctoberCMS 在页面 php 部分使用 Ajax API 和无脚本回退
- r - 用逻辑向量索引向量而不改变长度