簡體   English   中英

Pandas 滾動總和,包括前幾天和未來幾天

[英]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

說明:

  1. 我們想將df.Test系列 1 position 向上移動,以將第二天(“明天”)包含在滾動的 window 中,但它有一個不好的后果——原始系列的第一個成員消失了。

  2. 因此,我們以 1 元素系列 ( pd.Series(df.Test.iloc[0]) ) 的形式保存它 ( df.Test.iloc[0] ] )。

  3. 只有這樣我們才能執行原始系列的預期移位( df.Test.shift(-1) )。

  4. 生成的移位系列我們 append 到先前保存的 1 元素系列( pd.Series(df.Test.iloc[0]).append(df.Test.shift(-1)) )。

  5. 現在我們准備創建一個滾動 window,大小為 6(4 天前 + 今天 + 明天),最小周期為 1,以防止出現NaN值( .rolling(6, min_periods=1) )。

  6. 最后的步驟現在很明顯:

    • 應用.sum()方法,
    • 刪除第一個元素( .iloc[1:] ),它被預先添加到移位序列中,僅用於滾動 window 計算,
    • 可能將結果系列的數據類型轉換回 integer 類型( .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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM