Причинная передискретизация: сумма за последний 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.