python - pandas python 中的 3 个月聚合和转移周期分组

标签 python pandas

问题

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

所以我的 table 看起来像这样:

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

我想要的是通过向前移动一个月来汇总不同地区的每月数据,频率为 3 个月。

因此,如果我们以 Region_1 为例,我希望得到的最终结果是这样的:

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_shift 列中,我看到与第一个可用月份相比所做的转变。

当然,在上表中您只能看到 Region_1,但我希望获得所有组的结果。

更多背景

因此,我希望每个组的数据不仅聚合业务年季度的数据,而且还聚合 3 个月的频率,每次迭代向前移动一个月,直到到达最后一个月。

我的代码看起来像这样,但是这对每个区域的开始日期的月份进行分组,我真的不知道如何将开始月份移动一个并迭代到最后一个月:

grp = joined.groupby(['Region', pd.Grouper(key="Date", freq='3M')]).agg({"Visits":"sum", "Average_minutes":"mean", "Units_sold":"sum"})

例如,对于 Region_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

编辑: 添加了我想要得到的更好的可视化。

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

enter image description here

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

提前非常感谢您!

最佳答案

我不是 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

关于python - pandas python 中的 3 个月聚合和转移周期分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55321559/

相关文章:

python - TensorFlow 二进制文件经过优化,可在性能关键型操作中使用以下 CPU 指令 : AVX2 FMA

python - GeoDjango 想要在 [-180 -90, 180 90] 范围内协调?

python - Pandas 数据框值相等测试

python - 从数据帧中的当前索引反向搜索

Pandas groupby 在系列末尾填充零值

python - 如何从 kivy 的 Canvas 中删除线条

python - 将 ZMQStream 附加到现有的 Tornado ioloop

python - 基于相邻元素选择

python - Pandas 读取json ValueError : Protocol not known

python-3.x - 如何在列上应用函数