Панды, катящиеся с несортированными временными рядами - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть CSV с 1M записей.Каждая запись - это уникальный сайт / продукт / дата.Я пытаюсь использовать .rolling, чтобы получить скользящее среднее для каждого сайта / продукта за несколько дат.Однако даты не сортируются в хронологическом порядке.У меня вопрос, если я использую функцию .rolling, подобную этой:

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

... будет ли скользящее среднее вычисляться в хронологическом порядке или порядке списка?Я хочу использовать хронологию и стараться не тратить время на сортировку записей 1M.

1 Ответ

0 голосов
/ 06 декабря 2018

Это действительно нужно отсортировать.Это становится очевидным, если вы задаете смещение в качестве размера окна (для datetime) вместо целого числа.

Пример данных

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
...