adapt Bruno method into package, add 'operational' mode
[talweg.git] / pkg / R / F_Average.R
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 wednesdays in the past (until the beginning or memory limit) are
7 #' averaged to provide a smooth prediction. This forecast will most of the time be wrong,
8 #' 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 )