我有一个包含 1M 记录的 CSV。每条记录都是唯一的站点/产品/日期。我正在尝试使用 .rolling 来获取每个站点/产品在多个日期的移动平均值。但是,日期不是按时间顺序排列的。我的问题是如果我使用类似这样的 .rolling 函数:
df.groupby(level='IDs').apply(lambda x: x.rolling(window=2).sum())
...滚动平均值会按时间顺序还是列表顺序计算?我想要按时间顺序并试图避免让代码花时间对 1M 记录进行排序。
我有一个包含 1M 记录的 CSV。每条记录都是唯一的站点/产品/日期。我正在尝试使用 .rolling 来获取每个站点/产品在多个日期的移动平均值。但是,日期不是按时间顺序排列的。我的问题是如果我使用类似这样的 .rolling 函数:
df.groupby(level='IDs').apply(lambda x: x.rolling(window=2).sum())
...滚动平均值会按时间顺序还是列表顺序计算?我想要按时间顺序并试图避免让代码花时间对 1M 记录进行排序。
它确实需要排序。如果您给它一个偏移量作为窗口大小(对于日期时间)而不是整数,这将变得很明显。
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