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.10.tar.gz (296.7 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.10-cp313-cp313-win_amd64.whl (1.0 MB view details)

Uploaded CPython 3.13Windows x86-64

rustystats-0.4.10-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.10-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.10-cp313-cp313-macosx_11_0_arm64.whl (1.1 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

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

Uploaded CPython 3.13macOS 10.12+ x86-64

rustystats-0.4.10-cp312-cp312-win_amd64.whl (1.0 MB view details)

Uploaded CPython 3.12Windows x86-64

rustystats-0.4.10-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.10-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.10-cp312-cp312-macosx_11_0_arm64.whl (1.1 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

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

Uploaded CPython 3.12macOS 10.12+ x86-64

rustystats-0.4.10-cp311-cp311-win_amd64.whl (1.0 MB view details)

Uploaded CPython 3.11Windows x86-64

rustystats-0.4.10-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.10-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.10-cp311-cp311-macosx_11_0_arm64.whl (1.1 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

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

Uploaded CPython 3.11macOS 10.12+ x86-64

rustystats-0.4.10-cp310-cp310-win_amd64.whl (1.0 MB view details)

Uploaded CPython 3.10Windows x86-64

rustystats-0.4.10-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.10-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.10-cp310-cp310-macosx_11_0_arm64.whl (1.1 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

rustystats-0.4.10-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.10.tar.gz.

File metadata

  • Download URL: rustystats-0.4.10.tar.gz
  • Upload date:
  • Size: 296.7 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.10.tar.gz
Algorithm Hash digest
SHA256 05834c1da23fff407d608cc7b5d3172bacfddfc44a3b51625cef2e735b883b54
MD5 57f940f03ee5a1aec2ad82021c64e478
BLAKE2b-256 5bf15248c07cc4509f74b202cabc24ccfa40facf0d24964f511e316672725cd2

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustystats-0.4.10.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.10-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for rustystats-0.4.10-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 62e03355189ecfad75985e94b6e991712e7226f5692d0c2a16fd7490a1795347
MD5 e27109419bd0c2088be4dcce2973ef8b
BLAKE2b-256 d1aad2d3d3866c83e3ee0119fb904374f3111ce09f12d748ae1a4f6990e0c6b2

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustystats-0.4.10-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.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rustystats-0.4.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 75de673aa52490fd2874f8500d1dea50d39bdf212af28b4480bc3e796d01ac8b
MD5 93320cc7a0907b852f1c54e61ce95b6f
BLAKE2b-256 82eb7f74f69c709c0fe88371d24ee62d449b11e9cdc3997d431f33a641e823c0

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustystats-0.4.10-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.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for rustystats-0.4.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 aa39f669320cd132ee4e0621954f578642927ea4a891ef54246b53a000035f01
MD5 b3d4508ad0520468695b8fe2b516ede9
BLAKE2b-256 de6251e9bf1a2834494be9103009855a61c4e416783a04922bb24537effab76c

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustystats-0.4.10-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.10-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rustystats-0.4.10-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6003d04ada361e8f3dc5de40a6443b7363a9a36354e37abb8ac2107ec8d4cbd2
MD5 6bed614cbcdc58e2502cff1966900e7d
BLAKE2b-256 bc43baa5590e2c78853fa0583620a64116cde80c6c71d6eb95db989ff667b597

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustystats-0.4.10-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.10-cp313-cp313-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for rustystats-0.4.10-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 0e64143f5458004b18de539f110e20f59dbfd10a467265fd11ebc0e9077b086e
MD5 6b8a346394a6177dff38d425eda146f2
BLAKE2b-256 2c4e2774de0e69514036ffccc3230b75a69ddca680df5e2ab3f26cd320ce7d2d

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustystats-0.4.10-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.10-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for rustystats-0.4.10-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 62f6761a6fb1998ad8518e8063f01c267f257d68e94224082a1d2624492ef059
MD5 ff4a349081f2c29ccda27550dcf99d63
BLAKE2b-256 40417434e236e3d02bc31259bd84b90147ea710937c6062a6548ecc5773964a1

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustystats-0.4.10-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.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rustystats-0.4.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e4ac2ac4e9ebd86fa8220894e5482920ef064d7a4c268c60c77d111c8a6c8626
MD5 18d34532eb3d945e9c96f01d9622702a
BLAKE2b-256 7d47c1ca9eb35207cc9600e6614576ee3d86c457e513421bc40bb571b0fae017

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustystats-0.4.10-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.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for rustystats-0.4.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 f2c465b3b9cc4c5e1c8bd52fa6d873859d7341e3c7353348d089229e043dd4ac
MD5 fa48a8cca6a49ccef68e16ff742c40ed
BLAKE2b-256 ede28c05984771586df5e047a88e36c02b49a6700064e3619e1a255a6d8a47ae

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustystats-0.4.10-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.10-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rustystats-0.4.10-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6bbe9041ea6160a99c22b1390742ed3dd8ce00c726292ce22e414d0377dd4090
MD5 9b5ea9446c17a0614d0d9b8d6d48f99e
BLAKE2b-256 d27de8ed371018d496d9e600b0cf9a603af6310dda7b98f1c22dc692871c1415

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustystats-0.4.10-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.10-cp312-cp312-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for rustystats-0.4.10-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 926ec3be4624955f79863c1fee49b8472b48f5cec1c9fd906a9a45dbfbd3e948
MD5 fe6b85986615fc744a5cb909bea26980
BLAKE2b-256 eb4a1584a59672d889ca7e15206d4fe00a115cb2ca3808459e56a046e05f06e3

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustystats-0.4.10-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.10-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for rustystats-0.4.10-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 3a3f5b1d6eee60c505673c2109bfdfc05487975e44cf95b177e570d237d36330
MD5 693a67db7f1a47c0eb0282fa0e8c9846
BLAKE2b-256 fadb0f26cc755e080fae8b78c3fb9194b08b315019d841e5a4c747b9242e1be3

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustystats-0.4.10-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.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rustystats-0.4.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0f5bd566b29fffa713692270218ef4aad9581c788e343a0d0605023715c58163
MD5 ad416cf08f04396790fe61b3476bb29d
BLAKE2b-256 92d9163e099c085f13b56ce5c0c993e5fee85f287768ea1f6358242cac49f3f6

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustystats-0.4.10-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.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for rustystats-0.4.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 d741ed36048a5b8047f2c8f65c9956d8516130fa3f7ab5b0d679a9839e650557
MD5 b4197c6b6bbb95bf1479048c9d530b56
BLAKE2b-256 a6ddbd5d248f0bda77b864e3c840d26615dfddb637f27af497518c6c8a950764

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustystats-0.4.10-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.10-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rustystats-0.4.10-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 99681f13b7829d8d32dc8f5badb3d98d1eecbedc4a67a1228ef0adcdfc18753e
MD5 3f39d0d14dbfc1be305c0ca245313377
BLAKE2b-256 4ff07d1a6842578d46291b511b1d23f45ce4e165c651f10c6def2fc7de0f9eb2

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustystats-0.4.10-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.10-cp311-cp311-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for rustystats-0.4.10-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 b4b645847705c138b47cfa11aefe0d0456029e37fa40f97933eb6124f2c702f9
MD5 de257eefc8ec0d3d074b0b074de3a2f1
BLAKE2b-256 6139182c4aa16130d439b261fa1b8ba505a7119585cf089ad4172073d5fad3fc

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustystats-0.4.10-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.10-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for rustystats-0.4.10-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 ba4e395feb09a1cd5aac8049f5822c4bdecf502925ebaa0b2825a83cfa8269b5
MD5 d231f646fa8c6c4e2fe59583e085c524
BLAKE2b-256 0e79b845b2d13c0b612bd6c4c135294786d074ab4ba00590667fc740146f4f42

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustystats-0.4.10-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.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rustystats-0.4.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d142a7f6afcb74b6eeb11388adec4f7efc23b5b018bafd9ce6cec55d99ce91c6
MD5 11eccb184dffe2959fcc6ac4eda14e7f
BLAKE2b-256 cad5eeb23f2e8df0783e46baa0276f816507114609a4215ac020cfe0c7ae9fe2

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustystats-0.4.10-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.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for rustystats-0.4.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 5eb4cb25467a853ba851cff4c7e674f35d3f2bd4db6f0a3f97fe6118fc9fc864
MD5 2c730c84f5614a244a3938593177add8
BLAKE2b-256 6abb71400071c303c15f33d1792184aed36876198f6f493b1e031b84849336d3

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustystats-0.4.10-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.10-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rustystats-0.4.10-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 933cd4c7136ac54c74909536a2df146f312de2a800663fec6d10045f21b5561b
MD5 0e6d32f033d8794ca65f2e389123f2c7
BLAKE2b-256 f7e6b946350d226232ff5528a88652994209369d49b0a4324e6fc6ff7ec5e615

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustystats-0.4.10-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.10-cp310-cp310-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for rustystats-0.4.10-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 02c6bc3ab7105eeef511be47b6f6fd7fdd03d24551028c2f4ca6faf40d5172bd
MD5 ec0f4fd1654f5a4fd43a67fcdefc1265
BLAKE2b-256 6250d9eb656bb05e7d3fdfe18b71d1e5d023bb1aa9ddf991051c3960f835be28

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustystats-0.4.10-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