#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