во многих маркетинговых анализах мы рассчитываем коэффициент удержания, однако, если в когортном периоде есть только заказ, мы говорим, что клиент вернулся.
Вместо того, чтобы рассматривать одноразовое использование как возвращенного пользователя, я хочу определить возвращаемого пользователя как 3-х разовые пользователи в течение месяца.
Вот MRE:
df = pd.DataFrame({
"user_id":[1,1,1,1,1,2,2,2],
"RegisterDate":["2001-01","2001-01","2001-01","2001-01","2001-01","2001-02","2001-02","2001-02"],
"RentDate":["2001-01","2001-02","2001-02","2001-02","2001-03", "2001-02","2001-03","2001-03"],
"start_time":[7,5,4,1,7,5,8,8]
})
, которое выглядит так:
user_id RegisterDate RentDate start_time
0 1 2001-01 2001-01 7
1 1 2001-01 2001-02 5
2 1 2001-01 2001-02 4
3 1 2001-01 2001-02 1
4 1 2001-01 2001-03 7
5 2 2001-02 2001-02 5
6 2 2001-02 2001-03 8
7 2 2001-02 2001-03 8
Я могу найти количество разовых возвращающихся пользователей выполнив
mre.groupby(["RegisterDate", "RentDate"]).agg({
"user_id":pd.Series.nunique,
"start_time":"count"}).rename(columns={"user_id":"TotalUser", "start_time":"TotalRents"})
, который выдает
TotalUser TotalRents
RegisterDate RentDate
2001-01 2001-01 1 1
2001-02 1 3
2001-03 1 1
2001-02 2001-02 1 1
2001-03 1 2
В нашем исходном пользовательском фрейме данных с user_id = 1 арендовался только один раз в 2001-01 и 2001-03 годах. Я хочу их игнорировать. Я не могу просто посмотреть на TotalRents и игнорировать строку, если она меньше 3, потому что будет несколько пользователей, некоторые могут арендовать 10 или более раз, а другие чуть более 3 раз.
Текущее решение:
x = df.groupby(["RegisterDate", "RentDate", "user_id"]).count().reset_index().rename(columns={"start_time":"count"}).copy()
x.loc[x["count"] >= 2].groupby(["RegisterDate", "RentDate"]).count()[["count"]]
Заранее спасибо.