我嘗試計算幾天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')
非常感謝你的建議!
uj5u.com熱心網友回復:
您可以將自定義滾動索引器用于前瞻性視窗和np.nanprod:
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
uj5u.com熱心網友回復:
您可以使用:
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_periods=1 來啟用少于 3 個元素的計算
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/480592.html
上一篇:通過`.to_dict()`,pandas將Python字典中的`NaN`轉換為`nan`;如何檢查python中是否存在'nan'
