SPB Git

spb/wp2_uqo Public

UQO Working Paper No. 2 — Decoding Real Estate Descriptions: text-based hedonic analysis of housing listings.

TeX 73.8% Python 26%
1.6 KB · 48 lines python
Raw Blame History
1# Author: Simon-Pierre Boucher — contact@spboucher.ai2#3"""Hedonic OLS specifications A-E (standardized covariates, HC3 errors)."""45import pandas as pd6import statsmodels.api as sm7from sklearn.preprocessing import StandardScaler89from .config import STRUCTURAL_VARS10from .references import SIM_COLS111213def standardized_design(df, columns):14    """Z-score the selected columns and prepend a constant."""15    X = pd.DataFrame(16        StandardScaler().fit_transform(df[columns]),17        columns=columns,18        index=df.index,19    )20    return sm.add_constant(X)212223def fit_ols(df, columns, y=None):24    """OLS of log-price on standardized covariates with HC3 robust errors."""25    if y is None:26        y = df["log_price"]27    return sm.OLS(y, standardized_design(df, columns)).fit(cov_type="HC3")282930def fit_all_models(df):31    """Fit specifications A-E and return them with the significant-similarity list.3233    A: structural only            B: A + description length34    C: A + 20 similarities        D: B + 20 similarities (full)35    E: B + similarities significant at 5% in D (parsimonious)36    """37    specs = {38        "A": STRUCTURAL_VARS,39        "B": STRUCTURAL_VARS + ["remarks_length"],40        "C": STRUCTURAL_VARS + SIM_COLS,41        "D": STRUCTURAL_VARS + ["remarks_length"] + SIM_COLS,42    }43    models = {name: fit_ols(df, cols) for name, cols in specs.items()}44    sig_sims = [v for v in SIM_COLS if models["D"].pvalues.get(v, 1) < 0.05]45    specs["E"] = STRUCTURAL_VARS + ["remarks_length"] + sig_sims46    models["E"] = fit_ols(df, specs["E"])47    return models, specs, sig_sims48