У меня есть набор данных, в котором есть следующие столбцы: дата, идентификатор, значение. Затем мне нужна текущая сумма за предыдущие 3 дня (включая сам текущий день) для каждого идентификатора.
Я пытался посмотреть на несколько похожих вопросов в StackOverflow, но ни один из них не дал мне правильного результата.
Если идентификатор был замечен только один раз за последние 3 дня, сумма должна быть равна этому единственному значению. То же самое происходит, если он был замечен два раза в течение последних 3 дней, очевидно.
Желаемый результат - столбец "sum_3days":
date id value sum_3days
01/01/2019 1 2 2
01/01/2019 2 3 3
02/01/2019 1 2 4
02/01/2019 2 5 8
03/01/2019 1 2 6
03/01/2019 2 1 9
04/01/2019 1 6 10
05/01/2019 1 3 11
06/01/2019 1 6 15
06/01/2019 2 8 8
07/01/2019 1 3 12
07/01/2019 2 2 10
Таким образом, сумма должна «давать мне сумму всех значений, которые каждый идентификатор имел за последние 3 дня».
@DroidX86 выглядит скорее как groupby
, rolling
и cumsum
...
Я думаю, что ваш расчет sum_3days
неверен? например, 06/01/2019 2
должно быть 14
, а не 8
..?
Вы пробовали функцию
Cumsum()
Эта веб-страница может помочь http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.cumsum.html
Да, но сложная часть состоит в том, чтобы сделать отдельную «cumsum» для каждого идентификатора, а также установить количество дней равным 3.
Используйте groupby
, transform
и lambda
с rolling
и sum
:
df['sum_3days'] = (df.groupby(['id'])['value']
.transform(lambda x: x.rolling(3, min_periods=1).sum()))
[выход]
date id value sum_3days
0 2019-01-01 1 2 2
1 2019-01-01 2 3 3
2 2019-02-01 1 2 4
3 2019-02-01 2 5 8
4 2019-03-01 1 2 6
5 2019-03-01 2 1 9
6 2019-04-01 1 6 10
7 2019-05-01 1 3 11
8 2019-06-01 1 6 15
9 2019-06-01 2 8 14
10 2019-07-01 1 3 12
11 2019-07-01 2 2 11
Вероятно, вы ищете метод
cumsum()
: pandas.pydata.org/pandas-docs/stable/reference/api/…