Циббл - Скользящие оконные функции по группам - PullRequest
0 голосов
/ 09 октября 2019

У меня есть набор дат, похожий на этот фиктивный образец. Он содержит данные за два месяца для цифровой активности пользователей.

df <- tibble::tribble(
     ~date,      ~user_id, ~app_id, ~total_usage,
  20190701, "18120439-aa",     383,          223,
  20190702, "18120439-aa",     383,          147,
  20190701, "18120439-ab",     382,           10,
  20190701, "18120439-ab",     383,          395,
  20190702, "18120439-ab",     383,          495,
  20190703, "18120439-ab",     383,          347,
  20190807, "18160102-aa",     262,            6,
  20190808, "18160102-aa",     262,           24,
  20190711, "18160102-aa",     382,            3,
  20190725, "18160102-aa",     382,           11,
  20190727, "18160102-aa",     382,           48,
  20190702, "18160102-aa",     383,            6,
  20190705, "18160102-aa",     383,           42,
  20190706, "18160102-aa",     383,          104,
  20190708, "18160102-aa",     383,           12,
  20190709, "18160102-aa",     383,           13,
  20190710, "18160102-aa",     383,          114,
  20190712, "18160102-aa",     383,          187,
  20190713, "18160102-aa",     383,           37,
  20190715, "18160102-aa",     383,           58,
  20190716, "18160102-aa",     383,           40,
  20190717, "18160102-aa",     383,           40,
  20190718, "18160102-aa",     383,           35,
  20190719, "18160102-aa",     383,           19,
  20190720, "18160102-aa",     383,           63,
  20190723, "18160102-aa",     383,            2,
  20190726, "18160102-aa",     383,           69,
  20190729, "18160102-aa",     383,           31,
  20190730, "18160102-aa",     383,           26,
  20190731, "18160102-aa",     383,           41,
  20190802, "18160102-aa",     383,           50,
  20190805, "18160102-aa",     383,           34,
  20190806, "18160102-aa",     383,           23,
  20190807, "18160102-aa",     383,           14
  )

Первая задача

Я создал объект tsibble с key=c(user_id, app_id) и date в качестве индекса. Сначала я попытался получить среднее использование на пользователя на app_id за весь период. Пользователь может быть в сети любое количество дней, 1 день, 10 дней, 30 или каждый день == 60 дней. Я хотел рассчитать среднее значение на основе числа пользователей в день активности.

пример: пользователи 18160102-aa были активны только два дня и использовали app_id 262, первый день использования 6 минут, второй день 24, так что среднее использование для этогоПользователь в течение всего периода для app_id = 262 составляет 15 минут.

Я использовал tsibble :: tile_dbl для вычисления среднего размера окна 60 (2 месяца = 60 дней) за весь период, а затем преобразовал его обратно в таблицуи удалите дубликат строки. например:

library(tidyverse)
library(tsibble)

df %>% 
#create a tsibble object
  as_tsibble(key = c(user_id, app_id), index = date) %>% 
  group_by_key() %>%
# calculate average during the activity period
  mutate(Avg_period = tile_dbl(total_usage, ~ mean(., na.rm = TRUE), .size = 60)) %>% 
  as_tibble() %>%
  select(-total_usage, -date) %>% 
  distinct()

Вывод кажется правильным, однако мне интересно, есть ли лучший способ сделать это без создания дубликата?

Второе задание

Как можноЯ устанавливаю размер окна, если я хочу рассчитать среднее и свернутое использование за последние 7 дней, 14 и 21 день из определенных дней?

1 Ответ

1 голос
/ 11 октября 2019

Это мой взгляд на первый вопрос. Нам не нужен объект tsibble для выполнения этой задачи. tile_dbl() создает временную переменную группировки date60 и использует group_by() + summarise() для вычисления средних значений.

library(tidyverse)
df %>% 
  group_by(user_id, app_id) %>% 
  mutate(date60 = tsibble::tile_dbl(date, ~ .[1], .size = 60)) %>% 
  group_by(date60, add = TRUE) %>% 
  summarise(avg_period = mean(total_usage, na.rm = TRUE))
#> # A tibble: 6 x 4
#> # Groups:   user_id, app_id [6]
#>   user_id     app_id   date60 avg_period
#>   <chr>        <dbl>    <dbl>      <dbl>
#> 1 18120439-aa    383 20190701      185  
#> 2 18120439-ab    382 20190701       10  
#> 3 18120439-ab    383 20190701      412. 
#> 4 18160102-aa    262 20190807       15  
#> 5 18160102-aa    382 20190711       20.7
#> 6 18160102-aa    383 20190702       46.1

Создано в 2019-10-11 для представпакет (v0.3.0)

Что касается второго вопроса, я бы предложил посмотреть на пакет slide просто для расчета скользящего окна, включая дни из определенногодней с slide_index(). Tsibble будет постепенно отказываться от функций скользящего окна в пользу slide . Вы можете искать альтернативные решения, используя slide .

...