SPB Git
2.6 KB · 36 lines python
1#!/usr/bin/env python32"""Figure ch23 — cascade de formation du coût neuf du sujet du cas 1 (DONNÉES SYNTHÉTIQUES, graine 20261031) :3coûts directs par corps de métier, puis chaque poste indirect, l'incitatif, puis TPS et TVQ sur le bâtiment seul4(sans remboursement : la JVM du bien, terrain compris, dépasse les seuils). Sortie : assets/figures/ch23/ch23-fig-structure-couts.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 matplotlib.pyplot as plt9from matplotlib.ticker import FuncFormatter10from traite.style import setup, palette, savefig, LARGEUR, fmt_milliers11import ch21_cout_neuf as c21, ch23_structure_couts as cas1213def main():14    setup()15    devis, sujet = c21.charger(); cn = c21.cout_neuf_sujet(devis); g = c21.regrouper(devis); ri = cas.ratios_indirects(devis, cn)16    etapes = [(k, float(g.loc[k, "montant"]), palette.cat[0]) for k in c21.ORDRE_CORPS if k != "Coûts indirects"]17    etapes += [(p.replace(" (salaires)", "").replace(" (arpentage, sol)", ""), float(m), palette.cat[1]) for p, m in zip(ri["poste"], ri["montant"])]18    etapes += [("Incitatif (10 % de D+I)", cn["incitatif"], palette.cat[2]), ("TPS 5 %", cn["total"] * cas.TPS, palette.cat[3]), ("TVQ 9,975 %", cn["total"] * cas.TVQ, palette.cat[3])]19    fig, ax = plt.subplots(figsize=(LARGEUR, 4.3))20    cum = 0.0; labels = []21    for i, (lab, m, col) in enumerate(etapes):22        ax.barh(i, m / 1000, left=cum / 1000, color=col, height=0.7)23        ax.text((cum + m) / 1000 + 3, i, f"{m/1000:,.1f}".replace(",", " "), va="center", fontsize=6.8, color=palette.ink)24        cum += m; labels.append(lab)25    for lvl, nom in [(cn["direct"], f"D = {cn['direct']/1000:.1f} k$"), (cn["direct"] + cn["indirects"], f"D + I = {(cn['direct']+cn['indirects'])/1000:.1f} k$"),26                     (cn["total"], f"C_N = {cn['total']/1000:.1f} k$"), (cn["total"] * (1 + cas.TPS + cas.TVQ), f"TTC = {cn['total']*(1+cas.TPS+cas.TVQ)/1000:.1f} k$")]:27        ax.axvline(lvl / 1000, color=palette.ink2, lw=0.6, ls=":")28        ax.text(lvl / 1000, -0.75, nom.split(" = ")[0], ha="center", va="bottom", fontsize=7, color=palette.ink2)29    ax.set_yticks(range(len(etapes))); ax.set_yticklabels(labels, fontsize=7.5); ax.set_ylim(len(etapes) - 0.5, -1.6)30    ax.set_xlabel("Milliers de dollars (cumul)"); ax.xaxis.set_major_formatter(FuncFormatter(fmt_milliers)); ax.set_xlim(0, 490)31    ax.grid(axis="y", visible=False)32    out = savefig(fig, "ch23/ch23-fig-structure-couts.pdf"); print("OK", out)3334if __name__ == "__main__":35    main()36
Files · d49e547b9b0535e034d80fed31849741adb255e2
Menu

Theme