statespace
Linear Gaussian state space models, following Part I of Durbin and Koopman,
Time Series Analysis by State Space Methods (2nd ed., 2012). The core is a Fortran
library; ssfortran is its Python package.
- Filtering and smoothing:
- the Kalman filter with a steady-state shortcut
- exact diffuse initialization, in both univariate and multivariate forms
- univariate treatment, including correlated and time-varying H
- state, disturbance, fast, classical, two-filter, fixed-point and fixed-lag smoothers
- augmented and square-root filters
- collapsing large observation vectors, and linear restrictions
- Likelihood and estimation:
- exact, diffuse, concentrated and marginal log likelihoods
- maximum likelihood with L-BFGS-B, using DK's analytic score where it applies and numerical derivatives elsewhere
- EM for variance parameters
- standard errors, and the effect of parameter estimation on the smoothed states
- Simulation, forecasting and diagnostics: simulation smoothers, forecasts, standardized and auxiliary residuals, and residual tests.
- Built-in models (DK ch. 3): irregular, level, trend, seasonal (dummy, trigonometric, Harrison–Stevens), cycle, regression and intervention effects, ARIMA, continuous-time components and splines. Components apply to one series or several (SUTSE), and can load on common signals.
The documentation (user guide, examples, design notes, and Python, Fortran and C
references) builds with make -C docs html; see docs/install.rst.
The illustrations of DK chapter 8 are reproduced in example/. Differences from
statsmodels' tsa.statespace are listed in
docs/statsmodels_differences.md.
Fortran
The library builds with fpm and needs gfortran, LAPACK and BLAS.
fpm test --profile release # the test suite
fpm run --profile release --example nile_mle # a model defined in Fortran
fpm run --profile release --example dk_8_2_seatbelt # needs data/fetch_dk_data.py first
Models are defined by extending ssm_model_t (see example/nile_mle.f90), or
assembled from components with structural_model (see example/dk_8_2_seatbelt.f90).
fit_many fits independent models in parallel when built with
--flag -fopenmp --link-flag -fopenmp.
Python
pip builds the shared library with CMake through scikit-build-core. It needs
gfortran, LAPACK and BLAS installed.
pip install . # or: pip install .[test] && pytest
import numpy as np
import ssfortran as ss
y = np.loadtxt("data/nile.csv", delimiter=",", skiprows=1)[:, 1]
# Built-in components
mod = ss.StructuralModel(y, [ss.Irregular(), ss.Level()])
res = mod.fit()
print(res.summary())
smoothed = res.smooth().smoothed_state
# Matrix-level: fill the system matrices yourself
rep = ss.Representation(y, k_states=1)
rep["design"] = [[1.0]]; rep["transition"] = [[1.0]]; rep["selection"] = [[1.0]]
rep["obs_cov"] = [[15099.0]]; rep["state_cov"] = [[1469.1]]
rep.initialize_diffuse()
print(rep.loglike())
Fitting results have summary() (estimates with z-tests and intervals, fit
statistics, residual tests), fittedvalues, resid, get_forecast(steps) with
conf_int(), components() and estimation_bias(). A Representation also offers:
- the other smoothers of DK ch. 4: fast, classical, two-filter, Whittle, fixed-point, fixed-lag and updating
- smoothed covariances between periods, and filtering and smoothing weights
- the square-root and augmented filters (with the marginal likelihood)
- EM, collapsing, and linear state restrictions
- auxiliary residuals, de Jong–Penzer statistics, least squares residuals and R²_D
- the mean-correction and de Jong–Shephard simulation smoothers
A model with parameters can be defined in three ways:
| How | Speed | |
|---|---|---|
StructuralModel |
built-in components | all in Fortran; works with fit_many |
MappedModel |
declare which matrix entries each parameter sets | all in Fortran; works with fit_many |
MLEModel |
subclass and write update(params), as in statsmodels |
calls Python for each likelihood evaluation |
For the timing comparison with statsmodels from Python, run
bench/bench_python.py. It shows 2–8× speedups for single models, and 36× for 1000
series with fit_many. example/bench.f90 and bench/bench_statsmodels.py compare
the Fortran core directly.
To develop without installing:
cmake -S . -B build/cmake -G Ninja && cmake --build build/cmake
pytest # uses python/src and build/cmake (pyproject.toml)
License
MIT (see LICENSE); third-party notices are in THIRD_PARTY_NOTICES.md, and citations in docs/references.md.
Metadata
Release files for ssfortran 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| ssfortran-0.1.0.tar.gz | 155.5 kB | Details |
Built distributions (wheels)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| ssfortran-0.1.0-py3-none-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl | Python 3 | none | Linux glibc 2.27+ x86-64, Linux glibc 2.28+ x86-64 | Details |
| ssfortran-0.1.0-py3-none-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl | Python 3 | none | Linux glibc 2.28+ ARM64, Linux glibc 2.27+ ARM64 | Details |
Total release size: 19.5 MB
Release files / ssfortran-0.1.0.tar.gz
| Download URL | ssfortran-0.1.0.tar.gz |
|---|---|
| Size | 155.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
9b89ed7d73fd95df72285142ba79b6b5a103538909e6329ef03a45f0b5151fb3
|
|
BLAKE2b-256 checksum How to use checksums |
2e3a5ccf657074a797fffee005bc634db399bb496959f3baeb0a57478c03e596
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 28, 2026.
Transparency logRelease files / ssfortran-0.1.0-py3-none-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | ssfortran-0.1.0-py3-none-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 13.2 MB |
| Tags | Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
fc02ab6c4c8c212e800fa529edaa0b2aad9d03b8feb65c340f4cdbb941b8aa3d
|
|
BLAKE2b-256 checksum How to use checksums |
4a21c9d4295793e363f9df0a4701338936b9491fa6027764e9fff99840bae812
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 28, 2026.
Transparency logRelease files / ssfortran-0.1.0-py3-none-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
| Download URL | ssfortran-0.1.0-py3-none-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 6.2 MB |
| Tags | Linux glibc 2.27+ ARM64 Linux glibc 2.28+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
f424bb901016e1510c4dedce464ca75d9b48a0bb5d8066cef5c8520e441c09d4
|
|
BLAKE2b-256 checksum How to use checksums |
8dfbe0c5c6d885e82d56446e6e98d54f482014d63392129acbc06a987f3a06b7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 28, 2026.
Transparency log