python pandas объединяет данные транзакций во временные рамки по запросу клиента

#python #pandas

#python #pandas

Вопрос:

у меня есть фрейм данных с транзакционными данными, например

                        date            billing.email            DateTime      first_orderdate  first_order  total
date_created                                                                                                      
2020-10-13T01:53:03  2020-10  abc@hotmail.de 2020-10-13 01:53:03  2020-08-23T07:08:02            0  55.24
2020-09-29T01:52:46  2020-09  abc@hotmail.de 2020-09-29 01:52:46  2020-08-23T07:08:02            0  55.24
2020-09-20T07:23:03  2020-09  abc@hotmail.de 2020-09-20 07:23:03  2020-08-23T07:08:02            0  55.24
2020-09-15T01:38:03  2020-09  abc@hotmail.de 2020-09-15 01:38:03  2020-08-23T07:08:02            0  55.24
2020-09-01T01:23:03  2020-09  abc@hotmail.de 2020-09-01 01:23:03  2020-08-23T07:08:02            0  55.24
2020-08-23T07:08:02  2020-08  abc@hotmail.de 2020-08-23 07:08:02  2020-08-23T07:08:02            1  55.24
  

на данный момент это только один клиент (на основе электронной почты) и небольшие временные рамки для разработки.

я хочу создать обзор ценности клиента по определенным временным рамкам и для каждого клиента

 billing.email   first_orderdate rev_after_2M    rev_after6M     rev_after12M
abc@hotmail.de  2020-08             331,40          331,40          331,40
  

Теперь я бы перебрал каждого отдельного клиента и рассчитал это индивидуально, но должен быть простой способ pandas… верно?
цикл будет занимать очень много времени.

спасибо за любую подсказку E.

Комментарии:

1. На каком столбце даты должен основываться «временной интервал»? Так, например, rev_after6M , это в течение 6 месяцев date_created после , DateTime , first_orderdate , и т. Д.?

2. привет. извините. он должен сравнивать DateTime с first_orderdate n Месяц

Ответ №1:

Вот одно из возможных решений, использующее groupby каждое электронное письмо и использующее некоторую логику, чтобы проверить, произошли ли даты покупки в течение 2, 6, 12 месяцев после первого заказа.

 import pandas as pd
import numpy as np

# Ensure datetime format on all datetime columns
df[['DateTime','first_orderdate']] = df[['DateTime','first_orderdate']].apply(pd.to_datetime)

df['rev_after_2M'] = ((df.DateTime - df.first_orderdate)/np.timedelta64(1, 'M') <= 2) * df.total
df['rev_after_6M'] = ((df.DateTime - df.first_orderdate)/np.timedelta64(1, 'M') <= 6) * df.total
df['rev_after_12M'] = ((df.DateTime - df.first_orderdate)/np.timedelta64(1, 'M') <= 12) * df.total

df.groupby(
    ['billing.email', df.first_orderdate.dt.date])[['rev_after_2M', 'rev_after_6M', 'rev_after_12M']]
  .sum().reset_index()
  

Хитрость здесь заключается в том, чтобы сначала создать столбец индикатора, в котором говорится: «происходит ли это datetime в течение 2 месяцев (как определено numpy of first_orderdate ?» Если это так, это возвращает True результат, и мы умножаем его на значение этой строки ( total ) . True * value = value и False * value = 0, так что в итоге эти 3 столбца представляют только стоимость заказа, если это произошло в течение 2, 6, 12 месяцев.

Последний шаг — просто сгруппировать по электронной почте клиента и дате первого заказа (как у вас в вашем примере), а затем суммировать доход за каждый период. Результирующий фрейм данных (я добавил еще одно электронное письмо для иллюстрации) будет выглядеть следующим образом:

     billing.email     first_orderdate   rev_after_2M    rev_after_6M rev_after_12M
0   abc@hotmail.de    2020-08-23        331.44          331.44       331.44
1   banana@hotmail.de 2020-08-23        55.24           55.24        55.24