熊猫按未排序的时间序列滚动

时间:2018-12-06 18:20:22

标签: pandas group-by pandas-groupby rolling-sum

我有一个包含1M条记录的CSV。每个记录都是唯一的站点/产品/日期。我正在尝试使用.rolling来获取多个日期中每个网站/产品的移动平均值。但是,日期不是按时间顺序排序的。我的问题是,是否使用类似于以下内容的.rolling函数:

df.groupby(level='IDs').apply(lambda x: x.rolling(window=2).sum())

...滚动平均值将按时间顺序还是列表顺序进行计算?我想按时间顺序排列,并尽量避免让代码花时间对1M记录进行排序。

1 个答案:

答案 0 :(得分:0)

它确实需要排序。如果您给它一个偏移量作为窗口大小(用于日期时间)而不是一个整数,这将变得很明显。

样本数据

import pandas as pd
n = 6
df = pd.DataFrame({'date': pd.date_range('2018-01-01', '2018-01-03', periods=n),
                   'val': range(n)})
df = df.set_index('date')

订购时:

df.rolling(2, on='date').sum()
                 date  val
0 2018-01-01 00:00:00  NaN
1 2018-01-01 09:36:00  1.0
2 2018-01-01 19:12:00  3.0
3 2018-01-02 04:48:00  5.0
4 2018-01-02 14:24:00  7.0
5 2018-01-03 00:00:00  9.0

不排序时,不排序也不遵守日期排序。

df.sample(frac=1, random_state=123).rolling(2, on='date').sum()
                 date  val
1 2018-01-01 09:36:00  NaN
3 2018-01-02 04:48:00  4.0
4 2018-01-02 14:24:00  7.0
0 2018-01-01 00:00:00  4.0
2 2018-01-01 19:12:00  2.0
5 2018-01-03 00:00:00  7.0

现在,如果您希望获得2天的总和,您可以执行以下操作:

df.rolling(window='2D', on='date').sum()
                 date   val
0 2018-01-01 00:00:00   0.0
1 2018-01-01 09:36:00   1.0
2 2018-01-01 19:12:00   3.0
3 2018-01-02 04:48:00   6.0
4 2018-01-02 14:24:00  10.0
5 2018-01-03 00:00:00  15.0

但是,如果不进行排序,则会收到一条错误消息,指示您应该首先进行排序:

df.sample(frac=1, random_state=123).rolling(window='2D', on='date').sum()
ValueError: date must be monotonic