Skip to main content

Fast Generalized Linear Models with a Rust backend - statsmodels compatible

Project description

RustyStats 🦀📊

CI PyPI Rust License: AGPL-3.0

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

Codebase Documentation: pricingfrontier.github.io/rustystats/

See CHANGELOG.md for release notes.

Features

  • Dict-First API - Programmatic model building ideal for automated workflows and agents
  • Fast - Parallel Rust backend for high-throughput fitting
  • Memory Efficient - Low memory footprint 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
  • Lasso Credibility - Shrink toward a prior model instead of zero (CAS Monograph 13)
  • 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",
    exposure="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 (requires theta= or theta="estimate")

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",
    exposure="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, knots, boundary_knots, degree=3, monotonicity B-spline (default: penalized smooth, k=10)
ns df or k, knots, boundary_knots 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", exposure="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", exposure="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
  • knots=[2.0, 5.0, 8.0] → explicit interior knot positions (mutually exclusive with df/k)
  • boundary_knots=(0.0, 10.0) → custom boundary knots (optional, defaults to data range)
  • 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", exposure="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", exposure="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 exposure="Exposure", automatically uses claim rate (ClaimCount/Exposure) instead of raw counts. Pre-RS-ACT-002 users with offset="Exposure" get the same behaviour via the legacy alias, but array offset= no longer feeds the encoder — pass exposure= explicitly for exposure-weighted target encoding.
  • 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)
  • standardize: Internally standardize penalized columns before the penalty acts, reporting original-scale coefficients (default: True; set False for the legacy raw-scale penalty)

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

Lasso Credibility

Shrink model coefficients toward a prior model (complement of credibility) instead of toward zero. Based on the methodology in CAS Monograph 13 (Holmes & Casotto, 2025).

When lasso zeroes a coefficient, the prediction for that term falls back to the complement rather than vanishing — making regularized models directly usable as rating plans.

# 1. Fit a countrywide (prior) model
cw_result = rs.glm_dict(
    response="ClaimCount",
    terms={"VehAge": {"type": "bs"}, "DrivAge": {"type": "bs"}},
    data=countrywide_data,
    family="poisson",
    exposure="Exposure",
).fit()

# 2. Fit a state model with lasso, shrinking toward countrywide rates
state_result = rs.glm_dict(
    response="ClaimCount",
    terms={
        "VehAge": {"type": "bs"},
        "DrivAge": {"type": "bs"},
        "Region": {"type": "categorical"},
    },
    data=state_data,
    family="poisson",
    exposure="Exposure",
    complement="countrywide_rate",  # Column with prior rates (response scale)
).fit(regularization="lasso")

# 3. Inspect which terms the data supports vs. trusts the complement
print(state_result.summary())            # Shows "Lasso Credibility Results"
print(state_result.credibility_summary())  # Deviation from complement per term

Complement sources:

  • str — column name in the DataFrame (rates for log-link, probabilities for logit)
  • np.ndarray — array of prior values on the response scale
  • GLMModel — fitted model; predictions are computed automatically

Works with all families/links, splines, categoricals, interactions, and target encoding.


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)

Model Diagnostics

