π Demo: Google Colab
AutoTrend is a lightweight, iterative method for extracting local linear trends from time series data. Unlike traditional sliding window approaches that fit a model at every point, AutoTrend achieves computational efficiency by training a single linear regression model per focus region and extending the trend forward, measuring prediction errors without repeated model fitting.
pip install autotrendOr install from source:
git clone https://github.com/chotanansub/autotrend.git
cd autotrend
pip install -e .import numpy as np
from autotrend import decompose_llt
# Generate or load your time series
sequence = np.sin(np.linspace(0, 50, 500)) + np.linspace(0, 5, 500)
# Run LLT decomposition
result = decompose_llt(
seq=sequence,
max_models=5,
window_size=10,
error_percentile=40
)
# Visualize results
result.plot_full_decomposition()
# Access results
print(f"Number of iterations: {result.get_num_iterations()}")
print(f"Trend segments: {result.get_trend_segments()}")Output:
result.trend_marks: Array indicating which iteration labeled each pointresult.prediction_marks: Predicted values for each pointresult.models: List of LinearRegression models from each iterationresult.process_logs: Detailed logs for visualization
Traditional sliding window regression methods fit a new model at every time point, leading to high computational costs. Change point detection methods often require complex algorithms and parameter tuning.
AutoTrend uses an iterative, focus-based approach:
- Single Model per Region: Train one linear regression model at the start of each focus region
- Trend Extension: Extend the trend line forward without retraining
- Error-Based Refinement: Identify high-error points and focus on them in the next iteration
- Adaptive Segmentation: Automatically discover trend boundaries based on prediction error
β
Computationally Efficient: Minimal model training compared to full sliding windows
β
Adaptive: Automatically discovers trend boundaries without predefined change points
β
Interpretable: Clear linear segments with explicit slopes and intercepts
β
Flexible: Adjustable error thresholds and iteration limits
β
Lightweight: No complex optimization or parameter search required
- Sequence: Univariate time series
y = [yβ, yβ, ..., yβ] - Parameters:
window_size: Size of training window (default: 5)max_models: Maximum iterations (default: 10)error_percentile: Error threshold percentile (default: 40)percentile_step: Increment per iteration (default: 0)update_threshold: Whether to update threshold each iteration (default: False)
Define initial focus targets covering all predictable points:
focus_targets = [window_size, window_size+1, ..., T-1]
For each iteration, train a model on the first window of the focus region:
X_train = [0, 1, ..., window_size-1]
y_train = sequence[start:end]
model = LinearRegression().fit(X_train, y_train)Predict forward using the trained model's trend offset:
Ξ = Ε·_window_size - y_start
Ε·_t = y_(t-window_size) + Ξ
error_t = |y_t - Ε·_t|
threshold = percentile(errors, error_percentile)
low_error_points = {t | error_t β€ threshold}
high_error_points = {t | error_t > threshold}- Low error points: Assigned to current iteration, marked as resolved
- High error points: Become focus targets for next iteration
Repeat Steps 2-4 on high-error regions until:
- All points meet the error criterion, OR
- Maximum iterations reached
LLTResult(
trend_marks: np.ndarray, # Iteration labels for each point
prediction_marks: np.ndarray, # Predicted values
models: List[LinearRegression], # Trained models per iteration
process_logs: List[Tuple] # Detailed iteration logs
)autotrend/
βββ autotrend/
β βββ __init__.py # Main package exports
β βββ core/
β β βββ __init__.py
β β βββ llt_algorithm.py # Core LLT implementation
β β βββ llt_result.py # Result dataclass with plotting methods
β β βββ decompose_llt_class.py # Object-based API (DecomposeLLT)
β β βββ functional_api.py # Functional API (decompose_llt)
β β βββ utility.py # Helper functions (extract_ranges, split_by_gap)
β βββ data/
β β βββ __init__.py
β β βββ sythn_data/
β β β βββ __init__.py
β β β βββ generate_simple_wave.py # Stationary sine wave generator
β β β βββ generate_nonstationary_wave.py # Amplitude-modulated wave generator
β β β βββ generate_piecewise_linear.py # Piecewise linear sequence generator
β β βββ datasets/ # Future: Real-world dataset loaders
β βββ visualization/
β β βββ __init__.py
β β βββ plot.py # Main plotting module
β β βββ plot_error.py # Error analysis visualization
β β βββ plot_slope.py # Slope comparison plots
β β βββ plot_full_decomposition.py # Full decomposition view
β β βββ plot_iteration_grid.py # Iteration grid visualization
β β βββ plot_model_statistics.py # Model statistics plots
β βββ decomposition/
β βββ __init__.py # Future: Trend-seasonal decomposition
βββ demo/
β βββ __init__.py
β βββ demo_runner.py # Demo configuration and utilities
β βββ cases/
β β βββ __init__.py
β β βββ simple_wave.py # Sine wave demo
β β βββ nonstationary.py # Non-stationary wave demo
β β βββ piecewise_linear.py # Piecewise linear demo
β βββ run_all.py # Run all demos
βββ examples/
β βββ 01_quick_start.py
β βββ 02_basic_usage.py
βββ output/ # Generated plots and logs
β βββ simple_wave/
β βββ nonstationary_wave/
β βββ piecewise_linear/
βββ README.md
βββ setup.py
βββ pyproject.toml
βββ requirements.txt
βββ MANIFEST.in
βββ update_package.sh
βββ .gitignore

