Skip to main content

Fast Generalized Linear Models with a Rust backend - statsmodels compatible

Project description

RustyStats 🦀📊

High-performance Generalized Linear Models with a Rust backend and Python API

Codebase Documentation: pricingfrontier.github.io/rustystats/

Features

  • Dict-First API - Programmatic model building ideal for automated workflows and agents
  • Fast - Parallel Rust backend, 5-10x faster than statsmodels
  • Memory Efficient - 4-5x less RAM than statsmodels at scale
  • Stable - Step-halving IRLS, warm starts for robust convergence
  • Splines - B-splines and natural splines with auto-tuned smoothing and monotonicity
  • Target Encoding - Ordered target encoding for high-cardinality categoricals
  • Regularisation - Ridge, Lasso, and Elastic Net via coordinate descent
  • Validation - Design matrix checks with fix suggestions before fitting
  • Complete - 8 families, robust SEs, full diagnostics, VIF, partial dependence
  • Minimal - Only numpy and polars required

Installation

uv add rustystats

Quick Start

import rustystats as rs
import polars as pl

# Load data
data = pl.read_parquet("insurance.parquet")

# Fit a Poisson GLM for claim frequency
result = rs.glm_dict(
    response="ClaimCount",
    terms={
        "VehAge": {"type": "linear"},
        "VehPower": {"type": "linear"},
        "Area": {"type": "categorical"},
        "Region": {"type": "categorical"},
    },
    data=data,
    family="poisson",
    offset="Exposure",
).fit()

# View results
print(result.summary())

Families & Links

Family Default Link Use Case
gaussian identity Linear regression
poisson log Claim frequency
binomial logit Binary outcomes
gamma log Claim severity
tweedie log Pure premium (var_power=1.5)
quasipoisson log Overdispersed counts
quasibinomial logit Overdispersed binary
negbinomial log Overdispersed counts (proper distribution)

Dict-Based API

API built for programmatic model building.

result = rs.glm_dict(
    response="ClaimCount",
    terms={
        "VehAge": {"type": "bs", "monotonicity": "increasing"},  # Monotonic (auto-tuned)
        "DrivAge": {"type": "bs"},                               # Penalized smooth (default)
        "Income": {"type": "bs", "df": 5},                       # Fixed 5 df
        "BonusMalus": {"type": "linear", "monotonicity": "increasing"},  # Constrained coefficient
        "Region": {"type": "categorical"},
        "Brand": {"type": "target_encoding"},
        "Age2": {"type": "expression", "expr": "DrivAge**2"},
    },
    interactions=[
        {
            "VehAge": {"type": "linear"}, 
            "Region": {"type": "categorical"}, 
            "include_main": True
        },
    ],
    data=data,
    family="poisson",
    offset="Exposure",
    seed=42,
).fit(regularization="elastic_net")

Term Types

Type Parameters Description
linear monotonicity (optional) Raw continuous variable
categorical levels (optional) Dummy encoding
bs df or k, degree=3, monotonicity B-spline (default: penalized smooth, k=10)
ns df or k Natural spline (default: penalized smooth, k=10)
target_encoding prior_weight=1 Regularized target encoding
expression expr, monotonicity (optional) Arbitrary expression (like I())

Interactions

Each interaction is a dict with variable specs. Use include_main to also add main effects.

interactions=[
    # Standard interaction: product terms (main effects + interaction)
    {
        "DrivAge": {"type": "bs", "df": 5}, 
        "Brand": {"type": "target_encoding"},
        "include_main": True
    },
    # Categorical × continuous (interaction only)
    {
        "VehAge": {"type": "linear"}, 
        "Region": {"type": "categorical"}, 
        "include_main": False
    },
    # TE interaction: combined target encoding TE(Brand:Region)
    {
        "Brand": {"type": "categorical"},
        "Region": {"type": "categorical"},
        "target_encoding": True,
        "prior_weight": 1.0,  # optional
    },
    # FE interaction: combined frequency encoding FE(Brand:Region)
    {
        "Brand": {"type": "categorical"},
        "Region": {"type": "categorical"},
        "frequency_encoding": True,
    },
]
Flag Effect
(none) Standard product terms (cat×cat, cat×cont, etc.)
target_encoding: True Combined TE encoding: TE(var1:var2)
frequency_encoding: True Combined FE encoding: FE(var1:var2)

