A citable, reproducible bank of raw NIRS reference datasets — multi-source/multi-target, tier-governed, with on-demand checksum-verified access from each dataset's origin.
Project description
nirs4all-datasets
A citable, reproducible bank of raw NIRS (Near-Infrared Spectroscopy) reference datasets — for benchmarking, exploring, and comparing models on a common, version-pinned, provenance-rich footing.
Part of the open-source NIRS tools ecosystem: file readers, datasets, methods, browser modelling, reproducible pipelines, papers, benchmarks, and release dashboards for near-infrared spectroscopy.
A dataset here is raw measured reality, not a benchmark task: one or more spectral sources (instruments), any number of variables (every target and metadata column — nothing is invented, and nothing is thrown away), the native splits if the source defined them, and full provenance back to the origin that published the data. The task — which Y, which split, which metric — is a choice the consumer makes; it is never baked into the dataset.
This repository is split into one native acquisition layer and optional consumer-facing layers:
- a git-tracked catalog — one hand-checkable descriptor + a machine-generated identity card (stats, per-source/per-variable dataviz, MLCommons Croissant, a Datasheet) per dataset. The heavy bytes never enter git.
- a native acquisition core — Rust crates + stable
n4ds_C ABI + CLI/bindings that resolve dataset ids, fetch canonical bytes from their origin, verify SHA-256, and manage the platform cache. This surface does not require Python. - an optional Python package/binding —
nirs4all-datasetsembeds that acquisition core forget()/retrieve()/NirsDataset, plus the catalog, cards, and site tooling. - optional ecosystem bridges — the
[nirs4all]extra for modelling/qualification and the[io]extra for raw-origin reproduction throughnirs4all-io/nirs4all-formats.
It reuses nirs4all only through the optional [nirs4all] bridge for qualification and
to_nirs4all(), and nirs4all-io / nirs4all-formats only
through the optional [io] bridge for raw-origin reproduction. It never re-implements NIRS/IO logic.
Status: 0.3.x, pre-1.0 — the on-disk and API contracts may still change.
The dataset model
- Sources (X) —
1..n, kept separate. Multi-instrument / multi-block datasets keep each block as its own source. Sources may even carry different numbers of spectra (asymmetric repetitions): they are aligned by sample identity (sample_id), never by row position. - Variables (Y + metadata) —
0..n. There is no intrinsic Y/metadata distinction: every column is a potential target. A dataset may declare no target at all (X-only / metadata-only is valid). Declared targets are flagged; everything else is kept as metadata, with full per-variable dataviz either way. - Splits — documented, never auto-applied. Native train/test/fold partitions are recorded so you can
reproduce a paper's split, but
get()never silently applies one. - Tiers — how a dataset is shown and exported.
public(everything shown, openly fetchable from the origin),private(everything shown; export needs a token),anonymized(variable names masked + targets normalized; export needs a token). Bytes are never served from git or the site — the catalog points at the origin DOI/URL; a personal Dataverse is only a future fallback for protected datasets. - Versions — two axes. A content version (bumps when the dataset bytes change) and a metric-protocol version (lets the cards be re-qualified under a new protocol without rebuilding the data).
Install (development)
uv venv && uv pip install -e ".[dev]" # builds the optional Python package + embedded native core
# (uses local editable sibling bridges via [tool.uv.sources]; needs a Rust toolchain)
Native acquisition core, bindings, and optional bridges
The download/acquisition path of a dataset — version-pinned DOI resolution, redirect-safe Dataverse /
Zenodo / figshare fetch, streaming SHA-256 verification, and platform-cache management — lives in a small
Rust core (crates/nirs4all-datasets-core) behind a stable C ABI (n4ds_). The scientific
analysis layer (cards, qualify, site, health) stays in Python. The cross-language contract is one
distributable catalog/index.json; n4ds resolve returns both the byte contract and the tier-sanitized
schema-2.0 descriptor (sources, variables, ids, splits, retrieval). The n4ds CLI is the
parity oracle. Surfaces over that core:
| Binding | Package | Status |
|---|---|---|
| Python | optional nirs4all-datasets package, embedding nirs4all_datasets._n4ds (pyo3) |
built + tested |
| Rust | nirs4all-datasets-core / -capi (crates.io) |
built + tested |
| WASM/JS | @nirs4all/datasets-wasm (npm) — metadata + small public datasets |
built + tested |
| R | nirs4alldatasets (C shim, r-universe / Release) |
built + tested |
| Octave/MATLAB | MEX (GitHub Release zip) | built + tested |
See bindings/SPEC.md (the binding contract) and
docs/dev/release_process.md.
For the high-level Python API, get()/list()/card() still operate against a registry root checkout
(catalog/ + datasets/). For non-Python consumers, the native acquisition core consumes the bundled
or committed catalog/index.json contract directly. R/WASM/Rust clients do not need the Python provider
package: they resolve the index, inspect the returned descriptor, fetch/verify the listed files, then read
the canonical Parquet with host-native tooling.
Quickstart
import nirs4all_datasets as n4ad
n4ad.list() # the catalog index
n4ad.card("corn_eigenvector_nir") # the identity card (dict): sources, variables, stats, provenance
ds = n4ad.get("corn_eigenvector_nir") # -> NirsDataset (fetched from origin, checksum-verified, cached)
ds.sources() # ['X1', 'X2', 'X3'] — the same corn measured on three NIR instruments
ds.x("X1") # one source's spectra as a 2D numpy array
ds.x(concat=False) # {source_id: array} for every source (sample-aligned, not row-aligned)
ds.y() # all declared targets, per sample
ds.metadata() # the metadata columns (each a potential target)
ds.split("original") # the native split labels, if the source defined one
ds.to_nirs4all() # hand off to nirs4all for modelling
Private / anonymized datasets need a Dataverse token: n4ad.get("name", token=...).
CLI (n4a-datasets)
bootstrap <tree> author schema-2.0 descriptors from <tree>/v2.0/* (--prune to re-base)
build-all --source-tree <tree> organize + qualify every dataset in parallel (--protocol-refresh, --site)
add <raw_source> <id> one raw source -> canonical + card + index
qualify <id> (re)build a dataset's card (--anonymize -> card.anon.json)
health-check probe each dataset's open origins -> catalog/health.json
catalog | list | card | get regenerate the index / inspect / load a dataset
publish | grant | revoke | restrict personal-Dataverse governance for protected data (future)
n4a-datasets <command> --help documents every flag.
What lives where (3-tier storage)
- git (small, tracked):
catalog/datasets/<id>.yaml(descriptor),catalog/datasets.yaml(index + whole-bank summary), and per-datasetcard.json/card.md/croissant.json/manifest.json. - the origin (Zenodo, a data Dataverse, a vendor archive, …): the raw + canonical bytes, fetched on demand and never re-hosted by this project.
- local cache (downloaded on demand): the verified canonical Parquet under the native acquisition core's platform cache root.
API token — where to put it
A Dataverse API token is only needed to fetch private/anonymized datasets or to publish to a personal Dataverse; public datasets need none. Resolution order:
- Environment variable
NIRS4ALL_DATAVERSE_TOKEN(recommended; required in CI). ~/.config/nirs4all-datasets/config.toml(chmod 600):[dataverse] instance = "https://entrepot.recherche.data.gouv.fr" token = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
- A project
.env(gitignored) — see.env.example.
The token travels only in the X-Dataverse-key header, is never logged, and is never sent on a redirect
to signed object storage. Never commit it (.env, config.toml, *.token are gitignored).
Contributing
Full walkthrough in CONTRIBUTING.md; the design is in docs/DESIGN.md. The green gate (run before every commit) mirrors CI:
ruff check . && mypy --config-file pyproject.toml src
python catalog/scripts/validate.py # every descriptor is schema-valid
pytest -q
License
Code is dual-licensed open-source — CeCILL-2.1 OR AGPL-3.0-or-later (your choice) — with an
optional commercial license for closed-source / SaaS use; for any commercial use, contact
nirs4all-admin@cirad.fr. See LICENSING.md, LICENSES/ and
THIRD_PARTY_NOTICES.md.
Catalog content (cards, datasheets, metadata) is licensed CC-BY-4.0. Each dataset carries its own SPDX license in its descriptor and is only ever linked to its origin — open data is never re-hosted under a different license.
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 Distributions
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 nirs4all_datasets-0.3.7.tar.gz.
File metadata
- Download URL: nirs4all_datasets-0.3.7.tar.gz
- Upload date:
- Size: 1.4 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e0b997ccd9c1d04e4d3ac1edebea4330e234035318551ae75c3d3ee423ecf0b0
|
|
| MD5 |
1281f0f4dcaca37f929fb8aaf157345e
|
|
| BLAKE2b-256 |
0dd03ea8a4e7282f96c1fc4eb6a9fcd3195daae2d792fb24e8d1412d0be8f2bd
|
Provenance
The following attestation bundles were made for nirs4all_datasets-0.3.7.tar.gz:
Publisher:
release-python.yml on GBeurier/nirs4all-datasets
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
nirs4all_datasets-0.3.7.tar.gz -
Subject digest:
e0b997ccd9c1d04e4d3ac1edebea4330e234035318551ae75c3d3ee423ecf0b0 - Sigstore transparency entry: 2137574589
- Sigstore integration time:
-
Permalink:
GBeurier/nirs4all-datasets@784c2872662204e820c8cf6b58d01bc4788148c0 -
Branch / Tag:
refs/tags/v0.3.7 - Owner: https://github.com/GBeurier
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-python.yml@784c2872662204e820c8cf6b58d01bc4788148c0 -
Trigger Event:
push
-
Statement type:
File details
Details for the file nirs4all_datasets-0.3.7-cp311-abi3-win_amd64.whl.
File metadata
- Download URL: nirs4all_datasets-0.3.7-cp311-abi3-win_amd64.whl
- Upload date:
- Size: 7.4 MB
- Tags: CPython 3.11+, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5dfc873f4699e174cff72e2878d95743c78097fb3b836b6367fa1f707a9421a6
|
|
| MD5 |
1e60fba48a4e304cf14443db5f08009f
|
|
| BLAKE2b-256 |
e87511356a4fd027544c2d73aad7a2c37e01c3eebe8294bdff530670db1f2d03
|
Provenance
The following attestation bundles were made for nirs4all_datasets-0.3.7-cp311-abi3-win_amd64.whl:
Publisher:
release-python.yml on GBeurier/nirs4all-datasets
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
nirs4all_datasets-0.3.7-cp311-abi3-win_amd64.whl -
Subject digest:
5dfc873f4699e174cff72e2878d95743c78097fb3b836b6367fa1f707a9421a6 - Sigstore transparency entry: 2137574856
- Sigstore integration time:
-
Permalink:
GBeurier/nirs4all-datasets@784c2872662204e820c8cf6b58d01bc4788148c0 -
Branch / Tag:
refs/tags/v0.3.7 - Owner: https://github.com/GBeurier
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-python.yml@784c2872662204e820c8cf6b58d01bc4788148c0 -
Trigger Event:
push
-
Statement type:
File details
Details for the file nirs4all_datasets-0.3.7-cp311-abi3-manylinux_2_34_x86_64.whl.
File metadata
- Download URL: nirs4all_datasets-0.3.7-cp311-abi3-manylinux_2_34_x86_64.whl
- Upload date:
- Size: 8.7 MB
- Tags: CPython 3.11+, manylinux: glibc 2.34+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4a86b7faf59c0db60c70c62b9b196da08e9095e55c93724f76e2f51c812a467e
|
|
| MD5 |
6e02d4cbd1c8d9f6a9c395cde6f49df4
|
|
| BLAKE2b-256 |
baca091b38f2d671a8c3b326108a83360d6ffc0e045935c3ca9a7c8d819fcc90
|
Provenance
The following attestation bundles were made for nirs4all_datasets-0.3.7-cp311-abi3-manylinux_2_34_x86_64.whl:
Publisher:
release-python.yml on GBeurier/nirs4all-datasets
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
nirs4all_datasets-0.3.7-cp311-abi3-manylinux_2_34_x86_64.whl -
Subject digest:
4a86b7faf59c0db60c70c62b9b196da08e9095e55c93724f76e2f51c812a467e - Sigstore transparency entry: 2137574687
- Sigstore integration time:
-
Permalink:
GBeurier/nirs4all-datasets@784c2872662204e820c8cf6b58d01bc4788148c0 -
Branch / Tag:
refs/tags/v0.3.7 - Owner: https://github.com/GBeurier
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-python.yml@784c2872662204e820c8cf6b58d01bc4788148c0 -
Trigger Event:
push
-
Statement type:
File details
Details for the file nirs4all_datasets-0.3.7-cp311-abi3-macosx_11_0_arm64.whl.
File metadata
- Download URL: nirs4all_datasets-0.3.7-cp311-abi3-macosx_11_0_arm64.whl
- Upload date:
- Size: 7.5 MB
- Tags: CPython 3.11+, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9c7a73b756fb2e0e611881eda395fdd0366bb659a7844138df7dda4355f6bca7
|
|
| MD5 |
c3eb8a24edbf0cd386292404b810d8da
|
|
| BLAKE2b-256 |
8a38e8c4ef08f1c90b4f3d9d3dad24a6ce353241081736e9379f67aae9e0c6a2
|
Provenance
The following attestation bundles were made for nirs4all_datasets-0.3.7-cp311-abi3-macosx_11_0_arm64.whl:
Publisher:
release-python.yml on GBeurier/nirs4all-datasets
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
nirs4all_datasets-0.3.7-cp311-abi3-macosx_11_0_arm64.whl -
Subject digest:
9c7a73b756fb2e0e611881eda395fdd0366bb659a7844138df7dda4355f6bca7 - Sigstore transparency entry: 2137574774
- Sigstore integration time:
-
Permalink:
GBeurier/nirs4all-datasets@784c2872662204e820c8cf6b58d01bc4788148c0 -
Branch / Tag:
refs/tags/v0.3.7 - Owner: https://github.com/GBeurier
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-python.yml@784c2872662204e820c8cf6b58d01bc4788148c0 -
Trigger Event:
push
-
Statement type: