"""Atelier Chain Ladder (Prime Pure) : refaire les calculs de l'exercice guidé en Python.

    python atelier_chain_ladder.py        (les deux fichiers CSV dans le même dossier)

Données fictives de la Mutuelle Alcyon, branche Entreprises, cause « vol ». Nécessite pandas.
"""
import pandas as pd

sin = pd.read_csv("alcyon-vol-sinistres.csv", sep=";", encoding="utf-8-sig")
reg = pd.read_csv("alcyon-vol-reglements.csv", sep=";", encoding="utf-8-sig")

# 1. Année de survenance et année de développement de chaque règlement
reg = reg.merge(sin[["id_sinistre", "date_survenance"]], on="id_sinistre")
reg["survenance"] = reg["date_survenance"].str[:4].astype(int)
reg["developpement"] = reg["date_reglement"].str[:4].astype(int) - reg["survenance"] + 1
print("Règlements :", len(reg), "dont recours :", int((reg["montant"] < 0).sum()), "; total réglé :", reg["montant"].sum(), "€")

# 2. Triangle des règlements cumulés (les cases futures restent vides)
inc = reg.pivot_table(index="survenance", columns="developpement", values="montant", aggfunc="sum")
inc = inc.reindex(index=range(2016, 2026), columns=range(1, 11)).fillna(0)
cum = inc.cumsum(axis=1)
for i in cum.index:
    for j in cum.columns:
        if i + j - 1 > 2025:
            cum.loc[i, j] = float("nan")
print(cum.round(0))

# 3. Facteurs de développement pondérés
f = {}
for j in range(1, 10):
    connu = cum[j + 1].notna()
    f[j] = cum.loc[connu, j + 1].sum() / cum.loc[connu, j].sum()
print("Facteurs :", {j: round(v, 4) for j, v in f.items()})

# 4. Charge ultime et provision par année de survenance
total = 0.0
for i in cum.index:
    dev = 2026 - i
    dernier = cum.loc[i, dev]
    ultime = dernier
    for j in range(dev, 10):
        ultime *= f[j]
    total += ultime - dernier
    print(i, "dernier cumul", round(dernier), "ultime", round(ultime), "provision", round(ultime - dernier))
print("Provision totale :", round(total), "€")
