Создание n-time карты сохранения времени использования - PullRequest
0 голосов
/ 07 апреля 2020

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

Вместо того, чтобы рассматривать одноразовое использование как возвращенного пользователя, я хочу определить возвращаемого пользователя как 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"]]

Заранее спасибо.

...