Splines

# Default: penalized smooth with automatic tuning via GCV
result = rs.glm_dict(
    response="ClaimNb",
    terms={
        "Age": {"type": "bs"},           # B-spline (auto-tuned)
        "VehPower": {"type": "ns"},      # Natural spline (auto-tuned)
        "Region": {"type": "categorical"},
    },
    data=data, family="poisson", offset="Exposure",
).fit()

# Fixed degrees of freedom (no penalty)
result = rs.glm_dict(
    response="ClaimNb",
    terms={
        "Age": {"type": "bs", "df": 5},       # Fixed 5 df
        "VehPower": {"type": "ns", "df": 4},  # Fixed 4 df
        "Region": {"type": "categorical"},
    },
    data=data, family="poisson", offset="Exposure",
).fit()

Spline parameters:

  • No parameters → penalized smooth with automatic tuning (k=10)
  • df=5 → fixed 5 degrees of freedom
  • k=15 → penalized smooth with 15 basis functions
  • monotonicity="increasing" or "decreasing" → constrained effect (bs only)

When to use each type:

  • B-splines (bs): Standard choice, more flexible at boundaries, supports monotonicity
  • Natural splines (ns): Better extrapolation, linear beyond boundaries

Monotonic Splines

Constrain the fitted curve to be monotonically increasing or decreasing. Essential when business logic dictates a monotonic relationship.

# Monotonically increasing effect (e.g., age → risk)
result = rs.glm_dict(
    response="ClaimNb",
    terms={
        "Age": {"type": "bs", "monotonicity": "increasing"},
        "Region": {"type": "categorical"},
    },
    data=data, family="poisson", offset="Exposure",
).fit()

# Monotonically decreasing effect (e.g., vehicle value with age)
result = rs.glm_dict(
    response="ClaimAmt",
    terms={"VehAge": {"type": "bs", "df": 4, "monotonicity": "decreasing"}},
    data=data, family="gamma",
).fit()

Coefficient Constraints

Constrain coefficient signs using monotonicity on linear and expression terms.

result = rs.glm_dict(
    response="y",
    terms={
        "age": {"type": "linear", "monotonicity": "increasing"},  # β ≥ 0
        "age2": {"type": "expression", "expr": "age ** 2", "monotonicity": "decreasing"},  # β ≤ 0
        "income": {"type": "linear"},
    },
    data=data, family="poisson",
).fit()
Constraint Term Spec Effect
β ≥ 0 "monotonicity": "increasing" Positive effect
β ≤ 0 "monotonicity": "decreasing" Negative effect

Target Encoding

Ordered target encoding for high-cardinality categoricals.

# Dict API
result = rs.glm_dict(
    response="ClaimNb",
    terms={
        "Brand": {"type": "target_encoding"},
        "Model": {"type": "target_encoding", "prior_weight": 2.0},
        "Age": {"type": "linear"},
        "Region": {"type": "categorical"},
    },
    data=data, family="poisson", offset="Exposure",
).fit()

# Sklearn-style API
encoder = rs.TargetEncoder(prior_weight=1.0, n_permutations=4)
train_encoded = encoder.fit_transform(train_categories, train_target)
test_encoded = encoder.transform(test_categories)

Key benefits:

  • No target leakage: Ordered target statistics
  • Regularization: Prior weight controls shrinkage toward global mean
  • High-cardinality: Single column instead of thousands of dummies
  • Exposure-aware: For frequency models with offset="Exposure", automatically uses claim rate (ClaimCount/Exposure) instead of raw counts
  • Interactions: Use target_encoding: True in interactions to encode variable combinations

Expression Terms

