SPB Git
2.5 KB · 40 lines python
1#!/usr/bin/env python32"""Figure ch05 — valeur par logement par RMR du portefeuille du cas 4 (DONNÉES SYNTHÉTIQUES, graine 20261031) et3décomposition de l'écart logarithmique avec Montréal entre le RNE par logement et le taux de capitalisation.4Sortie : assets/figures/ch05/ch05-fig-valeur-logement-rmr.pdf"""5import sys, pathlib6ROOT = pathlib.Path(__file__).resolve().parents[3]7sys.path.insert(0, str(ROOT / "analysis/python")); sys.path.insert(0, str(ROOT / "analysis/python/cases"))8import numpy as np9import matplotlib.pyplot as plt10from traite.style import setup, palette, savefig, LARGEUR, fmt_dollars11from traite import cas412import ch05_rente as c51314def main():15    setup()16    dec = c5.decomposition_rmr(cas4.charger()["portefeuille"])17    fig, (a1, a2) = plt.subplots(1, 2, figsize=(LARGEUR, 3.0), gridspec_kw={"wspace": 0.45, "width_ratios": [1, 1.15]})18    y = np.arange(len(dec))[::-1]19    a1.barh(y, dec["valeur_par_logement"], color=palette.cat[0], height=0.62)20    for yi, (rmr, row) in zip(y, dec.iterrows()):21        a1.text(row["valeur_par_logement"] + 3000, yi, f"{fmt_dollars(row['valeur_par_logement'])}  ({row['taux_pondere']*100:.2f} %)", va="center", fontsize=7, color=palette.ink)22    a1.set_yticks(y); a1.set_yticklabels(dec.index); a1.set_xlim(0, 330000)23    a1.xaxis.set_major_formatter(plt.FuncFormatter(lambda x, p: f"{x/1000:.0f} k$"))24    a1.set_xlabel("Valeur par logement (taux global pondéré)"); a1.grid(axis="y", visible=False)25    a1.set_title("A. Valeur par logement, 2026", loc="left", fontsize=8.5)26    sub = dec.drop(index="Montréal"); y2 = np.arange(len(sub))[::-1]27    a2.barh(y2, sub["contrib_rne"], color=palette.cat[1], height=0.62, label="Effet du RNE par logement")28    a2.barh(y2, sub["contrib_taux"], left=np.where(sub["contrib_rne"] < 0, sub["contrib_rne"], 0), color=palette.cat[2], height=0.62, label="Effet du taux de capitalisation")29    for yi, (rmr, row) in zip(y2, sub.iterrows()):30        a2.plot(row["ecart_ln_V_n"], yi, marker="D", ms=5, color=palette.ink, mec=palette.surface)31    a2.axvline(0, color=palette.ink2, lw=0.8)32    a2.set_yticks(y2); a2.set_yticklabels(sub.index); a2.set_xlim(-0.8, 0.15)33    a2.set_xlabel("Écart logarithmique avec Montréal"); a2.grid(axis="y", visible=False)34    a2.set_title("B. Décomposition de l'écart (losange = total)", loc="left", fontsize=8.5)35    a2.legend(fontsize=6.8, loc="upper center", bbox_to_anchor=(0.45, -0.2), ncol=2)36    out = savefig(fig, "ch05/ch05-fig-valeur-logement-rmr.pdf"); print("OK", out)3738if __name__ == "__main__":39    main()40
Files · main
Menu

Theme