| name | time-series-decomposer |
| description | Decompose time series into trend, seasonal, and residual components. Use for forecasting, pattern analysis, and seasonality detection. |
Time Series Decomposer
Extract trend, seasonal, and residual components from time series data with visualization and basic forecasting.
Features
- Decomposition: Additive and multiplicative models
- Trend Extraction: Moving averages, polynomial fitting
- Seasonality Detection: Auto-detect and extract periodic patterns
- Residual Analysis: Identify anomalies in residuals
- Visualization: Component plots, ACF/PACF
- Basic Forecasting: Trend extrapolation, seasonal naive
Quick Start
from ts_decomposer import TimeSeriesDecomposer
decomposer = TimeSeriesDecomposer()
decomposer.load_csv("sales.csv", date_col="date", value_col="revenue")
result = decomposer.decompose(period=12)
print(f"Trend strength: {result['trend_strength']:.2f}")
print(f"Seasonal strength: {result['seasonal_strength']:.2f}")
decomposer.plot_components("decomposition.png")
CLI Usage
python ts_decomposer.py --input data.csv --date date --value sales --period 12
python ts_decomposer.py --input data.csv --date date --value sales --period 12 --model multiplicative
python ts_decomposer.py --input data.csv --date date --value sales --period 12 --forecast 6
python ts_decomposer.py --input data.csv --date date --value sales --auto-period
python ts_decomposer.py --input data.csv --date date --value sales --period 12 --plot components.png
python ts_decomposer.py --input data.csv --date date --value sales --period 12 --json
API Reference
TimeSeriesDecomposer Class
class TimeSeriesDecomposer:
def __init__(self)
def load_csv(self, filepath: str, date_col: str, value_col: str,
date_format: str = None) -> 'TimeSeriesDecomposer'
def load_series(self, series: pd.Series) -> 'TimeSeriesDecomposer'
def load_dataframe(self, df: pd.DataFrame, date_col: str,
value_col: str) -> 'TimeSeriesDecomposer'
def decompose(self, period: int = None, model: str = "additive") -> dict
def detect_period(self) -> int
def extract_trend(self, method: str = "moving_average",
window: int = None) -> pd.Series
def extract_seasonal(self, period: int) -> pd.Series
() ->
() ->
() ->
() -> pd.DataFrame
() -> pd.DataFrame
() ->
() ->
() ->
() -> pd.DataFrame
() ->
Decomposition Models
Additive Model
Y(t) = Trend(t) + Seasonal(t) + Residual(t)
Best when seasonal variations are roughly constant.
result = decomposer.decompose(period=12, model="additive")
Multiplicative Model
Y(t) = Trend(t) * Seasonal(t) * Residual(t)
Best when seasonal variations scale with the level of the series.
result = decomposer.decompose(period=12, model="multiplicative")
Output Format
Decomposition Result
{
"model": "additive",
"period": 12,
"trend_strength": 0.85,
"seasonal_strength": 0.72,
"components": {
"observed": [...],
"trend": [...],
"seasonal": [...],
"residual": [...]
},
"seasonal_pattern": {
1: 0.12,
2: -0.05,
...
},
"statistics": {
"trend_slope": 0.023,
"trend_r_squared": 0.91,
"residual_std": 0.15,
"residual_mean": 0.002
}
}
Trend Analysis
trend_info = decomposer.analyze_trend()
{
"direction": "increasing",
"slope": 0.023,
"r_squared": 0.91,
"change_points": [
{"index": 24, "date": "2023-01-01", "direction": "up"},
{"index": 48, "date": "2025-01-01", "direction": "down"}
],
"growth_rate": 0.028,
"volatility": 0.12
}
Seasonality Analysis
seasonal_info = decomposer.analyze_seasonality()
{
"detected_period": 12,
"strength": 0.72,
"pattern": {
1: {"value": 0.12, "label": "Jan", "rank": 3},
2: {"value": -0.05, "label": "Feb", "rank": 8},
...
},
"peak_period": 12,
"trough_period": 2,
"seasonal_range": 0.35
}
Period Detection
Auto-detect the seasonal period:
period = decomposer.detect_period()
print(f"Detected period: {period}")
result = decomposer.decompose()
Anomaly Detection
Find outliers in residuals:
anomalies = decomposer.detect_anomalies(threshold=2.0)
Basic Forecasting
forecast = decomposer.forecast(periods=12, method="trend")
forecast = decomposer.forecast(periods=12, method="seasonal_naive")
forecast = decomposer.forecast(periods=12, method="combined")
Visualization
Component Plot
decomposer.plot_components("components.png")
Generates a 4-panel plot:
- Original series
- Trend
- Seasonal
- Residuals
ACF/PACF Plot
decomposer.plot_acf_pacf("acf_pacf.png", lags=40)
Autocorrelation and partial autocorrelation functions.
Seasonal Plot
decomposer.plot_seasonal("seasonal.png")
Bar chart of seasonal effects by period.
Example Workflows
Sales Analysis
decomposer = TimeSeriesDecomposer()
decomposer.load_csv("monthly_sales.csv", "month", "revenue")
result = decomposer.decompose()
print(f"Trend: {decomposer.analyze_trend()['direction']}")
print(f"Peak season: Month {decomposer.analyze_seasonality()['peak_period']}")
decomposer.plot_components("sales_analysis.png")
Anomaly Detection
decomposer = TimeSeriesDecomposer()
decomposer.load_csv("daily_metrics.csv", "date", "pageviews")
decomposer.decompose(period=7)
anomalies = decomposer.detect_anomalies(threshold=2.5)
print(f"Found {len(anomalies)} anomalous days")
Forecasting with Seasonality
decomposer = TimeSeriesDecomposer()
decomposer.load_csv("quarterly_data.csv", "quarter", "value")
decomposer.decompose(period=4, model="multiplicative")
forecast = decomposer.forecast(periods=4, method="combined")
print(forecast)
Dependencies
- pandas>=2.0.0
- numpy>=1.24.0
- scipy>=1.10.0
- statsmodels>=0.14.0
- matplotlib>=3.7.0