torsh-series
Time series analysis and forecasting components for ToRSh - powered by SciRS2.
Overview
This crate provides comprehensive time series analysis, forecasting, and modeling capabilities with PyTorch-compatible neural network integration. It leverages scirs2-series for classical time series methods while enabling deep learning approaches through ToRSh's neural network modules.
Features
- Forecasting Models: ARIMA, SARIMA, Prophet, Exponential Smoothing
- Neural Forecasting: LSTM, GRU, Temporal CNNs, Transformers, N-BEATS, DeepAR
- Decomposition: STL, seasonal decomposition, trend extraction
- Anomaly Detection: Isolation forests, statistical methods, autoencoders
- State Space Models: Kalman filters, particle filters, Hidden Markov Models
- Feature Engineering: Lag features, rolling statistics, fourier features
- Changepoint Detection: PELT, Binary segmentation, Bayesian methods
- Frequency Analysis: FFT, spectral analysis, wavelets
- Utilities: Differencing, transformations, stationarity tests
- GPU Acceleration: Neural forecasting models on CUDA
Usage
Basic Time Series Operations
use *;
use *;
// Create time series data
let data = tensor!;
let timestamps = tensor!;
// Create TimeSeries object
let ts = new?;
println!;
println!;
// Basic statistics
println!;
println!;
Time Series Decomposition
STL Decomposition (Seasonal-Trend decomposition using Loess)
use *;
let data = generate_seasonal_data?; // 2 years of monthly data
// Perform STL decomposition
let stl = STLnew
.seasonal_window
.trend_window
.seasonal_degree
.trend_degree;
let result = stl.fit?;
let trend = result.trend;
let seasonal = result.seasonal;
let residual = result.residual;
println!;
println!;
// Plot components
plot_decomposition?;
Classical Decomposition
use *;
let data = load_ts?;
// Additive decomposition: data = trend + seasonal + residual
let decomp_add = seasonal_decompose?;
// Multiplicative decomposition: data = trend * seasonal * residual
let decomp_mul = seasonal_decompose?;
let trend = decomp_add.trend;
let seasonal = decomp_add.seasonal;
let residual = decomp_add.residual;
ARIMA Models
use *;
let data = load_ts?;
// Auto ARIMA - automatically selects best (p,d,q) parameters
let auto_model = new
.seasonal
.m // Seasonal period
.max_p
.max_q
.max_d
.information_criterion;
let model = auto_model.fit?;
println!;
// Forecast next 24 steps
let forecast = model.predict?;
let conf_int = model.predict_interval?; // 95% confidence interval
// Manual ARIMA(2,1,1)
let arima = ARIMAnew?;
arima.fit?;
let forecast = arima.predict?;
SARIMA (Seasonal ARIMA)
use *;
let data = load_ts?;
// SARIMA(1,1,1)(1,1,1,12)
// (p,d,q) = non-seasonal parameters
// (P,D,Q,m) = seasonal parameters (m=12 for monthly data)
let sarima = SARIMAnew?;
sarima.fit?;
// Forecast with confidence intervals
let forecast = sarima.predict?;
let = sarima.predict_interval?;
// Model diagnostics
let residuals = sarima.residuals?;
let aic = sarima.aic?;
let bic = sarima.bic?;
println!;
// Check residuals for white noise
let ljung_box = ljung_box_test?;
println!;
Exponential Smoothing
use *;
let data = load_ts?;
// Simple Exponential Smoothing
let ses = new?; // alpha=0.3
ses.fit?;
let forecast = ses.predict?;
// Holt's Linear Trend
let holt = new?; // alpha=0.8, beta=0.2
holt.fit?;
let forecast = holt.predict?;
// Holt-Winters (Triple Exponential Smoothing)
let hw = new
.seasonal_periods
.trend
.seasonal
.alpha
.beta
.gamma;
hw.fit?;
let forecast = hw.predict?;
// Auto ETS - automatically selects Error-Trend-Seasonal components
let auto_ets = new
.information_criterion
.allow_multiplicative_trend;
let model = auto_ets.fit?;
println!;
Neural Forecasting Models
LSTM for Time Series
use *;
use *;
let data = load_ts?;
// Prepare sequences for LSTM
let = create_sequences?;
// Define LSTM model
let lstm = new
.input_size
.hidden_size
.num_layers
.output_size
.dropout
.bidirectional;
// Train model
lstm.fit?;
// Forecast
let forecast = lstm.predict?;
// Multi-step forecasting
let multi_step_forecast = lstm.predict_multi_step?;
Temporal Convolutional Network (TCN)
use *;
let tcn = TCNnew
.input_channels
.output_size
.num_channels
.kernel_size
.dropout;
tcn.fit?;
let forecast = tcn.predict?;
Transformer for Time Series
use *;
let transformer = new
.d_model
.nhead
.num_encoder_layers
.num_decoder_layers
.dim_feedforward
.dropout
.sequence_length
.forecast_horizon;
transformer.fit?;
let forecast = transformer.predict?;
N-BEATS (Neural Basis Expansion Analysis)
use *;
// N-BEATS: interpretable and accurate forecasting
let nbeats = NBEATSnew
.stack_types
.num_blocks_per_stack
.forecast_length
.backcast_length
.hidden_layer_units
.share_weights_in_stack;
nbeats.fit?;
let forecast = nbeats.predict?;
// Get interpretable components
let = nbeats.decompose?;
DeepAR (Probabilistic Forecasting)
use *;
// DeepAR provides probabilistic forecasts
let deepar = new
.input_size
.hidden_size
.num_layers
.dropout
.context_length
.prediction_length=10;
deepar.fit?;
// Get probabilistic forecast with quantiles
let median_forecast = deepar.predict?;
let lower_bound = deepar.predict?;
let upper_bound = deepar.predict?;
// Sample from predictive distribution
let samples = deepar.sample?;
Anomaly Detection
use *;
let data = load_ts?;
// Statistical anomaly detection
let detector = new
.method
.threshold
.window_size;
let anomalies = detector.detect?;
println!;
// Isolation Forest
let iforest = new
.n_estimators
.contamination
.max_samples;
iforest.fit?;
let anomaly_scores = iforest.score?;
let anomalies = iforest.predict?; // -1 for anomalies, 1 for normal
// LSTM Autoencoder for anomaly detection
let ae = new
.encoding_dim
.sequence_length
.threshold_percentile;
ae.fit?;
let reconstruction_errors = ae.reconstruction_error?;
let anomalies = ae.detect_anomalies?;
// Seasonal Hybrid ESD (S-H-ESD) for seasonal data
let shesd = new
.max_anomalies
.alpha
.periodicity;
let anomalies = shesd.detect?;
Changepoint Detection
use *;
let data = load_ts?;
// PELT (Pruned Exact Linear Time)
let pelt = PELTnew
.model
.min_size
.jump
.penalty;
let changepoints = pelt.detect?;
println!;
// Binary Segmentation
let binseg = new
.n_changepoints
.model;
let changepoints = binseg.detect?;
// Bayesian Online Changepoint Detection
let bocd = new
.hazard_rate
.delay;
let changepoint_probs = bocd.detect_online?;
// Cumulative Sum (CUSUM)
let cusum = CUSUMnew
.threshold
.drift;
let changepoints = cusum.detect?;
State Space Models
Kalman Filter
use *;
// Linear Kalman Filter
let kf = new
.state_transition
.observation_matrix
.process_noise
.observation_noise
.initial_state
.initial_covariance;
// Filter (estimate current state)
let filtered_states = kf.filter?;
// Smooth (estimate all states given all observations)
let smoothed_states = kf.smooth?;
// Predict future states
let predictions = kf.predict?;
Particle Filter
use *;
// Particle Filter for nonlinear/non-Gaussian systems
let pf = new
.num_particles
.state_transition_fn
.observation_fn
.resampling_strategy;
let estimated_states = pf.filter?;
Hidden Markov Model (HMM)
use *;
// Discrete HMM
let hmm = HMMnew
.n_states
.n_observations;
hmm.fit?;
// Viterbi algorithm - find most likely state sequence
let state_sequence = hmm.viterbi?;
// Forward-backward algorithm - compute state probabilities
let state_probs = hmm.forward_backward?;
// Predict next observations
let predictions = hmm.predict?;
Frequency Domain Analysis
use *;
let data = load_ts?;
// Fast Fourier Transform
let fft_result = fft?;
let power_spectrum = fft_result.abs?.pow?;
// Find dominant frequencies
let dominant_freqs = find_dominant_frequencies?;
println!;
// Periodogram
let = periodogram?;
// Welch's method for power spectral density
let = welch?;
// Wavelet transform
let wavelet = new;
let coeffs = wavelet.transform?;
// Spectrogram
let = spectrogram?;
Feature Engineering
use *;
let data = load_ts?;
// Create lag features
let lag_features = create_lags?;
// Rolling statistics
let rolling_mean = rolling_mean?;
let rolling_std = rolling_std?;
let rolling_min = rolling_min?;
let rolling_max = rolling_max?;
// Expanding statistics
let expanding_mean = expanding_mean?;
let expanding_std = expanding_std?;
// Exponentially weighted statistics
let ewm_mean = ewm_mean?;
let ewm_std = ewm_std?;
// Time-based features
let ts_features = new
.add_hour_of_day
.add_day_of_week
.add_day_of_month
.add_month_of_year
.add_quarter
.add_is_weekend
.add_is_holiday;
let features = ts_features.transform?;
// Fourier features for seasonality
let fourier = fourier_features?;
// Calendar features
let calendar = calendar_features?;
Stationarity and Transformations
use *;
let data = load_ts?;
// Test for stationarity
let adf_result = augmented_dickey_fuller?;
println!;
if adf_result.p_value > 0.05
// KPSS test
let kpss_result = kpss_test?;
// Differencing
let diff1 = difference?;
let diff2 = difference?; // Second-order differencing
// Seasonal differencing
let seasonal_diff = seasonal_difference?;
// Log transformation
let log_data = data.log?;
// Box-Cox transformation
let = boxcox?;
println!;
// Inverse transform
let original = inv_boxcox?;
// Detrending
let detrended = detrend?;
Model Selection and Validation
use *;
let data = load_ts?;
// Train-test split
let split = 0.8;
let = train_test_split?;
// Time series cross-validation
let tscv = new;
for in tscv.split
// Expanding window cross-validation
let expanding_cv = new;
// Grid search for hyperparameters
let param_grid = vec!;
let best_params = grid_search_arima?;
println!;
Evaluation Metrics
use *;
let y_true = test_data;
let y_pred = forecasts;
// Mean Absolute Error
let mae = mean_absolute_error?;
// Root Mean Squared Error
let rmse = root_mean_squared_error?;
// Mean Absolute Percentage Error
let mape = mean_absolute_percentage_error?;
// Symmetric MAPE
let smape = symmetric_mape?;
// Mean Absolute Scaled Error
let mase = mean_absolute_scaled_error?;
// Forecast bias
let bias = forecast_bias?;
// Tracking signal
let tracking_signal = tracking_signal?;
Integration with SciRS2
This crate leverages the SciRS2 ecosystem for:
- Classical time series methods through
scirs2-series - Signal processing via
scirs2-signal - Statistical functions from
scirs2-stats - Neural network components via ToRSh modules
- Optimized tensor operations through
scirs2-core
All implementations follow the SciRS2 POLICY for consistent APIs and optimal performance.
Examples
See the examples/ directory for detailed examples:
arima_forecasting.rs- ARIMA/SARIMA modelinglstm_forecasting.rs- Neural forecasting with LSTManomaly_detection.rs- Time series anomaly detectiondecomposition.rs- STL and seasonal decompositionchangepoint_detection.rs- Detecting regime changeskalman_filter.rs- State space modeling
Performance Tips
- Use GPU acceleration for neural forecasting models
- Apply differencing to make series stationary before ARIMA
- Normalize data before training neural networks
- Use parallel processing for cross-validation
- Cache decomposition results when used multiple times
License
Licensed under the Apache License, Version 2.0. See LICENSE for details.