From 7e5f429e119ce09da1b0e8bf99dc3bff494f6a6d Mon Sep 17 00:00:00 2001 From: David Liang Date: Tue, 20 Apr 2021 12:31:27 +0800 Subject: [PATCH 01/10] Add multivariate sample --- .../samples/sample_multivariate_detect.py | 153 ++++++++++++++++++ 1 file changed, 153 insertions(+) create mode 100644 sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_multivariate_detect.py diff --git a/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_multivariate_detect.py b/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_multivariate_detect.py new file mode 100644 index 000000000000..c6357e8c4759 --- /dev/null +++ b/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_multivariate_detect.py @@ -0,0 +1,153 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + +""" +FILE: sample_multivariate_detect.py + +DESCRIPTION: + This sample demonstrates how to use multivariate dataset to train a model and use the model to detect anomalies. + +Prerequisites: + * The Anomaly Detector client library for Python + * A valid data feed + +USAGE: + python sample_multivariate_detect.py + + Set the environment variables with your own values before running the sample: + 1) ANOMALY_DETECTOR_KEY - your source Form Anomaly Detector API key. + 2) ANOMALY_DETECTOR_ENDPOINT - the endpoint to your source Anomaly Detector resource. +""" + +import os +import time +from datetime import datetime + +from azure.ai.anomalydetector import AnomalyDetectorClient +from azure.ai.anomalydetector.models import DetectionRequest, ModelInfo +from azure.core.credentials import AzureKeyCredential +from azure.core.exceptions import HttpResponseError + + +class MultivariateSample(): + + def __init__(self, subscription_key, anomaly_detector_endpoint, data_source=None): + self.sub_key = subscription_key + self.end_point = anomaly_detector_endpoint + + # Create an Anomaly Detector client + + # + self.ad_client = AnomalyDetectorClient(AzureKeyCredential(self.sub_key), self.end_point) + # + + self.data_source = data_source + + def train(self, start_time, end_time, max_tryout=500): + + # Number of models available now + model_list = list(self.ad_client.list_multivariate_model(skip=0, top=10000)) + print("{:d} available models before training.".format(len(model_list))) + + # Use sample data to train the model + print("Training new model...") + data_feed = ModelInfo(start_time=start_time, end_time=end_time, source=self.data_source) + response_header = \ + self.ad_client.train_multivariate_model(data_feed, cls=lambda *args: [args[i] for i in range(len(args))])[ + -1] + trained_model_id = response_header['Location'].split("/")[-1] + + # Model list after training + new_model_list = list(self.ad_client.list_multivariate_model(skip=0, top=10000)) + + # Wait until the model is ready. It usually takes several minutes + model_status = None + tryout_count = 0 + while (tryout_count < max_tryout and model_status != "READY"): + model_status = self.ad_client.get_multivariate_model(trained_model_id).model_info.status + tryout_count += 1 + time.sleep(2) + + assert model_status == "READY" + + print("Done.", "\n--------------------") + print("{:d} available models after training.".format(len(new_model_list))) + + # Return the latest model id + return trained_model_id + + def detect(self, model_id, start_time, end_time, max_tryout=500): + + # Detect anomaly in the same data source (but a different interval) + try: + detection_req = DetectionRequest(source=self.data_source, start_time=start_time, end_time=end_time) + response_header = self.ad_client.detect_anomaly(model_id, detection_req, + cls=lambda *args: [args[i] for i in range(len(args))])[-1] + result_id = response_header['Location'].split("/")[-1] + + # Get results (may need a few seconds) + r = self.ad_client.get_detection_result(result_id) + tryout_count = 0 + while r.summary.status != "READY" and tryout_count < max_tryout: + time.sleep(1) + r = self.ad_client.get_detection_result(result_id) + tryout_count += 1 + + if r.summary.status != "READY": + print("Request timeout after %d tryouts.".format(max_tryout)) + return None + + except HttpResponseError as e: + print('Error code: {}'.format(e.error.code), 'Error message: {}'.format(e.error.message)) + except Exception as e: + raise e + + return r + + def export_model(self, model_id, model_path="model.zip"): + + # Export the model + model_stream_generator = self.ad_client.export_model(model_id) + with open(model_path, "wb") as f_obj: + while True: + try: + f_obj.write(next(model_stream_generator)) + except StopIteration: + break + except Exception as e: + raise e + + def delete_model(self, model_id): + + # Delete the mdoel + self.ad_client.delete_multivariate_model(model_id) + model_list_after_delete = list(self.ad_client.list_multivariate_model(skip=0, top=10000)) + print("{:d} available models after deletion.".format(len(model_list_after_delete))) + + +if __name__ == '__main__': + SUBSCRIPTION_KEY = os.environ["ANOMALY_DETECTOR_KEY"] + ANOMALY_DETECTOR_ENDPOINT = os.environ["ANOMALY_DETECTOR_ENDPOINT"] + + # ***************************** + # Use your own data source here + # ***************************** + data_source = "" + + # Create a new sample and client + sample = MultivariateSample(SUBSCRIPTION_KEY, ANOMALY_DETECTOR_ENDPOINT, data_source) + + # Train a new model + model_id = sample.train(datetime(2021, 1, 1, 0, 0, 0), datetime(2021, 1, 2, 12, 0, 0)) + + # Reference + result = sample.detect(model_id, datetime(2021, 1, 2, 12, 0, 0), datetime(2021, 1, 3, 0, 0, 0)) + print("Result ID:\t", result.result_id) + print("Result summary:\t", result.summary) + print("Result length:\t", len(result.results)) + + # Export model + sample.export_model(model_id, "model.zip") + + # Delete model + sample.delete_model(model_id) From 9d476d2454a8329254fdd6da89d74c85e0b71e70 Mon Sep 17 00:00:00 2001 From: David Liang Date: Fri, 9 Jul 2021 11:51:10 +0800 Subject: [PATCH 02/10] MVAD sample refine --- .../samples/sample_multivariate_detect.py | 63 +++++++++++++------ 1 file changed, 45 insertions(+), 18 deletions(-) diff --git a/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_multivariate_detect.py b/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_multivariate_detect.py index c6357e8c4759..552c0cbc7ef4 100644 --- a/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_multivariate_detect.py +++ b/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_multivariate_detect.py @@ -25,6 +25,7 @@ from azure.ai.anomalydetector import AnomalyDetectorClient from azure.ai.anomalydetector.models import DetectionRequest, ModelInfo +from azure.ai.anomalydetector.models import ModelStatus, DetectionStatus from azure.core.credentials import AzureKeyCredential from azure.core.exceptions import HttpResponseError @@ -43,7 +44,7 @@ def __init__(self, subscription_key, anomaly_detector_endpoint, data_source=None self.data_source = data_source - def train(self, start_time, end_time, max_tryout=500): + def train(self, start_time, end_time, timeout=1000): # Number of models available now model_list = list(self.ad_client.list_multivariate_model(skip=0, top=10000)) @@ -62,21 +63,35 @@ def train(self, start_time, end_time, max_tryout=500): # Wait until the model is ready. It usually takes several minutes model_status = None - tryout_count = 0 - while (tryout_count < max_tryout and model_status != "READY"): - model_status = self.ad_client.get_multivariate_model(trained_model_id).model_info.status - tryout_count += 1 - time.sleep(2) - assert model_status == "READY" + start = time.time() + while time.time() - start < timeout and model_status != ModelStatus.READY and model_status != ModelStatus.FAILED: + model_info = self.ad_client.get_multivariate_model(trained_model_id).model_info + model_status = model_info.status + time.sleep(1) - print("Done.", "\n--------------------") - print("{:d} available models after training.".format(len(new_model_list))) + if model_status == ModelStatus.FAILED: + print("Creating model failed.") + print("Errors:") + if model_info.errors: + for res in model_info.errors: + print("Error code: {}. Message: {}".format(res.code, res.message)) + else: + print("None") + return None - # Return the latest model id - return trained_model_id + if model_status == ModelStatus.READY: + print("Done.", "\n--------------------") + print("{:d} available models after training.".format(len(new_model_list))) - def detect(self, model_id, start_time, end_time, max_tryout=500): + # Return the latest model id + return trained_model_id + + # If model status is "CREATED" or "RUNNING" + print("Model is not ready yet. Model status: {}".format(model_status)) + return None + + def detect(self, model_id, start_time, end_time, timeout=500): # Detect anomaly in the same data source (but a different interval) try: @@ -87,14 +102,23 @@ def detect(self, model_id, start_time, end_time, max_tryout=500): # Get results (may need a few seconds) r = self.ad_client.get_detection_result(result_id) - tryout_count = 0 - while r.summary.status != "READY" and tryout_count < max_tryout: - time.sleep(1) + start = time.time() + while r.summary.status != DetectionStatus.READY and r.summary.status != DetectionStatus.FAILED and time.time() - start < timeout: r = self.ad_client.get_detection_result(result_id) - tryout_count += 1 + time.sleep(1) - if r.summary.status != "READY": - print("Request timeout after %d tryouts.".format(max_tryout)) + if r.summary.status == DetectionStatus.RUNNING or r.summary.status == DetectionStatus.CREATED: + print("Detection is not ready yet. Detection status: {}".format(r.summary.status)) + return None + + if r.summary.status == DetectionStatus.FAILED: + print("Detection failed.") + print("Errors") + if r.summary.errors: + for res in r.summary.errors: + print("Error code: {}. Message: {}".format(res.code, res.message)) + else: + print("None") return None except HttpResponseError as e: @@ -139,9 +163,12 @@ def delete_model(self, model_id): # Train a new model model_id = sample.train(datetime(2021, 1, 1, 0, 0, 0), datetime(2021, 1, 2, 12, 0, 0)) + assert model_id is not None # Reference result = sample.detect(model_id, datetime(2021, 1, 2, 12, 0, 0), datetime(2021, 1, 3, 0, 0, 0)) + assert result is not None + print("Result ID:\t", result.result_id) print("Result summary:\t", result.summary) print("Result length:\t", len(result.results)) From fa8eaea4432b8666a86bdd9beba2c7ae334b1a03 Mon Sep 17 00:00:00 2001 From: David Liang Date: Fri, 9 Jul 2021 13:32:35 +0800 Subject: [PATCH 03/10] resolve comments --- .../samples/sample_multivariate_detect.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_multivariate_detect.py b/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_multivariate_detect.py index 552c0cbc7ef4..d002d6deaf5c 100644 --- a/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_multivariate_detect.py +++ b/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_multivariate_detect.py @@ -44,7 +44,7 @@ def __init__(self, subscription_key, anomaly_detector_endpoint, data_source=None self.data_source = data_source - def train(self, start_time, end_time, timeout=1000): + def train(self, start_time, end_time, timeout_in_seconds=1000): # Number of models available now model_list = list(self.ad_client.list_multivariate_model(skip=0, top=10000)) @@ -58,14 +58,11 @@ def train(self, start_time, end_time, timeout=1000): -1] trained_model_id = response_header['Location'].split("/")[-1] - # Model list after training - new_model_list = list(self.ad_client.list_multivariate_model(skip=0, top=10000)) - # Wait until the model is ready. It usually takes several minutes model_status = None start = time.time() - while time.time() - start < timeout and model_status != ModelStatus.READY and model_status != ModelStatus.FAILED: + while time.time() - start < timeout_in_seconds and model_status != ModelStatus.READY and model_status != ModelStatus.FAILED: model_info = self.ad_client.get_multivariate_model(trained_model_id).model_info model_status = model_info.status time.sleep(1) @@ -74,13 +71,16 @@ def train(self, start_time, end_time, timeout=1000): print("Creating model failed.") print("Errors:") if model_info.errors: - for res in model_info.errors: - print("Error code: {}. Message: {}".format(res.code, res.message)) + for error in model_info.errors: + print("Error code: {}. Message: {}".format(error.code, error.message)) else: print("None") return None if model_status == ModelStatus.READY: + # Model list after training + new_model_list = list(self.ad_client.list_multivariate_model(skip=0, top=10000)) + print("Done.", "\n--------------------") print("{:d} available models after training.".format(len(new_model_list))) @@ -91,7 +91,7 @@ def train(self, start_time, end_time, timeout=1000): print("Model is not ready yet. Model status: {}".format(model_status)) return None - def detect(self, model_id, start_time, end_time, timeout=500): + def detect(self, model_id, start_time, end_time, timeout_in_seconds=500): # Detect anomaly in the same data source (but a different interval) try: @@ -103,7 +103,7 @@ def detect(self, model_id, start_time, end_time, timeout=500): # Get results (may need a few seconds) r = self.ad_client.get_detection_result(result_id) start = time.time() - while r.summary.status != DetectionStatus.READY and r.summary.status != DetectionStatus.FAILED and time.time() - start < timeout: + while r.summary.status != DetectionStatus.READY and r.summary.status != DetectionStatus.FAILED and time.time() - start < timeout_in_seconds: r = self.ad_client.get_detection_result(result_id) time.sleep(1) From 86239eea406511f758196a06fc27385cecf6afa2 Mon Sep 17 00:00:00 2001 From: David Liang Date: Fri, 9 Jul 2021 13:34:08 +0800 Subject: [PATCH 04/10] resolve comments --- .../samples/sample_multivariate_detect.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_multivariate_detect.py b/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_multivariate_detect.py index d002d6deaf5c..cfabe15ad99b 100644 --- a/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_multivariate_detect.py +++ b/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_multivariate_detect.py @@ -81,7 +81,7 @@ def train(self, start_time, end_time, timeout_in_seconds=1000): # Model list after training new_model_list = list(self.ad_client.list_multivariate_model(skip=0, top=10000)) - print("Done.", "\n--------------------") + print("Done.\n--------------------") print("{:d} available models after training.".format(len(new_model_list))) # Return the latest model id From 0bedae4022cfd483831de64ebbd17932ba1da099 Mon Sep 17 00:00:00 2001 From: David Liang Date: Fri, 9 Jul 2021 14:28:10 +0800 Subject: [PATCH 05/10] resolve comments --- .../samples/sample_multivariate_detect.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_multivariate_detect.py b/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_multivariate_detect.py index cfabe15ad99b..03869dc28f5f 100644 --- a/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_multivariate_detect.py +++ b/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_multivariate_detect.py @@ -21,7 +21,7 @@ import os import time -from datetime import datetime +from datetime import datetime, timezone from azure.ai.anomalydetector import AnomalyDetectorClient from azure.ai.anomalydetector.models import DetectionRequest, ModelInfo @@ -113,10 +113,10 @@ def detect(self, model_id, start_time, end_time, timeout_in_seconds=500): if r.summary.status == DetectionStatus.FAILED: print("Detection failed.") - print("Errors") + print("Errors:") if r.summary.errors: - for res in r.summary.errors: - print("Error code: {}. Message: {}".format(res.code, res.message)) + for error in r.summary.errors: + print("Error code: {}. Message: {}".format(error.code, error.message)) else: print("None") return None @@ -162,11 +162,13 @@ def delete_model(self, model_id): sample = MultivariateSample(SUBSCRIPTION_KEY, ANOMALY_DETECTOR_ENDPOINT, data_source) # Train a new model - model_id = sample.train(datetime(2021, 1, 1, 0, 0, 0), datetime(2021, 1, 2, 12, 0, 0)) + model_id = sample.train(datetime(2021, 1, 1, 0, 0, 0, tzinfo=timezone.utc), + datetime(2021, 1, 2, 12, 0, 0, tzinfo=timezone.utc)) assert model_id is not None # Reference - result = sample.detect(model_id, datetime(2021, 1, 2, 12, 0, 0), datetime(2021, 1, 3, 0, 0, 0)) + result = sample.detect(model_id, datetime(2021, 1, 2, 12, 0, 0, tzinfo=timezone.utc), + datetime(2021, 1, 3, 0, 0, 0, tzinfo=timezone.utc)) assert result is not None print("Result ID:\t", result.result_id) From 90cff6bb3f8c1b236c137a11d0b6bb7c6c08505e Mon Sep 17 00:00:00 2001 From: David Liang Date: Wed, 14 Jul 2021 14:03:16 +0800 Subject: [PATCH 06/10] MVAD sample refine --- .../samples/sample_multivariate_detect.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_multivariate_detect.py b/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_multivariate_detect.py index 03869dc28f5f..a9b00b703ad3 100644 --- a/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_multivariate_detect.py +++ b/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_multivariate_detect.py @@ -30,7 +30,7 @@ from azure.core.exceptions import HttpResponseError -class MultivariateSample(): +class MultivariateSample: def __init__(self, subscription_key, anomaly_detector_endpoint, data_source=None): self.sub_key = subscription_key @@ -150,8 +150,8 @@ def delete_model(self, model_id): if __name__ == '__main__': - SUBSCRIPTION_KEY = os.environ["ANOMALY_DETECTOR_KEY"] - ANOMALY_DETECTOR_ENDPOINT = os.environ["ANOMALY_DETECTOR_ENDPOINT"] + SUBSCRIPTION_KEY = "" + ANOMALY_DETECTOR_ENDPOINT = "" # ***************************** # Use your own data source here From 0162b6b3bca1194b253f774b5d04db88d78f14c1 Mon Sep 17 00:00:00 2001 From: David Liang Date: Wed, 14 Jul 2021 14:03:39 +0800 Subject: [PATCH 07/10] remove credential info --- .../samples/sample_multivariate_detect.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_multivariate_detect.py b/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_multivariate_detect.py index a9b00b703ad3..20265e848f92 100644 --- a/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_multivariate_detect.py +++ b/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_multivariate_detect.py @@ -44,14 +44,14 @@ def __init__(self, subscription_key, anomaly_detector_endpoint, data_source=None self.data_source = data_source - def train(self, start_time, end_time, timeout_in_seconds=1000): + def train(self, start_time, end_time): # Number of models available now model_list = list(self.ad_client.list_multivariate_model(skip=0, top=10000)) print("{:d} available models before training.".format(len(model_list))) # Use sample data to train the model - print("Training new model...") + print("Training new model...(it may take a few minutes)") data_feed = ModelInfo(start_time=start_time, end_time=end_time, source=self.data_source) response_header = \ self.ad_client.train_multivariate_model(data_feed, cls=lambda *args: [args[i] for i in range(len(args))])[ @@ -61,8 +61,7 @@ def train(self, start_time, end_time, timeout_in_seconds=1000): # Wait until the model is ready. It usually takes several minutes model_status = None - start = time.time() - while time.time() - start < timeout_in_seconds and model_status != ModelStatus.READY and model_status != ModelStatus.FAILED: + while model_status != ModelStatus.READY and model_status != ModelStatus.FAILED: model_info = self.ad_client.get_multivariate_model(trained_model_id).model_info model_status = model_info.status time.sleep(1) @@ -91,7 +90,7 @@ def train(self, start_time, end_time, timeout_in_seconds=1000): print("Model is not ready yet. Model status: {}".format(model_status)) return None - def detect(self, model_id, start_time, end_time, timeout_in_seconds=500): + def detect(self, model_id, start_time, end_time): # Detect anomaly in the same data source (but a different interval) try: @@ -102,8 +101,9 @@ def detect(self, model_id, start_time, end_time, timeout_in_seconds=500): # Get results (may need a few seconds) r = self.ad_client.get_detection_result(result_id) - start = time.time() - while r.summary.status != DetectionStatus.READY and r.summary.status != DetectionStatus.FAILED and time.time() - start < timeout_in_seconds: + print("Get detection result...(it may take a few seconds)") + + while r.summary.status != DetectionStatus.READY and r.summary.status != DetectionStatus.FAILED: r = self.ad_client.get_detection_result(result_id) time.sleep(1) From 2e7374673c8cad5174bc9bf36b255d6072ea6576 Mon Sep 17 00:00:00 2001 From: David Liang Date: Wed, 14 Jul 2021 14:05:52 +0800 Subject: [PATCH 08/10] bug fix --- .../samples/sample_multivariate_detect.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_multivariate_detect.py b/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_multivariate_detect.py index 20265e848f92..44bab0aa1bcc 100644 --- a/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_multivariate_detect.py +++ b/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_multivariate_detect.py @@ -150,8 +150,8 @@ def delete_model(self, model_id): if __name__ == '__main__': - SUBSCRIPTION_KEY = "" - ANOMALY_DETECTOR_ENDPOINT = "" + SUBSCRIPTION_KEY = os.environ["ANOMALY_DETECTOR_KEY"] + ANOMALY_DETECTOR_ENDPOINT = os.environ["ANOMALY_DETECTOR_ENDPOINT"] # ***************************** # Use your own data source here From 44c38d8df08fa1fe1129d7087d44ace642399b23 Mon Sep 17 00:00:00 2001 From: David Liang Date: Wed, 14 Jul 2021 14:08:19 +0800 Subject: [PATCH 09/10] remove timeout --- .../samples/sample_multivariate_detect.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_multivariate_detect.py b/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_multivariate_detect.py index 44bab0aa1bcc..1076959539c7 100644 --- a/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_multivariate_detect.py +++ b/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_multivariate_detect.py @@ -107,10 +107,6 @@ def detect(self, model_id, start_time, end_time): r = self.ad_client.get_detection_result(result_id) time.sleep(1) - if r.summary.status == DetectionStatus.RUNNING or r.summary.status == DetectionStatus.CREATED: - print("Detection is not ready yet. Detection status: {}".format(r.summary.status)) - return None - if r.summary.status == DetectionStatus.FAILED: print("Detection failed.") print("Errors:") From 7bd6237d8fbfbc5d05789e9d2654aae5eb8894b2 Mon Sep 17 00:00:00 2001 From: David Liang Date: Wed, 14 Jul 2021 14:11:21 +0800 Subject: [PATCH 10/10] remove timeout --- .../samples/sample_multivariate_detect.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_multivariate_detect.py b/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_multivariate_detect.py index 1076959539c7..67779706d6cd 100644 --- a/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_multivariate_detect.py +++ b/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_multivariate_detect.py @@ -86,9 +86,6 @@ def train(self, start_time, end_time): # Return the latest model id return trained_model_id - # If model status is "CREATED" or "RUNNING" - print("Model is not ready yet. Model status: {}".format(model_status)) - return None def detect(self, model_id, start_time, end_time):