Причинная передискретизация: сумма за последний X <time_unit>

Скажем, что у меня есть следующие значения:

                                   money_spent
time                 
2014-10-06 17:59:40.016000-04:00      1.832128
2014-10-06 17:59:41.771000-04:00      2.671048
2014-10-06 17:59:43.001000-04:00      2.019434
2014-10-06 17:59:44.792000-04:00      1.294051
2014-10-06 17:59:48.741000-04:00      0.867856

Я надеюсь измерить много денег, потраченных каждые 2 секунды. Более конкретно, для каждой отметки времени на выходе мне нужно увидеть деньги, потраченные на за последние 2 секунды.

Когда я это сделаю:

df.resample('2S', how='last')

Я получаю:

                                money_spent
time               
2014-10-06 17:59:40-04:00          2.671048
2014-10-06 17:59:42-04:00          2.019434
2014-10-06 17:59:44-04:00          1.294051
2014-10-06 17:59:46-04:00               NaN
2014-10-06 17:59:48-04:00          0.867856

который не, что я ожидал бы. Для начала отметим, что первая запись в ремаркетированном df 2.671048, но это время 17:59:40, хотя, согласно исходному фреймворку, деньги не были потрачены пока. Как это возможно?

Ответ 1

попробуйте использовать how=np.sum:

df.resample('2S', how=np.sum, closed='left', label='right')

Edit

Что касается closed и label:

Это означает: от левого интервала и помечен датой с правого конца интервала.  (2 секунды, например [1, 1,2, 1,5, 1,9, 2)). И из docs:

closed: {'right', left} Какая сторона интервала бункера закрыта

label: {'right,' left} Какая метка края бункера для метки ведра с

Ответ 2

Вы можете добавлять события в фрейм, так как каждый потраченный доллар покидает систему через две секунды; Тогда вам нужно всего лишь кумулятивная сумма;

Существует вероятность того, что два события могут пересекаться; в этом случае после последнего шага вам нужно .drop_duplicate индексы времени, взяв последнее значение money_spent для каждого повторяющегося значения time:

>>> df
                            money_spent
time                                   
2014-10-06 21:59:40.016000        1.832
2014-10-06 21:59:41.771000        2.671
2014-10-06 21:59:43.001000        2.019
2014-10-06 21:59:44.792000        1.294
2014-10-06 21:59:48.741000        0.868

>>> xdf = df.copy()   # make a copy of the original frame
>>> xdf['money_spent'] *= -1  # negate the value of `money_spent`
>>> xdf.index += np.timedelta64(2, 's')  # move the time span 2 seconds 

теперь concat с исходным фреймом sort_index и найдите кумулятивную сумму:

>>> pd.concat([df, xdf]).sort_index().cumsum()
                            money_spent
2014-10-06 21:59:40.016000    1.832e+00
2014-10-06 21:59:41.771000    4.503e+00
2014-10-06 21:59:42.016000    2.671e+00
2014-10-06 21:59:43.001000    4.690e+00
2014-10-06 21:59:43.771000    2.019e+00
2014-10-06 21:59:44.792000    3.313e+00
2014-10-06 21:59:45.001000    1.294e+00
2014-10-06 21:59:46.792000   -4.441e-16
2014-10-06 21:59:48.741000    8.679e-01
2014-10-06 21:59:50.741000   -4.441e-16

Существует ошибка точности с плавающей запятой, которая отображается как очень маленькие значения, такие как -4.441e-16, в противном случае цифры выглядят правильно для меня:

>>> _['money_spent'].round(15)
2014-10-06 21:59:40.016000    1.832
2014-10-06 21:59:41.771000    4.503
2014-10-06 21:59:42.016000    2.671
2014-10-06 21:59:43.001000    4.690
2014-10-06 21:59:43.771000    2.019
2014-10-06 21:59:44.792000    3.313
2014-10-06 21:59:45.001000    1.294
2014-10-06 21:59:46.792000   -0.000
2014-10-06 21:59:48.741000    0.868
2014-10-06 21:59:50.741000   -0.000
Name: money_spent, dtype: float64

Ответ 3

Причина, по которой первый элемент в вашем возвращаемом массиве равен 2.67, заключается в том, что вы используете метод last для how для повторной настройки ваших данных. Если вы хотите изменить, где первая точка перевыбора будет читать 1.832128, используйте how='first' kwarg.