# Compute all diagnostics at once
diagnostics = result.diagnostics(
    train_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

Diagnostics JSON Shape

The diagnostics.to_json() output includes:

{
  "model_summary": {
    "formula": "...", "family": "poisson", "link": "log",
    "n_obs": 2000, "n_params": 6, "df_resid": 1994,
    "converged": true, "iterations": 5,
    "scale": 1.0,
    "scale_pearson": 1.0148,
    "null_deviance": 1408.77,
    "robust_se_type": "HC1"
  },
  "train_test": {
    "train": {
      "n_obs": 2000, "deviance": 2118.42,
      "log_likelihood": -1059.21,
      "aic": 2130.42, "bic": 2162.70,
      "gini": 0.3241, "auc": 0.6621, "ae_ratio": 1.0
    }
  },
  "coefficient_summary": [
    {
      "feature": "Age", "estimate": 0.00996,
      "std_error": 0.00339, "z_value": 2.941,
      "p_value": 0.0033, "significant": true,
      "conf_int": [0.003318, 0.01659],
      "relativity": 1.01, "relativity_ci": [1.0033, 1.0167],
      "robust_std_error": 0.003378, "robust_z_value": 2.947,
      "robust_p_value": 0.0032, "robust_significant": true
    }
  ]
}
  • BIC (train_test.train.bic): Bayesian Information Criterion alongside AIC
  • Scale (model_summary.scale): Deviance-based dispersion parameter
  • Scale Pearson (model_summary.scale_pearson): Pearson-based dispersion estimate
  • Null Deviance (model_summary.null_deviance): Intercept-only model deviance
  • Confidence Intervals (coefficient_summary[].conf_int): 95% CI [lower, upper]
  • Robust SEs (coefficient_summary[].robust_*): HC1 sandwich estimators for each coefficient
  • Robust SE Type (model_summary.robust_se_type): Present only when robust SEs were computed

Robust SE fields are null when store_design_matrix=False (lean mode) or for deserialized models.

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

Calibration Primitives

Explicit calibration tools for assessing and adjusting model balance, kept separate from the GLM coefficients so the underlying fit stays untouched.

# Standalone summary on arrays (overall A/E, per-bin, optional per-factor)
summary = rs.calibration_summary(
    y, mu,
    exposure=exposure,
    weights=weights,         # optional; weighted Σwy/Σwμ
    by={"Region": region},   # optional per-factor breakdown
    n_bins=10,
    ranking="auto",          # rate-rank when exposure is present
    min_exposure=10.0,       # flag low-exposure cells as suppressed
)

# From a fitted GLM (response/exposure resolved automatically)
result.calibration_summary(data, by="Region")

# Multiplicative or monotone calibration objects (opt-in, serialized separately)
cal = result.fit_calibration(holdout, method="global")     # GlobalCalibration
iso = result.fit_calibration(holdout, method="isotonic")   # IsotonicCalibration
calibrated_pred = cal.predict(result.predict(new_data))

# Log-link intercept relevel — same factor c = Σ(w·y)/Σ(w·μ), updates only the
# intercept. Every other coefficient is bit-identical, relativities preserved.
releveled = result.relevel(holdout)
assert all(releveled.params[1:] == result.params[1:])

Calibration is never applied silently to result.predict(). Calibration objects are separate, serializable (to_dict/from_dict), and not folded into GLM coefficients. Fitting calibration on the same rows used to fit the model overstates calibration quality — prefer a held-out fold.


Per-Prediction Contributions

Decompose each row's prediction into per-term contributions for trace explainability:

result = rs.glm_dict(
    response="sale_flag",
    terms={"diff_to_market": {"type": "ns", "df": 10}},
    data=train,
    family="binomial",
).fit()

rows = result.predict_contributions(new_data)
print(rows[0])
# {
#   "family": "binomial", "link": "logit",
#   "output_space": "linear_predictor", "prediction_space": "response",
#   "base_value": 0.0417,
#   "sum_contributions": -1.4280,
#   "prediction_from_contributions": -1.3863,   # eta
#   "prediction_value": 0.2000,                  # mu = inverse_link(eta)
#   "contributions": [
#       {"term": "diff_to_market", "term_type": "ns",
#        "feature_value": -25.0, "contribution": -1.4280, "rank": 1}
#   ]
# }

Key properties:

  • base_value + sum(contributions) == linear predictor (validated to 1e-9 by default)
  • inverse_link(linear predictor) == predict() (also validated)
  • Spline bases, categorical dummies, target/frequency encoding columns, and interaction tensor products are grouped back to their source term; the ladder shows factor-level rows, not basis-level rows
  • Offset is an explicit row (term_type="offset", contribution = log(Exposure) for log-link)
  • For complement-of-credibility models, base_value is per-row = link(complement[row]), and the intercept appears as a contribution row representing the deviation

Options:

  • group_terms=False: expand multi-column terms into one row per design column
  • include_design_columns=True: keep grouped rows but attach a per-column breakdown
  • return_format="dataframe": long-format pl.DataFrame (faster for batch scoring)
  • validate=False, atol, rtol: control the additivity check

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
  • Complement of credibility specification

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)
# uv add 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

# Export — "scoring" requires pre-built design matrix, "full" embeds preprocessing
result.to_onnx(path="model.onnx", mode="scoring")
result.to_onnx(path="model_full.onnx", mode="full")

# Predict (consumer side)
# uv add onnxruntime
import onnxruntime as ort
session = ort.InferenceSession("model_full.onnx")
preds = session.run(None, {"input": raw_features})[0]

| Size | Smaller | Larger |


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

