SPB Git
2.9 KB · 43 lines python
1#!/usr/bin/env python32"""Figure ch02 — cas 3 (DONNÉES SYNTHÉTIQUES) : (a) revenu net d'exploitation projeté avec les baux en place (droit du locateur)3et libre de baux (loyers de marché dès l'année 1) ; la surface entre les deux est le revenu cédé aux locataires ;4(b) valeur agrégée des baux pour les locataires (V_pleine − V_locateur) selon le nombre de logements reloués par an et le taux.5Sortie : assets/figures/ch02/ch02-fig-decomposition-droits.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, LARGEUR, fmt_dollars11import ch02_droits as cas121314def main():15    setup()16    res = cas.main(verbose=False)17    base, sens = res["base"], res["sensibilite"]18    pc, pm = base["proj_contrat"], base["proj_marche"]19    fig, (a, b) = plt.subplots(1, 2, figsize=(LARGEUR, 3.2), gridspec_kw={"width_ratios": [1.1, 1]})20    yrs = pc["exercice"].values21    a.plot(yrs, pm["rne"] / 1000, color=palette.cat[1], marker="s", ms=3, label="libre de baux (loyers de marché)")22    a.plot(yrs, pc["rne"] / 1000, color=palette.cat[0], marker="o", ms=3, label="baux en place (droit du locateur)")23    a.fill_between(yrs, pc["rne"] / 1000, pm["rne"] / 1000, where=pm["rne"] >= pc["rne"], color=palette.cat[1], alpha=0.18, lw=0)24    a.annotate("revenu cédé\naux locataires", xy=(yrs[1], (pc["rne"].iloc[1] + pm["rne"].iloc[1]) / 2000), xytext=(yrs[3] + 0.3, 96),25               fontsize=7.5, color=palette.ink, arrowprops=dict(arrowstyle="-", color=palette.ink2, lw=0.6))26    a.set_xlabel("Exercice"); a.set_ylabel("Revenu net d'exploitation (milliers de $)"); a.set_xticks(yrs[::2])27    a.legend(loc="upper left", fontsize=7.4); a.set_title("(a) RNE projeté, deux faisceaux de droits", loc="left")28    # (b) sensibilité29    for k, r in enumerate(cas.TAUX):30        s = sens[np.isclose(sens["taux"], r)].sort_values("rotation")31        b.plot((s["rotation"] * 12).round(0), s["V_locataires"] / 1000, marker="o", ms=3.5, color=palette.cat[k], label=f"$r$ = {r*100:.2f} %")32    b.set_yscale("log"); b.set_yticks([5, 10, 25, 50, 100, 250, 500]); b.set_yticklabels(["5", "10", "25", "50", "100", "250", "500"])33    b.set_xticks([0, 1, 2, 3, 6]); b.set_xlabel("Logements reloués au marché par an (sur 12)")34    b.set_ylabel("$V_{\\mathrm{pleine}} - V_{\\mathrm{locateur}}$ (milliers de dollars, éch. log.)")35    b.axvline(2, color=palette.ink2, lw=0.7, ls=":"); b.text(2.15, 200, "hypothèse\ndu cas 3", fontsize=7, color=palette.ink2)36    b.legend(loc="lower left", fontsize=7.4); b.set_title("(b) Valeur agrégée des baux pour les locataires", loc="left")37    fig.tight_layout(w_pad=2.2)38    out = savefig(fig, "ch02/ch02-fig-decomposition-droits.pdf"); print("OK", out)394041if __name__ == "__main__":42    main()43
Files · da8a4ee0304be0aa9c54ed0aad08d985fc4539fc
Menu

Theme