result = rs.glm_dict(
    response="y",
    terms={
        "age": {"type": "linear"},
        "age2": {"type": "expression", "expr": "age ** 2"},
        "age3": {"type": "expression", "expr": "age ** 3"},
        "income_k": {"type": "expression", "expr": "income / 1000"},
        "bmi": {"type": "expression", "expr": "weight / (height ** 2)"},
    },
    data=data, family="gaussian",
).fit()

Supported operations: +, -, *, /, ** (power)


Regularization

CV-Based Regularization

# Just specify regularization type - cv=5 is automatic
result = rs.glm_dict(
    response="y",
    terms={"x1": {"type": "linear"}, "x2": {"type": "linear"}, "cat": {"type": "categorical"}},
    data=data,
    family="poisson",
).fit(regularization="ridge")  # "ridge", "lasso", or "elastic_net"

print(f"Selected alpha: {result.alpha}")
print(f"CV deviance: {result.cv_deviance}")

Options:

  • regularization: "ridge" (L2), "lasso" (L1), or "elastic_net" (mix)
  • selection: "min" (best fit) or "1se" (more conservative, default: "min")
  • cv: Number of folds (default: 5)

Explicit Alpha

# Skip CV, use specific alpha
result = rs.glm_dict(response="y", terms={"x1": {"type": "linear"}, "x2": {"type": "linear"}}, data=data).fit(alpha=0.1, l1_ratio=0.0)  # Ridge
result = rs.glm_dict(response="y", terms={"x1": {"type": "linear"}, "x2": {"type": "linear"}}, data=data).fit(alpha=0.1, l1_ratio=1.0)  # Lasso
result = rs.glm_dict(response="y", terms={"x1": {"type": "linear"}, "x2": {"type": "linear"}}, data=data).fit(alpha=0.1, l1_ratio=0.5)  # Elastic Net

Design Matrix Validation

# Check for issues before fitting
model = rs.glm_dict(
    response="y",
    terms={"x": {"type": "ns", "df": 4}, "cat": {"type": "categorical"}},
    data=data, family="poisson",
)
results = model.validate()  # Prints diagnostics

if not results['valid']:
    print("Issues:", results['suggestions'])

# Validation runs automatically on fit failure with helpful suggestions

Checks performed:

  • Rank deficiency (linearly dependent columns)
  • High multicollinearity (condition number)
  • Zero variance columns
  • NaN/Inf values
  • Highly correlated column pairs (>0.999)

Results

# Coefficients & Inference
result.params              # Coefficients
result.fittedvalues        # Predicted means
result.deviance            # Model deviance
result.bse()               # Standard errors
result.tvalues()           # z-statistics
result.pvalues()           # P-values
result.conf_int(alpha)     # Confidence intervals

# Robust Standard Errors (sandwich estimators)
result.bse_robust("HC1")   # Robust SE (HC0, HC1, HC2, HC3)
result.tvalues_robust()    # z-stats with robust SE
result.pvalues_robust()    # P-values with robust SE
result.conf_int_robust()   # Confidence intervals with robust SE
result.cov_robust()        # Full robust covariance matrix

# Diagnostics (statsmodels-compatible)
result.resid_response()    # Raw residuals (y - μ)
result.resid_pearson()     # Pearson residuals
result.resid_deviance()    # Deviance residuals
result.resid_working()     # Working residuals
result.llf()               # Log-likelihood
result.aic()               # Akaike Information Criterion
result.bic()               # Bayesian Information Criterion
result.null_deviance()     # Null model deviance
result.pearson_chi2()      # Pearson chi-squared
result.scale()             # Dispersion (deviance-based)
result.scale_pearson()     # Dispersion (Pearson-based)
result.family              # Family name

Model Diagnostics

# Compute all diagnostics at once
diagnostics = result.diagnostics(
    data=data,
    categorical_factors=["Region", "VehBrand", "Area"],  # Including non-fitted
    continuous_factors=["Age", "Income", "VehPower"],    # Including non-fitted
)

# Export as compact JSON (optimized for LLM consumption)
json_str = diagnostics.to_json()

