after merg
[talweg.git] / pkg / R / F_Average.R
index d0b40b4..4d395ac 100644 (file)
@@ -3,9 +3,9 @@
 #' Pointwise average of all the series of the same day of week in the past.
 #'
 #' For example, if the current day (argument "today") is a tuesday, then all series
-#' corresponding to wednesdays in the past (until the beginning or memory limit) are
-#' averaged to provide a smooth prediction. This forecast will most of the time be wrong,
-#' but will also look plausible enough.
+#' corresponding to tuesday in the past (until the beginning or memory limit) -- and in
+#' the future if 'opera' is FALSE -- are averaged to provide a smooth prediction. This
+#' forecast will most of the time be wrong, but will also look plausible enough.
 #'
 #' @usage # AverageForecaster$new(pjump)
 #'
@@ -17,25 +17,41 @@ AverageForecaster = R6::R6Class("AverageForecaster",
        inherit = Forecaster,
 
        public = list(
-               predictShape = function(data, today, memory, horizon, ...)
+               predictShape = function(data, today, memory, predict_from, horizon, ...)
                {
-                       avg = rep(0., horizon)
+                       avg = rep(0., (horizon-predict_from+1))
                        first_day = max(1, today-memory)
-                       index = today-7 + 1
+                       index <- today
                        nb_no_na_series = 0
+                       opera = ifelse(hasArg("opera"), list(...)$opera, FALSE)
                        repeat
                        {
-                               {
-                                       serie_on_horizon = data$getCenteredSerie(index)[1:horizon]
-                                       index = index - 7
-                               };
+                               index = index - 7
+                               if (index < first_day)
+                                       break
+                               serie_on_horizon = data$getCenteredSerie(index)[predict_from:horizon]
                                if (!any(is.na(serie_on_horizon)))
                                {
                                        avg = avg + serie_on_horizon
                                        nb_no_na_series = nb_no_na_series + 1
-                               };
-                               if (index < first_day)
-                                       break
+                               }
+                       }
+                       if (!opera)
+                       {
+                               # The same, in the future
+                               index <- today
+                               repeat
+                               {
+                                       index = index + 7
+                                       if (index > data$getSize())
+                                               break
+                                       serie_on_horizon = data$getCenteredSerie(index)[predict_from:horizon]
+                                       if (!any(is.na(serie_on_horizon)))
+                                       {
+                                               avg = avg + serie_on_horizon
+                                               nb_no_na_series = nb_no_na_series + 1
+                                       }
+                               }
                        }
                        avg / nb_no_na_series
                }