Temporal Disaggregation of Time Series Data in Python
Project description
tsdisagg
Tools for converting low time series data to high frequency, based on the R package tempdisagg, and espeically the accompanying paper by Sax and Steiner 2013.
tsdisagg allows the user to convert low frequency time series data (e.g., yearly or quarterly) to a higher frequency (e.g., quarterly or monthly) in a way that preserves desired aggregate statistics in the high frequency data. It should, for example, sum back to the original low-frequency data.
In addition, regression-based methods are also implemented that allow the user to supply "indicator series", allowing variation from correlated high-frequency time series to be imputed into the low frequency data.
If you have any questions or issues, please open a thread. Pull requests to add features or fix bugs are welcome. Please clone the repository locally to have access to the testing suite.
Installation
tsdisagg is distributed on conda-forge. To install, use conda/mamba:
conda install -c conda-forge tsdisagg
Or, of course, you can install using pip:
pip install tsdisagg
Current Features
Currently, only conversion between yearly, quarterly, and monthly data is supported. Conversion to lower frequencies is non-trivial due to the calendar math that needs to be added, but this is on my to-do list.
The following interpolation methods have been implemented:
Single series, non-parametric methods:
- Denton
- Denton-Cholette
Multiseries, regression-based methods:
- Chow-Lin
- Litterman
Examples
Disaggregate a timeseries using the univariate Denton-Cholette method:
import pandas as pd
from tsdisagg import disaggregate_series
from tsdisagg.datasets import load_data
# Load example data
sales_a = load_data("annual_sales")
# Disaggregate from annual to quarterly using Denton-Cholette method
sales_q_dc = disaggregate_series(
sales_a.resample("YS").last(), # Use `.resample` to ensure the frequency is set correctly
target_freq="QS", # Desired output frequency
method="denton-cholette", # Disaggregation method
agg_func="sum", # Sales are flow data, so we want the quarters to sum back to the annual data
h=1, # Differencing order (1 in this case to preserve the trend)
)
Disaggregate a timeseries using the multivariate Chow-Lin method with an indicator series:
import pandas as pd
from tsdisagg import disaggregate_series
from tsdisagg.datasets import load_data
# Load example data
sales_a = load_data("annual_sales")
exports_q = load_data("quarterly_exports")
# Disaggregate from annual to quarterly using Chow-Lin method with quarterly sales as indicator
sales_q_chow_lin = disaggregate_series(
sales_a.resample("YS").last(), # Target series, annual frequency
exports_q.assign(intercept=1), # Indicator matrix. We can have as many series as we want here; so we use
# Exports at quarterly frequency, plus a deterministic intercept term.
method="chow-lin", # Disaggregation method
agg_func="sum", # Sales are flow data, so we want the quarters to sum back to the annual data
optimizer_kwargs={"method": "powell"}, # Additional arguments to the optimizer
)
Citing tsdisagg
If you use tsdisagg in your research, please use the following citation:
@software{tsdisagg,
author = {Jesse Grabowski},
title = {tsdisagg: Temporal Disaggregation of Time Series Data in Python},
version = {0.1.0},
url = {https://github.com/jessegrabowski/tsdisagg},
howpublished = {GitHub},
year = {2025},
}
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file tsdisagg-1.3.2.tar.gz.
File metadata
- Download URL: tsdisagg-1.3.2.tar.gz
- Upload date:
- Size: 104.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2a3a4ffe16f06122e8a5e36dca851b1b03bd5dca1f9f5998111cde5f1061328d
|
|
| MD5 |
3143fac9c75f57d4ffb038b2776ea647
|
|
| BLAKE2b-256 |
775f75a0bd21a87ccec5eddd598b5d3d3e3885389d3f513a351b78a5f478be7d
|
Provenance
The following attestation bundles were made for tsdisagg-1.3.2.tar.gz:
Publisher:
release.yml on jessegrabowski/tsdisagg
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
tsdisagg-1.3.2.tar.gz -
Subject digest:
2a3a4ffe16f06122e8a5e36dca851b1b03bd5dca1f9f5998111cde5f1061328d - Sigstore transparency entry: 604673759
- Sigstore integration time:
-
Permalink:
jessegrabowski/tsdisagg@cc63be4290008f4d7435fa092aade5fab514d18c -
Branch / Tag:
refs/tags/v1.3.2 - Owner: https://github.com/jessegrabowski
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@cc63be4290008f4d7435fa092aade5fab514d18c -
Trigger Event:
release
-
Statement type:
File details
Details for the file tsdisagg-1.3.2-py2.py3-none-any.whl.
File metadata
- Download URL: tsdisagg-1.3.2-py2.py3-none-any.whl
- Upload date:
- Size: 13.8 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7858bf0557d96d4277d737d81f6b197711868f93a20c6d58a91d06b6703ae90d
|
|
| MD5 |
965c79436d5fc5285cf8e26e4287bb42
|
|
| BLAKE2b-256 |
11de4d28615db3296668aa4d3623dec39785163ab9f5c9d8ca7d63e62c4c02c1
|
Provenance
The following attestation bundles were made for tsdisagg-1.3.2-py2.py3-none-any.whl:
Publisher:
release.yml on jessegrabowski/tsdisagg
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
tsdisagg-1.3.2-py2.py3-none-any.whl -
Subject digest:
7858bf0557d96d4277d737d81f6b197711868f93a20c6d58a91d06b6703ae90d - Sigstore transparency entry: 604673762
- Sigstore integration time:
-
Permalink:
jessegrabowski/tsdisagg@cc63be4290008f4d7435fa092aade5fab514d18c -
Branch / Tag:
refs/tags/v1.3.2 - Owner: https://github.com/jessegrabowski
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@cc63be4290008f4d7435fa092aade5fab514d18c -
Trigger Event:
release
-
Statement type: