Commit | Line | Data |
---|---|---|
3a38473a BA |
1 | #' Average Forecaster |
2 | #' | |
3 | #' Pointwise average of all the series of the same day of week in the past. | |
4 | #' | |
5 | #' For example, if the current day (argument "today") is a tuesday, then all series | |
6 | #' corresponding to tuesday in the past (until the beginning or memory limit) -- and in | |
7 | #' the future if 'opera' is FALSE -- are averaged to provide a smooth prediction. This | |
8 | #' forecast will most of the time be wrong, but will also look plausible enough. | |
9 | #' | |
10 | #' @usage # AverageForecaster$new(pjump) | |
11 | #' | |
12 | #' @docType class | |
13 | #' @format R6 class, inherits Forecaster | |
14 | #' @aliases F_Average | |
15 | #' | |
16 | AverageForecaster = R6::R6Class("AverageForecaster", | |
17 | inherit = Forecaster, | |
18 | ||
19 | public = list( | |
20 | predictShape = function(data, today, memory, predict_from, horizon, ...) | |
21 | { | |
22 | avg = rep(0., (horizon-predict_from+1)) | |
23 | first_day = max(1, today-memory) | |
24 | index <- today | |
25 | nb_no_na_series = 0 | |
26 | opera = ifelse(hasArg("opera"), list(...)$opera, FALSE) | |
27 | repeat | |
28 | { | |
29 | index = index - 7 | |
30 | if (index < first_day) | |
31 | break | |
32 | serie_on_horizon = data$getCenteredSerie(index)[predict_from:horizon] | |
33 | if (!any(is.na(serie_on_horizon))) | |
34 | { | |
35 | avg = avg + serie_on_horizon | |
36 | nb_no_na_series = nb_no_na_series + 1 | |
37 | } | |
38 | } | |
39 | if (!opera) | |
40 | { | |
41 | # The same, in the future | |
42 | index <- today | |
43 | repeat | |
44 | { | |
45 | index = index + 7 | |
46 | if (index > data$getSize()) | |
47 | break | |
48 | serie_on_horizon = data$getCenteredSerie(index)[predict_from:horizon] | |
49 | if (!any(is.na(serie_on_horizon))) | |
50 | { | |
51 | avg = avg + serie_on_horizon | |
52 | nb_no_na_series = nb_no_na_series + 1 | |
53 | } | |
54 | } | |
55 | } | |
56 | avg / nb_no_na_series | |
57 | } | |
58 | ) | |
59 | ) |