# -*- coding: utf-8 -*- """tabular_gradio.ipynb Automatically generated by Colab. Original file is located at https://colab.research.google.com/drive/1-_lDVeqDrMkiSuBA380Q7IC2WYa0NHcF """ import os # For filesystem operations import shutil # For directory cleanup import zipfile # For extracting model archives import pathlib # For path manipulations import pandas as pd # For tabular data handling import gradio as gr # For interactive UI import huggingface_hub # For downloading model assets import autogluon.tabular # For loading and running AutoGluon predictors # Settings MODEL_REPO_ID = "mrob937/2024-24679-tabular-autogluon-predictor" ZIP_FILENAME = "autogluon_predictor_dir.zip" CACHE_DIR = pathlib.Path("hf_assets") EXTRACT_DIR = CACHE_DIR / "predictor_native" FEATURE_COLS = [ "Tgt", "Rec", "Yds", "YBC/R", "YAC/R", "ADOT", "Drop%", "Rat" ] TARGET_COL = "Elite" def _prepare_predictor_dir() -> str: CACHE_DIR.mkdir(parents=True, exist_ok=True) local_zip = huggingface_hub.hf_hub_download( repo_id=MODEL_REPO_ID, filename=ZIP_FILENAME, repo_type="model", local_dir=str(CACHE_DIR), local_dir_use_symlinks=False, ) if EXTRACT_DIR.exists(): shutil.rmtree(EXTRACT_DIR) EXTRACT_DIR.mkdir(parents=True, exist_ok=True) with zipfile.ZipFile(local_zip, "r") as zf: zf.extractall(str(EXTRACT_DIR)) contents = list(EXTRACT_DIR.iterdir()) predictor_root = contents[0] if (len(contents) == 1 and contents[0].is_dir()) else EXTRACT_DIR return str(predictor_root) PREDICTOR_DIR = _prepare_predictor_dir() PREDICTOR = autogluon.tabular.TabularPredictor.load(PREDICTOR_DIR, require_py_version_match=False) OUTCOME_MAP = { 0: "Not Elite", 1: "Elite", } def _human_label(c): try: ci = int(c) if ci in OUTCOME_MAP: return OUTCOME_MAP[ci] except Exception: pass return str(c) def do_predict(player, tgt, rec, yds, ybc_r, yac_r, adot, drop_pct, rat): row = { "Player": str(player), FEATURE_COLS[0]: float(tgt), FEATURE_COLS[1]: float(rec), FEATURE_COLS[2]: float(yds), FEATURE_COLS[3]: float(ybc_r), FEATURE_COLS[4]: float(yac_r), FEATURE_COLS[5]: float(adot), FEATURE_COLS[6]: float(drop_pct), FEATURE_COLS[7]: float(rat), } X = pd.DataFrame([row], columns=["Player"] + FEATURE_COLS) pred_series = PREDICTOR.predict(X) raw_pred = pred_series.iloc[0] try: proba = PREDICTOR.predict_proba(X) if isinstance(proba, pd.Series): proba = proba.to_frame().T except Exception: proba = None pred_label = _human_label(raw_pred) proba_dict = None if proba is not None: row0 = proba.iloc[0] tmp = {} for cls, val in row0.items(): key = _human_label(cls) tmp[key] = float(val) + float(tmp.get(key, 0.0)) proba_dict = dict(sorted(tmp.items(), key=lambda kv: kv[1], reverse=True)) if proba_dict: return {f"{player} → {k}": v for k, v in proba_dict.items()} else: return {f"{player} → {pred_label}": 1.0} EXAMPLES = [ ["Justin Jefferson", 8.0, 5.0, 65.0, 6.0, 4.0, 8.5, 1.5, 137.2], ["Cooper Kupp", 15.0, 10.0, 140.0, 8.0, 6.0, 9.0, 0.5, 118.5], ["Rookie WR", 3.0, 2.0, 12.0, 4.0, 3.0, 5.0, 4.0, 50.5], ["Tyreek Hill", 20.0, 14.0, 220.0, 10.0, 8.0, 12.0, 0.2, 130.0], ["Bench Player", 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 10.0, 30.0], ] with gr.Blocks() as demo: gr.Markdown("# Football: Will this player be Elite?") gr.Markdown("Enter the player's name and stats below. The model will predict whether they're Elite and show probabilities.") player_name = gr.Textbox(value="Example Player", label="Player Name") with gr.Row(): tgt = gr.Slider(0, 30, value=8.0, step=0.5, label=FEATURE_COLS[0]) rec = gr.Slider(0, 20, value=5.0, step=0.5, label=FEATURE_COLS[1]) with gr.Row(): yds = gr.Number(value=60.0, precision=1, label=FEATURE_COLS[2]) ybc_r = gr.Number(value=6.0, precision=2, label=FEATURE_COLS[3]) with gr.Row(): yac_r = gr.Number(value=4.0, precision=2, label=FEATURE_COLS[4]) adot = gr.Number(value=8.0, precision=2, label=FEATURE_COLS[5]) with gr.Row(): drop_pct = gr.Slider(0.0, 100.0, value=1.5, step=0.1, label=FEATURE_COLS[6]) rat = gr.Slider(0.0, 158.0, value=7.2, step=0.1, label=FEATURE_COLS[7]) proba_pretty = gr.Label(num_top_classes=5, label="Class probabilities") inputs = [player_name, tgt, rec, yds, ybc_r, yac_r, adot, drop_pct, rat] for comp in inputs: comp.change(fn=do_predict, inputs=inputs, outputs=[proba_pretty]) gr.Examples( examples=EXAMPLES, inputs=inputs, label="Representative examples", examples_per_page=5, cache_examples=False, ) if __name__ == "__main__": demo.launch()