SPB Git
3.2 KB · 48 lines python
1#!/usr/bin/env python32"""Figure ch24 — sensibilité (DONNÉES SYNTHÉTIQUES, cas 1, graine 20261031) : (a) taux de dépréciation âge-vie modifiée selon la vie3économique et l'âge effectif ; (b) tornade de l'indication par le coût du sujet. Sortie : assets/figures/ch24/ch24-fig-sensibilite.pdf"""4import sys, pathlib5ROOT = pathlib.Path(__file__).resolve().parents[3]6sys.path.insert(0, str(ROOT / "analysis/python")); sys.path.insert(0, str(ROOT / "analysis/python/cases"))7import numpy as np, matplotlib.pyplot as plt8from traite.style import setup, palette, savefig, LARGEUR, fmt_dollars9import ch24_depreciation as cas101112def main():13    setup()14    d = cas.charger()15    var = cas.variantes_physique(d["cn"], d["fiche"], d["travaux"])16    se = cas.carence_salle_eau(d["devis"], d["cn"])17    w, vl = cas.extraction(d["ventes"], d["modele"], d["cn"]["total"])18    q = cas.ajuster_profil(w)["quadratique"]; vlr = cas.valeur_terrain_retenue(vl)19    vs = cas.valeur_sujet(d["cn"], vlr["retenue"], q, se["desuetude"], var)20    sx = cas.sensibilite_extraction(d["ventes"], d["modele"], d["cn"]["total"])21    to = cas.tornade(d["cn"], vlr["retenue"], vs["d_extraite"], se["desuetude"], var, sx)22    vies = (50, 60, 70, 80, 100); ages = (20, 25, 29, 33, 37)23    G = cas.grille_age_vie(d["cn"], var["curable"], vies, ages).values * 10024    fig, (a, b) = plt.subplots(2, 1, figsize=(LARGEUR, 5.4), gridspec_kw={"hspace": 0.5, "height_ratios": [1.15, 1]})25    im = a.imshow(G, cmap=palette.cmap_seq(), aspect="auto", origin="upper", vmin=15, vmax=80)26    a.set_xticks(range(len(ages))); a.set_xticklabels([str(x) for x in ages]); a.set_yticks(range(len(vies))); a.set_yticklabels([str(v) for v in vies])27    a.set_xlabel("Âge effectif de la structure (ans)"); a.set_ylabel("Vie économique (ans)"); a.grid(False)28    for i in range(len(vies)):29        for j in range(len(ages)):30            a.text(j, i, f"{G[i, j]:.0f}", ha="center", va="center", fontsize=7.5, color="white" if G[i, j] > 45 else palette.ink)31    a.set_title("(a) Âge-vie modifiée, % du coût neuf", loc="left", fontsize=9)32    base = to[0]["base"]33    ordre = sorted(range(len(to)), key=lambda i: abs(to[i]["haut"] - to[i]["bas"]))34    for k, i in enumerate(ordre):35        o = to[i]; lo, hi = min(o["bas"], o["haut"]), max(o["bas"], o["haut"])36        b.barh(k, hi - lo, left=lo, color=palette.cat[0] if k < len(ordre) - 1 else palette.cat[1], height=0.6)37        b.text(lo - 3000, k, fmt_dollars(lo).replace("$", r"\$"), ha="right", va="center", fontsize=7, color=palette.ink)38        b.text(hi + 3000, k, fmt_dollars(hi).replace("$", r"\$"), ha="left", va="center", fontsize=7, color=palette.ink)39    b.axvline(base, color=palette.ink2, lw=0.8, ls="--")40    b.set_yticks(range(len(ordre))); b.set_yticklabels([to[i]["param"].replace(" au lieu de l'extraction", "") for i in ordre], fontsize=7.5)41    b.set_xlim(400000, 680000); b.xaxis.set_major_formatter(plt.FuncFormatter(fmt_dollars)); b.grid(axis="y", visible=False)42    b.set_xlabel(f"Indication par le coût (base {fmt_dollars(base)})".replace("$", r"\$")); b.set_title("(b) Tornade de l'indication par le coût", loc="left", fontsize=9)43    out = savefig(fig, "ch24/ch24-fig-sensibilite.pdf"); print("OK", out)444546if __name__ == "__main__":47    main()48
Files · cd76781f94cbc7113926bd8a4bd920d14c17c982
Menu

Theme