Skip to content

Commit

Permalink
add EntireAnomalyDetector, LatestAnomalyDetector
Browse files Browse the repository at this point in the history
  • Loading branch information
v-shuawei committed Jan 26, 2024
1 parent e312864 commit ab707b0
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 13 deletions.
2 changes: 1 addition & 1 deletion anomaly-detector/anomaly_detector/__init__.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
from .multivariate.model import MultivariateAnomalyDetector
from .univariate.univariate_anomaly_detection import UnivariateAnomalyDetector
from .univariate.univariate_anomaly_detection import UnivariateAnomalyDetector, EntireAnomalyDetector, LatestAnomalyDetector
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ def merge_with_delta(results, func, args):

class AnomalyDetectionModel:
def __init__(self, series=None, max_anomaly_ratio=DEFAULT_MAX_RATIO, alpha=DEFAULT_ALPHA, threshold=DEFAULT_THRESHOLD, granularity=DEFAULT_GRANULARITY_NONE, interval=None, indices=None,
fill_up_mode=DEFAULT_FILL_UP_MODE, fixed_value_to_fill=None, need_trend=False, need_spectrum_period=False, detector=dict(), detect_mode=None):
fill_up_mode=DEFAULT_FILL_UP_MODE, fixed_value_to_fill=None, need_trend=False, need_spectrum_period=False, detector=dict()):
self.__values = [float(item["value"]) for item in series]
self.__max_ratio = max_anomaly_ratio
self.__alpha = alpha
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,12 @@
from anomaly_detector.univariate.util.refine import get_margins

class UnivariateAnomalyDetector(BaseAnomalyDetector):
def __init__(self):
def __init__(self, detect_mode = None):

super(UnivariateAnomalyDetector, self).__init__()
self.error_msg = None
self.error_code = 'BadArgument'
self._error_msg = None
self._error_code = 'BadArgument'
self._detect_mode = detect_mode

def is_timestamp_ascending(self, series):
count = len(series)
Expand Down Expand Up @@ -236,22 +237,24 @@ def parse_arg(self, data, params):
def predict(self, context, data: pd.DataFrame, params: Optional[Dict[str, Any]] = None):

data, model_params = self.parse_arg(data, params)
if self._detect_mode is None:
self._detect_mode = params['detect_mode']

if self.error_msg is not None:
raise AnomalyDetectionRequestError(error_code=self.error_code, error_msg=self.error_msg)
if self._error_msg is not None:
raise AnomalyDetectionRequestError(error_code=self._error_code, error_msg=self.error_msg)

detector = AnomalyDetectionModel(series=data, **model_params)

results, period, spectrum_period, model_id, do_fill_up = detector.detect(
period=params.get('period',DEFAULT_PERIOD), last_value=data[-1] if params['detect_mode'] == DetectType.LATEST else None)
period=params.get('period',DEFAULT_PERIOD), last_value=data[-1] if self._detect_mode == DetectType.LATEST else None)

try:
results["timestamp"] = [x['timestamp'] for x in data]
except KeyError:
results["timestamp"] = [x for x in range(len(data))]

results_items= {}
if params['detect_mode'] == DetectType.ENTIRE:
if self._detect_mode == DetectType.ENTIRE:

results = results.sort_index()
expected_value, upper_margin, lower_margin, anomaly_neg, anomaly_pos, anomaly, severity, boundary_units, anomaly_scores \
Expand Down Expand Up @@ -305,4 +308,13 @@ def predict(self, context, data: pd.DataFrame, params: Optional[Dict[str, Any]]
SuggestedWindow: suggested_window
}}
]
return result_list
return result_list


class EntireAnomalyDetector(UnivariateAnomalyDetector):
def __init__(self):
super(EntireAnomalyDetector, self).__init__(DetectType.ENTIRE)

class LatestAnomalyDetector(UnivariateAnomalyDetector):
def __init__(self):
super(LatestAnomalyDetector, self).__init__(DetectType.LATEST)
5 changes: 2 additions & 3 deletions anomaly-detector/tests/e2e_test_2.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import mlflow
import numpy as np
import pandas as pd
from anomaly_detector import UnivariateAnomalyDetector
from anomaly_detector import EntireAnomalyDetector
from mlflow.models import infer_signature

mlflow.set_tracking_uri(uri="http://127.0.0.1:5000")
Expand All @@ -11,7 +11,6 @@ def main():
mlflow.set_experiment("MLflow Quickstart 2")

params = {
"detect_mode": "entire",
"granularity": "monthly",
"maxAnomalyRatio": 0.25,
"sensitivity": 95,
Expand All @@ -22,7 +21,7 @@ def main():
mlflow.log_params(params)
mlflow.set_tag("Training Info", "Univariate Anomaly Detector")

model = UnivariateAnomalyDetector()
model = EntireAnomalyDetector()

signature = infer_signature(params=params)
print(model)
Expand Down

0 comments on commit ab707b0

Please sign in to comment.