Nikodym RiskLib¶
Librería Python open-source (Apache-2.0) de riesgo de crédito integral:
scoring/scorecards, ML, provisiones CMF (Chile) e IFRS 9/ECL, forward-looking y
stress testing. Paquete: nikodym.
Estado: 0.9.0 — primer release público (pre-1.0)
Disponible en PyPI: pip install nikodym. API versionada como 0.x honesto: las superficies
que aún crecen (resultados/overlay/métricas/orquestación) pueden cambiar hasta la 1.0.
Principios¶
- Reproducibilidad total:
(datos + config + semilla) → resultado idéntico. Cada corrida emite un lineage bundle (git SHA + hash de datos + config + semilla +uv.lock). - Gobernanza por construcción (SR 11-7): model card y audit-trail automáticos.
- Config declarativo (Pydantic v2): el config ES el experimento.
- Núcleo liviano:
import nikodymno arrastra el stack ML; los backends pesados van tras extras opcionales con import perezoso. - CMF ≠ IFRS 9: dos motores separados; la provisión es el máximo (piso prudencial).
Instalación¶
pip install nikodym # núcleo base (config, Study, lineage)
pip install 'nikodym[scoring]' # MVP scorecard (optbinning + statsmodels + sklearn>=1.6)
pip install 'nikodym[all]' # todo lo redistribuible (sin copyleft)
Quickstart¶
El experimento es un NikodymConfig declarativo; nikodym.run(config) lo ejecuta de extremo a
extremo (binning → selección → modelo → scorecard → calibración → desempeño → estabilidad) y
devuelve un Study reproducible. El siguiente ejemplo usa el preset estándar F1
sobre un dataset sintético de consumo, así corre sin que rellenes ningún campo:
from pathlib import Path
from tempfile import mkdtemp
import nikodym
from nikodym.core.config import NikodymConfig
from nikodym.ui.datasets import materialize
from nikodym.ui.presets import standard_preset
# 1. Materializa el dataset sintético de consumo (determinista) en un workdir temporal.
workdir = Path(mkdtemp(prefix="nikodym-quickstart-"))
preset = standard_preset()
data_path = materialize(preset["dataset_id"], workdir=workdir)
# 2. Toma el config F1 curado y apúntalo al archivo de datos recién materializado.
cfg_dict = preset["config"]
cfg_dict["data"]["load"]["source"] = str(data_path)
config = NikodymConfig.model_validate(cfg_dict)
# 3. Ejecuta la corrida completa y verifica el estado.
study = nikodym.run(config)
assert study.run_context.status == "done"
# 4. Accede a los resultados namespaced por dominio/clave.
scorecard = study.artifacts.get("scorecard", "scorecard") # tabla del scorecard
metrics = study.artifacts.get("performance", "discriminant_metrics") # AUC/KS/Gini por partición
print(metrics)
nikodym.run es fail-loud pero no explosivo: ante un fallo devuelve el Study parcial con
study.run_context.status == "failed" (el error vive en el audit-trail y el lineage, no se
silencia). Por eso el consumidor por código debe chequear study.run_context.status antes de
usar los resultados.
Con un config propio se sustituye el preset: se define el NikodymConfig (esquema de datos,
binning, modelo, scorecard, calibración) y se apunta data.load.source al dataset real. Ver
Conceptos para el modelo mental y Referencia de la API para el detalle de
run, Study y NikodymConfig.
Licencia¶
Apache-2.0. Sin dependencias copyleft (GPL/LGPL/AGPL) en el wheel.