Я хочу получить количество и сумму значений в течение +/- 7 дней для столбца после того, как кадр данных сгруппирован в определенный столбец
Пример данных (отредактированный для отражения моего реального набора данных):
group | date | amount
-------------------------------------------
A | 2017-12-26 04:20:20 | 50000.0
A | 2018-01-17 00:54:15 | 60000.0
A | 2018-01-27 06:10:12 | 150000.0
A | 2018-02-01 01:15:06 | 100000.0
A | 2018-02-11 05:05:34 | 150000.0
A | 2018-03-01 11:20:04 | 150000.0
A | 2018-03-16 12:14:01 | 150000.0
A | 2018-03-23 05:15:07 | 150000.0
A | 2018-04-02 10:40:35 | 150000.0
сгруппировать по group
, а затем по сумме date-7
<<code>date <<code>date+7
Результаты, которые я хочу:
group | date | amount | grouped_sum
-----------------------------------------------------------
A | 2017-12-26 04:00:00 | 50000.0 | 50000.0
A | 2018-01-17 00:00:00 | 60000.0 | 60000.0
A | 2018-01-27 06:00:00 | 150000.0 | 250000.0
A | 2018-02-01 01:00:00 | 100000.0 | 250000.0
A | 2018-02-11 05:05:00 | 150000.0 | 150000.0
A | 2018-03-01 11:00:04 | 150000.0 | 150000.0
A | 2018-03-16 12:00:01 | 150000.0 | 150000.0
A | 2018-03-23 05:00:07 | 100000.0 | 100000.0
A | 2018-04-02 10:00:00 | 100000.0 | 100000.0
Быстрый фрагмент для получения набора данных:
group = 9 * ['A']
date = pd.to_datetime(['2017-12-26 04:20:20', '2018-01-17 00:54:15',
'2018-01-27 06:10:12', '2018-02-01 01:15:06',
'2018-02-11 05:05:34', '2018-03-01 11:20:04',
'2018-03-16 12:14:01', '2018-03-23 05:15:07',
'2018-04-02 10:40:35'])
amount = [50000.0, 60000.0, 150000.0, 100000.0, 150000.0,
150000.0, 150000.0, 150000.0, 150000.0]
df = pd.DataFrame({'group':group, 'date':date, 'amount':amount})
Бит объяснения:
- 2-я строка - 40, потому что она суммирует данные для A в периоды 2018-01-14 и 2018-01-15
- 4-я строка - 30, потому что она суммирует данные для B за период 2018-01-03 + следующие 7 дней
- 6-я строка - 30, потому что она суммирует данные для B за период 2018-01-03 + предыдущие 7 дней.
Я понятия не имею, как сделать сумму за период диапазона дат. Я мог бы сделать это, если сделаю так:
1.Создайте еще один столбец, в котором будут показаны дата-7 и дата + 7 для каждой строки
group | date | amount | date-7 | date+7
-------------------------------------------------------------
A | 2017-12-26 | 50000.0 | 2017-12-19 | 2018-01-02
A | 2018-01-17 | 60000.0 | 2018-01-10 | 2018-01-24
2.счетная сумма в диапазоне дат: df[df.group == 'A' & df.date > df.date-7 & df.date < df.date+7].amount.sum()
3. Но этот метод довольно утомителен.
РЕДАКТИРОВАТЬ (2018-09-01):
Ниже описан этот метод на основе ответа @jezrael, который работает для меня, но работает только для одной группы:
t = pd.Timedelta(7, unit='d')
def g(row):
res = df[(df.created > row.created - t) & (df.created < row.created + t)].amount.sum()
return res
df['new'] = df.apply(g, axis=1)