{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": "# Primera provisión interna\n\n**Disponibilidad:** requiere bayesrisk 2.17.0 o posterior; PyPI 2.16.0 no incluye estas puertas. Confirma la versión disponible en [PyPI](https://pypi.org/project/bayesrisk/#history). Las salidas conservan su [candidato de verificación original](https://github.com/nexolabs-gh/bayesrisk/actions/runs/39523257538), artefacto `candidate-distributions-with-evidence`; CI vuelve a ejecutar el cuaderno y coteja sus resultados.\n\nTL;DR: recorrido experimental con PD y LGD declaradas. La PD constante es ilustrativa, no estimada ni validada. Se conserva la fórmula grupal y el detalle es un prorrateo.\n\nRequiere `bayesrisk[scoring,excel]`. Los datos sintéticos F5 vienen con el paquete. Ejecuta las celdas en orden en una carpeta propia; allí se guardan la evidencia y los entregables.\n\n## Calcular y mirar el resumen"
  },
  {
   "cell_type": "code",
   "metadata": {},
   "source": "from pathlib import Path\n\nimport pandas as pd\n\nfrom bayesrisk import Provision\nfrom bayesrisk.ui.datasets import materialize\n\ncartera = pd.read_parquet(materialize(\"provision_interna_generica\", workdir=Path(\"datos\")))\ncartera[\"pd_declarada\"] = 0.02  # Sólo ilustración: no es una PD estimada.\nprovision = Provision(cartera, as_of=\"as_of_date\", portfolio=\"portfolio\",\n                      exposure=\"exposure_amount\", pd=\"pd_declarada\", lgd=\"lgd\", formats=[\"csv\"])\nprovision.run(until=\"provisioning_internal\")\nprovision.summary()",
   "execution_count": 1,
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": "── Cartera ──\nArchivo: DataFrame en memoria, guardado como bayesrisk-runs/provision/input/data-<hash>.parquet\n6.000 filas · 13 columnas\nEsquema inferido: 13 columnas\nIdentificador: sin identificador declarado: se usa el índice del archivo\nPD externa declarada; esta corrida no ajusta ni calibra la PD\nEvidencia de la corrida: bayesrisk-runs/provision/run\n── Provisión interna ──\n6.000 operaciones · 3 grupos\nExposición: 8.129.332.047 · Provisión: 77.468.271\nAgrupación: banda de score\nPD externa declarada: no se ajustó ni calibró en esta corrida\nEl detalle prorratea el total grupal por exposición; no suma productos individuales\nLa severidad la aporta la institución, columna por operación, y la del grupo es el promedio ponderado por la exposición.\n⚠ Sin identificador de operación declarado: unicidad económica no verificada\nEjecución: completada hasta «Provisión interna» (corrida parcial)\nProvisión interna total: 77.468.271\n"
    },
    {
     "output_type": "execute_result",
     "execution_count": 1,
     "metadata": {},
     "data": {
      "text/plain": "FinalSummary(execution='completada hasta «Provisión interna» (corrida parcial)', validation='no aplica: una provisión no tiene veredicto técnico; lo que la cifra supone está en «Supuestos»', figures=(('Provisión interna total', '77.468.271'), ('Exposición total', '8.129.332.047'), ('Operaciones', '6.000'), ('Grupos', '3'), ('Cobertura', '0,95 %')), review=('Provisión interna: Sin identificador de operación declarado: unicidad económica no verificada',), decisions=(), files=(('Carpeta del proyecto', 'bayesrisk-runs/provision'), ('Config vigente', 'bayesrisk-runs/provision/config.yaml'), ('Evidencia de la corrida', 'bayesrisk-runs/provision/run'), ('Registro de auditoría', 'bayesrisk-runs/provision/run/audit_trail.jsonl')), stages=(StageSummary(stage='data', label='Cartera', lines=('Archivo: DataFrame en memoria, guardado como bayesrisk-runs/provision/input/data-<hash>.parquet', '6.000 filas · 13 columnas', 'Esquema inferido: 13 columnas', 'Identificador: sin identificador declarado: se usa el índice del archivo', 'PD externa declarada; esta corrida no ajusta ni calibra la PD', 'Evidencia de la corrida: bayesrisk-runs/provision/run'), alerts=(), table=None, formats={'Filas': 'int', 'Malos': 'int', 'Tasa de malos': 'pct'}), StageSummary(stage='provisioning_internal', label='Provisión interna', lines=('6.000 operaciones · 3 grupos', 'Exposición: 8.129.332.047 · Provisión: 77.468.271', 'Agrupación: banda de score', 'PD externa declarada: no se ajustó ni calibró en esta corrida', 'El detalle prorratea el total grupal por exposición; no suma productos individuales', 'La severidad la aporta la institución, columna por operación, y la del grupo es el promedio ponderado por la exposición.'), alerts=('Sin identificador de operación declarado: unicidad económica no verificada',), table=                            Grupo  ...    Provisión\ngroup_key                          ...\nconsumo_senior|banda_01  banda_01  ...  25812389.48\nmicroempresa|banda_01    banda_01  ...  26191512.67\nnomina|banda_01          banda_01  ...  25464368.86\n[3 rows x 8 columns], formats={'Operaciones': 'int', 'Exposición': 'num2', 'Provisión': 'num2', 'PD del grupo': 'pct', 'LGD del grupo': 'pct', 'Tasa de pérdida': 'pct'})))\n",
      "text/html": "<div class=\"bayesrisk-summary\"><h2>Resumen de la provisión interna</h2><p><b>Ejecución:</b> completada hasta «Provisión interna» (corrida parcial)</p><h4>Supuestos</h4><ul><li>La provisión se calcula por grupos; el detalle prorratea ese total por exposición</li><li>La calidad de PD y LGD no queda certificada por terminar el cálculo</li><li>La severidad la aporta la institución, columna por operación, y la del grupo es el promedio ponderado por la exposición.</li><li>PD externa declarada: esta corrida no la ajustó ni calibró</li></ul><table><tbody><tr><th>Provisión interna total</th><td>77.468.271</td></tr><tr><th>Exposición total</th><td>8.129.332.047</td></tr><tr><th>Operaciones</th><td>6.000</td></tr><tr><th>Grupos</th><td>3</td></tr><tr><th>Cobertura</th><td>0,95 %</td></tr></tbody></table><h4>Qué revisar</h4><ul><li>⚠ Provisión interna: Sin identificador de operación declarado: unicidad económica no verificada</li></ul><h4>Decisiones humanas registradas</h4><ul><li>Ninguna decisión humana registrada; lo que se decidió vive en el config de la corrida.</li></ul><h4>Dónde quedó cada archivo</h4><ul><li>Carpeta del proyecto: <code>bayesrisk-runs/provision</code></li><li>Config vigente: <code>bayesrisk-runs/provision/config.yaml</code></li><li>Evidencia de la corrida: <code>bayesrisk-runs/provision/run</code></li><li>Registro de auditoría: <code>bayesrisk-runs/provision/run/audit_trail.jsonl</code></li></ul></div>\n"
     }
    }
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": "## Reanudar y exportar\n\nReanudar crea una corrida completa nueva. El CSV contiene todo el detalle, Excel reúne las etapas y el ZIP conserva entradas y estudios. Sin ID declarado sólo se verifica el índice técnico; la unicidad económica no está acreditada."
  },
  {
   "cell_type": "code",
   "metadata": {},
   "source": "provision.resume()\nprovision.export_excel()\nprovision.export(\"provision.zip\")\nprovision.summary(\"provisioning_internal\")",
   "execution_count": 2,
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": "── Cartera ──\nArchivo: DataFrame en memoria, guardado como bayesrisk-runs/provision/input/data-<hash>.parquet\n6.000 filas · 13 columnas\nEsquema inferido: 13 columnas\nIdentificador: sin identificador declarado: se usa el índice del archivo\nPD externa declarada; esta corrida no ajusta ni calibra la PD\nEvidencia de la corrida: bayesrisk-runs/provision/run\n── Provisión interna ──\n6.000 operaciones · 3 grupos\nExposición: 8.129.332.047 · Provisión: 77.468.271\nAgrupación: banda de score\nPD externa declarada: no se ajustó ni calibró en esta corrida\nEl detalle prorratea el total grupal por exposición; no suma productos individuales\nLa severidad la aporta la institución, columna por operación, y la del grupo es el promedio ponderado por la exposición.\n⚠ Sin identificador de operación declarado: unicidad económica no verificada\n── Informe y ficha ──\nInforme HTML: bayesrisk-runs/provision/reports/provision_interna_report.html\nRegistro de auditoría: bayesrisk-runs/provision/run/audit_trail.jsonl\nEjecución: completada\nProvisión interna total: 77.468.271\nExcel por etapa: 3 libros en bayesrisk-runs/provision/excel\nPaquete de la corrida: provision.zip\n"
    },
    {
     "output_type": "execute_result",
     "execution_count": 2,
     "metadata": {},
     "data": {
      "text/plain": "StageSummary(stage='provisioning_internal', label='Provisión interna', lines=('6.000 operaciones · 3 grupos', 'Exposición: 8.129.332.047 · Provisión: 77.468.271', 'Agrupación: banda de score', 'PD externa declarada: no se ajustó ni calibró en esta corrida', 'El detalle prorratea el total grupal por exposición; no suma productos individuales', 'La severidad la aporta la institución, columna por operación, y la del grupo es el promedio ponderado por la exposición.'), alerts=('Sin identificador de operación declarado: unicidad económica no verificada',), table=                            Grupo  ...    Provisión\ngroup_key                          ...\nconsumo_senior|banda_01  banda_01  ...  25812389.48\nmicroempresa|banda_01    banda_01  ...  26191512.67\nnomina|banda_01          banda_01  ...  25464368.86\n[3 rows x 8 columns], formats={'Operaciones': 'int', 'Exposición': 'num2', 'Provisión': 'num2', 'PD del grupo': 'pct', 'LGD del grupo': 'pct', 'Tasa de pérdida': 'pct'})\n",
      "text/html": "<div class=\"bayesrisk-summary\"><h3>Provisión interna</h3><ul><li>6.000 operaciones · 3 grupos</li><li>Exposición: 8.129.332.047 · Provisión: 77.468.271</li><li>Agrupación: banda de score</li><li>PD externa declarada: no se ajustó ni calibró en esta corrida</li><li>El detalle prorratea el total grupal por exposición; no suma productos individuales</li><li>La severidad la aporta la institución, columna por operación, y la del grupo es el promedio ponderado por la exposición.</li></ul><ul><li>⚠ Sin identificador de operación declarado: unicidad económica no verificada</li></ul><table class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th>Grupo</th>\n      <th>Cartera</th>\n      <th>Operaciones</th>\n      <th>Exposición</th>\n      <th>PD del grupo</th>\n      <th>LGD del grupo</th>\n      <th>Tasa de pérdida</th>\n      <th>Provisión</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>banda_01</td>\n      <td>consumo_senior</td>\n      <td>1.998</td>\n      <td>2.695.080.608,87</td>\n      <td>2,00 %</td>\n      <td>47,89 %</td>\n      <td>0,96 %</td>\n      <td>25.812.389,48</td>\n    </tr>\n    <tr>\n      <td>banda_01</td>\n      <td>microempresa</td>\n      <td>1.999</td>\n      <td>2.762.159.530,97</td>\n      <td>2,00 %</td>\n      <td>47,41 %</td>\n      <td>0,95 %</td>\n      <td>26.191.512,67</td>\n    </tr>\n    <tr>\n      <td>banda_01</td>\n      <td>nomina</td>\n      <td>2.003</td>\n      <td>2.672.091.906,91</td>\n      <td>2,00 %</td>\n      <td>47,65 %</td>\n      <td>0,95 %</td>\n      <td>25.464.368,86</td>\n    </tr>\n  </tbody>\n</table></div>\n"
     }
    }
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python",
   "version": "3.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
