add realtime option, slightly refactor data acquisition
[talweg.git] / pkg / R / Data.R
... / ...
CommitLineData
1#' Data
2#'
3#' Data encapsulation
4#'
5#' @docType class
6#' @importFrom R6 R6Class
7#'
8#' @field .data List of \itemize{
9#' \item time: vector of times
10#' \item serie: centered series
11#' \item level: corresponding levels
12#' \item exo: exogenous variables
13#' \item exo_hat: predicted exogenous variables}
14#'
15#' @section Methods:
16#' \describe{
17#' \item{\code{getSize()}}{
18#' Return number of series in dataset.}
19#' \item{\code{getStdHorizon()}}{
20#' Return number of time steps from serie[1] until midnight}
21#' \item{\code{appendHat(time, hat_serie, hat_exo)}}{
22#' New estimated data + time.}
23#' \item{\code{append(serie, exo)}}{
24#' New measured data; call *after* \code{appendHat()}}
25#' \item{\code{getTime(index)}}{
26#' Get times at specified index.}
27#' \item{\code{getCenteredSerie(index, hat=FALSE)}}{
28#' Get (measured or predicted) centered serie at specified index.}
29#' \item{\code{getCenteredSeries(indices, hat=FALSE)}}{
30#' Get centered series at specified indices (in columns).}
31#' \item{\code{getLevel(index, hat=FALSE)}}{
32#' Get level at specified index.}
33#' \item{\code{getSerie(index, hat=FALSE)}}{
34#' Get serie (centered+level) at specified index.}
35#' \item{\code{getSeries(indices, hat=FALSE)}}{
36#' Get series at specified indices (in columns).}
37#' \item{\code{getExo(index, hat=FALSE)}}{
38#' Get exogenous variables at specified index.}
39#' }
40#'
41Data = R6::R6Class("Data",
42 private = list(
43 .data = list()
44 ),
45 public = list(
46 getSize = function()
47 length(private$.data)
48 ,
49 getStdHorizon = function()
50 24 - as.POSIXlt( private$.data[[1]]$time[1] )$hour + 1
51 ,
52 appendHat = function(time, hat_serie, hat_exo)
53 {
54 hat_level = mean(hat_serie, na.rm=TRUE)
55 hat_centered_serie = hat_serie - hat_level
56 private$.data[[length(private$.data)+1]] <- list(
57 "time"=time, "hat_centered_serie"=hat_centered_serie,
58 "hat_level"=hat_level, "hat_exo"=hat_exo )
59 },
60 append = function(serie, exo)
61 {
62 level = mean(serie, na.rm=TRUE)
63 centered_serie = serie - level
64 private$.data[[length(private$.data)]]$centered_serie <- centered_serie,
65 private$.data[[length(private$.data)]]$level <- level,
66 private$.data[[length(private$.data)]]$exo <- exo,
67 },
68 getTime = function(index)
69 {
70 index = dateIndexToInteger(index, self)
71 private$.data[[index]]$time
72 },
73 getCenteredSerie = function(index, hat=FALSE)
74 {
75 index = dateIndexToInteger(index, self)
76 if (hat)
77 private$.data[[index]]$hat_centered_serie
78 else
79 private$.data[[index]]$centered_serie
80 },
81 getCenteredSeries = function(indices, hat=FALSE)
82 sapply(indices, function(i) self$getCenteredSerie(i, hat))
83 ,
84 getLevel = function(index, hat=FALSE)
85 {
86 index = dateIndexToInteger(index, self)
87 if (hat)
88 private$.data[[index]]$hat_level
89 else
90 private$.data[[index]]$level
91 },
92 getSerie = function(index, hat=FALSE)
93 {
94 index = dateIndexToInteger(index, self)
95 if (hat)
96 private$.data[[index]]$hat_centered_serie + private$.data[[index]]$hat_level
97 else
98 private$.data[[index]]$centered_serie + private$.data[[index]]$level
99 },
100 getSeries = function(indices, hat=FALSE)
101 sapply(indices, function(i) self$getSerie(i, hat))
102 ,
103 getExo = function(index, hat=FALSE)
104 {
105 index = dateIndexToInteger(index, self)
106 if (hat)
107 private$.data[[index]]$hat_exo
108 else
109 private$.data[[index]]$exo
110 },
111 removeFirst = function()
112 private$.data <- private$.data[2:length(private$.data)]
113 ,
114 removeLast = function()
115 private$.data <- private$.data[1:(length(private$.data)-1)]
116 )
117)