我有一个熊猫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
我想要sum
和TRX_COUNT
这样,每个TRX_COUNT
都是未来12个月TRX_COUNTS
的sum
。所以最终结果是
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/1
的TRX_COUNT_SUM
为1+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