我try 计算Dataframe df1中每个元素在x天内的累积积(例如3).有没有一种有效的方法可以做到这一点?到目前为止,我只知道在行上生成一个正常的累积积,而没有将回溯期固定为x天(=df2).例如:

  • 2022-01-02 ID1:1.0528=(忽略NaN)0.94*1.12
  • 2022-01-05 ID1:1.2002=0.94*1.12*1.14
  • 2022-01-09 ID1:1.4045=1.12*1.14*1.10

最佳情况下,它还将忽略NaN值,并计算剩余数字的累积回报.到目前为止,我只知道如何通过创建一个副本并移动它来计算,但我想计算50行以上的许多列的累积积,这是不高效的.

df1:
            ID1     ID2
Date        
2022-01-02  NaN     0.95
2022-01-05  0.94    0.98
2022-01-09  1.12    NaN
2022-01-10  1.14    1.02
2022-01-11  1.10    1.00
2022-01-12  0.92    0.82

df2:
            ID1     ID2
Date        
2022-01-02  1.0528  0.9309
2022-01-05  1.2002  0.9996
2022-01-09  1.4045  1.0200
2022-01-10  1.1537  0.8364
2022-01-11  1.0120  0.8200
2022-01-12  0.9200  0.8200

对于可复制性:

import pandas as pd
import numpy as np
df1 = pd.DataFrame({
    'Date':['2022-01-02', '2022-01-05', '2022-01-09', '2022-01-10', '2022-01-11', '2022-01-12'],
    'ID1':[np.nan, 0.94, 1.12, 1.14, 1.1, 0.92], 
    'ID2':[0.95, 0.98, np.nan, 1.02, 1, 0.82]})
df1 = df1.set_index('Date')

非常感谢您的建议!

推荐答案

您可以使用:

df1.fillna(1)[::-1].rolling(window=3, min_periods=1).agg(lambda x: x.prod())[::-1]

输出:

                 ID1     ID2
Date                        
2022-01-02  1.052800  0.9310
2022-01-05  1.200192  0.9996
2022-01-09  1.404480  1.0200
2022-01-10  1.153680  0.8364
2022-01-11  1.012000  0.8200
2022-01-12  0.920000  0.8200

它是如何工作的?

  • 滚动使用前面的行(或居中),这里我们反转数组以计算反向滚动
  • 我们用1填充NAN(我们也可以使用np.nanprod)
  • 我们使用min\u periods=1来启用少于3个元素的计算

Python相关问答推荐

如何将双框框列中的成对变成两个新列

海运图:调整行和列标签

C#使用程序从Python中执行Exec文件

如何从.cgi网站刮一张表到rame?

当从Docker的--env-file参数读取Python中的环境变量时,每个\n都会添加一个\'.如何没有额外的?

如何使用scipy的curve_fit与约束,其中拟合的曲线总是在观测值之下?

从嵌套的yaml创建一个嵌套字符串,后面跟着点

在Python中调用变量(特别是Tkinter)

未调用自定义JSON编码器

numpy.unique如何消除重复列?

将标签移动到matplotlib饼图中楔形块的开始处

Numpyro AR(1)均值切换模型抽样不一致性

处理Gekko的非最优解

在用于Python的Bokeh包中设置按钮的样式

简单 torch 模型测试:ModuleNotFoundError:没有名为';Ultralytics.yolo';

PySpark:如何最有效地读取不同列位置的多个CSV文件

Pandas数据框上的滚动平均值,其中平均值的中心基于另一数据框的时间

在Pandas 中以十六进制显示/打印列?

如何通过特定导入在类中执行Python代码

如何删除剪裁圆的对角线的外部部分