Spaces:
Sleeping
Sleeping
| # -*- 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() |