Skip to main content

Local Linear Trend Extraction for Time Series

Project description

๐Ÿ“ˆ AutoTrend: Local Linear Trend Extraction

Python License

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.

๐Ÿš€ Demo: Google Colab


๐Ÿš€ Quick Start

import numpy as np
from autotrend import decompose_llt, plot_full_decomposition

# 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
plot_full_decomposition(sequence, result)

# 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 point
  • result.prediction_marks: Predicted values for each point
  • result.models: List of LinearRegression models from each iteration
  • result.process_logs: Detailed logs for visualization

๐Ÿ’ก Core Concept

The Problem

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.

The Solution

AutoTrend uses an iterative, focus-based approach:

  1. Single Model per Region: Train one linear regression model at the start of each focus region
  2. Trend Extension: Extend the trend line forward without retraining
  3. Error-Based Refinement: Identify high-error points and focus on them in the next iteration
  4. Adaptive Segmentation: Automatically discover trend boundaries based on prediction error

Key Advantages

โœ… 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


โš™๏ธ Algorithm Overview

Input

  • Sequence: Univariate time series y = [yโ‚€, yโ‚, ..., yโ‚œ]
  • Parameters:
    • window_size: Size of training window (default: 10)
    • max_models: Maximum iterations (default: 5)
    • error_percentile: Error threshold percentile (default: 40)
    • percentile_step: Increment per iteration (default: 0)
    • update_threshold: Whether to update threshold each iteration (default: False)

Process

Step 1: Initialization

Define initial focus targets covering all predictable points:

focus_targets = [window_size, window_size+1, ..., T-1]

Step 2: Train Linear Model

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)

Step 3: Extend Trend and Measure Error

Predict forward using the trained model's trend offset:

ฮ” = ลท_window_size - y_start
ลท_t = y_(t-window_size) + ฮ”
error_t = |y_t - ลท_t|

Step 4: Segment by Error Threshold

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

Step 5: Iterate

Repeat Steps 2-4 on high-error regions until:

  • All points meet the error criterion, OR
  • Maximum iterations reached

Output

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
)

๐Ÿ“‚ Directory Structure

autotrend/
โ”œโ”€โ”€ autotrend/
โ”‚   โ”œโ”€โ”€ __init__.py                    # Main package exports
โ”‚   โ”œโ”€โ”€ core/
โ”‚   โ”‚   โ”œโ”€โ”€ __init__.py
โ”‚   โ”‚   โ”œโ”€โ”€ local_linear_trend.py      # Core LLT algorithm
โ”‚   โ”‚   โ””โ”€โ”€ 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/
โ”‚   โ”œโ”€โ”€ demo_utils.py                  # Demo configuration and utilities
โ”‚   โ”œโ”€โ”€ simple_wave.py                 # Sine wave demo
โ”‚   โ”œโ”€โ”€ piecewise_linear.py            # Piecewise linear demo
โ”‚   โ””โ”€โ”€ run_all.py                     # Run all demos
โ”œโ”€โ”€ output/                            # Generated plots and logs
โ”‚   โ”œโ”€โ”€ simple_wave/
โ”‚   โ””โ”€โ”€ piecewise_linear/
โ”œโ”€โ”€ README.md
โ””โ”€โ”€ requirements.txt

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

autotrend-0.2.0.tar.gz (23.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

autotrend-0.2.0-py3-none-any.whl (28.9 kB view details)

Uploaded Python 3

File details

Details for the file autotrend-0.2.0.tar.gz.

File metadata

  • Download URL: autotrend-0.2.0.tar.gz
  • Upload date:
  • Size: 23.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.7.9

File hashes

Hashes for autotrend-0.2.0.tar.gz
Algorithm Hash digest
SHA256 9f920bbd165df2383bd0c0df5a02f4c6caf29fc1bb6845ca0a3aac33e4f64b67
MD5 bc90c7e3a58ff847037e624b43a17c89
BLAKE2b-256 422e5932767ef1a583ce2178b82aea1b9748640221dec8e8bb3255598849563d

See more details on using hashes here.

File details

Details for the file autotrend-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: autotrend-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 28.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.7.9

File hashes

Hashes for autotrend-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 b768608b619f0be1041595a7f456ef57f8a5dc6fe2e3bdd4bc1a2e6d7d4dbde2
MD5 a10d6b575f7aae0f792499377764b3d9
BLAKE2b-256 96dbf54aa4bbdbf9d3b00bc1ab5d2f9a9f83c1973e76f982301238b9a151d42b

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page