熊猫滚动窗累计,不完全系列

  • 本文关键字:全系列 滚动 熊猫 pandas
  • 更新时间 :
  • 英文 :


我有一个熊猫df如下:

YEAR   MONTH   USERID    TRX_COUNT
2020   1        1         1
2020   2        1         2
2020   3        1         1
2020   12       1         1
2021   1        1         3
2021   2        1         3
2021   3        1         4

我想要sumTRX_COUNT这样,每个TRX_COUNT都是未来12个月TRX_COUNTSsum。所以最终结果是

YEAR   MONTH   USERID    TRX_COUNT   TRX_COUNT_SUM
2020   1        1         1            5
2020   2        1         2            7
2020   3        1         1            8
2020   12       1         1            11
2021   1        1         3            10
2021   2        1         3            7
2021   3        1         4            4

例如,2020/1TRX_COUNT_SUM1+2+1+1=5,即前12个月的计数。第二个条目是7,因为它是2+1+1+3的总和,距离2020/2有12个月我希望得到部分数据,因为没有全年的数据。这些可以部分求和或设为零(因为我不会使用偏导数)。我尝试了cumsum的各种变体,并通过USERID, YR, MONTH进行分组,但在处理时间窗口时遇到了错误。谢谢!

查看逻辑和预期输出,您正在寻找更多的滚动和而不是总和。您想滚动12个月,并将TRX_COUNT的数量相加。cumsum会将之前的计算累加。

无论如何,在你的数据集中有一些复杂的事情。1. 间隔是不均匀的。你正在寻找向前滚动,而典型的滚动是向后的。

为了解决这个问题,首先,我将使区间偶数,以便我可以使用正则滚动。

df['ym'] = pd.to_datetime([f'{x}/0{y}' if y < 10 else f'{x}/{y}' for x, y in zip(df.YEAR, df.MONTH)])
df = df.set_index('ym').resample('MS').first()

然后,尝试向前滚动。要执行正向滚动,我将数据帧反转一次并执行滚动,然后再反转回来。

df['TRX_COUNT_SUM'] = (df.iloc[::-1]    # Reverse to do (backward) rolling
.rolling(12, min_periods=0)
.TRX_COUNT.sum()
.iloc[::-1])     # Reverse back to original
# remove resampled records
df = df[df.YEAR > 0]

YEAR  MONTH  USERID  TRX_COUNT  TRX_COUNT_SUM
ym
2020-01-01  2020.0    1.0     1.0        1.0            5.0
2020-02-01  2020.0    2.0     1.0        2.0            7.0
2020-03-01  2020.0    3.0     1.0        1.0            8.0
2020-12-01  2020.0   12.0     1.0        1.0           11.0
2021-01-01  2021.0    1.0     1.0        3.0           10.0
2021-02-01  2021.0    2.0     1.0        3.0            7.0
2021-03-01  2021.0    3.0     1.0        4.0            4.0

最新更新