如何根据 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 个月的滚动总和?的主要内容,如果未能解决你的问题,请参考以下文章
在 MicroStrategy 中滚动 12 个月的 Salesforce
excel中使用CORREL函数计算两个时间序列数据列之间的滚动相关性(Rolling correlations)例如,计算两种商品销售额之间的3个月的滚动相关性