Canadian synthetic population tooling for StatCan margin tables and Census microdata.
Project description
SynthPopCan
SynthPopCan is an early-stage project for building Canadian synthetic population tooling.
SynthPopCan is an independent research-software project. It is not affiliated with, endorsed by, or sponsored by Statistics Canada or the Government of Canada.
Near-term goals:
- Provide a Python library and CLI that can create synthetic populations through IPF from Statistics Canada margin/control tables.
- Build census microdata workflows for household- and person-level synthetic populations using a tree-based synthetic population generator plus calibration. The local 2016 Census material is the first available microdata source, but the tooling should be census-year agnostic.
- Maintain a local web app for configuring runs, inspecting controls, generating from prepared models, validating outputs, and downloading results.
Broader SynthEco-style enrichment with cohort, environmental, school, healthcare, and food-access layers is intentionally deferred until the base population synthesis workflow is stable.
Detailed documentation is published at
https://synthpopcan.readthedocs.io/. The source files live under docs/;
start with docs/index.rst for task-based navigation to the web app, IPF from
StatCan margin tables, generated-from-model workflows, the beginner Python API,
and advanced microdata/model-training material.
Project planning and research notes are tracked separately:
PLANS.md: current roadmap, open work, sequencing, and design decisions.NOTES.md: research synthesis from local materials and external literature.docs/status.md: completed implementation status and benchmark notes.CHANGELOG.md: public release notes.
Quick Start
Install the published package from PyPI:
python -m pip install synthpopcan
Then inspect the command line:
synthpopcan --help
For a one-off command without installing the tool into your current
environment, use uvx:
uvx synthpopcan --help
uvx synthpopcan guide ipf
From a source checkout for development:
git clone https://github.com/dlq/synthpopcan.git
cd synthpopcan
uv sync
uv run synthpopcan --help
For installation details, see docs/installation.md.
Where To Start
Most users should start in the Sphinx documentation rather than in this README:
| Task | Documentation |
|---|---|
| Use the local browser app | docs/web-app.md |
| Generate with IPF from margin/control tables | docs/ipf.md, docs/controls.md, docs/statcan.md |
| Use the beginner Python API | docs/library-getting-started.md |
Work with local data layout and data doctor |
docs/data.md |
| Inspect source files safely | docs/sources.md |
| Work with census microdata adapters | docs/microdata.md |
| Train, audit, package, or use tree models | docs/tree.md |
| Validate generated outputs | docs/validate.md |
| Check current implementation status | docs/status.md |
Build the documentation locally with:
uv run sphinx-build -W -b html docs docs/_build/html
Developer Benchmarks
IPF benchmark fixtures are available as developer tooling, not as a normal user workflow:
uv run python scripts/benchmark_ipf.py
Use --seed-records for smaller or larger local runs while checking
performance changes. Optional full-data tree-model smoke tests are documented
as status and planning evidence rather than as default test-suite requirements.
Data Policy
Large, raw, private, or access-controlled data are not tracked in git.
data/raw/is a local ignored cache for central raw inputs, including public Census Profile and WDS downloads.data/private/is a local ignored cache for access-controlled or sensitive later-use datasets.references/is a local ignored cache for copied papers, proposals, and legacy code references.
Public geography, school, healthcare, road, and environmental layers should generally be fetched from authoritative public sources such as Statistics Canada, open.canada.ca, donneesquebec.ca, and municipal/provincial open-data portals rather than stored in this repository.
Local-only manifests may exist inside ignored data directories to document what is present on a development machine.
Model Packages
Reviewed model packages may be distributed with the project when they are
explicitly intended as public research artifacts. The installed package should
stay small: only the tiny demo model is bundled. Larger published models are
downloaded on demand with synthpopcan models fetch MODEL_ID.
Release assets are gzip-compressed to keep downloads small. The CLI handles decompression and stores a normal JSON model package in the local cache.
Bundled model packages are not raw Census microdata. They should still be treated as derived research artifacts with provenance, disclosure-risk checks, and limitations. A model package being marked as a publishable candidate means it passed the project's current checks; it is not a claim of official approval, legal privacy certification, or fitness for every research use.
Before publishing a new model package, review docs/data.md, docs/tree.md,
docs/release-checklist.md, and CONTRIBUTING.md.
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 synthpopcan-0.3.0.tar.gz.
File metadata
- Download URL: synthpopcan-0.3.0.tar.gz
- Upload date:
- Size: 6.9 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
248749d4acb39b12ec1500368fa499f9121d822fd530c1bc899dfabb0649f361
|
|
| MD5 |
97f34e22c9d8e23a9e51f51b987145b5
|
|
| BLAKE2b-256 |
e561ff7033875104ec1011785e857bbe726479cda2468f2b5ae371430eb89afe
|
Provenance
The following attestation bundles were made for synthpopcan-0.3.0.tar.gz:
Publisher:
publish.yml on dlq/synthpopcan
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
synthpopcan-0.3.0.tar.gz -
Subject digest:
248749d4acb39b12ec1500368fa499f9121d822fd530c1bc899dfabb0649f361 - Sigstore transparency entry: 2012635189
- Sigstore integration time:
-
Permalink:
dlq/synthpopcan@e4128c547f90f42b08baee435b0f5018b02c80c8 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/dlq
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@e4128c547f90f42b08baee435b0f5018b02c80c8 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file synthpopcan-0.3.0-py3-none-any.whl.
File metadata
- Download URL: synthpopcan-0.3.0-py3-none-any.whl
- Upload date:
- Size: 240.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8add2353fc1f89815d1249f362969f97358798226fe351a11175ec4505dafeca
|
|
| MD5 |
5e373486e544ff790174cbeb6cb77754
|
|
| BLAKE2b-256 |
38a225165e691b79b710996e232c2639e43be32e09b63a56250bf23d0c041be1
|
Provenance
The following attestation bundles were made for synthpopcan-0.3.0-py3-none-any.whl:
Publisher:
publish.yml on dlq/synthpopcan
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
synthpopcan-0.3.0-py3-none-any.whl -
Subject digest:
8add2353fc1f89815d1249f362969f97358798226fe351a11175ec4505dafeca - Sigstore transparency entry: 2012635331
- Sigstore integration time:
-
Permalink:
dlq/synthpopcan@e4128c547f90f42b08baee435b0f5018b02c80c8 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/dlq
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@e4128c547f90f42b08baee435b0f5018b02c80c8 -
Trigger Event:
workflow_dispatch
-
Statement type: