Browse Source

Anomaly detector: wrong seasonality offset #671 (#673)

pull/1/head
Alexandr Velikiy 5 years ago committed by rozetko
parent
commit
7bdb2c38f7
  1. 11
      analytics/analytics/detectors/anomaly_detector.py

11
analytics/analytics/detectors/anomaly_detector.py

@ -1,6 +1,7 @@
import logging import logging
import numpy as np import numpy as np
import pandas as pd import pandas as pd
import math
from typing import Optional, Union, List, Tuple from typing import Optional, Union, List, Tuple
from analytic_types import AnalyticUnitId, ModelCache from analytic_types import AnalyticUnitId, ModelCache
@ -80,8 +81,10 @@ class AnomalyDetector(ProcessingDetector):
time_step = data_second_time - data_start_time time_step = data_second_time - data_start_time
for segment in segments: for segment in segments:
seasonality_offset = (abs(segment['from'] - data_start_time) % seasonality) // time_step
seasonality_index = seasonality // time_step seasonality_index = seasonality // time_step
season_count = math.ceil(abs(segment['from'] - data_start_time) / seasonality)
start_seasonal_segment = segment['from'] + seasonality * season_count
seasonality_offset = (abs(start_seasonal_segment - data_start_time) % seasonality) // time_step
#TODO: upper and lower bounds for segment_data #TODO: upper and lower bounds for segment_data
segment_data = pd.Series(segment['data']) segment_data = pd.Series(segment['data'])
upper_bound = self.add_season_to_data( upper_bound = self.add_season_to_data(
@ -180,8 +183,11 @@ class AnomalyDetector(ProcessingDetector):
time_step = utils.convert_pd_timestamp_to_ms(dataframe['timestamp'][1]) - utils.convert_pd_timestamp_to_ms(dataframe['timestamp'][0]) time_step = utils.convert_pd_timestamp_to_ms(dataframe['timestamp'][1]) - utils.convert_pd_timestamp_to_ms(dataframe['timestamp'][0])
for segment in segments: for segment in segments:
seasonality_offset = (abs(segment['from'] - data_start_time) % seasonality) // time_step
seasonality_index = seasonality // time_step seasonality_index = seasonality // time_step
# TODO: move it to utils and add tests
season_count = math.ceil(abs(segment['from'] - data_start_time) / seasonality)
start_seasonal_segment = segment['from'] + seasonality * season_count
seasonality_offset = (abs(start_seasonal_segment - data_start_time) % seasonality) // time_step
segment_data = pd.Series(segment['data']) segment_data = pd.Series(segment['data'])
upper_bound = self.add_season_to_data( upper_bound = self.add_season_to_data(
upper_bound, segment_data, seasonality_offset, seasonality_index, True upper_bound, segment_data, seasonality_offset, seasonality_index, True
@ -207,6 +213,7 @@ class AnomalyDetector(ProcessingDetector):
len_smoothed_data = len(data) len_smoothed_data = len(data)
for idx, _ in enumerate(data): for idx, _ in enumerate(data):
if idx - offset < 0: if idx - offset < 0:
#TODO: add seasonality for non empty parts
continue continue
if (idx - offset) % seasonality == 0: if (idx - offset) % seasonality == 0:
if addition: if addition:

Loading…
Cancel
Save