pysrat
pysrat is a Python package for fitting and analysing NHPP (Non-Homogeneous Poisson
Process) software reliability models. It provides a clean scikit-learn–style API
(model.fit(data), params_, llf_, aic_) and high-performance EM core
implementations exposed from C++ via pybind11.
Features
- Scikit-learn–style estimators (
model.fit(data),params_,llf_,aic_) - Fast EM updates implemented in C++ and exposed via pybind11
- A collection of classical NHPP models and CF1 (canonical phase-type)
- Plotting helpers for visualization (
plot_mvf,plot_dmvf,plot_rate) - Metrics-based (multi-factor) models in which software metrics enter as covariates
(
MFLogitNHPP,MFProbitNHPP,MFCloglogNHPP) - User-defined link functions: supply the inverse link and its derivative, and the EM algorithm, likelihood, AIC and variable selection are inherited
- Offsets, which express Cox proportional-hazards models without dedicated code
- AIC-based variable selection (
stepwise) - A Poisson regression–based framework (
fit_pr_nhpp)
Installation
pip install pysrat
To build from source (recommended during development):
git clone https://github.com/SwReliab/pysrat.git
cd pysrat
pip install -e .
Requirements
- Python ≥ 3.9
- A C++20-capable compiler (required for some extension modules such as CF1)
Optional / developer tools
ninja(recommended build backend for faster CMake builds)pytestfor development and testsPython headersand development toolchain for building native extensions
Quick start
import numpy as np
from pysrat.data.nhpp import NHPPData
from pysrat.nhpp.models import ExponentialNHPP
from pysrat.nhpp.plot import plot_mvf
# Create NHPP data from grouped intervals
data = NHPPData.from_intervals(intervals=[1, 1, 1, 1], counts=[0, 1, 0, 5])
# Fit model
model = ExponentialNHPP().fit(data)
print("Parameters:", model.params_)
print("Log-likelihood:", model.llf_)
print("AIC:", model.aic_)
# Plot mean value function
plot_mvf(data, model)
Working with data
pysrat accepts several NHPP data formats via pysrat.data.nhpp.NHPPData:
- Interval/grouped data:
NHPPData.from_intervals(intervals=..., counts=..., on_boundary=...) - Counts per interval:
NHPPData.from_intervals(counts=...) - Time data (without counts):
NHPPData.from_intervals(intervals=..., on_boundary=...)orNHPPData.from_intervals(intervals=..., te=...)
Available models
Common models are exported under pysrat.nhpp.models:
ExponentialNHPPGammaNHPPPareto2NHPPTruncatedNormalNHPPLogNormalNHPPTruncatedLogisticNHPPLogLogisticNHPPTruncatedExtremeValueMaxNHPPLogExtremeValueMaxNHPPTruncatedExtremeValueMinNHPPLogExtremeValueMinNHPPCanonicalPhaseTypeNHPP(CF1)
CF1 example
from pysrat.data.nhpp import NHPPData
from pysrat.nhpp.models import CanonicalPhaseTypeNHPP
data = NHPPData.from_intervals(intervals=[1, 2, 1.5], counts=[1, 0, 2], on_boundary=[0, 1, 0])
model = CanonicalPhaseTypeNHPP(3).fit(data)
print(model.params_)
Plotting
Use the plotting helpers from pysrat.nhpp.plot:
from pysrat.nhpp.plot import plot_mvf, plot_rate
plot_mvf(data, model)
plot_rate(data, model)
You can pass a dictionary of models to compare multiple MVFs:
models = {
"Exp": ExponentialNHPP().fit(data),
"Gamma": GammaNHPP().fit(data),
}
plot_mvf(data, models)
Model comparison
Compare models using aic_ or llf_:
from pysrat.nhpp.models import ExponentialNHPP, GammaNHPP
data = NHPPData.from_intervals(counts=[0, 1, 0, 5])
m1 = ExponentialNHPP().fit(data)
m2 = GammaNHPP().fit(data)
best = min((m1, m2), key=lambda m: m.aic_)
print("Best model:", best.name)
Metrics-based (multi-factor) models
These models let software metrics enter as covariates of the fault-detection
probability. The data are held by DMetricsData, and each model differs only in its
link function.
import importlib.resources as resources
import pandas as pd
from pysrat.data import DMetricsData
from pysrat.nhpp import MFLogitNHPP, MFProbitNHPP, MFCloglogNHPP, stepwise
# a bundled data set: one row per testing period
path = resources.files("pysrat").joinpath("datasets/dmetrics/dmetrics1.csv")
df = pd.read_csv(path)
data = DMetricsData.from_dataframe(
df, metrics=["day", "tc", "ctc", "cov", "ccov"], fault="fault")
model = MFLogitNHPP().fit(data)
print(model.aic_) # 82.895
best = stepwise(model) # AIC-based variable selection
print(best.aic_, best.data_.metrics_name) # 79.074 ['day', 'tc', 'ctc']
Switching the link function is a matter of replacing the class, so MFProbitNHPP
and MFCloglogNHPP are used in exactly the same way.
Two points are worth noting.
- Do not put a constant column in
metrics. The intercept is handled by the model throughhas_intercept; passingintercept=TrueraisesValueError. - An offset turns the cloglog model into a Cox proportional-hazards model. The
offset is the complementary log-log of the baseline hazard rate, so a discrete
Weibull baseline with shape
mneeds no dedicated class:
import numpy as np
k = np.arange(1, len(df) + 1, dtype=float)
df["off"] = np.log(k**m - (k - 1.0)**m) # Weibull offset, up to a constant
data = DMetricsData.from_dataframe(
df, metrics=[...], fault="fault", offset="off")
model = MFCloglogNHPP().fit(data)
See docs/metrics-models.md for the formulation.
Adding a link function
The E-step of the EM algorithm does not depend on the link function, and the M-step is
a fit of a generalized linear model to weighted binomial data. Within that fit, the link
function enters through one step only: computing the fault-detection probability
mu = linkinv(z) and its derivative dmu/dz from the linear predictor z.
DynamicGLMBase therefore exposes these two as its extension points. The example below
is the logit link under a Box-Cox transformation, which has one shape parameter lam.
import numpy as np
from pysrat.nhpp.multifactor._dglm import DynamicGLMBase
EPS = 1e-12
class MFBoxCoxNHPP(DynamicGLMBase):
link = "boxcox"
def __init__(self, lam=0.0, has_intercept=True):
super().__init__(has_intercept=has_intercept)
self.lam = float(lam)
def _linkinv(self, z):
if self.lam == 0.0:
return 1.0 / (1.0 + np.exp(-z))
w = np.maximum(1.0 + self.lam * z, EPS)
return 1.0 / (1.0 + w**(-1.0 / self.lam))
def _dmu(self, z, mu):
if self.lam == 0.0:
return mu * (1.0 - mu)
return mu * (1.0 - mu) / (1.0 + self.lam * z)
def _link_domain(self, z): # only for a restricted domain
return 1.0 + self.lam * z > EPS
Everything else -- the EM algorithm, the log likelihood, AIC and stepwise -- is
inherited. _link_domain is needed only when the link is undefined on part of the real
line, as here, where 1 + lam * z > 0 is required; the M-step then never steps outside
that domain.
A link function with a parameter such as lam stays inside the GLM family once the
parameter is fixed, so an outer one-dimensional search over the parameter, with the EM
algorithm run to convergence at each value, estimates it.
The built-in links (logit, probit, cloglog) keep using the C++ IRLS; only
user-defined links go through the Python one.
PR-NHPP regression framework
fit_pr_nhpp fits module-wise NHPP models with a Poisson regression outer loop. Each
module has its own fault data and thus its own NHPP model, while the static metrics of
the modules explain the differences between their expected fault counts.
import importlib.resources as resources
import pandas as pd
from pysrat.data import NHPPData, SMetricsData
from pysrat.nhpp import GammaNHPP
from pysrat.nhpp.regression import fit_pr_nhpp
root = resources.files("pysrat").joinpath("datasets/smetrics")
names = ["catalina", "connector", "jasper", "servlets", "tester", "webapps"]
# one NHPP model per module, fitted to that module's fault data
models = {
nm: GammaNHPP().fit(
NHPPData.from_csv(root.joinpath(f"tomcat5_{nm}.csv"),
intervals="time", counts="fault"))
for nm in names
}
# static metrics of the modules; the row index gives the module names.
# Three of the seven columns are used: 3 metrics + intercept = 4 coefficients,
# which leaves 2 residual degrees of freedom on 6 modules.
smetrics = pd.read_csv(root.joinpath("tomcat5_smetrics.csv"), index_col=0)
sdata = SMetricsData.from_dataframe(
smetrics[["LOC", "Fn", "Ac"]], use_index_as_name=True)
fit = fit_pr_nhpp(models, sdata, reg="glm")
print(fit["converged"], fit["n_iter"]) # True 812
print(fit["coef"])
The keys of models must match the names in sdata. reg="glm" fits the outer
regression by IRLS and reg="elasticnet" adds an L1/L2 mix controlled by alpha;
both accept lambd as the penalty strength.
SMetricsData can also be built directly, which is useful when the metrics do not come
from a data frame. The offset is optional and may be overridden at call time.
import numpy as np
sdata = SMetricsData(
names=["mod_a", "mod_b", "mod_c"],
metrics=np.array([[1.2, 0.3], [0.7, 1.0], [1.5, 0.4]], dtype=float),
offset=np.log(np.array([1200.0, 900.0, 1500.0], dtype=float)), # optional
)
Check fit["converged"] before using the result. Two things make the outer loop
stop short.
- Identifiability. The regression estimates
1 + qcoefficients, whereqis the number of metrics, frommmodules. When1 + q >= mthe model is not identified and the loop never converges, however many iterations it is given. Either use fewer metrics, as above, or add a penalty (lambd > 0, optionally withreg="elasticnet"). The bundled Tomcat data has 6 modules, so all 7 of its metrics cannot be used at once without a penalty. - Iteration count. The loop runs one EM step per iteration, so it converges slowly.
A few thousand iterations are normal even when the model is well posed; the default
max_outer_iteris 10000.
A RuntimeWarning is issued if the loop ends without converging.
Examples
See the examples/ notebooks included in the repository for end-to-end
workflows (basic fitting, comparison, CF1 usage and plotting):
examples/example1.ipynb— Exponential NHPPexamples/example2.ipynb— CF1 fitting and comparisonexamples/example3.ipynb— Multi-factor models (MFLogitNHPP)examples/example4.ipynb— Poisson regression–based NHPP fitting (fit_pr_nhpp)
Contributing
Contributions are welcome. Please open an issue describing the change or a PR with tests and documentation updates.
License
This project is distributed under the terms of the MIT License. See LICENSE.
Metadata
Release files for pysrat 0.2.8
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| pysrat-0.2.8.tar.gz | 2.7 MB | Without provenance | Details for pysrat-0.2.8.tar.gz |
Built distributions (wheels)
Total release size: 14.1 MB
Release files / pysrat-0.2.8.tar.gz
| Download URL | pysrat-0.2.8.tar.gz |
|---|---|
| Size | 2.7 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
4c7d292e3ef202e97e40866f74ba8600467157b86d94ff7768dd581980bfa7bf
|
|
BLAKE2b-256 checksum How to use checksums |
09e514a3918c71d6d39452fae42e7176a31334821235a3ad709385dc2344071a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Release files / pysrat-0.2.8-cp313-cp313-win_amd64.whl
| Download URL | pysrat-0.2.8-cp313-cp313-win_amd64.whl |
|---|---|
| Size | 575.4 kB |
| Tags | CPython 3.13 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
9c8e8d95a30fbc62b701a097c3a168bb17aff03e49d221608e0bb6289384dc1c
|
|
BLAKE2b-256 checksum How to use checksums |
d099f825c0fd0558655aa0fecd9597cde08f3e33842e8b9ceca01aa03ad332c5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Release files / pysrat-0.2.8-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | pysrat-0.2.8-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 622.2 kB |
| Tags | CPython 3.13 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
ab3ec7e2f383e1aeea3455f19cc5dd68699dcf45b090ec6aefba9ac7421de415
|
|
BLAKE2b-256 checksum How to use checksums |
1ece06e807ebfea679824fc8e3e8683890db9aba28afc2f5b3c06d51c1f43c29
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Release files / pysrat-0.2.8-cp313-cp313-macosx_11_0_arm64.whl
| Download URL | pysrat-0.2.8-cp313-cp313-macosx_11_0_arm64.whl |
|---|---|
| Size | 522.5 kB |
| Tags | CPython 3.13 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
80e17eeb537120656a230e368008edd8323946a9ba11466557100d62d236487a
|
|
BLAKE2b-256 checksum How to use checksums |
0cf27b1c51ee5072ad1c710caacc1d7ef0c833ace5cc8a3a0d56bbf8dd4de680
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Release files / pysrat-0.2.8-cp313-cp313-macosx_10_13_x86_64.whl
| Download URL | pysrat-0.2.8-cp313-cp313-macosx_10_13_x86_64.whl |
|---|---|
| Size | 577.5 kB |
| Tags | CPython 3.13 macOS 10.13+ x86-64 |
|
SHA-256 checksum How to use checksums |
731dd68d5e9c467c7fbe6ae11d849430b8ad665d5826319b919c3f750e3cbcee
|
|
BLAKE2b-256 checksum How to use checksums |
59829ef9ba858aa5c3371aaacc245f4aa076e96ea9a71c84c151ed1d5a1fd787
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Release files / pysrat-0.2.8-cp312-cp312-win_amd64.whl
| Download URL | pysrat-0.2.8-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 575.2 kB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
e6a7eeff125f0cacf862e218a9dff3dc8c24ec11416f9294e65acd6de05a124e
|
|
BLAKE2b-256 checksum How to use checksums |
ab427adc221e2b2477754fc2b10be089965c9653d8e42e58bab4b2d4d21c8a4a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Release files / pysrat-0.2.8-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | pysrat-0.2.8-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 622.0 kB |
| Tags | CPython 3.12 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
06ad0b635a33cce827f28f88ba58dd212bd2a436ccb526590beb59fee2d24751
|
|
BLAKE2b-256 checksum How to use checksums |
b4fc5e747726cc030ef49468fdbfc8d0667ba25141250612bc26d7813f0d20f7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Release files / pysrat-0.2.8-cp312-cp312-macosx_11_0_arm64.whl
| Download URL | pysrat-0.2.8-cp312-cp312-macosx_11_0_arm64.whl |
|---|---|
| Size | 522.4 kB |
| Tags | CPython 3.12 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
edc742baf9eb516e2bb33eabdf69740c962943afbc555672c9764485d395c660
|
|
BLAKE2b-256 checksum How to use checksums |
2e69eedb387197bde087223b0ebe650869bb40edfc3d59a1eee5ef67e6e5f924
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Release files / pysrat-0.2.8-cp312-cp312-macosx_10_13_x86_64.whl
| Download URL | pysrat-0.2.8-cp312-cp312-macosx_10_13_x86_64.whl |
|---|---|
| Size | 577.3 kB |
| Tags | CPython 3.12 macOS 10.13+ x86-64 |
|
SHA-256 checksum How to use checksums |
499411eef54495cf35306f11ad889e8ee203abd3556881f5ad3d3547389125ac
|
|
BLAKE2b-256 checksum How to use checksums |
beeff5f0adee562c749d394758ee31af4eaa74e21850ad4b1dd527c5eb86296c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Release files / pysrat-0.2.8-cp311-cp311-win_amd64.whl
| Download URL | pysrat-0.2.8-cp311-cp311-win_amd64.whl |
|---|---|
| Size | 568.8 kB |
| Tags | CPython 3.11 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
9d0e9cd89265c691899d2386a59a5274b701b1f25340f08fac48a5a912a7c9b3
|
|
BLAKE2b-256 checksum How to use checksums |
6f660fe2e386199d5048736fb7598a3af9ce52004267cc77c3ea97047eb75d69
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Release files / pysrat-0.2.8-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | pysrat-0.2.8-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 618.3 kB |
| Tags | CPython 3.11 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
f5ecb617ad0c83dc8932975a75d6080aab0c971f5c419739f227d91785946876
|
|
BLAKE2b-256 checksum How to use checksums |
bd9dd326716a7f642f85ab82054bc5f5a443f26a9307a6ac4a8e0d91ec67c8ca
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Release files / pysrat-0.2.8-cp311-cp311-macosx_11_0_arm64.whl
| Download URL | pysrat-0.2.8-cp311-cp311-macosx_11_0_arm64.whl |
|---|---|
| Size | 518.0 kB |
| Tags | CPython 3.11 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
99e3efb0b263e93ce094bf76a2f4e91c2b9afc60d32155b6b544df8d4601aa06
|
|
BLAKE2b-256 checksum How to use checksums |
1379a637fc827ca9fd58459571c4b938e97eacc3f35a799b096b4fec3c4be86e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Release files / pysrat-0.2.8-cp311-cp311-macosx_10_9_x86_64.whl
| Download URL | pysrat-0.2.8-cp311-cp311-macosx_10_9_x86_64.whl |
|---|---|
| Size | 571.6 kB |
| Tags | CPython 3.11 macOS 10.9+ x86-64 |
|
SHA-256 checksum How to use checksums |
ac07b1853e78d00007ad94f66e25019fca8e424b477fe9c53d2f9d03b60cf697
|
|
BLAKE2b-256 checksum How to use checksums |
91da3ec03e4b869333392e476a6eacd3a4ba1a74faa3414ebdf8da06af18b72b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Release files / pysrat-0.2.8-cp310-cp310-win_amd64.whl
| Download URL | pysrat-0.2.8-cp310-cp310-win_amd64.whl |
|---|---|
| Size | 566.3 kB |
| Tags | CPython 3.10 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
a31ee74010bf7f635a14746dd8e7216e611de03b3ada3f173347d1fea46e91a7
|
|
BLAKE2b-256 checksum How to use checksums |
895b5f60a9ddc129d121157d958876d37307bfd2c617bea9c9c641c59e2f94e7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Release files / pysrat-0.2.8-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | pysrat-0.2.8-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 614.8 kB |
| Tags | CPython 3.10 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
51adeffba4013e3f201aec1e79ea0740ce3bd9c0fb01c672cd296c128ad81585
|
|
BLAKE2b-256 checksum How to use checksums |
2c8372f7cbec88c437498002de0d93f99e37cc84a6cd03460a74c70329fc6bc7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Release files / pysrat-0.2.8-cp310-cp310-macosx_11_0_arm64.whl
| Download URL | pysrat-0.2.8-cp310-cp310-macosx_11_0_arm64.whl |
|---|---|
| Size | 514.4 kB |
| Tags | CPython 3.10 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
fda509ca24b0980868eaaba23b6d78936b1f8e2aa54a5bd5db9d8ebcc8dffdc4
|
|
BLAKE2b-256 checksum How to use checksums |
e3095371a0e097de03a2930de751e55b3bfc780e562f8f4212db6845a4c1d1c4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Release files / pysrat-0.2.8-cp310-cp310-macosx_10_9_x86_64.whl
| Download URL | pysrat-0.2.8-cp310-cp310-macosx_10_9_x86_64.whl |
|---|---|
| Size | 567.6 kB |
| Tags | CPython 3.10 macOS 10.9+ x86-64 |
|
SHA-256 checksum How to use checksums |
fa892548124744bf2dc5e28570010328d057312e7ba8e724ff816ea3f7368463
|
|
BLAKE2b-256 checksum How to use checksums |
941bf5b777fc0a26e81e4f9c6951399b67faa88be1bedf29a1c36d1e350ba2e8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Release files / pysrat-0.2.8-cp39-cp39-win_amd64.whl
| Download URL | pysrat-0.2.8-cp39-cp39-win_amd64.whl |
|---|---|
| Size | 566.7 kB |
| Tags | CPython 3.9 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
d30435e398660dc913054b091e33ca2c137d173f8877c26049489204a2937eb7
|
|
BLAKE2b-256 checksum How to use checksums |
e0f34828b595b54736dc57f381354a9d457d887e83449a2432202acdc70857eb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Release files / pysrat-0.2.8-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | pysrat-0.2.8-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 615.1 kB |
| Tags | CPython 3.9 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
0169fda6db5da0fde994ee935d6951e8a630c390342b8dd327a1ef265d130a18
|
|
BLAKE2b-256 checksum How to use checksums |
a020488fa2c57de99f218d2bb412fd90b3681be8cd95d60457ea377a95a44f97
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Release files / pysrat-0.2.8-cp39-cp39-macosx_11_0_arm64.whl
| Download URL | pysrat-0.2.8-cp39-cp39-macosx_11_0_arm64.whl |
|---|---|
| Size | 514.6 kB |
| Tags | CPython 3.9 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
a17d681f8de3d6f0c0c7d7b87dd178b7adb60d958f9dcf1576056fcba3ee8c62
|
|
BLAKE2b-256 checksum How to use checksums |
8f1a9280fae96e8203d63a42eee0ab3b8be95a09f54527b05a2d9f704a25d463
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Release files / pysrat-0.2.8-cp39-cp39-macosx_10_9_x86_64.whl
| Download URL | pysrat-0.2.8-cp39-cp39-macosx_10_9_x86_64.whl |
|---|---|
| Size | 567.8 kB |
| Tags | CPython 3.9 macOS 10.9+ x86-64 |
|
SHA-256 checksum How to use checksums |
59e0c2c197ed270123078b28193545938c4d5d23dadd121b300f02e912965355
|
|
BLAKE2b-256 checksum How to use checksums |
8061e224171a4ee0883531fdd055e9e29daa93621f82b26148b7f28a1de60357
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Security for pysrat 0.2.8
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.