# Pre-fit data exploration (no model needed)
exploration = rs.explore_data(
    data=data,
    response="ClaimNb",
    categorical_factors=["Region", "VehBrand", "Area"],
    continuous_factors=["Age", "VehPower", "Income"],
    exposure="Exposure",
    family="poisson",
    detect_interactions=True,
)

Diagnostic Features:

  • Calibration: Overall A/E ratio, calibration by decile with CIs, Hosmer-Lemeshow test
  • Discrimination: Gini coefficient, AUC, KS statistic, lift metrics
  • Factor Diagnostics: A/E by level/bin for ALL factors (fitted and non-fitted)
  • VIF/Multicollinearity: Variance inflation factors for design matrix columns
  • Partial Dependence: Effect plots with shape detection and recommendations
  • Overfitting Detection: Compare train vs test metrics when test data provided
  • Interaction Detection: Greedy residual-based detection of potential interactions
  • Warnings: Auto-generated alerts for high dispersion, poor calibration, missing factors
  • Base Model Comparison: Compare new model against existing/benchmark predictions

Comparing Against a Base Model

Compare your new model against predictions from an existing model (e.g., current production model):

# Add base model predictions to your data
data = data.with_columns(pl.lit(old_model_predictions).alias("base_pred"))

# Run diagnostics with base_predictions
diagnostics = result.diagnostics(
    train_data=data,
    categorical_factors=["Region", "VehBrand"],
    continuous_factors=["Age", "VehPower"],
    base_predictions="base_pred",  # Column name with base model predictions
)

# Access comparison results
bc = diagnostics.base_predictions_comparison

# Side-by-side metrics
print(f"Model loss: {bc.model_metrics.loss}, Base loss: {bc.base_metrics.loss}")
print(f"Model Gini: {bc.model_metrics.gini}, Base Gini: {bc.base_metrics.gini}")

# Improvement metrics (positive = new model is better)
print(f"Loss improvement: {bc.loss_improvement_pct}%")
print(f"Gini improvement: {bc.gini_improvement}")
print(f"AUC improvement: {bc.auc_improvement}")

# Decile analysis sorted by model/base prediction ratio
for d in bc.model_vs_base_deciles:
    print(f"Decile {d.decile}: actual={d.actual:.4f}, "
          f"model={d.model_predicted:.4f}, base={d.base_predicted:.4f}")

The comparison includes:

  • Side-by-side metrics: Loss (mean deviance), Gini, AUC, A/E ratio for both models
  • Improvement metrics: loss_improvement_pct, gini_improvement, auc_improvement
  • Decile analysis: Data sorted by model/base ratio, showing where the new model diverges
  • Calibration comparison: Count of deciles where each model has better A/E

Model Serialization

Save and load fitted models for later use:

# Fit and save
model_bytes = result.to_bytes()

with open("model.bin", "wb") as f:
    f.write(model_bytes)

# Load later
with open("model.bin", "rb") as f:
    loaded = rs.GLMModel.from_bytes(f.read())

# Predict with loaded model
predictions = loaded.predict(new_data)

What's preserved:

  • Coefficients and feature names
  • Categorical encoding levels
  • Spline knot positions
  • Target encoding statistics
  • Formula, family, link function

Compact storage: Only prediction-essential state is stored (~KB, not MB).


Model Export (PMML & ONNX)

Export fitted models to standard formats for deployment — no extra dependencies required. PMML uses stdlib XML; ONNX protobuf serialization is implemented from scratch in Rust.

PMML

# Export to PMML 4.4 XML
pmml_xml = result.to_pmml()
result.to_pmml(path="model.pmml")

# Load & predict (consumer side)
# pip install pypmml
from pypmml import Model
pmml_model = Model.fromFile("model.pmml")

new_data = pl.DataFrame({"VehAge": [3, 5, 1], "Area": ["C", "A", "B"]})
preds = pmml_model.predict(new_data.to_dict(as_series=False))

ONNX

Two modes: scoring (consumer builds design matrix) and full (preprocessing embedded in graph).

