TeX 55.1%
Python 44.2%
1#!/usr/bin/env python32# Author: Simon-Pierre Boucher — simon-pierre.boucher@uqo.ca3"""Phase 2 — HMTS benchmark (G) at province × class and region × class, windows 4 and 13 months.4Output: results/benchmarks/series_hmts.parquet (same long schema as series.parquet)."""5from __future__ import annotations67import sys8import time9from pathlib import Path1011sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "src"))12import polars as pl1314from sharp_hpi import config as C15from sharp_hpi import estimators as E16from sharp_hpi.hedonic import assign_loc_fe, build_features1718OUT = C.RESULTS / "benchmarks"19GRID = E.month_grid("2021-01", "2026-10")202122def main() -> None:23 f = build_features(pl.read_parquet(C.ANALYTIC_TX))24 rows = []25 for cls in C.PROPERTY_TYPES:26 d = f.filter(pl.col("property_class") == cls)27 prov = assign_loc_fe(d, min_n=15).with_columns(pl.col("mrc_code").alias("loc_coarse"))28 for w in (4, 13):29 t0 = time.time(); s = E.hmts(prov, GRID, window=w)30 rows.append(s.to_frame().with_columns(pl.lit(cls).alias("class"), pl.lit("province").alias("level"), pl.lit("QC").alias("geo_id"), pl.lit(None, dtype=pl.Float64).alias("se")))31 print(cls, "province", s.method, f"{time.time() - t0:.0f}s", flush=True)32 for reg in sorted(d["region_code"].unique().to_list()):33 dr = d.filter(pl.col("region_code") == reg)34 if dr.height < 500:35 continue36 drr = assign_loc_fe(dr, min_n=15).with_columns(pl.col("mun_code").alias("loc_coarse"))37 t0 = time.time(); s = E.hmts(drr, GRID, window=13)38 rows.append(s.to_frame().with_columns(pl.lit(cls).alias("class"), pl.lit("region").alias("level"), pl.lit(reg).alias("geo_id"), pl.lit(None, dtype=pl.Float64).alias("se")))39 print(cls, reg, s.method, f"{time.time() - t0:.0f}s", flush=True)40 pl.concat(rows).select(["class", "level", "geo_id", "method", "month", "log_index", "se", "n"]).write_parquet(OUT / "series_hmts.parquet")414243if __name__ == "__main__":44 main()45