У меня есть блок данных транзакций. Один из моих столбцов - дата (datetime64 [ns]). Я делаю группу пользователей (электронная почта как id). Меня интересует изменчивость времени между заказами каждого пользователя. Так что я ищу в группе, чтобы найти стандартное отклонение разницы между датами (в днях) для каждого пользователя. Если у пользователя две или менее транзакции, ответ должен быть равен 0. Это часть фрейма данных (я изменил некоторые вещи вручную):
df
email date
0 [email protected] 2018-05-01 12:29:59
1 [email protected] 2018-07-11 13:43:22
2 [email protected] 2018-09-21 12:29:23
3 [email protected] 2018-09-01 09:21:43
4 [email protected] 2018-04-30 12:29:30
5 [email protected] 2018-03-22 12:29:23
6 [email protected] 2018-07-21 12:29:17
7 [email protected] 2018-08-11 12:29:41
8 [email protected] 2018-05-23 12:29:14
9 [email protected] 2018-06-01 12:29:17
10 [email protected] 2018-07-18 12:29:20
11 [email protected] 2018-08-21 12:29:40
12 [email protected] 2018-10-01 12:29:31
13 [email protected] 2018-06-01 12:29:20
14 [email protected] 2018-05-21 12:29:18
15 [email protected] 2018-07-20 12:29:59
Я пробовал много способов, но все равно не могу это получить. Пожалуйста помоги.
Для последовательных различий, которые, кажется, имеют наибольший смысл с учетом вашего объяснения:
df.sort_values('date').groupby('email').apply(lambda x: x.date.diff().std()).fillna(0)
email
[email protected] 0 days 00:00:00
[email protected] 48 days 05:04:12.988006
[email protected] 0 days 00:00:00
[email protected] 0 days 00:00:00
[email protected] 0 days 00:00:00
[email protected] 0 days 00:00:00
[email protected] 14 days 18:10:16.764069
[email protected] 23 days 06:17:04.453408
dtype: timedelta64[ns]
.std()
будет пустым для групп с 1 значением, отличным от нуля, и поскольку. diff
уменьшает количество ненулевых наблюдений на 1, это автоматически возвращает NaN
для любых групп с 2 или менее измерениями, которые мы заполняем 0.
Также просто знайте, что по умолчанию для pandas
следует использовать N-1
степени свободы.
.diff()
вычисляет первое различие дат в каждой группе (т. е. текущая строка - предыдущая строка), но здесь необходимо вычесть одну и ту же (произвольную) дату из каждой даты.