Skip to main content

Time Series Decomposition

Separate your time series into trend, seasonal, and residual components.


anofox_fcst_ts_mstl_decomposition

Multiple Seasonal-Trend decomposition using Loess (MSTL). Decomposes a time series into trend, one or more seasonal components, and residual.

Parameters

ParameterTypeRequiredDefaultDescription
table_nameVARCHARYes-Source table
group_colVARCHARNoNULLGroup column for multi-series
date_colVARCHARYes-Date column
value_colVARCHARYes-Value column
paramsMAPNoMAPConfiguration

Options MAP:

OptionTypeDefaultDescription
seasonal_periodsINTEGER[][7]Seasonal periods to decompose

Output

Returns table with original columns plus:

FieldTypeDescription
trendDOUBLETrend component
seasonal_PDOUBLESeasonal component for period P (one column per period)
residualDOUBLERemainder after removing trend and seasonality

Example

-- Single seasonality (weekly)
SELECT * FROM anofox_fcst_ts_mstl_decomposition(
'sales_data',
NULL, -- group_col
date,
sales,
MAP{'seasonal_periods': [7]}
);

Multi-Seasonal Decomposition

-- Multiple seasonalities (weekly + monthly)
SELECT * FROM anofox_fcst_ts_mstl_decomposition(
'hourly_demand',
NULL,
timestamp,
demand,
MAP{'seasonal_periods': [24, 168]} -- daily (24h) + weekly (168h)
);

Multi-Series Decomposition

-- Decompose multiple products
SELECT * FROM anofox_fcst_ts_mstl_decomposition(
'sales_by_product',
product_id, -- group column
date,
sales,
MAP{'seasonal_periods': [7, 365]}
);

Interpretation Guide

ComponentWhat It ShowsBusiness Use
TrendLong-term directionGrowth/decline analysis
SeasonalRepeating patternsCapacity planning, promotions
ResidualRandom fluctuationsAnomaly detection, forecast uncertainty

Residual Analysis:

  • Large residuals indicate unusual events or data quality issues
  • Patterns in residuals suggest missing seasonality
  • Residual variance indicates forecast uncertainty

Common Seasonal Periods

Data FrequencyCommon Periods
Daily7 (weekly), 365 (yearly)
Hourly24 (daily), 168 (weekly)
Weekly52 (yearly)
Monthly12 (yearly)
Quarterly4 (yearly)

Decomposition Workflow

-- 1. Detect seasonality first
SELECT * FROM anofox_fcst_ts_analyze_seasonality(
'sales_data', NULL, date, sales, MAP{}
);

-- 2. Use detected periods for decomposition
SELECT * FROM anofox_fcst_ts_mstl_decomposition(
'sales_data',
NULL,
date,
sales,
MAP{'seasonal_periods': [7, 365]} -- periods from step 1
);

-- 3. Analyze components
SELECT
AVG(trend) as avg_trend,
STDDEV(residual) as residual_volatility,
MIN(trend) as min_trend,
MAX(trend) as max_trend
FROM (
SELECT * FROM anofox_fcst_ts_mstl_decomposition(
'sales_data', NULL, date, sales, MAP{'seasonal_periods': [7]}
)
);

🍪 Cookie Settings