в data.table?
(скользящее количество пользователей с датой логина в последние 30 дней)
я ничего кроме map_df по датам и подобных вариантов не придумал
вот типа такого убожества:
> library(data.table)
> library(magrittr)
> dates <- seq(as.Date('2023-09-01'), by = 1, length.out = 5)
>
> my_dt <- data.table(login_dt = dates) %>%
+ .[, list(user_id = sample(letters[1:5], sample(3, 1))), by = login_dt]
> my_dt
login_dt user_id
1: 2023-09-01 c
2: 2023-09-01 a
3: 2023-09-02 d
4: 2023-09-02 b
5: 2023-09-03 a
6: 2023-09-04 e
7: 2023-09-05 d
>
> purrr::map_df(dates, function(x) {
+ my_dt[
+ login_dt %between% c(x - 2, x),
+ list(
+ login_dt = x,
+ lb = x - 2,
+ n_users = uniqueN(user_id))
+ ]
+ })
login_dt lb n_users
1: 2023-09-01 2023-08-30 2
2: 2023-09-02 2023-08-31 4
3: 2023-09-03 2023-09-01 4
4: 2023-09-04 2023-09-02 4
5: 2023-09-05 2023-09-03 3
library(zoo) my_dt[,.(n=uniqueN(user_id)),.(login_dt)][,mau:=rollapplyr(n,width=30,FUN=sum,fill=NA)][]
так MAU же нельзя считать через сумму DAU
Я пару раз перечитал вот эту строчку и решил что можно (скользящее количество пользователей с датой логина в последние 30 дней)
Ну формально по математике. у меня 3 пользователя каждый день в течении месяца. Мое MAU =3 а не 90)
вообще, одна из древних продуктовых метрик залипания пользователя в продукте — это как раз dau / mau, так называемая stickiness %)
что-то похожее здесь писал: https://habr.com/ru/articles/558250/ https://habr.com/ru/articles/555476/
если я правильно понял, тот же map в основе
Сложно придумать что-то другое. Кумулятивный UniqeN с вычитанием? Не уверен вот так сходу, что это правильно будет))
Я не уверен что алгоритмически тут можно упростить и нигде не обмануться. Но так, чуть попроще это позволяет сделать {slider} slider::slide_period_dfr( my_dt, my_dt$login_dt, .period = "day", .before = 2L, \(x) x[ , .( dt_from = min(login_dt), dt_to = max(login_dt), users = uniqueN(user_id) ) ] )
Такой вариант my_dt[, my_dt[, .(n_users = uniqueN(user_id)), .(login_dt %between% c(lg_1 - 2, lg_1))], .(lg_1 = login_dt)][login_dt == TRUE]
о как. интересно. спасибо! никогда не думал, что %between% можно в группировку запихнуть
Если диапазон дат в таблице my_dt большой, то, вероятно, быстрее будет считать MAU через slider или вариантом ниже window <- data.table(start = dates - 2L, end = dates) my_dt[window, on = .(login_dt <= end, login_dt >= start)] %>% .[, .(n_users = uniqueN(user_id)), by = .(login_dt)]
https://t.me/r_in_action/352
код посмотрю, спасибо а картинка некорректная все же, несмотря на расшифровку в самом посте
Уж какая картинка нашлась, дело вообще не в ней. Далеко не каждый увидит ее кривизну.
Ну это как бы фиксированный таймфрейм, ему такое решение нужно было ?
Как я понял moving average, ему нужен динамический, плавающий? Типа среднее 30 дней на любом отрезке времени? Это больше временной ряд даже.
А что у меня не так?
Я по картинке понял что там только 3 таймфрейма вроде
Делаю вид, что не читал этого сообщения. И
Обсуждают сегодня