python - Pandas 中带有日期时间索引的滚动前瞻和
问题描述
我有以下简化格式的多元时间序列/面板数据:
id,date,event_ind
1,2014-01-01,0
1,2014-01-02,1
1,2014-01-03,1
2,2014-01-01,1
2,2014-01-02,1
2,2014-01-03,1
3,2014-01-01,0
3,2014-01-02,0
3,2014-01-03,1
对于这个简化的示例,我希望按 id 分组的 event_ind 的未来 2 天总和
出于某种原因,改编这个例子仍然给我“索引不是单调错误”:如何在熊猫中进行前向滚动求和?
这是我的方法,在我调整之前,它原本适用于过去的分组滚动:
df.sort_values(['id','date'], ascending=[True,True], inplace=True)
df.reset_index(drop=True, inplace=True)
df['date'] = pd.DatetimeIndex(df['date'])
df.set_index(['date'], drop=True, inplace=True)
rolling_forward_2_day = lambda x: x.iloc[::-1].rolling('2D').sum().shift(1).iloc[::-1]
df['future_2_day_total'] = df.groupby(['id'], sort=False)['event_ind'].transform(rolling_forward_2_day)
df.reset_index(drop=False, inplace=True)
这是预期的结果:
id date event_ind future_2_day_total
0 1 2014-01-01 0 2
1 1 2014-01-02 1 1
2 1 2014-01-03 1 0
3 2 2014-01-01 1 2
4 2 2014-01-02 1 1
5 2 2014-01-03 1 0
6 3 2014-01-01 0 1
7 3 2014-01-02 0 1
8 3 2014-01-03 1 0
关于我可能做错了什么或高性能替代方案的任何提示都会很棒!
编辑:
一个快速的澄清。此示例已简化,有效的解决方案需要能够处理间隔不均匀/不规则的时间序列,这就是使用基于时间的索引滚动的原因。
解决方案
您仍然可以rolling
在此处使用,但将其与标志一起使用win_type='boxcar'
并在求和前后移动数据:
df['future_day_2_total'] = (
df.groupby('id').event_ind.shift(-1)
.fillna(0).groupby(df.id).rolling(2, win_type='boxcar')
.sum().shift(-1).fillna(0)
)
id date event_ind future_day_2_total
0 1 2014-01-01 0 2.0
1 1 2014-01-02 1 1.0
2 1 2014-01-03 1 0.0
3 2 2014-01-01 1 2.0
4 2 2014-01-02 1 1.0
5 2 2014-01-03 1 0.0
6 3 2014-01-01 0 1.0
7 3 2014-01-02 0 1.0
8 3 2014-01-03 1 0.0
推荐阅读
- php - 不从 db 获取所有产品
- ssh - 访问云代工文件系统(如 FTP)?
- groovy - 如何将字符串转换为 Groovy 中的现有对象?
- python - 如何使用记录器在特定日志文件中打印,而不在龙卷风应用程序的主管日志文件中打印
- react-native - 使用 react native、redux 对喜欢/不喜欢和喜欢计数进行乐观更新
- text - 组织模式导出到文本:使用 HTML 标签导出的引文
- android - 从 uri 的 Arraylist 在列表视图中显示图像
- blockchain - 链上和已安装的智能合约有什么区别?
- php - 动态显示上线/下线的人
- java - 自定义格式字符串:双括号中的参数 java