"""Pick the recommender on a validation cut-off (30 Jun -> 1 Jul-25 Aug) before touching the 25 Aug test.""" import numpy as np, pandas as pd, lightgbm as lgb, pickle from scipy.stats import rankdata from p03_reco import build, topk, evaluate, FEATS from pcommon import * def blend(F): r = lambda c: F.groupby('outlet_id')[c].rank(pct=True) return 0.5 * r('itemcf') + 0.3 * r('vanshare') + 0.2 * r('usercf') res = {} for name, trc, tec in (('validation', ['2026-05-05', '2026-06-02'], '2026-06-30'), ('test', ['2026-06-02', '2026-06-30'], str(RECO_CUTOFF.date()))): tr = pd.concat([build(pd.Timestamp(c)) for c in trc], ignore_index=True); te = build(pd.Timestamp(tec)) rk = lgb.LGBMClassifier(n_estimators=400, learning_rate=0.05, num_leaves=63, min_child_samples=100, subsample=0.8, subsample_freq=1, colsample_bytree=0.8, verbose=-1, n_jobs=2).fit(tr[FEATS], tr.y) te['p'] = rk.predict_proba(te[FEATS])[:, 1]; te['blend'] = blend(te) r = {'ranker': evaluate(te, topk(te, te.p)), 'item_cf': evaluate(te, topk(te, te.itemcf)), 'blend': evaluate(te, topk(te, te.blend)), 'van_best_sellers': evaluate(te, topk(te, te.vanshare + 1e-6 * te['pop'])), 'push_best_sellers': evaluate(te, topk(te, te['pop'] + 1e-6 * te.itemcf))} res[name] = r for k, v in r.items(): print(name, k, {a: round(float(b), 4) for a, b in v.items()}) if name == 'test': pickle.dump({'te': te, 'rk': rk, 'res': res}, open(f'{WORK}/reco_test.pkl', 'wb')) pickle.dump(res, open(f'{WORK}/reco_select.pkl', 'wb'))