Skip to content
pg_stl

pg_stl

pg_stl : Time series analysis functions for PostgreSQL

Overview

ID Extension Package Version Category License Language
1130
pg_stl
pg_stl
1.0.0
TIME
PostgreSQL
C
Attribute Has Binary Has Library Need Load Has DDL Relocatable Trusted
--s-d-r
No
Yes
No
Yes
yes
no
Relationships
See Also
timescaledb
timeseries
periods

ACF, PACF, STL decomposition, and Holt-Winters forecasting.

Packages

Type Repo Version PG Major Compatibility Package Pattern Dependencies
EXT
PIGSTY
1.0.0
18
17
16
15
14
pg_stl -
RPM
PIGSTY
1.0.0
18
17
16
15
14
pg_stl_$v -
DEB
PIGSTY
1.0.0
18
17
16
15
14
postgresql-$v-pg-stl -
Linux / PG PG18 PG17 PG16 PG15 PG14
el8.x86_64
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
MISS
MISS
el8.aarch64
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
MISS
MISS
el9.x86_64
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
MISS
MISS
el9.aarch64
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
MISS
MISS
el10.x86_64
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
MISS
MISS
el10.aarch64
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
MISS
MISS
d12.x86_64
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
MISS
MISS
d12.aarch64
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
MISS
MISS
d13.x86_64
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
MISS
MISS
d13.aarch64
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
MISS
MISS
u22.x86_64
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
MISS
MISS
u22.aarch64
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
MISS
MISS
u24.x86_64
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
MISS
MISS
u24.aarch64
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
MISS
MISS
u26.x86_64
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
MISS
MISS
u26.aarch64
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
MISS
MISS
Package Version OS ORG SIZE File URL
pg_stl_18 1.0.0 el8.x86_64 pigsty 19.5 KiB pg_stl_18-1.0.0-1PIGSTY.el8.x86_64.rpm
pg_stl_18 1.0.0 el8.aarch64 pigsty 18.9 KiB pg_stl_18-1.0.0-1PIGSTY.el8.aarch64.rpm
pg_stl_18 1.0.0 el9.x86_64 pigsty 19.4 KiB pg_stl_18-1.0.0-1PIGSTY.el9.x86_64.rpm
pg_stl_18 1.0.0 el9.aarch64 pigsty 19.0 KiB pg_stl_18-1.0.0-1PIGSTY.el9.aarch64.rpm
pg_stl_18 1.0.0 el10.x86_64 pigsty 19.7 KiB pg_stl_18-1.0.0-1PIGSTY.el10.x86_64.rpm
pg_stl_18 1.0.0 el10.aarch64 pigsty 19.3 KiB pg_stl_18-1.0.0-1PIGSTY.el10.aarch64.rpm
postgresql-18-pg-stl 1.0.0 d12.x86_64 pigsty 24.8 KiB postgresql-18-pg-stl_1.0.0-1PIGSTY~bookworm_amd64.deb
postgresql-18-pg-stl 1.0.0 d12.aarch64 pigsty 24.4 KiB postgresql-18-pg-stl_1.0.0-1PIGSTY~bookworm_arm64.deb
postgresql-18-pg-stl 1.0.0 d13.x86_64 pigsty 24.8 KiB postgresql-18-pg-stl_1.0.0-1PIGSTY~trixie_amd64.deb
postgresql-18-pg-stl 1.0.0 d13.aarch64 pigsty 24.3 KiB postgresql-18-pg-stl_1.0.0-1PIGSTY~trixie_arm64.deb
postgresql-18-pg-stl 1.0.0 u22.x86_64 pigsty 25.9 KiB postgresql-18-pg-stl_1.0.0-1PIGSTY~jammy_amd64.deb
postgresql-18-pg-stl 1.0.0 u22.aarch64 pigsty 25.5 KiB postgresql-18-pg-stl_1.0.0-1PIGSTY~jammy_arm64.deb
postgresql-18-pg-stl 1.0.0 u24.x86_64 pigsty 25.7 KiB postgresql-18-pg-stl_1.0.0-1PIGSTY~noble_amd64.deb
postgresql-18-pg-stl 1.0.0 u24.aarch64 pigsty 25.5 KiB postgresql-18-pg-stl_1.0.0-1PIGSTY~noble_arm64.deb
postgresql-18-pg-stl 1.0.0 u26.x86_64 pigsty 25.7 KiB postgresql-18-pg-stl_1.0.0-1PIGSTY~resolute_amd64.deb
postgresql-18-pg-stl 1.0.0 u26.aarch64 pigsty 25.4 KiB postgresql-18-pg-stl_1.0.0-1PIGSTY~resolute_arm64.deb

