如何根据groupby计算12个月的滚动总和?

How to calculate 12 month rolling sum based on groupby?

我正在尝试使用 Python 为以下数据框计算基于人名的订单数量和收入的 12 个月滚动总和:

df = pd.DataFrame( columns = ['Name','Month','Orders','Revenue']) 
df['Name'] = ['Ava','Ava','Ava','Baptiste','Baptiste','Baptiste','Baptiste','Cam','Cam']
df['Month'] =['2019-07','2020-04','2021-03','2020-03','2020-10','2021-03','2021-05','2020-01','2021-03'] 
df['Orders'] =[2,12,4,5,9,10,3,4,5]
df['Revenue'] = [10,25,15,5,8,10,12,20,5]

为了给出以下输出:

df['Rolling 12 Month Orders'] = [2,14,16,5,14,24,22,4,5]
df['Rolling 12 Month Revenue'] = [10,35,40,5,13,23,30,20,5]

滚动总和应将过去 12 个月内按名称列分组的所有总和相加。

我试过以下方法:

df['Rolling 12 Month Orders'] = df.groupby(['Name','Month'])['Orders'].rolling(12).sum()

但它没有给我预期的结果。

您将 rolling 频率传递为 12,pandas 不知道您要指定 12 个月 window,还需要确保您的 Month列被识别为日期类型列,试试这个:

df['Month'] = pd.to_datetime(df['Month'])

df['Rolling 12 Month Orders'] = df.groupby(['Name']).rolling('365d', on = 'Month')['Orders'].sum().reset_index( drop = True)

df['Rolling 12 Month Revenue'] = df.groupby(['Name']).rolling('365d', on = 'Month')['Revenue'].sum().reset_index( drop = True)

此外,您需要使用 365d 而不是 12m,因为使用 12m 会引发错误:ValueError: <12 * MonthEnds> is a non-fixed frequency.

对此的简要解释是滚动 window 必须具有固定的宽度 - “一个月”没有固定的天数。