[英]Pandas rolling sum that includes previous and coming days
一個初學者,基本上,試圖找到一個滾動的總和,包括今天、過去 4 天和未來幾天,在這種情況下是第二天(明天)。
Test
1995-07-01 1
1995-07-02 0
1995-07-03 0
1995-07-04 1
1995-07-05 0
1995-07-06 0
1995-07-07 0
1995-07-08 0
1995-07-09 0
1995-07-10 0
1995-07-11 1
得到“今天”和過去 4 天的滾動總和 df['test'].rolling(5).sum()
1995-07-01 NaN
1995-07-02 NaN
1995-07-03 NaN
1995-07-04 NaN
1995-07-05 2.0
1995-07-06 1.0
1995-07-07 1.0
1995-07-08 1.0
1995-07-09 0.0
1995-07-10 0.0
1995-07-11 1.0
但是將第二天的值包含在這個總和中對我來說很困難,我想要的是 output 1995-07-10 顯示 1,因為它需要包含“明天”(因為 1995-07-11 在測試數據中是 1 )
我相信您需要的是shift()
方法。 它將允許您將數據移動幾天,然后您可以根據需要將其與日期對齊。
有關文檔, 請參閱此鏈接。
df['test'].shift(-1,fill_value=0).rolling(5).sum()
提供:
date
1995-07-01 NaN
1995-07-02 NaN
1995-07-03 NaN
1995-07-04 NaN
1995-07-05 1.0
1995-07-06 1.0
1995-07-07 1.0
1995-07-08 0.0
1995-07-09 0.0
1995-07-10 1.0
1995-07-11 1.0
利用
pd.Series(df.Test.iloc[0]).append(df.Test.shift(-1)) \
.rolling(6, min_periods=1).sum().iloc[1:].astype(int)
結果(原始系列僅用於舒適的快速檢查)
--- Result --- -- (Original) -- Test Test 1995-07-01 1 1995-07-01 1 1995-07-02 1 1995-07-02 0 1995-07-03 2 1995-07-03 0 1995-07-04 2 1995-07-04 1 1995-07-05 2 1995-07-05 0 1995-07-06 1 1995-07-06 0 1995-07-07 1 1995-07-07 0 1995-07-08 1 1995-07-08 0 1995-07-09 0 1995-07-09 0 1995-07-10 1 1995-07-10 0 1995-07-11 1 1995-07-11 1
說明:
我們想將df.Test
系列 1 position 向上移動,以將第二天(“明天”)包含在滾動的 window 中,但它有一個不好的后果——原始系列的第一個成員消失了。
因此,我們以 1 元素系列 ( pd.Series(df.Test.iloc[0])
) 的形式保存它 ( df.Test.iloc[0]
] )。
只有這樣我們才能執行原始系列的預期移位( df.Test.shift(-1)
)。
生成的移位系列我們 append 到先前保存的 1 元素系列( pd.Series(df.Test.iloc[0]).append(df.Test.shift(-1))
)。
現在我們准備創建一個滾動 window,大小為 6(4 天前 + 今天 + 明天),最小周期為 1,以防止出現NaN
值( .rolling(6, min_periods=1)
)。
最后的步驟現在很明顯:
.sum()
方法,.iloc[1:]
),它被預先添加到移位序列中,僅用於滾動 window 計算,.astype(int)
)df['Tomorrow'] = df.shift(-1)
df['Previous'] = df['Test'].rolling(4).sum()
df.sum(axis=1)
Output
1995-07-01 1.0
1995-07-02 0.0
1995-07-03 1.0
1995-07-04 3.0
1995-07-05 1.0
1995-07-06 1.0
1995-07-07 1.0
1995-07-08 0.0
1995-07-09 0.0
1995-07-10 1.0
1995-07-11 2.0
或者,如果您希望前 3 行具有前 4 行的值,即使少於 4 天:
df['Previous'] = df['Test'].rolling(4, min_periods=1).sum()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.