Source

pig build pkg pg_stl;		# build rpm/deb

Install

Make sure PGDG and PIGSTY repo available:

pig repo add pgsql -u   # add both repo and update cache

Install this extension with pig:

pig install pg_stl;		# install via package name, for the active PG version

pig install pg_stl -v 18;   # install for PG 18
pig install pg_stl -v 17;   # install for PG 17
pig install pg_stl -v 16;   # install for PG 16

Create this extension with:

CREATE EXTENSION pg_stl;

Usage

Sources: pg_ts_analysis README, SQL definitions, control file.

pg_stl provides time-series analysis functions for PostgreSQL: autocorrelation, partial autocorrelation, STL decomposition, and Holt-Winters forecasting. The upstream README and SQL definitions target PostgreSQL 16+.

Autocorrelation

acf_array(data double precision[], lags integer) returns autocorrelation values for lags 1..lags:

CREATE EXTENSION pg_stl;

SELECT acf_array(
  array_agg(revenue ORDER BY date)::double precision[],
  28
)
FROM daily_sales;

The README describes using peaks at lags such as 7, 14, and 21 as a signal for weekly seasonality. The function returns NULL when the series is too short, lags < 1, or lags >= n.

Partial Autocorrelation

pacf_array(data double precision[], lags integer) returns partial autocorrelation values using the Durbin-Levinson recursion:

WITH series AS (
  SELECT array_agg(value ORDER BY ts)::double precision[] AS values
  FROM measurements
)
SELECT
  unnest(acf_array(values, 20)) AS acf,
  unnest(pacf_array(values, 20)) AS pacf
FROM series;

Use PACF when you want the direct lag relationship after accounting for shorter lags.

STL Decomposition

stl_decompose decomposes a series into trend, seasonal, and residual arrays:

WITH data AS (
  SELECT array_agg(revenue ORDER BY month)::double precision[] AS values
  FROM monthly_revenue
),
decomposed AS (
  SELECT (stl_decompose(values, 12)).*
  FROM data
)
SELECT
  unnest(trend) AS trend,
  unnest(seasonal) AS seasonal,
  unnest(residual) AS residual
FROM decomposed;

Signature from the SQL definition:

stl_decompose(
  y double precision[],
  period integer,
  seasonal integer DEFAULT 7,
  robust boolean DEFAULT true,
  trend integer DEFAULT 0,
  low_pass integer DEFAULT 0,
  inner_iter integer DEFAULT 2,
  outer_iter integer DEFAULT 0
) RETURNS stl_result

Use the convenience functions when only one component is needed:

SELECT stl_trend(values, 12) FROM series;
SELECT stl_seasonal(values, 12) FROM series;
SELECT stl_residual(values, 12) FROM series;

Ordered Collection Helper

The SQL file also defines stl_collect_ordered(tbl regclass, val text, ord text) to collect a column into an ordered double precision[]:

SELECT stl_decompose(
  stl_collect_ordered('monthly_revenue'::regclass, 'revenue', 'month'),
  12
);

Holt-Winters Forecasting

holt_winters_predict(seasonal_type text, period_length int, start_data_array real[]) forecasts one seasonal cycle ahead. seasonal_type is 'mult' for multiplicative seasonality or 'add' for additive seasonality:

SELECT *
FROM holt_winters_predict(
  'mult',
  4,
  (SELECT array_agg(revenue ORDER BY date)::real[] FROM sales)
);

The SQL implementation chooses smoothing coefficients automatically: first by 500 random initializations, then by refinement in 0.001 steps to minimize squared error. The helper holt_winters_mse(...) is present as the error-calculation routine used by the predictor.

Caveats

  • stl_decompose expects a double precision[] with no NULL values.
  • The README states the series length must be at least 2 * period.
  • seasonal must be an odd integer greater than or equal to 3.
  • Holt-Winters expects a real[] input and supports only 'mult' and 'add' seasonal types.
Last updated on