Browse Source

sarima++

pull/25/head
Alexey Velikiy 2 years ago
parent
commit
fc71844ba3
  1. 25
      server/src/services/analytic_service/analytic_unit/anomaly_analytic_unit.rs
  2. 3
      server/src/services/analytic_service/analytic_unit/pattern_analytic_unit.rs
  3. 1
      server/src/services/metric_service.rs

25
server/src/services/analytic_service/analytic_unit/anomaly_analytic_unit.rs

@ -9,6 +9,7 @@ use super::types::{AnalyticUnit, AnalyticUnitConfig, AnomalyConfig, LearningResu
use async_trait::async_trait;
use subbeat::metric::MetricResult;
use chrono::prelude::*;
struct SARIMA {
pub ts: Vec<f64>,
@ -24,10 +25,10 @@ impl SARIMA {
}
}
pub fn learn(ts: Vec<(u64, f64)>) {
pub fn learn(&mut self, ts: &Vec<(u64, f64)>) {
// TODO: compute avg based on seasonality
}
pub fn predict(timestamp: u64, value: f64) -> (f64, f64, f64) {
pub fn predict(&self, timestamp: u64, value: f64) -> (f64, f64, f64) {
// TODO: implement
return (0.0, 0.0, 0.0);
}
@ -112,10 +113,24 @@ impl AnalyticUnit for AnomalyAnalyticUnit {
panic!("Bad config!");
}
}
async fn learn(&mut self, _ms: MetricService, _ss: SegmentsService) -> LearningResult {
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
let mut sarima = SARIMA::new(self.config.seasonality);
let utc: DateTime<Utc> = Utc::now();
let to = utc.timestamp() as u64;
let from = to - self.config.seasonality * 3;
let mr = ms.query(from, to, DETECTION_STEP).await.unwrap();
if mr.data.keys().len() == 0 {
return LearningResult::FinishedEmpty;
}
let k = mr.data.keys().nth(0).unwrap();
let ts = &mr.data[k];
sarima.learn(ts);
// TODO: ensure that learning reruns on seasonaliy change
// TODO: load data to learning
// TODO: update model to work online

3
server/src/services/analytic_service/analytic_unit/pattern_analytic_unit.rs

@ -51,6 +51,7 @@ impl fmt::Debug for LearningResults {
}
}
// TODO: maye remove this because metric service works with interpolate_nans_and_gaps_with_zeros
fn nan_to_zero(n: f64) -> f64 {
if n.is_nan() {
return 0.;
@ -429,8 +430,6 @@ impl AnalyticUnit for PatternAnalyticUnit {
if to.is_some() {
results.push((from.unwrap(), to.unwrap()));
from = None;
to = None;
}
Ok(results)

1
server/src/services/metric_service.rs

@ -26,6 +26,7 @@ impl MetricService {
// TODO: it's a hack, should replace all metrics
let key = mr.data.keys().nth(0).unwrap().clone();
let ts = mr.data.get_mut(&key).unwrap();
// TODO: make interpolate_nans_and_gaps_with_zeros configurable
*ts = subbeat::utils::interpolate_nans_and_gaps_with_zeros(&ts, from, to, step);
// mr.data.insert(*k, ts_interpolated);
}

Loading…
Cancel
Save