# Scoring mode (default) — input is pre-built design matrix
onnx_bytes = result.to_onnx(mode="scoring")
result.to_onnx(path="model.onnx", mode="scoring")

# Full mode — input is raw feature values, preprocessing embedded
result.to_onnx(path="model_full.onnx", mode="full")
# Load & predict on a DataFrame with onnxruntime (consumer side)
# pip install onnxruntime
import onnxruntime as ort
import numpy as np

new_data = pl.DataFrame({
    "VehAge": [3, 5, 1],
    "Area": ["C", "A", "B"],
})

# ── Scoring mode: build design matrix from DataFrame ──
session = ort.InferenceSession("model.onnx")
# Columns match model.feature_names (excluding Intercept): [VehAge, Area_B, Area_C]
X = np.column_stack([
    new_data["VehAge"].to_numpy().astype(np.float64),
    (new_data["Area"] == "B").cast(pl.Float64).to_numpy(),
    (new_data["Area"] == "C").cast(pl.Float64).to_numpy(),
])
preds = session.run(None, {"X": X})[0]  # shape (3, 1)

# ── Full mode: pass raw values, categoricals as integer codes ──
session = ort.InferenceSession("model_full.onnx")
# Map categorical levels to 0-based codes: A=0, B=1, C=2
level_map = {"A": 0, "B": 1, "C": 2}
raw = np.column_stack([
    new_data["VehAge"].to_numpy().astype(np.float64),
    new_data["Area"].map_elements(lambda v: level_map[v], return_dtype=pl.Int64).to_numpy().astype(np.float64),
])
preds = session.run(None, {"input": raw})[0]  # shape (3, 1)
scoring full
Input Pre-built design matrix Raw feature values
Categoricals One-hot dummies Integer codes
Preprocessing Consumer handles it Embedded in graph
Size Smaller Larger

Performance Benchmarks

RustyStats vs Statsmodels — Synthetic data, 101 features (10 continuous + 10 categorical with 10 levels each).

Family 10K rows 250K rows 500K rows
Gaussian 18.3x 6.4x 5.1x
Poisson 19.6x 7.1x 5.2x
Binomial 23.5x 7.1x 5.4x
Gamma 9.0x 13.4x 8.9x
NegBinomial 22.5x 7.2x 5.0x

Average speedup: 10.9x (range: 5.0x – 23.5x)

Memory Usage

Rows RustyStats Statsmodels Reduction
10K 4 MB 72 MB 18x
250K 253 MB 1,796 MB 7.1x
500K 780 MB 3,590 MB 4.6x
Full benchmark details
Family Rows RustyStats Statsmodels Speedup
Gaussian 10,000 0.085s 1.559s 18.3x
Gaussian 250,000 1.769s 11.363s 6.4x
Gaussian 500,000 3.399s 17.386s 5.1x
Poisson 10,000 0.137s 2.692s 19.6x
Poisson 250,000 2.128s 15.072s 7.1x
Poisson 500,000 4.581s 23.693s 5.2x
Binomial 10,000 0.093s 2.189s 23.5x
Binomial 250,000 1.851s 13.155s 7.1x
Binomial 500,000 3.842s 20.862s 5.4x
Gamma 10,000 0.486s 4.353s 9.0x
Gamma 250,000 2.377s 31.885s 13.4x
Gamma 500,000 5.202s 46.167s 8.9x
NegBinomial 10,000 0.141s 3.177s 22.5x
NegBinomial 250,000 2.128s 15.278s 7.2x
NegBinomial 500,000 4.900s 24.331s 5.0x

Times are median of 3 runs. Benchmark scripts in benchmarks/.


Dependencies

Rust

  • ndarray, nalgebra - Linear algebra
  • rayon - Parallel iterators (multi-threading)
  • statrs - Statistical distributions
  • pyo3 - Python bindings

Python

  • numpy - Array operations (required)
  • polars - DataFrame support (required)

License

Elastic License 2.0 (ELv2) — Free to use, modify, and distribute. Cannot be offered as a hosted/managed service.

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

