Skip to main content

Anomaly Detection Algorithms

Input Limitations

execute is the core method of anomaly detection algorithms. Before calling this method, the framework configures the historical time-series data used for anomaly detection in the self.list object attribute.

Output Limitations

The execute method returns an array of the same length as self.list. A value of -1 in the array indicates an anomaly.

For example, in the series [2, 2, 2, 2, 100], assuming that 100 is an anomaly, the method returns [1, 1, 1, 1, -1].

Sample Code

This section describes an example anomaly detection algorithm that returns the final data point in a time series as an anomaly.

from taosanalytics.service import AbstractAnomalyDetectionService

# Algorithm files must start with an underscore ("_") and end with "Service".
class _MyAnomalyDetectionService(AbstractAnomalyDetectionService):
""" Define a class inheriting from AbstractAnomalyDetectionService and implementing the abstract method of that class. """

# Name the algorithm using only lowercase ASCII characters.
name = 'myad'

# Include a description of the algorithm (recommended)
desc = """return the last value as the anomaly data"""

def __init__(self):
"""Method to initialize the class"""
super().__init__()

def execute(self):
""" Implementation of algorithm logic"""

"""Create an array with length len(self.list) whose results are all 1, then set the final value in the array to -1 to indicate an anomaly"""
res = [1] * len(self.list)
res[-1] = -1

"""Return results"""
return res


def set_params(self, params):
"""This algorithm does not take any parameters, so this logic is not included."""
return super().set_params(params)

Save this file to the ./lib/taosanalytics/algo/ad/ directory and restart the taosanode service. In the TDengine CLI, run SHOW ANODES FULL to see your new algorithm. Your applications can now invoke this algorithm via SQL.

--- Detect anomalies in the `col` column using the newly added `myad` algorithm
SELECT COUNT(*) FROM foo ANOMALY_WINDOW(col, 'algo=myad')

If you have never started the anode, see Installation to add the anode to your TDengine cluster.

Unit Testing

You can add unit test cases to the anomaly_test.py file in the taosanalytics/test directory or create a file for unit tests. The framework uses the Python unittest module.

def test_myad(self):
""" Test the _IqrService class """
s = loader.get_service("myad")

# Configure the data to test
s.set_input_list(AnomalyDetectionTest.input_list, None)

r = s.execute()

# The final value is an anomaly
self.assertEqual(r[-1], -1)
self.assertEqual(len(r), len(AnomalyDetectionTest.input_list))