[英]Pandas Rolling window to calculate sum of the same items of the last n days
跟進這個問題,現在我想計算滾動 window 上給定相同分組的不同列的總和/平均值。
這是要設置的代碼片段。 我想計算過去 30 天每個人每行收入的總和/平均值。 此外,由於我的數據非常大(實際數據有 170 萬行),我認為任何使用apply
的方法都不起作用。
偽:
Date
Name
數據Earning
的sum
並將其返回到該行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 的帖子,所以非常感謝你。 不同的是,這個解決方案
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.