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

Posted

技术标签:

【中文标题】如何根据 groupby 计算 12 个月的滚动总和?【英文标题】:How to calculate 12 month rolling sum based on groupby? 【发布时间】:2021-08-14 18:46:12 【问题描述】:

我正在尝试使用 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()

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

【问题讨论】:

您好,您对我下面的回答有任何疑问吗?请让 mw 知道,我只是注意到您接受了答案,然后取消了它。我很乐意提供帮助。虽然我在发布之前检查了最后的代码。 它适用于小型数据集,但是对于较大的数据集需要一段时间,我打算使用它,所以决定等待,看看是否有替代方案。 【参考方案1】:

您将 rolling 频率传递为 12,pandas 不知道您要指定 12 个月的窗口,还需要确保您的 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

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

【讨论】:

以上是关于如何根据 groupby 计算 12 个月的滚动总和?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Hive - 计算前几个月的滚动 SUM、AVG

在 MicroStrategy 中滚动 12 个月的 Salesforce

动态 SQL 滚动 12 个月数据透视

Qlikview 滚动 12 个月财政

如何找到滚动的 3 个月方差?

excel中使用CORREL函数计算两个时间序列数据列之间的滚动相关性(Rolling correlations)例如,计算两种商品销售额之间的3个月的滚动相关性