#forecasting #statistics #arima #ets

anofox-forecast

Time series forecasting library - Rust port of anofox-time

2 unstable releases

new 0.2.0 Dec 18, 2025
0.1.0 Dec 12, 2025

#141 in Math

MIT license

1.5MB
31K SLoC

Rust 28K SLoC // 0.1% comments C++ 1.5K SLoC // 0.1% comments Python 1.5K SLoC // 0.2% comments

anofox-forecast

CI Crates.io Documentation codecov MIT License

Time series forecasting library for Rust.

Provides 35+ forecasting models, 76+ statistical features, seasonality decomposition, changepoint detection, anomaly detection, and time series clustering. Rust port of anofox-time (C++).

Features

  • Forecasting Models (35+)

    • ARIMA and AutoARIMA with automatic order selection
    • Exponential Smoothing: Simple (SES), Holt's Linear, Holt-Winters
    • ETS (Error-Trend-Seasonal) state-space framework with AutoETS
    • Baseline methods: Naive, Seasonal Naive, Random Walk with Drift, Simple Moving Average
    • Theta method for forecasting
    • Intermittent demand models: Croston, ADIDA, TSB
    • Ensemble methods with multiple combination strategies
  • Time Series Feature Extraction (76+ features)

    • Basic statistics (mean, variance, quantiles, energy, etc.)
    • Distribution features (skewness, kurtosis, symmetry)
    • Autocorrelation and partial autocorrelation
    • Entropy features (approximate, sample, permutation, binned, Fourier)
    • Complexity measures (C3, CID, Lempel-Ziv)
    • Trend analysis and stationarity tests (ADF, KPSS)
  • Seasonality & Decomposition

    • STL (Seasonal-Trend decomposition using LOESS)
    • MSTL (Multiple Seasonal-Trend decomposition) for complex seasonality
  • Periodicity Detection

    • ACF-based period detection
    • FFT-based spectral analysis
    • Autoperiod (hybrid FFT+ACF, Vlachos et al. 2005)
    • CFD-Autoperiod (noise-resistant with clustering)
    • SAZED ensemble (parameter-free, combines multiple methods)
  • Changepoint Detection

    • PELT algorithm with O(n) average complexity
    • Multiple cost functions: L1, L2, Normal, Poisson
  • Anomaly Detection

    • Statistical methods (IQR, z-score)
    • Automatic threshold selection
    • Seasonality-aware detection
  • Time Series Clustering

    • Dynamic Time Warping (DTW) distance
    • K-Means clustering with multiple distance metrics
    • Elbow method for optimal cluster selection
  • Data Transformations

    • Scaling: standardization, min-max, robust scaling
    • Box-Cox transformation with automatic lambda selection
    • Window functions: rolling mean, std, min, max, median
    • Exponential weighted moving averages
  • Model Evaluation & Validation

    • Accuracy metrics: MAE, MSE, RMSE, MAPE, and more
    • Time series cross-validation
    • Residual testing and diagnostics

Installation

Add this to your Cargo.toml:

[dependencies]
anofox-forecast = "0.1"

Quick Start

Creating a Time Series

use anofox_forecast::prelude::*;
use chrono::{TimeZone, Utc};

// Create timestamps
let timestamps: Vec<_> = (0..100)
    .map(|i| Utc.with_ymd_and_hms(2024, 1, 1, 0, 0, 0).unwrap() + chrono::Duration::days(i))
    .collect();

// Create values
let values: Vec<f64> = (0..100).map(|i| (i as f64 * 0.1).sin() + 10.0).collect();

// Build the time series
let ts = TimeSeries::builder()
    .timestamps(timestamps)
    .values(values)
    .build()?;

ARIMA Forecasting

use anofox_forecast::prelude::*;
use anofox_forecast::models::arima::Arima;

// Create and fit an ARIMA(1,1,1) model
let mut model = Arima::new(1, 1, 1)?;
model.fit(&ts)?;

// Generate forecasts with 95% confidence intervals
let forecast = model.predict_with_intervals(12, 0.95)?;

println!("Point forecasts: {:?}", forecast.values());
println!("Lower bounds: {:?}", forecast.lower());
println!("Upper bounds: {:?}", forecast.upper());

Holt-Winters Forecasting

use anofox_forecast::models::exponential::HoltWinters;

// Create Holt-Winters with additive seasonality (period = 12)
let mut model = HoltWinters::additive(12)?;
model.fit(&ts)?;

let forecast = model.predict(24)?;

Feature Extraction

use anofox_forecast::features::{mean, variance, skewness, approximate_entropy};

let values = ts.values();

let m = mean(values);
let v = variance(values);
let s = skewness(values);
let ae = approximate_entropy(values, 2, 0.2)?;

println!("Mean: {}, Variance: {}, Skewness: {}, ApEn: {}", m, v, s, ae);

STL Decomposition

use anofox_forecast::seasonality::Stl;

// Decompose with seasonal period of 12
let stl = Stl::new(12)?;
let decomposition = stl.decompose(&ts)?;

println!("Trend: {:?}", decomposition.trend());
println!("Seasonal: {:?}", decomposition.seasonal());
println!("Remainder: {:?}", decomposition.remainder());

Changepoint Detection

use anofox_forecast::changepoint::{Pelt, CostFunction};

let pelt = Pelt::new(CostFunction::L2, 10.0)?;
let changepoints = pelt.detect(&ts)?;

println!("Changepoints at indices: {:?}", changepoints);

Periodicity Detection

use anofox_forecast::detection::{
    detect_period, detect_period_ensemble, Autoperiod, PeriodicityDetector,
};

// Quick detection with default settings
let result = detect_period(&values);
println!("Detected period: {:?}", result.primary_period);

// Ensemble method (combines ACF, FFT, and other detectors)
let result = detect_period_ensemble(&values);
println!("Period: {:?}, Confidence: {:.2}", result.primary_period, result.confidence());

// Custom detector with specific parameters
let detector = Autoperiod::new(2, 365, 3.0, 0.2);
let result = detector.detect(&values);
for p in &result.periods {
    println!("Period: {}, Score: {:.4}, Source: {:?}", p.period, p.score, p.source);
}

API Reference

Core Types

Type Description
TimeSeries Main data structure for univariate/multivariate time series
Forecast Prediction results with optional confidence intervals
CalendarAnnotations Holiday and regressor management
AccuracyMetrics Model evaluation metrics (MAE, MSE, RMSE, MAPE, etc.)

Forecasting Models

Model Description
Arima ARIMA(p,d,q) model
AutoArima Automatic ARIMA order selection
Ses Simple Exponential Smoothing
Holt Holt's Linear Trend method
HoltWinters Holt-Winters with seasonal components
Ets ETS state-space model
AutoEts Automatic ETS model selection
Naive Naive forecasting
SeasonalNaive Seasonal naive forecasting
Theta Theta method
Croston Croston's method for intermittent demand

Feature Categories

Category Examples
Basic mean, variance, minimum, maximum, quantile
Distribution skewness, kurtosis, variation_coefficient
Autocorrelation autocorrelation, partial_autocorrelation
Entropy approximate_entropy, sample_entropy, permutation_entropy
Complexity c3, cid_ce, lempel_ziv_complexity
Trend linear_trend, adf_test, ar_coefficient

Dependencies

  • chrono - Date and time handling
  • faer - Linear algebra operations
  • statrs - Statistical distributions and functions
  • thiserror - Error handling
  • rand - Random number generation
  • rustfft - Fast Fourier Transform for periodicity detection

License

MIT License - see LICENSE for details.

Dependencies

~12MB
~240K SLoC