rustystats-0.4.11.tar.gz (296.2 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

rustystats-0.4.11-cp313-cp313-win_amd64.whl (994.2 kB view details)

Uploaded CPython 3.13Windows x86-64

rustystats-0.4.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

rustystats-0.4.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.1 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

rustystats-0.4.11-cp313-cp313-macosx_11_0_arm64.whl (1.1 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

rustystats-0.4.11-cp313-cp313-macosx_10_12_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.13macOS 10.12+ x86-64

rustystats-0.4.11-cp312-cp312-win_amd64.whl (995.0 kB view details)

Uploaded CPython 3.12Windows x86-64

rustystats-0.4.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

rustystats-0.4.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.1 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

rustystats-0.4.11-cp312-cp312-macosx_11_0_arm64.whl (1.1 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

rustystats-0.4.11-cp312-cp312-macosx_10_12_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.12macOS 10.12+ x86-64

rustystats-0.4.11-cp311-cp311-win_amd64.whl (996.1 kB view details)

Uploaded CPython 3.11Windows x86-64

rustystats-0.4.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

rustystats-0.4.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.1 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

rustystats-0.4.11-cp311-cp311-macosx_11_0_arm64.whl (1.0 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

rustystats-0.4.11-cp311-cp311-macosx_10_12_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.11macOS 10.12+ x86-64

rustystats-0.4.11-cp310-cp310-win_amd64.whl (994.7 kB view details)

Uploaded CPython 3.10Windows x86-64

rustystats-0.4.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

rustystats-0.4.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.1 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

rustystats-0.4.11-cp310-cp310-macosx_11_0_arm64.whl (1.0 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

rustystats-0.4.11-cp310-cp310-macosx_10_12_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.10macOS 10.12+ x86-64

File details

Details for the file rustystats-0.4.11.tar.gz.

File metadata

  • Download URL: rustystats-0.4.11.tar.gz
  • Upload date:
  • Size: 296.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for rustystats-0.4.11.tar.gz
Algorithm Hash digest
SHA256 07ebb6ed07e40d48a5acf1cf9b541abde07f8afaf2d6023e30c826d0fb0808cf
MD5 30b7d69ab559e9e3d0956640f938ebdd
BLAKE2b-256 7b9498d9459beff9f9096c3cc050a4ed372595310ec7ea416294ba84e8a78886

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustystats-0.4.11.tar.gz:

Publisher: release.yml on PricingFrontier/rustystats

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rustystats-0.4.11-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: rustystats-0.4.11-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 994.2 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for rustystats-0.4.11-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 666a0fe890f1e0bac34154c1fe4503677ff2742a1ad52f7bdc5bf6f10db44b55
MD5 2773ad74f880c39bfbd0607bb15c0ad6
BLAKE2b-256 3ce0acb49a580d897fa5bf9d9d72836cc23632a41d4c1c340122e446f1d998ac

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustystats-0.4.11-cp313-cp313-win_amd64.whl:

Publisher: release.yml on PricingFrontier/rustystats

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rustystats-0.4.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rustystats-0.4.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3db17ec7e05ef454562c34069db675d400a3deb160c81b79984aab454067a4be
MD5 5790cb32961a554598aad7edb9673af8
BLAKE2b-256 84db025f8885fc03b4291a56eab29ec812c8b3c53a1cc3b6a30b20a44db4f1a0

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustystats-0.4.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on PricingFrontier/rustystats

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rustystats-0.4.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for rustystats-0.4.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 b9736e22aca15988aa0abca3d6ef65a24b64d388528d713c44ff981237147c8c
MD5 6a3aad346314e03a8f67b284da518f39
BLAKE2b-256 ed309414cd0f8f8e0a661aac52c424b319fd0e2114663cc612c70999a663548e

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustystats-0.4.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on PricingFrontier/rustystats

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rustystats-0.4.11-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rustystats-0.4.11-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a69a43bc400596fcfa994029f9e71dfccf165f06bee7ad35bdaa63bb616b3350
MD5 993d241619193d9cdeb2f88544444cdc
BLAKE2b-256 bb7f76e19f3c26eeef1c89474f129ef90b95f32380b3520840513c3ecf12386d

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustystats-0.4.11-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: release.yml on PricingFrontier/rustystats

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rustystats-0.4.11-cp313-cp313-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for rustystats-0.4.11-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 3579fadbed2eeb2f20d7e382351a27625e98cd4ddb5a686e6f23119236d95a95
MD5 aa14c2734bbfc68f315f376d58d7b9e8
BLAKE2b-256 5175beb2cd416a82e23998b6437045daa13da4f2d1ca1ae117fb5e8f35fcd10a

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustystats-0.4.11-cp313-cp313-macosx_10_12_x86_64.whl:

Publisher: release.yml on PricingFrontier/rustystats

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rustystats-0.4.11-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: rustystats-0.4.11-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 995.0 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for rustystats-0.4.11-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 30ddcc27fcd9a11587d2bc20c9a97742d135c2f729f88b90f864945f2a4d83dd
MD5 42909bdd456842823758269cddba2353
BLAKE2b-256 b6de35ece2d7ec61dea171229c0f7325c0dfc8cb84719ccecc2654d70be45931

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustystats-0.4.11-cp312-cp312-win_amd64.whl:

Publisher: release.yml on PricingFrontier/rustystats

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rustystats-0.4.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rustystats-0.4.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b0fb2c1eff7e534d16e61b131f7c031e63602549d1cce5fd7703050cb7be926d
MD5 40b372748abb9244c7d3a71c7ca51966
BLAKE2b-256 1ec3aa2a3a93db09d0e1fd637a078f5b062b77a27220251866a11ef267cd8806

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustystats-0.4.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on PricingFrontier/rustystats

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rustystats-0.4.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for rustystats-0.4.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 8c878169f91a3f7aa16e5d1f1d0335b96af73d03effbd451d40894282e323a8c
MD5 2ba1bb3849c5527f91e5eba8a0b404fb
BLAKE2b-256 bd77517f913fd487963d48cbbb7d9b8a33e30fad2b0d4ee2babc713d8e0748da

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustystats-0.4.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on PricingFrontier/rustystats

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rustystats-0.4.11-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rustystats-0.4.11-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 dad636e46bef369db8d2ceb228d86b13b58f237546c19dbdbdbedef8b0649dc3
MD5 4f91ce76fb1e3d7281829ef0c1253581
BLAKE2b-256 f25008b674942e83e2bb279e78e1f595586162eb1f15843935465d843b1d82f4

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustystats-0.4.11-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: release.yml on PricingFrontier/rustystats

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rustystats-0.4.11-cp312-cp312-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for rustystats-0.4.11-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 5c4e22e77c1735d891b42b984047093273b58ba33a47e31ba194f6ffb8e7d755
MD5 949f46269f04596b0856dac6ee58e0b3
BLAKE2b-256 5406e8585f33a0d4b4cb4619d95714021a63c87e4d09aab6f7d0b919ca1fddf8

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustystats-0.4.11-cp312-cp312-macosx_10_12_x86_64.whl:

Publisher: release.yml on PricingFrontier/rustystats

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rustystats-0.4.11-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: rustystats-0.4.11-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 996.1 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for rustystats-0.4.11-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 34bced73aee501957b184a9a5d03dbf92885540bf2c382bbde709b379d4edf7b
MD5 a12d14608d5479cc3363e17bd5aa7bbe
BLAKE2b-256 2393d87d7a678ed5cea5045f7da9483be678f7543e70c3ff1ee44ca8e79ff562

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustystats-0.4.11-cp311-cp311-win_amd64.whl:

Publisher: release.yml on PricingFrontier/rustystats

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rustystats-0.4.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rustystats-0.4.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 69a749a1d9a9d200f6171159eca9d672ea2d45f1eb4bc4dc05db724229b4b495
MD5 14e9500473099f8a0dcccf8de34b8298
BLAKE2b-256 d4e1be700255dcf570454c96e5730d23cebb2a81060e01b0815da6546f368eb3

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustystats-0.4.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on PricingFrontier/rustystats

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rustystats-0.4.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for rustystats-0.4.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 6b50154518008871ebf9816e10e6e664c617e9d934c7af0f1c4bd2a381d9e956
MD5 2798016cee7198fd90978da9b929cd4f
BLAKE2b-256 e91ae53656a104d1face439fd56462a9d30265dc2c11d0ae5dadb6ffb518dcee

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustystats-0.4.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on PricingFrontier/rustystats

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rustystats-0.4.11-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rustystats-0.4.11-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f6366f41354cd890741c77a4f85638a529ca43819237e16980641283950e9db4
MD5 b25d9bb464a99708295f9514432da230
BLAKE2b-256 dc33fcbe3d9018b5024396bb9efb6c855d3abf122d7ca4dc03d600d664478768

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustystats-0.4.11-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: release.yml on PricingFrontier/rustystats

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rustystats-0.4.11-cp311-cp311-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for rustystats-0.4.11-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 1e0fa98d523dbee279516efff4f572952f38d1e19e1e3dcbfdcc6429589d5ebe
MD5 00b87dc1eef9194142fa04f0fa723b5d
BLAKE2b-256 823c33f1bf24d5cc0ff926728db285b6363f9eadcbf02fee6cb496815e5981c6

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustystats-0.4.11-cp311-cp311-macosx_10_12_x86_64.whl:

Publisher: release.yml on PricingFrontier/rustystats

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rustystats-0.4.11-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: rustystats-0.4.11-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 994.7 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for rustystats-0.4.11-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 efd11b9110f9406fb0faf8b20e4da30ab65ba57eff9db8833556ef78fefd05e6
MD5 a0af393ebf259278c5065e6d8a01f7bd
BLAKE2b-256 eb054c497119ab5ef5ef135e4b6b40c987bd72ddba9928b5898ef244cff34a7e

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustystats-0.4.11-cp310-cp310-win_amd64.whl:

Publisher: release.yml on PricingFrontier/rustystats

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rustystats-0.4.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rustystats-0.4.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 27f0a35dd7809a08b5af9d4719b5dba5c734cb7352b0d4cb93ac645551ed016c
MD5 22c77db963266b1e68ca388c42cf38cd
BLAKE2b-256 9e5374f2c2ea340c7f81ed9fcb3be4b7c9a721dcc7257acc3c03be8ec4b67a2e

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustystats-0.4.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on PricingFrontier/rustystats

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rustystats-0.4.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for rustystats-0.4.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 7c7972f6bd0be4ab9d01ac83bf7d23495d9801af6586c3ed5d41f915c46ba74c
MD5 32d866330e08ce7eae568c17342f8700
BLAKE2b-256 b10d997505791c3847392efc1203b6c34d2d0b9f31e4097ccf0e05f5b798b3f0

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustystats-0.4.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on PricingFrontier/rustystats

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rustystats-0.4.11-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rustystats-0.4.11-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b8911560c1af0ec28d7bdbde34c434bbd1c0869babe509fba32931c8b042685b
MD5 ad7ca2a61f42a4272fa8d65fa0b71507
BLAKE2b-256 85dfcc51d2d94b43155d0d7297d28257abc9f67d62d5fe93781cbdb1060f0787

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustystats-0.4.11-cp310-cp310-macosx_11_0_arm64.whl:

Publisher: release.yml on PricingFrontier/rustystats

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rustystats-0.4.11-cp310-cp310-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for rustystats-0.4.11-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 f0282c48e1db1991e226e5f3676521d75f55a300a62d6cfa70354b12e877734b
MD5 bb7916c773e916d06a1cb7ae40e12876
BLAKE2b-256 52d20ae88db00e26699043d72130552ec3fc117f06af01f63249d78783deb885

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustystats-0.4.11-cp310-cp310-macosx_10_12_x86_64.whl:

Publisher: release.yml on PricingFrontier/rustystats

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page