如何根据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 必须具有固定的宽度 - “一个月”没有固定的天数。
我正在尝试使用 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 必须具有固定的宽度 - “一个月”没有固定的天数。