Unified CPU/GPU statistical categorical encoding: leakage-safe target encoding generalized to arbitrary statistics, with one sklearn-compatible API.
Project description
catstat
Unified CPU/GPU statistical categorical encoding: leakage-safe target encoding generalized to arbitrary statistics, behind one scikit-learn-compatible API.
Runs on CPU (pandas/numpy) today. The GPU path (cuDF/CuPy) is parity-validated (CPU/GPU
allclose) but not yet faster than CPU up to ~1M rows, so backend="auto" resolves to CPU;
explicit backend="gpu" is available for device-resident pipelines and larger data. See
docs/roadmap.md and docs/known_issues.md (KI-020).
Install
pip install catstat
Optional extras: catstat[gpu] (RAPIDS cuDF/CuPy, CUDA 12), catstat[polars]
(output="polars"), catstat[docs] (API-reference build), catstat[dev] (tests + lint + build).
Quickstart
from catstat import TargetEncoder, CountEncoder, FrequencyEncoder
enc = TargetEncoder(cols="auto", stats=["mean"], smooth="auto", cv=5, random_state=42)
X_train_enc = enc.fit_transform(X_train, y_train) # out-of-fold (leakage-safe)
X_test_enc = enc.transform(X_test) # full-data encodings for new data
Why catstat
sklearn's TargetEncoder is CPU and mean-only; cuML is GPU-only (RAPIDS-locked, few stats);
category_encoders has no internal cross-fitting (leakage risk). catstat is the union: one API,
CPU today and GPU when it pays off, generalized statistics, always leakage-safe.
What it encodes
Three encoders over a shared core: TargetEncoder (supervised, cross-fitted) and the
unsupervised CountEncoder / FrequencyEncoder. TargetEncoder(stats=[...]) selects the
statistics to emit:
stats= entry |
smoothing | target | GPU | column infix |
|---|---|---|---|---|
"mean" |
m-estimate (fixed) / empirical-Bayes (smooth="auto") |
regression / binary / multiclass | ✅ | te_mean |
"count" |
— | unsupervised | ✅ | count |
"frequency" |
— | unsupervised | ✅ | freq |
"var", "std" |
— (global fallback) | regression | ✅ | te_var, te_std |
"median", "min", "max" |
— (global fallback) | regression | ✅ | te_median / te_min / te_max |
"skew" |
— (global fallback) | regression | CPU only | te_skew |
("name", callable) — custom (quantiles, IQR, …) |
— (global fallback) | regression | CPU only | name |
Smoothing honesty: only mean/probability statistics are smoothed. Count/frequency get none;
order/shape statistics never blend — below min_samples_category (or where undefined) they fall
back to the global statistic. (stats=["quantile"] raises with a hint to pass a custom
callable such as ("q90", lambda v: np.quantile(v, 0.9)).)
Other knobs: scheme ∈ {kfold, loo, ordered} (cross-fitting for the mean; loo/ordered are
mean-only), multi_feature_mode ∈ {independent, combination} (joint group-by), handle_unknown /
handle_missing ∈ {value, return_nan, error}, backend ∈ {auto, cpu, gpu}, and output ∈ {auto, numpy, pandas, polars}.
Leakage-safe by design
fit_transform(X, y)is out-of-fold: each fold is encoded from its complement, then the encoder refits on the full data for latertransformof new rows.fit(X, y).transform(X)on the training set is the leaky path and is documented as such.smooth="auto"variance is computed per fold; folds flow only throughrandom_state(catstatowns fold assignment, so CPU and GPU produce the same encodings — asserted allclose).- Deterministic given
random_state.
scikit-learn compatibility
BaseEstimator / TransformerMixin; works in Pipeline and ColumnTransformer, supports
set_output(transform="pandas"|"polars") and get_feature_names_out. The supported subset of
sklearn.utils.estimator_checks.check_estimator is documented and tested (see
docs/known_issues.md, KI-012).
API reference
Rendered API docs: https://matapanino.github.io/catstat/ (built with pdoc; see
scripts/build_docs.sh).
Develop
pip install -e ".[dev]"
bash scripts/check.sh # ruff + pytest + examples (the green gate)
PYTHONPATH=src python3 -m pytest tests/ -q
PYTHONPATH=src python3 -m benchmarks.run_benchmarks --size small --backend cpu --reps 5 \
--out benchmarks/results/run.json
See CLAUDE.md for the development rules and docs/ for the design.
License
MIT
Project details
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 catstat-0.2.0.tar.gz.
File metadata
- Download URL: catstat-0.2.0.tar.gz
- Upload date:
- Size: 116.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
660ee999e2d12d948dd31d148272a8ba07c636a025ebd73b17e3ece2885d54c0
|
|
| MD5 |
8046ec2421a5eed8098e95cbf4ca6f8a
|
|
| BLAKE2b-256 |
3f63a0bd06c96c3ed8c7b65cc23804110d8b23abc5c15e4c294b09d1fd9653a4
|
Provenance
The following attestation bundles were made for catstat-0.2.0.tar.gz:
Publisher:
release.yml on Matapanino/catstat
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
catstat-0.2.0.tar.gz -
Subject digest:
660ee999e2d12d948dd31d148272a8ba07c636a025ebd73b17e3ece2885d54c0 - Sigstore transparency entry: 1965107840
- Sigstore integration time:
-
Permalink:
Matapanino/catstat@126616e3e6ae8e63c4478f0000da912202a30af8 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/Matapanino
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@126616e3e6ae8e63c4478f0000da912202a30af8 -
Trigger Event:
push
-
Statement type:
File details
Details for the file catstat-0.2.0-py3-none-any.whl.
File metadata
- Download URL: catstat-0.2.0-py3-none-any.whl
- Upload date:
- Size: 29.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 |
1e0f93fbb00edadded97f51241798b55eb2bab4cc67038df44e83075ea991b96
|
|
| MD5 |
99a94e8b57f07486206f0f094151d443
|
|
| BLAKE2b-256 |
1fd1052dd522947701dcb6e2cf45cb73554b862907d7d46efcc76432d4c388a9
|
Provenance
The following attestation bundles were made for catstat-0.2.0-py3-none-any.whl:
Publisher:
release.yml on Matapanino/catstat
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
catstat-0.2.0-py3-none-any.whl -
Subject digest:
1e0f93fbb00edadded97f51241798b55eb2bab4cc67038df44e83075ea991b96 - Sigstore transparency entry: 1965108020
- Sigstore integration time:
-
Permalink:
Matapanino/catstat@126616e3e6ae8e63c4478f0000da912202a30af8 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/Matapanino
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@126616e3e6ae8e63c4478f0000da912202a30af8 -
Trigger Event:
push
-
Statement type: