From 49cc1fe0a7820893ba67d7b26404778378bd5774 Mon Sep 17 00:00:00 2001 From: Congrui <43364740+conhua@users.noreply.github.com> Date: Tue, 1 Sep 2020 23:51:46 +0800 Subject: [PATCH] add python sdk sample (#13338) * add python sample * add change point * update anomaly detector sample code * update readme * update readme for samples * update MANIFEST.in * fix pr Co-authored-by: yongxingwu Co-authored-by: Xia Zhu --- .../azure-ai-anomalydetector/MANIFEST.in | 1 + .../samples/README.md | 59 +++++++++++++ .../samples/sample_data/request-data.csv | 47 +++++++++++ .../samples/sample_detect_change_point.py | 84 +++++++++++++++++++ .../sample_detect_entire_series_anomaly.py | 84 +++++++++++++++++++ .../sample_detect_last_point_anomaly.py | 81 ++++++++++++++++++ 6 files changed, 356 insertions(+) create mode 100644 sdk/anomalydetector/azure-ai-anomalydetector/samples/README.md create mode 100644 sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_data/request-data.csv create mode 100644 sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_detect_change_point.py create mode 100644 sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_detect_entire_series_anomaly.py create mode 100644 sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_detect_last_point_anomaly.py diff --git a/sdk/anomalydetector/azure-ai-anomalydetector/MANIFEST.in b/sdk/anomalydetector/azure-ai-anomalydetector/MANIFEST.in index bde85ca9d6c8..622490cdae53 100644 --- a/sdk/anomalydetector/azure-ai-anomalydetector/MANIFEST.in +++ b/sdk/anomalydetector/azure-ai-anomalydetector/MANIFEST.in @@ -1,4 +1,5 @@ recursive-include tests *.py *.yaml +recursive-include samples *.py *.md include *.md include azure/__init__.py include azure/ai/__init__.py diff --git a/sdk/anomalydetector/azure-ai-anomalydetector/samples/README.md b/sdk/anomalydetector/azure-ai-anomalydetector/samples/README.md new file mode 100644 index 000000000000..d3cbeb03df82 --- /dev/null +++ b/sdk/anomalydetector/azure-ai-anomalydetector/samples/README.md @@ -0,0 +1,59 @@ +--- +page_type: sample +languages: + - python +products: + - azure + - azure-cognitive-services + - azure-anomaly-detector +urlFragment: anomalydetector-samples +--- + +# Samples for Azure Anomaly Detector client library for Python + +These code samples show common scenario operations with the Anomaly Detector client library. + +These sample programs show common scenarios for the Anomaly Detector client's offerings. + +|**File Name**|**Description**| +|----------------|-------------| +|[sample_detect_entire_series_anomaly.py][sample_detect_entire_series_anomaly] |Detecting anomalies in the entire time series.| +|[sample_detect_last_point_anomaly.py][sample_detect_last_point_anomaly] |Detecting the anomaly status of the latest data point.| +|[sample_detect_change_point.py][sample_detect_change_point] |Detecting change points in the entire time series.| + +## Prerequisites +* Python 2.7 or 3.5 or higher is required to use this package. +* The Pandas data analysis library. +* You must have an [Azure subscription][azure_subscription] and an +[Azure Anomaly Detector account][azure_anomaly_detector_account] to run these samples. + +## Setup + +1. Install the Azure Anomaly Detector client library for Python with [pip][pip]: + +```bash +pip install azure-ai-anomalydetector +``` + +2. Clone or download this sample repository +3. Open the sample folder in Visual Studio Code or your IDE of choice. + +## Running the samples + +1. Open a terminal window and `cd` to the directory that the samples are saved in. +2. Set the environment variables specified in the sample file you wish to run. +3. Follow the usage described in the file, e.g. `python sample_detect_entire_series_anomaly.py` + +## Next steps + +Check out the [API reference documentation][python-fr-ref-docs] to learn more about +what you can do with the Azure Anomaly Detector client library. + +[pip]: https://pypi.org/project/pip/ +[azure_subscription]: https://azure.microsoft.com/free/cognitive-services +[azure_anomaly_detector_account]: https://ms.portal.azure.com/#create/Microsoft.CognitiveServicesAnomalyDetector +[python-fr-ref-docs]: https://azuresdkdocs.blob.core.windows.net/$web/python/azure-cognitiveservices-anomalydetector/0.3.0/index.html + +[sample_detect_entire_series_anomaly]: ./sample_detect_entire_series_anomaly.py +[sample_detect_last_point_anomaly]: ./sample_detect_last_point_anomaly.py +[sample_detect_change_point]: ./sample_detect_change_point.py diff --git a/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_data/request-data.csv b/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_data/request-data.csv new file mode 100644 index 000000000000..7f242c3712c1 --- /dev/null +++ b/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_data/request-data.csv @@ -0,0 +1,47 @@ +2018-03-01T00:00:00Z,32858923 +2018-03-02T00:00:00Z,29615278 +2018-03-03T00:00:00Z,22839355 +2018-03-04T00:00:00Z,25948736 +2018-03-05T00:00:00Z,34139159 +2018-03-06T00:00:00Z,33843985 +2018-03-07T00:00:00Z,33637661 +2018-03-08T00:00:00Z,32627350 +2018-03-09T00:00:00Z,29881076 +2018-03-10T00:00:00Z,22681575 +2018-03-11T00:00:00Z,24629393 +2018-03-12T00:00:00Z,34010679 +2018-03-13T00:00:00Z,33893888 +2018-03-14T00:00:00Z,33760076 +2018-03-15T00:00:00Z,33093515 +2018-03-16T00:00:00Z,29945555 +2018-03-17T00:00:00Z,22676212 +2018-03-18T00:00:00Z,25262514 +2018-03-19T00:00:00Z,33631649 +2018-03-20T00:00:00Z,34468310 +2018-03-21T00:00:00Z,34212281 +2018-03-22T00:00:00Z,38144434 +2018-03-23T00:00:00Z,34662949 +2018-03-24T00:00:00Z,24623684 +2018-03-25T00:00:00Z,26530491 +2018-03-26T00:00:00Z,35445003 +2018-03-27T00:00:00Z,34250789 +2018-03-28T00:00:00Z,33423012 +2018-03-29T00:00:00Z,30744783 +2018-03-30T00:00:00Z,25825128 +2018-03-31T00:00:00Z,21244209 +2018-04-01T00:00:00Z,22576956 +2018-04-02T00:00:00Z,31957221 +2018-04-03T00:00:00Z,33841228 +2018-04-04T00:00:00Z,33554483 +2018-04-05T00:00:00Z,32383350 +2018-04-06T00:00:00Z,29494850 +2018-04-07T00:00:00Z,22815534 +2018-04-08T00:00:00Z,25557267 +2018-04-09T00:00:00Z,34858252 +2018-04-10T00:00:00Z,34750597 +2018-04-11T00:00:00Z,34717956 +2018-04-12T00:00:00Z,34132534 +2018-04-13T00:00:00Z,30762236 +2018-04-14T00:00:00Z,22504059 +2018-04-15T00:00:00Z,26149060 +2018-04-16T00:00:00Z,35250105 \ No newline at end of file diff --git a/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_detect_change_point.py b/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_detect_change_point.py new file mode 100644 index 000000000000..f2f0eb64e6d3 --- /dev/null +++ b/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_detect_change_point.py @@ -0,0 +1,84 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + +""" +FILE: sample_detect_change_point.py + +DESCRIPTION: + This sample demonstrates how to detect entire series change points. + +Prerequisites: + * The Anomaly Detector client library for Python + * A .csv file containing a time-series data set with + UTC-timestamp and numerical values pairings. + Example data is included in this repo. + +USAGE: + python sample_detect_change_point.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 +from azure.ai.anomalydetector import AnomalyDetectorClient +from azure.ai.anomalydetector.models import DetectRequest, TimeSeriesPoint, TimeGranularity, \ + AnomalyDetectorError +from azure.core.credentials import AzureKeyCredential +import pandas as pd + + +class DetectChangePointsSample(object): + + def detect_change_point(self): + SUBSCRIPTION_KEY = os.environ["ANOMALY_DETECTOR_KEY"] + ANOMALY_DETECTOR_ENDPOINT = os.environ["ANOMALY_DETECTOR_ENDPOINT"] + TIME_SERIES_DATA_PATH = os.path.join("./sample_data", "request-data.csv") + + # Create an Anomaly Detector client + + # + client = AnomalyDetectorClient(AzureKeyCredential(SUBSCRIPTION_KEY), ANOMALY_DETECTOR_ENDPOINT) + # + + # Load in the time series data file + + # + series = [] + data_file = pd.read_csv(TIME_SERIES_DATA_PATH, header=None, encoding='utf-8', parse_dates=[0]) + for index, row in data_file.iterrows(): + series.append(TimeSeriesPoint(timestamp=row[0], value=row[1])) + # + + # Create a request from the data file + + # + request = DetectRequest(series=series, granularity=TimeGranularity.daily) + # + + # detect change points throughout the entire time series + + # + print('Detecting change points in the entire time series.') + + try: + response = client.detect_change_point(request) + except AnomalyDetectorError as e: + print('Error code: {}'.format(e.error.code), 'Error message: {}'.format(e.error.message)) + except Exception as e: + print(e) + + if any(response.is_change_point): + print('An change point was detected at index:') + for i, value in enumerate(response.is_change_point): + if value: + print(i) + else: + print('No change point were detected in the time series.') + # + + +if __name__ == '__main__': + sample = DetectChangePointsSample() + sample.detect_change_point() diff --git a/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_detect_entire_series_anomaly.py b/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_detect_entire_series_anomaly.py new file mode 100644 index 000000000000..941e381d9cd0 --- /dev/null +++ b/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_detect_entire_series_anomaly.py @@ -0,0 +1,84 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + +""" +FILE: sample_detect_entire_series_anomaly.py + +DESCRIPTION: + This sample demonstrates how to detect entire series anomalies. + +Prerequisites: + * The Anomaly Detector client library for Python + * A .csv file containing a time-series data set with + UTC-timestamp and numerical values pairings. + Example data is included in this repo. + +USAGE: + python sample_detect_entire_series_anomaly.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 +from azure.ai.anomalydetector import AnomalyDetectorClient +from azure.ai.anomalydetector.models import DetectRequest, TimeSeriesPoint, TimeGranularity, \ + AnomalyDetectorError +from azure.core.credentials import AzureKeyCredential +import pandas as pd + + +class DetectEntireAnomalySample(object): + + def detect_entire_series(self): + SUBSCRIPTION_KEY = os.environ["ANOMALY_DETECTOR_KEY"] + ANOMALY_DETECTOR_ENDPOINT = os.environ["ANOMALY_DETECTOR_ENDPOINT"] + TIME_SERIES_DATA_PATH = os.path.join("./sample_data", "request-data.csv") + + # Create an Anomaly Detector client + + # + client = AnomalyDetectorClient(AzureKeyCredential(SUBSCRIPTION_KEY), ANOMALY_DETECTOR_ENDPOINT) + # + + # Load in the time series data file + + # + series = [] + data_file = pd.read_csv(TIME_SERIES_DATA_PATH, header=None, encoding='utf-8', parse_dates=[0]) + for index, row in data_file.iterrows(): + series.append(TimeSeriesPoint(timestamp=row[0], value=row[1])) + # + + # Create a request from the data file + + # + request = DetectRequest(series=series, granularity=TimeGranularity.daily) + # + + # detect anomalies throughout the entire time series, as a batch + + # + print('Detecting anomalies in the entire time series.') + + try: + response = client.detect_entire_series(request) + except AnomalyDetectorError as e: + print('Error code: {}'.format(e.error.code), 'Error message: {}'.format(e.error.message)) + except Exception as e: + print(e) + + if any(response.is_anomaly): + print('An anomaly was detected at index:') + for i, value in enumerate(response.is_anomaly): + if value: + print(i) + else: + print('No anomalies were detected in the time series.') + # + + +if __name__ == '__main__': + sample = DetectEntireAnomalySample() + sample.detect_entire_series() diff --git a/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_detect_last_point_anomaly.py b/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_detect_last_point_anomaly.py new file mode 100644 index 000000000000..d8557583396c --- /dev/null +++ b/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_detect_last_point_anomaly.py @@ -0,0 +1,81 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + +""" +FILE: sample_detect_last_point_anomaly.py + +DESCRIPTION: + This sample demonstrates how to detect last series point whether is anomaly. + +Prerequisites: + * The Anomaly Detector client library for Python + * A .csv file containing a time-series data set with + UTC-timestamp and numerical values pairings. + Example data is included in this repo. + +USAGE: + python sample_detect_last_point_anomaly.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 +from azure.ai.anomalydetector import AnomalyDetectorClient +from azure.ai.anomalydetector.models import DetectRequest, TimeSeriesPoint, TimeGranularity, \ + AnomalyDetectorError +from azure.core.credentials import AzureKeyCredential +import pandas as pd + + +class DetectLastAnomalySample(object): + + def detect_last_point(self): + SUBSCRIPTION_KEY = os.environ["ANOMALY_DETECTOR_KEY"] + ANOMALY_DETECTOR_ENDPOINT = os.environ["ANOMALY_DETECTOR_ENDPOINT"] + TIME_SERIES_DATA_PATH = os.path.join("./sample_data", "request-data.csv") + + # Create an Anomaly Detector client + + # + client = AnomalyDetectorClient(AzureKeyCredential(SUBSCRIPTION_KEY), ANOMALY_DETECTOR_ENDPOINT) + # + + # Load in the time series data file + + # + series = [] + data_file = pd.read_csv(TIME_SERIES_DATA_PATH, header=None, encoding='utf-8', parse_dates=[0]) + for index, row in data_file.iterrows(): + series.append(TimeSeriesPoint(timestamp=row[0], value=row[1])) + # + + # Create a request from the data file + + # + request = DetectRequest(series=series, granularity=TimeGranularity.daily) + # + + # Detect the anomaly status of the latest data point + + # + print('Detecting the anomaly status of the latest data point.') + + try: + response = client.detect_last_point(request) + except AnomalyDetectorError as e: + print('Error code: {}'.format(e.error.code), 'Error message: {}'.format(e.error.message)) + except Exception as e: + print(e) + + if response.is_anomaly: + print('The latest point is detected as anomaly.') + else: + print('The latest point is not detected as anomaly.') + # + + +if __name__ == '__main__': + sample = DetectLastAnomalySample() + sample.detect_last_point()