Панды: несоответствие частоты TimeGrouper
У меня есть следующий DataFrame:
df = pd.DataFrame({
'Buyer': 'Carl Mark Carl Joe Joe Carl'.split(),
'Quantity': [1,3,5,8,9,3],
'Date' : [
DT.datetime(2013,9,1,13,0),
DT.datetime(2013,9,1,13,5),
DT.datetime(2013,10,1,20,0),
DT.datetime(2013,10,3,10,0),
DT.datetime(2013,12,2,12,0),
DT.datetime(2013,12,2,14,0),
]})
df = df.set_index('Date', drop=False)
Со следующей функцией:
def f(frame):
cum_sum = 0
if (len(frame) > 0):
cum_sum = frame.Quantity.sum()
frame['cum_sum'] = cum_sum
return frame
x1 = df.groupby(pd.TimeGrouper('20M')).apply(f)
Я получаю вывод
Buyer Date Quantity cum_sum
Date
2013-09-01 13:00:00 Carl 2013-09-01 13:00:00 1 4
2013-09-01 13:05:00 Mark 2013-09-01 13:05:00 3 4
2013-10-01 20:00:00 Carl 2013-10-01 20:00:00 5 25
2013-10-03 10:00:00 Joe 2013-10-03 10:00:00 8 25
2013-12-02 12:00:00 Joe 2013-12-02 12:00:00 9 25
2013-12-02 14:00:00 Carl 2013-12-02 14:00:00 3 25
Как это возможно, что cum_sum первых двух строк не 25? Если я использую 'A' в качестве ежегодного квантификатора в функции TimeGrouper, то cum_sum из первых двух строк вычисляется правильно?
Спасибо
Энди
1 ответ
Решение
Вам нужно добавить closed='left'
к группировщику времени, иначе он не будет включать первый бин (и, следовательно, его в другую группу) и, кстати, опечатку в вашей функции: cum_sum
не sum_sum
(Pdb) df.groupby(TimeGrouper('20M',closed='left')).apply(f)
Buyer Date Quantity cum_sum
Date
2013-09-01 13:00:00 Carl 2013-09-01 13:00:00 1 29
2013-09-01 13:05:00 Mark 2013-09-01 13:05:00 3 29
2013-10-01 20:00:00 Carl 2013-10-01 20:00:00 5 29
2013-10-03 10:00:00 Joe 2013-10-03 10:00:00 8 29
2013-12-02 12:00:00 Joe 2013-12-02 12:00:00 9 29
2013-12-02 14:00:00 Carl 2013-12-02 14:00:00 3 29