Как рассчитать среднее количество дней между первым и вторым заказом в кадре данных, который содержит более 2 заказов на клиента? - PullRequest
4 голосов
/ 20 сентября 2019

У меня есть кадр данных, подобный следующему:

  id_cliente    id_ordine data_ordine id_medium
0  madinside  IML-0042758  2016-08-23   1190408
1  lisbeth19  IML-0071225  2017-02-26   1205650
2  lisbeth19  IML-0072944  2017-03-15   1207056
3  lisbeth19  IML-0077676  2017-05-12   1211395
4  lisbeth19  IML-0077676  2017-05-12   1207056
5  madinside  IML-0094979  2017-09-29   1222195
6  lisbeth19  IML-0099675  2017-11-15   1211446
7  lisbeth19  IML-0099690  2017-11-15   1225212
8  lisbeth19  IML-0101439  2017-12-02   1226511
9  lisbeth19  IML-0109883  2018-03-14   1226511

Я хотел бы добавить три столбца:

  • первый столбец может быть назван "номер заказа на клиента " и должен соответствовать порядку заказов, сделанных тем же клиентом.
    Таким образом, заказ IML-0042758 должен быть 1, IML-0071225 долженбудет 1, IML-0072944 должно быть 2, IML-0077676 должно быть 3, IML-0094979 должно быть 2 и т. д.

  • второй столбец может быть назван "дни между первым и n порядком одного и того же клиента" и показывает разницу "data_ordine" (datetimeстолбец) между различными заказами, сделанными одним и тем же клиентом.
    Таким образом, значения для первых 6 строк будут: 0 (2016-08-23 - 2016-08-23), 0 (2017-02-26 - 2017-02-26), 17 (2017-03-15 - 2017-02-26), 75 (2017-05-12 - 2017-02-26), 75 (2017-05-12 - 2017-02-26), 402 (2017-09-29 - 2017-02-26).

  • третий столбец может быть назван "дни между первым и n порядком одного и того же id_medium" и показывает "data_ordine" разницу(столбец даты и времени) между различными заказами по id_medium .
    Таким образом, значения для первых 6 строк будут: 0 (2016-08-23 - 2016-08-23), 0 (2017-02-26 - 2017-02-26), 0 (2017-03-15 - 2017-03-15), 0 (2017-05-12 - 2017-05-12), 58 (2017-05-12 -2017-03-15, потому что средний "1207056" заказан во второй раз), 0 (2017-09-29 - 2017-09-29).

В конце я хотел бы подсчитать, сколько времени в среднем требуется клиенту, чтобы сделать второй заказ, третий заказ, четвертый заказ и т. Д.
Исколько времени в среднем занимает клиент, чтобы сделать второй, третий (и т. д.) заказ на тот же id_medium.

1 Ответ

2 голосов
/ 20 сентября 2019

Сначала преобразуйте в datetime и sort, чтобы вычисления были надежными.

  • В первом столбце мы можем использовать groupby + ngroup для маркировки каждого заказа, затем мы вычитаем минимальное значение от каждого человека, чтобы все они начинались с 1
  • Дни с первогоДля заказа используйте groupby + transform, чтобы получить первую дату каждого клиента, затем вычтите
  • Третий столбец такой же, просто добавьте id_medium к группировке

Код:

df['data_ordine'] = pd.to_datetime(df['data_ordine']) 
df = df.sort_values('data_ordine')

df['Num_ords'] = df.groupby(['id_cliente', 'id_ordine']).ngroup()
df['Num_ords'] = df.Num_ords - df.groupby(['id_cliente']).Num_ords.transform('min')+1

df['days_bet'] = (df.data_ordine -df.groupby('id_cliente').data_ordine.transform('min')).dt.days

df['days_bet_id'] = (df.data_ordine - df.groupby(['id_cliente', 'id_medium']).data_ordine.transform('min')).dt.days

Вывод:

  id_cliente    id_ordine data_ordine  id_medium  Num_ords  days_bet  days_bet_id
0  madinside  IML-0042758  2016-08-23    1190408         1         0            0
1  lisbeth19  IML-0071225  2017-02-26    1205650         1         0            0
2  lisbeth19  IML-0072944  2017-03-15    1207056         2        17            0
3  lisbeth19  IML-0077676  2017-05-12    1211395         3        75            0
4  lisbeth19  IML-0077676  2017-05-12    1207056         3        75           58
5  madinside  IML-0094979  2017-09-29    1222195         2       402            0
6  lisbeth19  IML-0099675  2017-11-15    1211446         4       262            0
7  lisbeth19  IML-0099690  2017-11-15    1225212         5       262            0
8  lisbeth19  IML-0101439  2017-12-02    1226511         6       279            0
9  lisbeth19  IML-0109883  2018-03-14    1226511         7       381          102
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...