169 похожих чатов

Уважаемые, у меня очень тупой вопрос. как бы вы считали MAU

в 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

23 ответов

19 просмотров

library(zoo) my_dt[,.(n=uniqueN(user_id)),.(login_dt)][,mau:=rollapplyr(n,width=30,FUN=sum,fill=NA)][]

Philipp-Upravitelev Автор вопроса
Ivan Struzhkov
library(zoo) my_dt[,.(n=uniqueN(user_id)),.(login_...

так MAU же нельзя считать через сумму DAU

Philipp Upravitelev
так MAU же нельзя считать через сумму DAU

Я пару раз перечитал вот эту строчку и решил что можно (скользящее количество пользователей с датой логина в последние 30 дней)

Ілія Малекі
А почему?

Ну формально по математике. у меня 3 пользователя каждый день в течении месяца. Мое MAU =3 а не 90)

Philipp-Upravitelev Автор вопроса
Ілія Малекі
А ой-ой..

вообще, одна из древних продуктовых метрик залипания пользователя в продукте — это как раз dau / mau, так называемая stickiness %)

что-то похожее здесь писал: https://habr.com/ru/articles/558250/ https://habr.com/ru/articles/555476/

Philipp-Upravitelev Автор вопроса
Ilya Shutov
что-то похожее здесь писал: https://habr.com/ru/ar...

если я правильно понял, тот же map в основе

Philipp Upravitelev
если я правильно понял, тот же 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]

Philipp-Upravitelev Автор вопроса
Vadim Zotin
Такой вариант my_dt[, my_dt[, .(n_users = uniqueN(...

о как. интересно. спасибо! никогда не думал, что %between% можно в группировку запихнуть

Philipp Upravitelev
о как. интересно. спасибо! никогда не думал, что %...

Если диапазон дат в таблице 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

Philipp-Upravitelev Автор вопроса
Ilya Shutov
https://t.me/r_in_action/352

код посмотрю, спасибо а картинка некорректная все же, несмотря на расшифровку в самом посте

Philipp Upravitelev
код посмотрю, спасибо а картинка некорректная все...

Уж какая картинка нашлась, дело вообще не в ней. Далеко не каждый увидит ее кривизну.

Ilya Shutov
https://t.me/r_in_action/352

Ну это как бы фиксированный таймфрейм, ему такое решение нужно было ?

Ilya Shutov
В смысле?

Как я понял moving average, ему нужен динамический, плавающий? Типа среднее 30 дней на любом отрезке времени? Это больше временной ряд даже.

Ilya Shutov
А что у меня не так?

Я по картинке понял что там только 3 таймфрейма вроде

@quadrivium
Я по картинке понял что там только 3 таймфрейма вр...

Делаю вид, что не читал этого сообщения. И

Похожие вопросы

Обсуждают сегодня

а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Добрый день. Хочу сделать отрисовку по команде на панели. Почему-то рисуется только при втором вызове. С чем может быть связано, не подскажете? procedure TForm1.FormDblClick(...
Kirill Filippenok
20
Всем доброго дня! Подскажите может кто использовал связку Pagebuilder + Clientsetting. Сами параметры с типом pagebuilder в модуле Clientsetting работают нормально, можно такж...
Александр Добриков
12
А почему в си некоторые вещи работают с двойными кавычками некоторые с одинарными? Нельзя было все сделать с одними или чтоб работало с разными? например чтоб выводить строки ...
.
15
Всем привет! Нужен совет от опытных. Переношу свой проект с Делфи 10.2 Токио на Лазарус 3.2 установленный через инсталлятор fpcupdeluxe-x86_64-win64. При импортировании проект...
Дмитрий Завгородний
7
Всем привет! Подскажите. Я написал приложение на Delphi 10.2 Tokyo под Windows 10. И передо мной стал вопрос о том чтобы сделать это приложение кроссплатформенным (под Linux и...
Дмитрий Завгородний
24
Good afternoon, I just started learning php in conjunction with mysql. I am registering a system on a local Mamp server using phpMyAdmin. It seems to be stored normally in the...
ManGo
1
Эх кто-то пришел и весь праздник испортил :( You need complex FBX scene importing setup to change things on import? good luck with that. You need navigation and pathfinding? g...
Serg Gini
5
Добрый день! Такая проблема возникла, написал код на Python, который компилирует, собирает и запускает файлы .s А в случае работы нужно то же самое делать для .asm Чем эти фа...
A Mori
5
Всем привет! procedure TForm1.FormCreate(Sender: TObject); type TStartEnd = record S: Byte; E: Byte; end; var a, b: TStartEnd; begin {1} a.S := 1; {2} a.E := 2; ...
Руслан Михайлович
10
Карта сайта