From 61e1600f6e35fa27e6074467baaacfc33e7fecf5 Mon Sep 17 00:00:00 2001 From: Alexey Velikiy Date: Tue, 23 Nov 2021 11:12:53 +0300 Subject: [PATCH] SARIMA++ --- .../analytic_unit/anomaly_analytic_unit.rs | 31 +++++++++++++++---- 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/server/src/services/analytic_service/analytic_unit/anomaly_analytic_unit.rs b/server/src/services/analytic_service/analytic_unit/anomaly_analytic_unit.rs index c4b9f8f..bffea52 100644 --- a/server/src/services/analytic_service/analytic_unit/anomaly_analytic_unit.rs +++ b/server/src/services/analytic_service/analytic_unit/anomaly_analytic_unit.rs @@ -16,19 +16,31 @@ struct SARIMA { } impl SARIMA { - pub fn learn() { - + + pub fn new(seasonality: u64) -> SARIMA { + return SARIMA { + ts: Vec::new(), + seasonality + } + } + + pub fn learn(ts: Vec<(u64, f64)>) { + // TODO: compute avg based on seasonality } pub fn predict(timestamp: u64, value: f64) -> (f64, f64, f64) { + // TODO: implement return (0.0, 0.0, 0.0); } - // TODO: learn - // TODO: update - // TODO: predict with HSR + + pub fn push_point() { + // TODO: inmplement + } + // TODO: don't count NaNs in model } + // TODO: move to config const DETECTION_STEP: u64 = 10; @@ -46,14 +58,16 @@ fn get_value_with_offset(ts: &Vec<(u64, f64)>, index: usize, offset: u64) -> any pub struct AnomalyAnalyticUnit { config: AnomalyConfig, + sarima: Option } impl AnomalyAnalyticUnit { pub fn new(config: AnomalyConfig) -> AnomalyAnalyticUnit { - AnomalyAnalyticUnit { config } + AnomalyAnalyticUnit { config, sarima: None } } fn get_hsr_from_metric_result(&self, mr: &MetricResult) -> anyhow::Result { + // TODO: get it from model if mr.data.keys().len() == 0 { return Ok(HSR::ConfidenceTimeSerie(Vec::new())); } @@ -99,6 +113,8 @@ impl AnalyticUnit for AnomalyAnalyticUnit { } } async fn learn(&mut self, _ms: MetricService, _ss: SegmentsService) -> LearningResult { + + let sarima = SARIMA::new(self.config.seasonality); // TODO: ensue that learning runs on seasonaliy change // TODO: load data to learning @@ -111,6 +127,9 @@ impl AnalyticUnit for AnomalyAnalyticUnit { from: u64, to: u64, ) -> anyhow::Result> { + if self.sarima.is_none() { + return Err(anyhow::format_err!("Learning model is not ready")); + } let mr = ms .query(from - self.config.seasonality * 5, to, DETECTION_STEP) .await