SPB Git
2.4 KB · 39 lines python
1#!/usr/bin/env python32"""Figure ch23 — IPCB Montréal, maison individuelle, par division de travaux (Statistique Canada 18-10-0289-01), données RÉELLES :3variation de l'indice de chaque division entre le T1 2020 et le T4 2022 (flambée) et entre le T3 2025 et le T3 2026 (dernière année).4Les divisions sont des indices de prix, non des contributions pondérées (les poids du panier ne sont pas publiés dans le tableau).5Sortie : assets/figures/ch23/ch23-fig-ipcb-divisions.pdf"""6import sys, pathlib7ROOT = pathlib.Path(__file__).resolve().parents[3]8sys.path.insert(0, str(ROOT / "analysis/python")); sys.path.insert(0, str(ROOT / "analysis/python/cases"))9import numpy as np, matplotlib.pyplot as plt10from traite.style import setup, palette, savefig, LARGEUR11import ch23_structure_couts as cas1213COURT = {"Bois, plastiques et composites": "Bois, plastiques, composites", "Chauffage, ventilation et conditionnement d’air": "CVCA",14         "Isolation thermique et étanchéité": "Isolation et étanchéité", "Sécurité et protection électronique": "Sécurité électronique",15         "Services d’utilités": "Services d'utilités", "Agrégat des divisions": "Ensemble (agrégat)"}1617def main():18    setup()19    df_div = cas.ipcb_long(("Montréal, Québec",), ("Maison individuelle [621112]",), None)20    dv = cas.divisions_maison(df_div).iloc[::-1]21    y = np.arange(len(dv)); h = 0.3822    fig, ax = plt.subplots(figsize=(LARGEUR, 4.6))23    ax.barh(y + h / 2, dv["var_2020_2022"] * 100, height=h, color=palette.cat[0], label="T1 2020 → T4 2022")24    ax.barh(y - h / 2, dv["var_aa"] * 100, height=h, color=palette.cat[1], label="T3 2025 → T3 2026")25    ax.set_yticks(y); ax.set_yticklabels([COURT.get(d, d) for d in dv["division"]], fontsize=7.5)26    for yi, (a, b, d) in enumerate(zip(dv["var_2020_2022"], dv["var_aa"], dv["division"])):27        ax.text(a * 100 + 1, yi + h / 2, f"{a*100:+.0f} %", va="center", fontsize=6.8, color=palette.ink)28        ax.text(b * 100 + 1, yi - h / 2, f"{b*100:+.1f} %", va="center", fontsize=6.8, color=palette.ink)29        if d == "Agrégat des divisions":30            ax.get_yticklabels()[yi].set_fontweight("bold")31    ax.axvline(0, color=palette.ink2, lw=0.6)32    ax.set_xlabel("Variation de l'indice de division (%)"); ax.set_xlim(-2, 100)33    ax.legend(loc="lower right", fontsize=7.5)34    ax.grid(axis="y", visible=False)35    out = savefig(fig, "ch23/ch23-fig-ipcb-divisions.pdf"); print("OK", out)3637if __name__ == "__main__":38    main()39
Files · 11f6c54e39ac2d8ce41b1b464d12e942e4170c06
Menu

Theme