Production-grade bootstrap uncertainty estimation: 15+ methods, sklearn CV, pandas accessor.
Project description
bootstrapx
Production-grade bootstrap uncertainty estimation for Python.
15 bootstrap methods · sklearn-compatible · pandas accessor · memory-safe batching
Why bootstrapx?
scipy.stats.bootstrap covers 3 CI types and only iid data.
The R boot package is comprehensive but not Pythonic.
bootstrapx bridges this gap.
| Feature | scipy |
arch |
bootstrapx |
|---|---|---|---|
| BCa interval | ✅ | ❌ | ✅ |
| Studentized (bootstrap-t) | ❌ | ❌ | ✅ |
| Bayesian bootstrap | ❌ | ❌ | ✅ |
| Poisson / Bernoulli weights | ❌ | ❌ | ✅ |
| MBB / CBB / Stationary block | ❌ | ✅ | ✅ |
| Sieve (AR-based) | ❌ | ❌ | ✅ |
| Wild bootstrap | ❌ | ✅ | ✅ |
| Cluster / Stratified | ❌ | ❌ | ✅ |
| scikit-learn CV API | ❌ | ❌ | ✅ |
pandas .bootstrap accessor |
❌ | ❌ | ✅ |
| Reproducible (seeded RNG) | ✅ | partial | ✅ |
| Constant memory (batched) | ❌ | ❌ | ✅ |
Installation
pip install bootstrapx-lib # core (numpy + scipy only)
pip install "bootstrapx-lib[pandas]" # + pandas accessor
pip install "bootstrapx-lib[numba]" # + Numba JIT acceleration
pip install "bootstrapx-lib[pandas,numba]" # everything
Quick Start
Basic usage
import numpy as np
from bootstrapx import bootstrap
data = np.random.default_rng(42).normal(5, 2, size=300)
result = bootstrap(data, np.mean)
print(result)
# BootstrapResult(method='bca', theta_hat=4.97, se=0.11, CI=[4.75, 5.19])
print(result.confidence_interval.low, result.confidence_interval.high)
print(5.0 in result.confidence_interval) # True
pandas accessor
import pandas as pd
import numpy as np
import bootstrapx # registers .bootstrap accessor
s = pd.Series(np.random.default_rng(0).exponential(scale=2, size=500))
# On a Series
r = s.bootstrap.bca(np.mean)
print(r)
# On a DataFrame — column-wise summary
df = pd.DataFrame({"control": s, "treatment": s * 1.1 + 0.3})
print(df.bootstrap.summary(np.mean))
# theta_hat ci_low ci_high se method
# column
# control 1.9973 1.8215 2.1862 0.0941 bca
# treatment 2.4970 2.3036 2.7048 0.1035 bca
scikit-learn cross-validation
from bootstrapx import BootstrapCV
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.model_selection import cross_val_score
from sklearn.datasets import load_breast_cancer
X, y = load_breast_cancer(return_X_y=True)
cv = BootstrapCV(n_splits=200, random_state=42)
scores = cross_val_score(
GradientBoostingClassifier(n_estimators=100),
X, y, cv=cv, scoring="roc_auc"
)
print(f"AUC: {scores.mean():.4f} ± {scores.std():.4f}")
# AUC: 0.9921 ± 0.0071
Time-series bootstrap
import numpy as np
from bootstrapx import bootstrap
rng = np.random.default_rng(0)
y = np.zeros(500)
for t in range(1, 500):
y[t] = 0.7 * y[t-1] + rng.normal()
# Moving Block Bootstrap — preserves serial correlation
result = bootstrap(y, np.mean, method="mbb", block_length=15, n_resamples=4999)
print(result)
# Sieve Bootstrap — fits AR(p) model to residuals
result = bootstrap(y, np.mean, method="sieve", n_resamples=9999)
print(result)
A/B test with clustered data
import numpy as np
from bootstrapx import bootstrap
n_clusters = 50
cluster_ids = np.repeat(np.arange(n_clusters), 20)
rng = np.random.default_rng(1)
data = rng.normal(loc=cluster_ids * 0.1, scale=1.0)
result = bootstrap(
data, np.mean,
method="cluster",
cluster_ids=cluster_ids,
n_resamples=4999,
)
print(result)
# Correctly wider CI that accounts for within-cluster correlation
Performance
Measured on Apple M1, Python 3.12, n_resamples=4 999, median of 5 runs.
Run yourself: python benchmarks/bench_speed.py --quick
BCa (bias-corrected and accelerated):
| n | scipy (ms) | bootstrapx (ms) | Speedup |
|---|---|---|---|
| 200 | 9.6 | 5.8 | 1.7× |
| 2 000 | 69 | 58 | 1.2× |
| 5 000 | 433 | 156 | 2.8× |
| 10 000 | 1 015 | 289 | 3.5× |
At n < 1 000, scipy and bootstrapx are comparable; bootstrapx applies a vectorised fast path for numpy built-ins (mean, median, std, etc.) at n < 500. Speedup grows with sample size due to O(n) vectorised jackknife vs O(n²) in scipy.
Coverage accuracy
BCa empirical coverage at nominal 95%, 1 000 Monte Carlo simulations across normal, log-normal, exponential and t(3) distributions: bootstrapx matches scipy to within simulation noise (< 0.01) for mean and median.
Note: BCa coverage for
np.stdon heavy-tailed distributions (exponential) is ~91–93% at n = 200 — identical behaviour in both bootstrapx and scipy. This reflects known instability of jackknife acceleration for scale statistics, not a library-specific issue. Usen_resamples ≥ 9 999ormethod="studentized"for better coverage when estimating variance.
Run yourself: python benchmarks/bench_coverage_accuracy.py --fast
Documentation
📖 Full docs: artyerokhin.github.io/bootstrapx
All supported methods
| Method | method= |
Use case |
|---|---|---|
| BCa | "bca" |
General purpose, best coverage accuracy |
| Percentile | "percentile" |
Simple, fast |
| Basic (Hall) | "basic" |
Symmetric distributions |
| Studentized | "studentized" |
Known variance structure |
| Bayesian | "bayesian" |
Bayesian UQ, non-parametric posterior |
| Poisson weights | "poisson" |
Weighted bootstrap, survey data |
| Bernoulli weights | "bernoulli" |
Subsampling variant |
| Subsampling | "subsampling" |
Heavy tails, no finite variance |
| Moving Block (MBB) | "mbb" |
Stationary time series |
| Circular Block (CBB) | "cbb" |
Stationary TS, edge-effect free |
| Stationary | "stationary" |
Politis & Romano (1994) |
| Tapered Block | "tapered" |
Paparoditis & Politis (2001) |
| Sieve | "sieve" |
AR(p) time series (Bühlmann 1997) |
| Wild | "wild" |
Heteroscedastic residuals (Wu 1986) |
| Cluster | "cluster" |
Multi-level / panel data |
| Stratified | "strata" |
Stratified sampling designs |
Contributing
git clone https://github.com/artyerokhin/bootstrapx.git
cd bootstrapx
pip install -e ".[dev,pandas]"
pytest tests/ -v
Citation
If you use bootstrapx in academic work:
@software{bootstrapx,
author = {Erokhin, Artem},
title = {bootstrapx: Production-grade bootstrap uncertainty estimation},
url = {https://github.com/artyerokhin/bootstrapx},
version = {0.3.1},
year = {2026},
}
License
MIT — see LICENSE.
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 bootstrapx_lib-0.3.2.tar.gz.
File metadata
- Download URL: bootstrapx_lib-0.3.2.tar.gz
- Upload date:
- Size: 26.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
75389148bd668f3aa40a224a9364bb90599afdfb251d848b1683c90904889101
|
|
| MD5 |
f8d515720322ac6bf31071d826d91333
|
|
| BLAKE2b-256 |
4871ce588f14bf83a728e391652a52b1318625fdcd556ca9561ff525a7d17be2
|
Provenance
The following attestation bundles were made for bootstrapx_lib-0.3.2.tar.gz:
Publisher:
publish.yml on artyerokhin/bootstrapx
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
bootstrapx_lib-0.3.2.tar.gz -
Subject digest:
75389148bd668f3aa40a224a9364bb90599afdfb251d848b1683c90904889101 - Sigstore transparency entry: 1646962532
- Sigstore integration time:
-
Permalink:
artyerokhin/bootstrapx@0a2aa763d6232aff1278ec930f9941ac7159883c -
Branch / Tag:
refs/tags/v0.3.2 - Owner: https://github.com/artyerokhin
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@0a2aa763d6232aff1278ec930f9941ac7159883c -
Trigger Event:
push
-
Statement type:
File details
Details for the file bootstrapx_lib-0.3.2-py3-none-any.whl.
File metadata
- Download URL: bootstrapx_lib-0.3.2-py3-none-any.whl
- Upload date:
- Size: 22.2 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 |
4ade1bf521de94db0a73ee95c38772800df57119078cf1aeadd39413770fd859
|
|
| MD5 |
118ee8321f0a7af67349bdae985e0f93
|
|
| BLAKE2b-256 |
ed92f453329e59080b72f3fec9e5216440d36fce68cf03afc143b4a5e3437fdf
|
Provenance
The following attestation bundles were made for bootstrapx_lib-0.3.2-py3-none-any.whl:
Publisher:
publish.yml on artyerokhin/bootstrapx
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
bootstrapx_lib-0.3.2-py3-none-any.whl -
Subject digest:
4ade1bf521de94db0a73ee95c38772800df57119078cf1aeadd39413770fd859 - Sigstore transparency entry: 1646962650
- Sigstore integration time:
-
Permalink:
artyerokhin/bootstrapx@0a2aa763d6232aff1278ec930f9941ac7159883c -
Branch / Tag:
refs/tags/v0.3.2 - Owner: https://github.com/artyerokhin
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@0a2aa763d6232aff1278ec930f9941ac7159883c -
Trigger Event:
push
-
Statement type: