Python 分为3个月的聚合期和转换期

Python 分为3个月的聚合期和转换期,python,pandas,Python,Pandas,问题 我有一个数据框架,包含许多地区及其各自的销售单位、执行的访问量和每月的平均访问时间。并非所有地区的起始日期都相同 我的桌子看起来像这样: Region Month Visits Average_minutes Units_sold Region_1 2018.01.01 12 2.22 120 Region_1 2018.02.01 10 2.02 108 Region_2 2017.04.

问题

我有一个数据框架,包含许多地区及其各自的销售单位、执行的访问量和每月的平均访问时间。并非所有地区的起始日期都相同

我的桌子看起来像这样:

Region    Month       Visits  Average_minutes  Units_sold
Region_1  2018.01.01  12      2.22             120
Region_1  2018.02.01  10      2.02             108
Region_2  2017.04.01  4       1.8              60
Region_2  2017.05.01  4       1.6              56
Region_2  2017.06.01  3       1.5              58
Region_1  2018.03.01  11      2.1              103
Region_3  2018.04.01  3       2.22             20
Region_3  2018.05.01  2       2                22
Region_2  2017.07.01  6       1.7              61
Region_1  2018.04.01  14      2.1              125
Region_3  2018.06.01  3       2.3              21
Region_3  2018.07.01  3       2.4              19
Region_1  2018.05.01  10      2.12             116
Region_2  2017.08.01  3       2.1              55
Region    Date        Visits  Average_minutes  Units_sold  3M_shift
Region_1  2018.01.01  33      2.11             331         0
Region_1  2018.04.01  24      2.11             241         0
Region_1  2018.02.01  35      2.07             336         1
Region_1  2018.05.01  10      2.12             116         1
Region_1  2018.02.01  35      2.07             336         2
Region_1  2018.05.01  10      2.12             116         2
我想要的是通过向前移动一个月,以3个月的频率汇总不同地区的月度数据

因此,如果我们以区域_1为例,我希望得到的最终结果如下:

Region    Month       Visits  Average_minutes  Units_sold
Region_1  2018.01.01  12      2.22             120
Region_1  2018.02.01  10      2.02             108
Region_2  2017.04.01  4       1.8              60
Region_2  2017.05.01  4       1.6              56
Region_2  2017.06.01  3       1.5              58
Region_1  2018.03.01  11      2.1              103
Region_3  2018.04.01  3       2.22             20
Region_3  2018.05.01  2       2                22
Region_2  2017.07.01  6       1.7              61
Region_1  2018.04.01  14      2.1              125
Region_3  2018.06.01  3       2.3              21
Region_3  2018.07.01  3       2.4              19
Region_1  2018.05.01  10      2.12             116
Region_2  2017.08.01  3       2.1              55
Region    Date        Visits  Average_minutes  Units_sold  3M_shift
Region_1  2018.01.01  33      2.11             331         0
Region_1  2018.04.01  24      2.11             241         0
Region_1  2018.02.01  35      2.07             336         1
Region_1  2018.05.01  10      2.12             116         1
Region_1  2018.02.01  35      2.07             336         2
Region_1  2018.05.01  10      2.12             116         2
如您所见,日期现在包含3个月频率的开始日期,在3M_班次栏中,我看到了与第一个可用月份相比的班次

当然,在上面的表格中,你只能看到区域_1,但我想得到所有组的结果

更多背景

因此,我希望对每个组的数据进行汇总,不仅是业务年度季度的数据,而且是在每个迭代的3个月频率上,向前移动一个月,直到我到达最后一个月

我的代码如下所示,但这将从每个区域的开始日期开始的月份进行分组,我真的不知道如何将开始月份逐月移动并迭代到最后一个月:

grp = joined.groupby(['Region', pd.Grouper(key="Date", freq='3M')]).agg({"Visits":"sum", "Average_minutes":"mean", "Units_sold":"sum"})
以区域_1为例,我得到以下结果:

Region  Date          Visits  Average_minutes  Units_sold
Region_1  2018.01.01  33      2.11             331
Region_1  2018.04.01  24      2.11             241
编辑: 增加了一个更好的可视化我想得到什么

在下面的图片中,你可以明白我的意思。到目前为止,绿色部分就是我所拥有的。我想做一个粉红色的部分循环,但我不知道怎么做

你能帮我得到想要的结果吗


提前非常感谢

我不是100%确定你在找什么,但我的解释是,也许这会有帮助

第一个排序区域和月份

df = df.sort_values(['Region', 'Month'])
设置一个多索引

df = df.set_index(['Region', 'Month'])
然后按区域分组,应用滚动窗口进行聚合,并将其向后移动两个时段

df = df.groupby(level='Region').apply(lambda x: x.rolling(window=3).agg({"Visits":"sum", "Average_minutes":"mean", "Units_sold":"sum"}).shift(-2))
结果是:

                     Visits  Average_minutes  Units_sold
Region   Month                                          
Region_1 2018.01.01    33.0         2.113333       331.0
         2018.02.01    35.0         2.073333       336.0
         2018.03.01    35.0         2.106667       344.0
         2018.04.01     NaN              NaN         NaN
         2018.05.01     NaN              NaN         NaN
Region_2 2017.04.01    11.0         1.633333       174.0
         2017.05.01    13.0         1.600000       175.0
         2017.06.01    12.0         1.766667       174.0
         2017.07.01     NaN              NaN         NaN
         2017.08.01     NaN              NaN         NaN
Region_3 2018.04.01     8.0         2.173333        63.0
         2018.05.01     8.0         2.233333        62.0
         2018.06.01     NaN              NaN         NaN
         2018.07.01     NaN              NaN         NaN

嗨,跑出去。非常感谢您的评论。不幸的是,你的解决方案不是我想要的。我不能清楚地解释我想得到什么是我的错误。为了更清晰,我在我的原始帖子底部添加了一张图片,以便更好地理解我想要实现的目标。希望这会更容易理解!非常感谢。有人能帮我解决这个问题吗?我想帮你买。我还不太清楚你在找什么。您能否提供一个清晰的示例结果表/数据框架,以便我知道您想要实现什么?例如,在我看来,表中的+3个月轮班与绿色列相同。我不明白。此外,区域1的结果表重复了第5:6行中第3:4行的相同数据,这也令人困惑。如果你能清楚你的预期结果,我们可以再看一看。再次感谢你的意图。所以,你的解决方案是我想要实现的第一步。基本上,您的解决方案基于3个月的窗口聚合数据,然后将其向后移动两个月。这将是我迈出的第一步。我的下一步是删除区域_1的2018.01.01月(好像不存在),然后再次执行相同的(3个窗口,-2个班次)流程。然后,再次删除2018.02.01数据,并再次重复(3个窗口,-2个班次)过程。区域2的情况也一样,仅区域2的起始日期为2017.04.01。因此,基本上我希望进行分组,然后删除第一个数据行并重复整个过程(从第二个月开始,因为我删除了第一个月)。这种方式更容易理解吗?