问题描述
目标
我想根据 ID 和时间索引将当前行值和接下来的 2 行值与第一行值相加。时间索引以3天的窗口向前移动,而总和值只能具有相同的ID
当前不正确的功能
- 第一行值 SUMMED VALUE = 第一行值
- 第 2 行值 SUMMED VALUE = 第 1 行值 + 第 2 行值
- 第 3 行值 SUMMED VALUE = 第 3 行值 + 第 2 行值 + 第 1 行值
gr = current_df.groupby("id").rolling('3D').rolling_sum_3.sum()
final_dataframe = pd.DataFrame(gr)
目标如下
- A.) 第 1 行值 SUMMED VALUE = 第 3 行值 + 第 2 行值 + 第 1 行值
- B.) 如果此 ID 和 3 天时间范围内没有第 2 行或第 3 行值,只需将此字段保留为 NaN 值
- A.) 第 2 行值 SUMMED VALUE = 第 2 行值 + 第 3 行值 + 第 4 行值
- B.) 如果此 ID 和 3 天时间范围内没有第 3 行或第 4 行值,只需将此字段保留为 NaN 值
- 等
我试过了
- 使用 if 和 for 循环 -> 运行很长时间
- 我需要保持这种快速的 Pandas 格式,并且可能必须更改滚动窗口的 win_type 属性 pandas documentation 以便我可以滚动窗口,但我没有完全了解这些选项 - https://docs.scipy.org/doc/scipy/reference/signal.windows.html#module-scipy.signal.windows
- 我无法将所有内容都向上移动,因为发生的事件之间存在多个月的差异,而目标只是将 3 天范围内的值相加
- Nan 值在顶部而不是底部 - how to get a continuous rolling mean in pandas?
- 无分组 - ValueError: index must be monotonic when applying rolling("2H").mean()
- 正如我之前提到的,使用 for 和 if 并不是一个真正的选择,因为这会减慢计算速度,而且我有几十万行。目前需要3s。与答案中的那些方法类似,甚至 20 分钟 - Moving average on pandas.groupby object that respects time
解决方法
- 反转系列,然后使用 3 的滚动窗口求和。
- 后向滚动总和将成为前向滚动总和,因为您颠倒了排序顺序