/trend-api

Anomaly detection and forecasting API

Primary LanguageRGNU General Public License v3.0GPL-3.0

Trend

An anomaly detection and forecasting API. Get started quickly with state-of-the-art algorithms.

Installation

Docker

An image is available on Docker Hub. Run:

docker run -ti -p=8000:8000 ankane/trend

Non-Docker

Download the latest code

git clone https://github.com/ankane/trend-api.git
cd trend-api

Install Jetpack and run:

Rscript -e 'jetpack::install()'

And start the server

Rscript server.R

Anomaly Detection

Detect anomalies in a time series.

  • Works with dates and times
  • Accounts for seasonality and trend
  • Robust to missing values

The current version uses STL with multiple seasonal components for decomposition.

POST /anomalies HTTP/1.1
Host: trendapi.org
Content-Type: application/json

{
  "series": {
    "2023-01-01": 150,
    "2023-01-02": 125,
    "2023-01-03": 133
  }
}

Returns JSON structured like this:

{
  "anomalies": [
    "2023-01-10",
    "2023-01-13"
  ]
}

Forecasting

Get future predictions for a time series.

  • Works with dates and times
  • Accounts for seasonality and trend
  • Robust to missing values
  • No need to remove outliers beforehand

The current version uses TBATS for predictions.

POST /forecast HTTP/1.1
Host: trendapi.org
Content-Type: application/json

{
  "series": {
    "2023-01-01": 150,
    "2023-01-02": 125,
    "2023-01-03": 133
  },
  "count": 3
}

Returns JSON structured like this:

{
  "forecast": {
    "2023-03-01": 137.5,
    "2023-03-02": 122.9,
    "2023-03-03": 144.1
  }
}

If you get a flat or linear forecast, this is expected. It means no seasonality is detected in the series.

Correlation (Experimental)

Get the correlation between two time series.

The current version uses normalized cross correlation.

POST /correlation HTTP/1.1
Host: trendapi.org
Content-Type: application/json

{
  "series": {
    "2023-01-01": 150,
    "2023-01-02": 125,
    "2023-01-03": 133
  },
  "series2": {
    "2023-01-01": 150,
    "2023-01-02": 176,
    "2023-01-03": 145
  }
}

Returns JSON structured like this:

{
  "correlation": 0.95
}

Errors

The API uses HTTP status codes to indicate errors.

Code Description
400 There’s an issue with the request parameters
500 There’s an issue with the server

The body will contain details about the specific error.

{
  "error": "Missing parameter: series"
}

Clients

A client library is available for Ruby.

Here’s an example with jQuery:

var series = {}, i, date, data;
for (i = 1; i < 30; i++) {
  date = new Date(2018, 3, i);
  series[date.toISOString()] = date.getDay();
}
data = {series: series};

$.post("https://trendapi.org/forecast", data, function(resp) {
  console.log(resp);
}, "json");

Credits

A special thanks to Rob J Hyndman for his incredible work on forecasting. Learn more about the topic from his free online book.

History

View the changelog

Contributing

Everyone is encouraged to help improve this project. Here are a few ways you can help: