pandas DataFrame 中 x 天每个元素的累积乘积

2024-03-12

我尝试计算 a 中的每个元素Dataframe df1累计积超过x天(例如 3)。有没有有效的方法来做到这一点?到目前为止,我只知道在行上生成正常的累积乘积,而不将回溯期固定为x days (=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')

非常感谢您的建议!


您可以使用定制滚动分度器 https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.rolling.html用于前瞻性窗户和np.nanprod https://numpy.org/doc/stable/reference/generated/numpy.nanprod.html:

import numpy as np

# Window of index i includes rows [i:i+3).
indexer = pd.api.indexers.FixedForwardWindowIndexer(window_size=3)

print(df.rolling(indexer, min_periods=1).apply(np.nanprod))
                 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pandas DataFrame 中 x 天每个元素的累积乘积 的相关文章

随机推荐