diff --git a/ats/evaluators.py b/ats/evaluators.py index 56187b9..c85c98a 100644 --- a/ats/evaluators.py +++ b/ats/evaluators.py @@ -2,15 +2,15 @@ import pandas as pd from copy import deepcopy -def _format_for_anomaly_detector(input_df,synthetic=False): +def _format_for_anomaly_detector(df,synthetic=False): if synthetic: - input_df.drop(columns=['effect_label'],inplace=True) - if 'anomaly_label' not in input_df.columns: + df = df.drop(columns=['effect_label'],inplace=False) + if 'anomaly_label' not in df.columns: raise ValueError('The input DataFrame has to contain an "anomaly_label" column for evaluation') - anomaly_labels = input_df.loc[:,'anomaly_label'] - input_df.drop(columns=['anomaly_label'],inplace=True) - return input_df,anomaly_labels + anomaly_labels = df.loc[:,'anomaly_label'] + df = df.drop(columns=['anomaly_label'],inplace=False) + return df,anomaly_labels def evaluate_anomaly_detector(evaluated_timeseries_df, anomaly_labels, details=False): diff --git a/ats/tests/test_evaluators.py b/ats/tests/test_evaluators.py index cba8342..6701061 100644 --- a/ats/tests/test_evaluators.py +++ b/ats/tests/test_evaluators.py @@ -507,3 +507,23 @@ def test_series_granularity_evaluation(self): evaluation_result2 = _series_granularity_evaluation(flagged_series2,anomaly_labels2) except Exception as e: self.assertIsInstance(e,ValueError) + + def test_double_evaluator(self): + anomalies = ['step_uv'] + effects = [] + series_generator = HumiTempTimeseriesGenerator() + # series1 will be a true anomaly for the minmax + series1 = series_generator.generate(anomalies=anomalies,effects=effects) + # series2 will be a false positive for minmax (it sees always 2 anomalous data points for each variable) + series2 = series_generator.generate(anomalies=[],effects=effects) + dataset = [series1,series2] + evaluator = Evaluator(test_data=dataset) + minmax1 = MinMaxAnomalyDetector() + minmax2 = MinMaxAnomalyDetector() + minmax3 = MinMaxAnomalyDetector() + models={'detector_1': minmax1, + 'detector_2': minmax2, + 'detector_3': minmax3 + } + evaluation_results = evaluator.evaluate(models=models,granularity='series') + evaluation_results = evaluator.evaluate(models=models,granularity='series')