簡體   English   中英

Pandas 滾動 window 計算最近n天相同項目的總和

[英]Pandas Rolling window to calculate sum of the same items of the last n days

跟進這個問題,現在我想計算滾動 window 上給定相同分組的不同列的總和/平均值。

這是要設置的代碼片段。 我想計算過去 30 天每個人每行收入的總和/平均值 此外,由於我的數據非常大(實際數據有 170 萬行),我認為任何使用apply的方法都不起作用。

偽:

  • 對於每一行,從日期開始匯總過去 30 天的Date
  • 僅過濾Name數據
  • 計算Earningsum並將其返回到該行
d = {'Name': ['Jack', 'Jim', 'Jack', 'Jim', 'Jack', 'Jack', 'Jim', 'Jack', 'Jane', 'Jane'],
     'Date': ['08/01/2021',
              '27/01/2021',
              '05/02/2021',
              '10/02/2021',
              '17/02/2021',
              '18/02/2021',
              '20/02/2021',
              '21/02/2021',
              '22/02/2021',
              '29/03/2021'],
     'Earning': [40, 10, 20, 20, 40, 50, 100, 70, 80, 90]}

df = pd.DataFrame(data=d)
df['Date'] = pd.to_datetime(df.Date, format='%d/%m/%Y')
df = df.sort_values('Date')

IIUC使用

df = (df.join(df.set_index('Date')
                .groupby('Name')['Earning']
                .rolling('30d', closed='both')
                .sum()
                .rename('sum'), on=['Name', 'Date']))
print (df)
   Name       Date  Earning    sum
0  Jack 2021-01-08       40   40.0
1   Jim 2021-01-27       10   10.0
2  Jack 2021-02-05       20   60.0
3   Jim 2021-02-10       20   30.0
4  Jack 2021-02-17       40   60.0
5  Jack 2021-02-18       50  110.0
6   Jim 2021-02-20      100  130.0
7  Jack 2021-02-21       70  180.0
8  Jane 2021-02-22       80   80.0
9  Jane 2021-03-29       90   90.0

這個答案是基於@jezrael 的帖子,所以非常感謝你。 不同的是,這個解決方案

  1. 使用左連接來確保我們不會改變原始數據的形狀
  2. 過濾掉重復項,以防數據中存在相同的 ['Date', 'Name']。
def sum_of_last_n_days(df: pd.DataFrame, identifier: str, timestamp: str, sum_col: str, delta: int) -> pd.DataFrame:
   
    col_name = "sum_%s" % identifier
    temp_df = df.set_index(timestamp) \
        .groupby(identifier, sort=False)[sum_col] \
        .rolling('%sd' % delta, closed='both') \
        .sum() \
        .rename(col_name)
    temp_df = temp_df[~temp_df.index.duplicated(keep="first")]
    return df.merge(temp_df, how="left", left_on=[identifier, timestamp], right_index=True)

frequency_of_last_n_days(df, "Name", "Date", "Earning", 30)

結果

   Name       Date  Earning    sum
0  Jack 2021-01-08       40   40.0
1   Jim 2021-01-27       10   10.0
2  Jack 2021-02-05       20   60.0
3   Jim 2021-02-10       20   30.0
4  Jack 2021-02-17       40   60.0
5  Jack 2021-02-18       50  110.0
6   Jim 2021-02-20      100  130.0
7  Jack 2021-02-21       70  180.0
8  Jane 2021-02-22       80   80.0
9  Jane 2021-03-29       90   90.0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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