fixes and improvements
[talweg.git] / R / S_Neighbors.R
index c44bd9b..b8e32cc 100644 (file)
@@ -23,9 +23,33 @@ NeighborsShapeForecaster = setRefClass(
                        if (length(data$getCenteredSerie(1)) < length(data$getCenteredSerie(2)))
                                first_day = 2
 
-                       # Predict only on non-NAs days (TODO:)
-                       if (any(is.na(data$getSerie(today))))
-                               return (NA)
+                       # Predict only on (almost) non-NAs days
+                       nas_in_serie = is.na(data$getSerie(today))
+                       if (any(nas_in_serie))
+                       {
+                               #TODO: better define "repairing" conditions (and method)
+                               if (sum(nas_in_serie) >= length(nas_in_serie) / 2)
+                                       return (NA)
+                               for (i in seq_along(nas_in_serie))
+                               {
+                                       if (nas_in_serie[i])
+                                       {
+                                               #look left
+                                               left = i-1
+                                               while (left>=1 && nas_in_serie[left])
+                                                       left = left-1
+                                               #look right
+                                               right = i+1
+                                               while (right<=length(nas_in_serie) && nas_in_serie[right])
+                                                       right = right+1
+                                               #HACK: modify by-reference Data object...
+                                               data$data[[today]]$serie[i] <<-
+                                                       if (left==0) data$data[[today]]$serie[right]
+                                                       else if (right==0) data$data[[today]]$serie[left]
+                                                       else (data$data[[today]]$serie[left] + data$data[[today]]$serie[right]) / 2.
+                                       }
+                               }
+                       }
 
                        # Determine indices of no-NAs days followed by no-NAs tomorrows
                        fdays_indices = c()