TeX 55.1%
Python 44.2%
1# Author: Simon-Pierre Boucher — simon-pierre.boucher@uqo.ca2"""Central configuration: paths, snapshot identity, sample window, conventions."""3from __future__ import annotations45from pathlib import Path67ROOT = Path(__file__).resolve().parents[2]8DATA = ROOT / "data"9RAW = DATA / "raw"10EXTERNAL = DATA / "external"11INTERIM = DATA / "interim"12PROCESSED = DATA / "processed"13RESULTS = ROOT / "results"14FIGURES = ROOT / "figures"15DOCS = ROOT / "docs"16CONFIGS = ROOT / "configs"17LOGS = ROOT / "logs"1819# --- Immutable extraction snapshot (Phase 1) -------------------------------20# `sqlite3 .backup` of M3U96a:~/apps/vrai-prix/data/vraiprix.db taken21# 2026-10-21 00:30 (America/Toronto) into ~/wp22-snapshot/, copied to RAW.22SNAPSHOT_DB = RAW / "vraiprix-20261021.db"23SNAPSHOT_SHA256 = "2816d8ddbee66faf7f8961fabf0460583249e911dab52014e633be14b9d34461"24SNAPSHOT_TAKEN = "2026-10-21T00:30:00-04:00"25SNAPSHOT_SOURCE = "M3U96a:~/apps/vrai-prix/data/vraiprix.db (production, read via .backup)"2627# Earlier vintages of the same transaction table (ids + dates only), used to28# measure registration/publication lags. See docs/provenance_report.md.29VINTAGES = {30 "2026-08-06": RAW / "vintages" / "vintage_qwhpi_csv.parquet",31 "2026-08-09": RAW / "vintages" / "vintage_wp10_parquet.parquet",32 "2026-10-10": RAW / "vintages" / "vintage_20261010.csv.gz",33 "2026-10-17": RAW / "vintages" / "vintage_toveli_20261017.parquet",34}3536# --- External reference data ----------------------------------------------37SDA_GPKG = EXTERNAL / "SDA.gpkg" # MRNF administrative boundaries V2026-0738MAMH_MUN_CSV = EXTERNAL / "MUN.csv" # MAMH répertoire des municipalités39MAMH_MRC_CSV = EXTERNAL / "MRC.csv"4041# --- Sample window and index conventions ----------------------------------42SAMPLE_START = "2021-01-01"43SAMPLE_END = "2026-10-07" # last transaction date in snapshot44BASE_YEAR = 2021 # primary normalisation: 2021 avg = 10045BASE_MONTH = "2021-01" # secondary normalisation46PROPERTY_TYPES = ("house", "condo", "plex")47SEED = 2026102148MODEL_VERSION = "0.1.0"49CRS_METRIC = "EPSG:32198" # NAD83 / Quebec Lambert5051# --- Parquet layers --------------------------------------------------------52RAW_TX = INTERIM / "raw_transactions.parquet"53RAW_UNITS_MATCHED = INTERIM / "raw_units_matched.parquet"54RAW_UNITS_STOCK = INTERIM / "raw_units_stock.parquet"55RAW_MARKET_INDEX = INTERIM / "raw_market_index.parquet"56STD_TX = INTERIM / "std_transactions.parquet" # standardized layer57GEO_TX = INTERIM / "geo_transactions.parquet" # + geography58CLEAN_TX = PROCESSED / "clean_transactions.parquet" # cleaned (flags, ledger)59ANALYTIC_TX = PROCESSED / "analytic_transactions.parquet" # analytic layer606162def ensure_dirs() -> None:63 for d in (INTERIM, PROCESSED, RESULTS, FIGURES, DOCS, LOGS):64 d.mkdir(parents=True, exist_ok=True)65