Pandas Groupby Dates, затем Cumprod of Group? - PullRequest
0 голосов
/ 04 ноября 2018

У меня есть список значений с datetime:

     Datetime         Val 
[[2017-01-01 15:00:00, 2],
 [2017-02-05 19:00:00, 3],
 [2018-04-22 15:00:00, 6],
 [2018-08-02 13:00:00, 3],
 [2018-10-03 12:00:00, 3]]

Я хочу сгруппировать значения в N одинаковых интервалов по дате и времени, а затем получить список cumprod of vals для каждой группы. Если группа пуста, cumprod равен 1.

Мой текущий подход - вычисление первой и последней отметки времени, затем использование linspace для вычисления одинаково разнесенных интервалов даты и времени, вот где я застрял:

n = 5 # 5 equally sized bins
start = pd.Timestamp(df.iloc[0]['datetime'])
end = pd.Timestamp(df.iloc[-1]['datetime'])
bins = np.linspace(start.value, end.value, n+1) # n+1 as linspace is right bound including
groups = pd.to_datetime(bins).values

Возвращает:

 ['2017-01-01T15:00:00.000000000' '2017-05-09T14:24:00.000000000'
 '2017-09-14T13:48:00.000000000' '2018-01-20T13:12:00.000000000'
 '2018-05-28T12:36:00.000000000' '2018-10-03T12:00:00.000000000']

Вывод с 5 одинаково разнесенными ячейками и приведенными выше примерами значений может быть, например:

 output = [2*3, 1, 1, 6, 3*3] # 1 if there is no "Val" for a bin

Есть ли эффективный / чистый способ решить это? Я посмотрел в pd.Grouper, но не могу заставить работать значение freq для вывода одинаково распределенных групп даты и времени. Другое решение, которое я попробовал, - преобразование даты и времени в эпоху, а затем использование np.digitize для классификации по корзинам. Но это также не сработало. Цените любую помощь, также приветствуются решения Numpy.

1 Ответ

0 голосов
/ 04 ноября 2018

Вы можете использовать pd.cut, чтобы легко указать свои корзины. Тогда вам нужно groupby + prod.

df.groupby(pd.cut(df.Datetime, bins=5, right=False)).Val.prod()

Выход:

Datetime
[2017-01-01 15:00:00, 2017-05-09 14:24:00)           6
[2017-05-09 14:24:00, 2017-09-14 13:48:00)           1
[2017-09-14 13:48:00, 2018-01-20 13:12:00)           1
[2018-01-20 13:12:00, 2018-05-28 12:36:00)           6
[2018-05-28 12:36:00, 2018-10-04 03:21:25.200000)    9
Name: Val, dtype: int64

Мы автоматически получаем желаемое поведение отсутствующих групп, которые заполняются 1, потому что prod, пустые Series и ndarrays умножаются на 1.

import numpy as np

np.prod(pd.Series())
#1.0

np.prod(np.ndarray(shape=0))
#1.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...