Python 带Datetime索引的熊猫滚动前瞻和

Python 带Datetime索引的熊猫滚动前瞻和,python,pandas,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 对于这个简化的示例,我希望事件的未来2天总和按id分组 出于某种原因,修改此示例仍然会给我“索引不是单调错误”: 以下是我的方法,在我采用该方法之前

我有以下简化格式的多元时间序列/面板数据:

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
对于这个简化的示例,我希望事件的未来2天总和按id分组

出于某种原因,修改此示例仍然会给我“索引不是单调错误”:

以下是我的方法,在我采用该方法之前,该方法在过去的集团滚动中发挥了作用:

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
任何关于我可能做错了什么或高性能替代方案的提示都将非常好

编辑:


一个快速的澄清。这个例子是简化的,有效的解决方案需要能够处理间隔不均匀/不规则的时间序列,这就是为什么使用基于时间的索引进行滚动。

您仍然可以在这里使用
滚动,但将其与标志
win\u 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

“boxcar”很棒。您是否有一个好的资源来准确解释什么是boxcar win类型以及其他win_类型+感谢你的贡献!不幸的是,这种巧妙的shift()用法只适用于这个简化的示例,而不适用于我的实际任务。在我的实际任务中,我将在未来365天内滚动。@Pylander我必须对其进行测试,但这仍然有效,您只需更改最后的换档量。@ScottBoston我只知道boxcar是在我与
SciPy
一起使用时才知道的。关于不同窗口类型的pandas文档严重缺乏。如果我有时间把一些例子放在一起,我可能会考虑向文件提交一个拉请求。@ USSR34033:我认为问题是,在我的实际情况中,这些实际上不是干净和完整的时间序列,所以我不能使用Shift,需要使用DATETIME索引。