SPB Git
3.7 KB · 59 lines python
1#!/usr/bin/env python32"""Figure ch24 — courbes de dépréciation du bâtiment en fonction de l'âge (DONNÉES SYNTHÉTIQUES, cas 1, graine 20261031) :3(a) taux extraits du marché pour les 600 ventes, médianes par tranche d'âge et ajustement quadratique ;4(b) profils comparés : âge-vie linéaire (60 ans), extraction, courbe hédonique et profil « vrai » du générateur convertis en5dépréciation du bâtiment (part du terrain α), avec les deux lectures du sujet à 28 ans.6Sortie : assets/figures/ch24/ch24-fig-courbes.pdf"""7import sys, pathlib8ROOT = pathlib.Path(__file__).resolve().parents[3]9sys.path.insert(0, str(ROOT / "analysis/python")); sys.path.insert(0, str(ROOT / "analysis/python/cases"))10import numpy as np, matplotlib.pyplot as plt11from traite.style import setup, palette, savefig, LARGEUR12import ch24_depreciation as cas131415def main():16    setup()17    d = cas.charger()18    w, vl = cas.extraction(d["ventes"], d["modele"], d["cn"]["total"])19    aj = cas.ajuster_profil(w); q = aj["quadratique"]20    vlr = cas.valeur_terrain_retenue(vl)21    pr = cas.profils(d["modele"], d["sujet"], vlr["retenue"], q)22    var = cas.variantes_physique(d["cn"], d["fiche"], d["travaux"])23    fig, (a, b) = plt.subplots(1, 2, figsize=(LARGEUR, 3.1), gridspec_kw={"wspace": 0.28})24    # (a) nuage + médianes par tranche + ajustement quadratique25    a.scatter(w["age"], w["taux"] * 100, s=7, color=palette.cat[0], alpha=0.25, linewidths=0, label="Ventes (600)")26    tr = cas.tranches(w)27    mids = [5, 15, 25, 35, 45, 55, 75]28    a.plot(mids, tr["median"].values * 100, "o", color=palette.cat[1], ms=5, label="Médiane par tranche de 10 ans")29    ages = np.arange(0, 100)30    a.plot(ages, cas.taux_quadratique(q, ages) * 100, color=palette.cat[1], lw=1.8, label="Ajustement quadratique")31    a.plot(ages, np.minimum(ages / 60, 1) * 100, color=palette.ink2, lw=1.2, ls="--", label="Âge-vie linéaire (60 ans)")32    a.set_xlim(0, 100); a.set_ylim(-30, 100)33    a.set_xlabel("Âge chronologique (ans)"); a.set_ylabel("Dépréciation extraite (% du coût neuf)")34    a.set_title("(a) Extraction de marché, 600 ventes", loc="left", fontsize=9)35    a.legend(loc="upper left", fontsize=7)36    # (b) profils comparés37    ag = pr["ages"]38    b.plot(ag, pr["age_vie"] * 100, color=palette.ink2, lw=1.2, ls="--", label="Âge-vie linéaire (60 ans)")39    b.plot(ag, pr["extraction"] * 100, color=palette.cat[1], lw=1.8, label="Extraction de marché (quadratique)")40    b.plot(ag, pr["hedonique_bat"] * 100, color=palette.cat[0], lw=1.8, label="Hédonique, converti au bâtiment")41    b.plot(ag, pr["generateur_bat"] * 100, color=palette.cat[2], lw=1.6, ls=":", label="Profil du générateur, converti")42    b.legend(loc="upper left", fontsize=7)43    # sujet à 28 ans44    b.plot([28], [var["ventilee"]["taux"] * 100], "D", color=palette.cat[5], ms=6)45    b.annotate(f"Sujet, ventilée : {var['ventilee']['taux']*100:.1f} %", (28, var["ventilee"]["taux"] * 100), xytext=(40, 58), fontsize=7.5, color=palette.ink,46               arrowprops=dict(arrowstyle="-", color=palette.ink2, lw=0.6))47    t28 = float(cas.taux_quadratique(q, 28))48    b.plot([28], [t28 * 100], "o", color=palette.cat[1], ms=6)49    b.annotate(f"Sujet, extraction : {t28*100:.1f} %", (28, t28 * 100), xytext=(36, 6), fontsize=7.5, color=palette.ink,50               arrowprops=dict(arrowstyle="-", color=palette.ink2, lw=0.6))51    b.set_xlim(0, 82); b.set_ylim(0, 100)52    b.set_xlabel("Âge (ans)"); b.set_ylabel("Dépréciation du bâtiment (% du coût neuf)")53    b.set_title(f"(b) Profils comparés (part du terrain α = {pr['alpha']:.2f})", loc="left", fontsize=9)54    out = savefig(fig, "ch24/ch24-fig-courbes.pdf"); print("OK", out)555657if __name__ == "__main__":58    main()59
Files · b89896847ac1aae8938f8bc73852056ce0ce4556
Menu

Theme