Tsibble-按组滚动窗口功能

时间:2019-10-09 18:47:16

标签: time-series tidyverse rolling-computation tsibble

我有一个类似这个虚拟样本的日期集。它包含两个月的数字用户活动数据。

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
  )

第一个任务

我使用key=c(user_id, app_id)date作为索引创建了一个对象对象。首先,我尝试获得整个期间每个用户每个app_id的平均使用量。用户可以在线任何天数,1天,10天,30天或每天== 60天。我想根据活动日的用户数来计算rollapply平均值。

示例:用户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 个答案:

答案 0 :(得分:1)

这是我对第一个问题的看法。我们不需要倾斜对象来执行此任务。 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

reprex package(v0.3.0)于2019-10-11创建

关于第二个问题,我建议看一下slide软件包,仅用于滚动窗口计算,包括使用slide_index()从特定天数开始的天数。 Tsibble将逐渐弃用滚动窗口功能,而推荐使用 slide 。您可能希望使用幻灯片查找替代解决方案。