AGPL-3.0

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.8.7.tar.gz (552.5 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.8.7-cp313-cp313-win_amd64.whl (1.4 MB view details)

Uploaded CPython 3.13Windows x86-64

rustystats-0.8.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

rustystats-0.8.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.4 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

rustystats-0.8.7-cp313-cp313-macosx_11_0_arm64.whl (1.3 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

rustystats-0.8.7-cp313-cp313-macosx_10_12_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.13macOS 10.12+ x86-64

rustystats-0.8.7-cp312-cp312-win_amd64.whl (1.4 MB view details)

Uploaded CPython 3.12Windows x86-64

rustystats-0.8.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

rustystats-0.8.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.4 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

rustystats-0.8.7-cp312-cp312-macosx_11_0_arm64.whl (1.3 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

rustystats-0.8.7-cp312-cp312-macosx_10_12_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.12macOS 10.12+ x86-64

rustystats-0.8.7-cp311-cp311-win_amd64.whl (1.4 MB view details)

Uploaded CPython 3.11Windows x86-64

rustystats-0.8.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

rustystats-0.8.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.4 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

rustystats-0.8.7-cp311-cp311-macosx_11_0_arm64.whl (1.3 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

rustystats-0.8.7-cp311-cp311-macosx_10_12_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.11macOS 10.12+ x86-64

rustystats-0.8.7-cp310-cp310-win_amd64.whl (1.4 MB view details)

Uploaded CPython 3.10Windows x86-64

rustystats-0.8.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

rustystats-0.8.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.4 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

rustystats-0.8.7-cp310-cp310-macosx_11_0_arm64.whl (1.3 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

rustystats-0.8.7-cp310-cp310-macosx_10_12_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.10macOS 10.12+ x86-64

File details

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

File metadata

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

File hashes

Hashes for rustystats-0.8.7.tar.gz
Algorithm Hash digest
SHA256 f5eed577a236f9c453bcf90fbfe3cf7fbc0071936643382e2ba29cd870554fdb
MD5 25e1b3963c4687c8a4bda363e5828e53
BLAKE2b-256 6cd70d4798491f1352a7ccc41338194c1498dce31e2496b156bcaf5aebec23f8

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rustystats-0.8.7-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for rustystats-0.8.7-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 07f9e5a2aab142e4b34ced67775ce79486867d1a4542ce7cce7a91381a766a1e
MD5 3db185845f885ffcb75906e4c06e15fb
BLAKE2b-256 7d2b9ab3fcfd0cf120c288a9c3c4a144de2fcc03fc2bb081db29de5e2b91a32f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rustystats-0.8.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b8444bdeefb8cbb5aabf97bd0f683d056c8bd0a8fedbe90f67ef3879996bb40b
MD5 12127dda8437a9f82925d3e71c8c0194
BLAKE2b-256 f54569388fd11c6762ad0500a7d1e9fe253457262dc526567fbdaa7c850a5173

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rustystats-0.8.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 504d2ae331287241d501e5a34bfaa061715a2b9550908e3bd8d69adc1f65e7e0
MD5 f7aa51e079b5aa28e2c352d18b8e6104
BLAKE2b-256 258f36e206954da4f6326c26d56072d88aeed04b7b090a82662b73df9bb31bdd

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rustystats-0.8.7-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 fe566b9a38d4a5575bbf78dfb6fe93ecafe46c553004539cd6dcc4eab177d05a
MD5 726c14bfcd1ca6263991995900c90b53
BLAKE2b-256 05bd25827f7050f6cf688781ff40af5d0fd617da89758f7829a3e6bbff02d6b3

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rustystats-0.8.7-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 c8fb67d0da4af5cbb30b9723fa6fa1c4497adb75f93d30b331d75d3cd7075d3c
MD5 b2b96aa0ead9b5bc9bb51acb43c4367b
BLAKE2b-256 e6e7c7b6d86a4a4257275b9030357311f876fb5c6c5876ee294d8e7b97e54069

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rustystats-0.8.7-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for rustystats-0.8.7-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 e071460d1705404e2988865609c4d5f197291b11ff69a1b88783c4156858450c
MD5 09106325f9b07b1178c0760944c8ac00
BLAKE2b-256 373e075004371608f8980cb354705918c09e53e4fcaecc8a107c0de09f5b54f9

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rustystats-0.8.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 767f6a4173d1bd11aa58afcfd0a086df2722fcd23431433006512cde8c2c2871
MD5 9d9ad92d3644ce66f6e97e5d20cecc0b
BLAKE2b-256 4132d05838d169f9f06366882dd974e396de2653cc4c9f02cecc09e17246c664

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rustystats-0.8.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 b1c80c927ac50f2e28c4b908b44680c5411baec399b6cc9b09ba32c6908e3db3
MD5 fdb6a655aebd0bce34303b67cbb2ccd2
BLAKE2b-256 39ef1cac8df88d41a3a17d07724fdf9c1c126a5390ac64b8a53d4b899af8d8fc

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rustystats-0.8.7-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 04283586f45d3532919212b724181339e7f1023b2878f2603478b4fcb2fc8021
MD5 97fd6bacb65417a49733ec0e1253945e
BLAKE2b-256 5dfb60d7106a686f0408b845af02ffb009e9aa6d5501a084737f4aefb8d97dbe

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rustystats-0.8.7-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 5811cd0a716488e72cc070d1b2cdb368aa34b9c17dbc52da9e5389a4fed08eb8
MD5 9aa2d46f920884941cb0fbd9e57bfaaa
BLAKE2b-256 5b62561ff1ae1c15889480bf934f346f5353522c37893f8629bfb3cff1bdd118

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rustystats-0.8.7-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for rustystats-0.8.7-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 d7c01a712ee0cc217c0b0426d695f5fd47d9d6f28bb79c95b853e3c049af4dd1
MD5 c6094555eaa6834bc91de3aa9c02785a
BLAKE2b-256 c5abcbc88872639de72bf5527083db561b2b67f20ab00e8b3ace9b3b934612bb

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rustystats-0.8.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 00588101d90c84d97fcc0dc6679ae21832e67f9db51cfc6270048868e6c33ff8
MD5 b00e76ecb53ab22c5ac502fa10288562
BLAKE2b-256 26e784f0b81887dc9dd9b972e910f523c25cd094a6b27b45017708c09cfcb246

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rustystats-0.8.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 9ec7642db55ee37a6f7dcf9f08a84c1971f8c3e5ec024d698637912bdb4dffd1
MD5 0dff7fe4e49f6c7239338ea70c9946ef
BLAKE2b-256 fdb0b5c714d164fd164edfd95b15179258910f1cade062f483fe21362f800f44

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rustystats-0.8.7-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 eda7eefe31f6ff8b6e44bb603e349ec1e416188d5e325abcc6ff024ec74ab84e
MD5 56fc0b4faed7ca4a83e6c9def2297107
BLAKE2b-256 d6733d8c8528babc3cb0017f7e3e8e91469d18af1d09354c5c91195d91c66222

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rustystats-0.8.7-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 6dc2a3a9b9cdd405e0f2dbc54693f61cb302388d1deb6c7f8671fa6d47455467
MD5 6c07dee2207f881504480533f02467c1
BLAKE2b-256 d3618864ab033fb286931d89d0dc35b89f7e4a6d6f938ea72f186149a2bdb2bc

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rustystats-0.8.7-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for rustystats-0.8.7-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 3a4c74f3b7d551da9456da2a31d10a7f6319529c941b4c19b317d5334503d920
MD5 42598d339f1b2debdf44814d4e4908ab
BLAKE2b-256 8dfba99fe8c66d3d8e73d3f4f41f6cdabf20b240d5a59d724cc17344e4baacaf

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rustystats-0.8.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d53473b2ea0dcab8c42946c26a76c78a75dbbff2bd3e948f0358d1f34685530e
MD5 d9623c620e59cdeb96c2a07b0ba95e8b
BLAKE2b-256 f0801fa1a126ad058a37eddf88b8fd567de97ae099f77e5ac171a044a8e98c4e

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rustystats-0.8.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 05ff9611a81597b15414e4e9c669aa565972d040cc8b8f86b7c4c3bef7c1b2db
MD5 7502098576a3e96da993f827a1e2ea31
BLAKE2b-256 d95a81e01b59a78975a2d424165587d1e3e32204089996d49ba92caf92dd4437

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rustystats-0.8.7-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c946f988aca37c67715681882cf0e4d035a56490f903966a53b6f88f6e84ae21
MD5 9e60e1529f67f43bad786af21f407cd5
BLAKE2b-256 b30792827b1bf9cb91e89832013d7b45f251dd767c4a75d34204b365bd3b44f7

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rustystats-0.8.7-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 3b72e047185bb60db3cba7570ed5bd99a5be7fe27fb7eee3570abaff8e0cd21e
MD5 6bb433372dae5888864ef8b4adf5eb56
BLAKE2b-256 77e93e82669214446b8597c3f33cf252db253ab29a559024cf84b9b804f70107

See more details on using hashes here.

Provenance

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