Interpretable binning with temporal stability diagnostics for credit risk, PD, and scorecard workflows.
Project description
RiskBands
Binning para risco de credito com foco em robustez temporal, comparacao entre candidatos e racional auditavel.
Documentacao oficial | Benchmark PD vintage | Quickstart | API
O que e o RiskBands
O RiskBands e uma biblioteca para construir, comparar e auditar candidatos de binning quando o problema real nao e apenas maximizar uma metrica estatica, mas tambem defender o resultado ao longo do tempo.
Ele foi pensado especialmente para contextos como:
- modelos de PD
- scorecards de credito
- variaveis com drift temporal
- leitura relevante por safra ou vintage
- estruturas com bins raros, baixa cobertura ou reversoes de ranking
A pergunta central do projeto e simples:
Um binning que parece otimo no agregado continua defensavel quando voce abre o comportamento por safra?
Onde o projeto se diferencia
O OptimalBinning ja resolve muito bem o problema de corte estatico. O
RiskBands nao tenta negar isso.
No fluxo supervisionado numerico do repositorio atual, o projeto reaproveita
optbinning.OptimalBinning no backend do corte estatico. O diferencial esta no
que vem depois:
- diagnostico temporal por variavel, bin e periodo
- penalizacoes estruturais para fragilidade, baixa cobertura e volatilidade
- comparacao entre candidatos via
BinComparator - score objetivo mais alinhado a trade-offs de risco de credito
- resumos auditaveis para explicar por que um candidato venceu
Em outras palavras:
OptimalBinningpuro ajuda a encontrar um bom corte estaticoRiskBandsajuda a decidir se esse corte continua sendo a melhor resposta para credito quando o tempo entra na analise
Instalacao
Instalacao base:
pip install riskbands
Extra opcional para graficos Plotly e export HTML dos benchmarks:
pip install "riskbands[viz]"
Para desenvolvimento, testes e notebooks:
git clone https://github.com/joaaomaia/RiskBands.git
cd RiskBands
pip install -e .[dev]
Como comecar
Porta tecnica:
Porta metodologica:
- Por que RiskBands
- Por que nao usar apenas OptimalBinning
- Benchmark PD vintage
- Como ler os graficos
- Robustez temporal em risco de credito
Quickstart minimo
import numpy as np
import pandas as pd
from riskbands import Binner
rng = np.random.default_rng(0)
n = 800
X = pd.DataFrame({"score": rng.normal(size=n)})
X["month"] = rng.choice([202301, 202302, 202303, 202304], size=n)
proba = 0.20 + 0.15 * X["score"] + 0.02 * (X["month"] - 202301)
proba = np.clip(proba, 0.01, 0.99)
y = pd.Series((rng.random(n) < proba).astype(int), name="target")
binner = Binner(
strategy="supervised",
check_stability=True,
monotonic="ascending",
min_event_rate_diff=0.03,
)
binner.fit(X, y, time_col="month")
summary = binner.temporal_variable_summary(
diagnostics=binner.temporal_bin_diagnostics(
X,
y,
time_col="month",
dataset_name="train",
),
time_col="month",
)
Benchmark principal do repositorio
O benchmark mais importante hoje compara tres lentes:
OptimalBinningpuro como baseline externaRiskBandsestatico como baseline internaRiskBandsbalanceado/temporal como abordagem orientada a credito
Materiais principais:
- pd_vintage_benchmark.py
- pd_vintage_benchmark.ipynb
- pd_vintage_champion_challenger.py
- temporal_stability_example.py
O que o projeto nao tenta ser
O foco do RiskBands e binning. Ele nao tenta, sozinho, ser:
- pipeline completo de modelagem de PD
- framework de monitoramento de carteira
- solucao completa de MLOps para credito
A proposta e ser uma camada especializada e forte de decisao sobre binning.
Mensagem principal
O RiskBands nao tenta substituir a forca do OptimalBinning.
Ele tenta responder melhor a pergunta que aparece no mundo real de credito:
Entre os candidatos que parecem bons no agregado, qual continua mais defensavel quando o tempo entra na decisao?
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file riskbands-1.0.0.tar.gz.
File metadata
- Download URL: riskbands-1.0.0.tar.gz
- Upload date:
- Size: 47.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9751e47bbc4f19e26af81adc75f95374736ad3c138377074665f3a2d69d30553
|
|
| MD5 |
f89106527b343c7ef4977515e667ee75
|
|
| BLAKE2b-256 |
03f2f1d0a6187a8a9bf4c25cbd6f10fddbbe9670c5656e0c89cf67779e7491ff
|
Provenance
The following attestation bundles were made for riskbands-1.0.0.tar.gz:
Publisher:
publish-pypi.yml on joaaomaia/RiskBands
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
riskbands-1.0.0.tar.gz -
Subject digest:
9751e47bbc4f19e26af81adc75f95374736ad3c138377074665f3a2d69d30553 - Sigstore transparency entry: 1282316452
- Sigstore integration time:
-
Permalink:
joaaomaia/RiskBands@1aa8aeac8257d9b304c63699efd937e4d54cbb4e -
Branch / Tag:
refs/tags/v1.0.0 - Owner: https://github.com/joaaomaia
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@1aa8aeac8257d9b304c63699efd937e4d54cbb4e -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file riskbands-1.0.0-py3-none-any.whl.
File metadata
- Download URL: riskbands-1.0.0-py3-none-any.whl
- Upload date:
- Size: 44.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
61d67eb66bfb1bdb84aa2ec73f3c1e2dfcca66b76795615599e7601e55a66eba
|
|
| MD5 |
59c17dda5f338ddf51fae00c5d2fee20
|
|
| BLAKE2b-256 |
9db979051c4f5b388255ec0630d9c49b9c9a0def0129c5d95adff64c8fc7d11f
|
Provenance
The following attestation bundles were made for riskbands-1.0.0-py3-none-any.whl:
Publisher:
publish-pypi.yml on joaaomaia/RiskBands
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
riskbands-1.0.0-py3-none-any.whl -
Subject digest:
61d67eb66bfb1bdb84aa2ec73f3c1e2dfcca66b76795615599e7601e55a66eba - Sigstore transparency entry: 1282316699
- Sigstore integration time:
-
Permalink:
joaaomaia/RiskBands@1aa8aeac8257d9b304c63699efd937e4d54cbb4e -
Branch / Tag:
refs/tags/v1.0.0 - Owner: https://github.com/joaaomaia
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@1aa8aeac8257d9b304c63699efd937e4d54cbb4e -
Trigger Event:
workflow_dispatch
-
Statement type: