Skip to content

pg_stl

pg_stl : Time series analysis functions for PostgreSQL

Overview

IDExtensionPackageVersionCategoryLicenseLanguage
1130
pg_stl
pg_stl
1.0.0
TIME
PostgreSQL
C
AttributeHas BinaryHas LibraryNeed LoadHas DDLRelocatableTrusted
--s-d-r
No
Yes
No
Yes
yes
no
Relationships
See Also
timescaledb
timeseries
periods

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

Packages

TypeRepoVersionPG Major CompatibilityPackage PatternDependencies
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 / PGPG18PG17PG16PG15PG14
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
PackageVersionOSORGSIZEFile URL
pg_stl_181.0.0el8.x86_64pigsty19.5 KiBpg_stl_18-1.0.0-1PIGSTY.el8.x86_64.rpm
pg_stl_181.0.0el8.aarch64pigsty18.9 KiBpg_stl_18-1.0.0-1PIGSTY.el8.aarch64.rpm
pg_stl_181.0.0el9.x86_64pigsty19.4 KiBpg_stl_18-1.0.0-1PIGSTY.el9.x86_64.rpm
pg_stl_181.0.0el9.aarch64pigsty19.0 KiBpg_stl_18-1.0.0-1PIGSTY.el9.aarch64.rpm
pg_stl_181.0.0el10.x86_64pigsty19.7 KiBpg_stl_18-1.0.0-1PIGSTY.el10.x86_64.rpm
pg_stl_181.0.0el10.aarch64pigsty19.3 KiBpg_stl_18-1.0.0-1PIGSTY.el10.aarch64.rpm
postgresql-18-pg-stl1.0.0d12.x86_64pigsty24.8 KiBpostgresql-18-pg-stl_1.0.0-1PIGSTY~bookworm_amd64.deb
postgresql-18-pg-stl1.0.0d12.aarch64pigsty24.4 KiBpostgresql-18-pg-stl_1.0.0-1PIGSTY~bookworm_arm64.deb
postgresql-18-pg-stl1.0.0d13.x86_64pigsty24.8 KiBpostgresql-18-pg-stl_1.0.0-1PIGSTY~trixie_amd64.deb
postgresql-18-pg-stl1.0.0d13.aarch64pigsty24.3 KiBpostgresql-18-pg-stl_1.0.0-1PIGSTY~trixie_arm64.deb
postgresql-18-pg-stl1.0.0u22.x86_64pigsty25.9 KiBpostgresql-18-pg-stl_1.0.0-1PIGSTY~jammy_amd64.deb
postgresql-18-pg-stl1.0.0u22.aarch64pigsty25.5 KiBpostgresql-18-pg-stl_1.0.0-1PIGSTY~jammy_arm64.deb
postgresql-18-pg-stl1.0.0u24.x86_64pigsty25.7 KiBpostgresql-18-pg-stl_1.0.0-1PIGSTY~noble_amd64.deb
postgresql-18-pg-stl1.0.0u24.aarch64pigsty25.5 KiBpostgresql-18-pg-stl_1.0.0-1PIGSTY~noble_arm64.deb
postgresql-18-pg-stl1.0.0u26.x86_64pigsty25.7 KiBpostgresql-18-pg-stl_1.0.0-1PIGSTY~resolute_amd64.deb
postgresql-18-pg-stl1.0.0u26.aarch64pigsty25.4 KiBpostgresql-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