# app.py import gradio as gr import xgboost as xgb from xgboost import DMatrix from huggingface_hub import hf_hub_download from app_training_df_getter import create_app_user_training_df import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preprocessing import LabelEncoder from helper import * from helper import ChampionConverter import joblib # Define champion list for dropdowns CHAMPIONS = [ "Aatrox", "Ahri", "Akali", "Akshan", "Alistar", "Amumu", "Anivia", "Annie", "Aphelios", "Ashe", "Aurelion Sol", "Azir", "Bard", "Bel'Veth", "Blitzcrank", "Brand", "Braum", "Caitlyn", "Camille", "Cassiopeia", "Cho'Gath", "Corki", "Darius", "Diana", "Dr. Mundo", "Draven", "Ekko", "Elise", "Evelynn", "Ezreal", "Fiddlesticks", "Fiora", "Fizz", "Galio", "Gangplank", "Garen", "Gnar", "Gragas", "Graves", "Gwen", "Hecarim", "Heimerdinger", "Illaoi", "Irelia", "Ivern", "Janna", "Jarvan IV", "Jax", "Jayce", "Jhin", "Jinx", "Kai'Sa", "Kalista", "Karma", "Karthus", "Kassadin", "Katarina", "Kayle", "Kayn", "Kennen", "Kha'Zix", "Kindred", "Kled", "Kog'Maw", "KSante", "LeBlanc", "Lee Sin", "Leona", "Lillia", "Lissandra", "Lucian", "Lulu", "Lux", "Malphite", "Malzahar", "Maokai", "Master Yi", "Milio", "Miss Fortune", "Mordekaiser", "Morgana", "Naafiri", "Nami", "Nasus", "Nautilus", "Neeko", "Nidalee", "Nilah", "Nocturne", "Nunu & Willump", "Olaf", "Orianna", "Ornn", "Pantheon", "Poppy", "Pyke", "Qiyana", "Quinn", "Rakan", "Rammus", "Rek'Sai", "Rell", "Renata Glasc", "Renekton", "Rengar", "Riven", "Rumble", "Ryze", "Samira", "Sejuani", "Senna", "Seraphine", "Sett", "Shaco", "Shen", "Shyvana", "Singed", "Sion", "Sivir", "Skarner", "Sona", "Soraka", "Swain", "Sylas", "Syndra", "Tahm Kench", "Taliyah", "Talon", "Taric", "Teemo", "Thresh", "Tristana", "Trundle", "Tryndamere", "Twisted Fate", "Twitch", "Udyr", "Urgot", "Varus", "Vayne", "Veigar", "Vel'Koz", "Vex", "Vi", "Viego", "Viktor", "Vladimir", "Volibear", "Warwick", "Wukong", "Xayah", "Xerath", "Xin Zhao", "Yasuo", "Yone", "Yorick", "Yuumi", "Zac", "Zed", "Zeri", "Ziggs", "Zilean", "Zoe", "Zyra" ] try: label_encoder = joblib.load('util/label_encoder.joblib') n_classes = len(label_encoder.classes_) print("Label encoder loaded successfully") except Exception as e: print(f"Error loading label encoder: {e}") label_encoder = None # Load model try: model_path = hf_hub_download( repo_id="ivwhy/champion-predictor-model", filename="champion_predictor.json" ) # Initialize the model with proper parameters model = xgb.XGBClassifier( use_label_encoder=False, objective='multi:softprob', num_class=n_classes ) # Load the model model._Booster = xgb.Booster() model._Booster.load_model(model_path) # Set only n_classes_ model.n_classes_ = n_classes except Exception as e: print(f"Error loading model: {e}") model = None # Initialize champion name encoder # champion_encoder = LabelEncoder() # champion_encoder.fit(CHAMPIONS) #==================================== Functions ================================================= def get_user_training_df(player_opgg_url): try: print("========= Inside get_user_training_df(player_opgg_url) ============= \n") #print("player_opgg_url: ", player_opgg_url, "\n type(player_opgg_url): ", type(player_opgg_url), "\n") # Add input validation if not player_opgg_url or not isinstance(player_opgg_url, str): return "Invalid URL provided" training_df = create_app_user_training_df(player_opgg_url) return training_df except Exception as e: # Add more detailed error information import traceback error_trace = traceback.format_exc() print(f"Full error trace:\n{error_trace}") return f"Error getting training data: {str(e)}" #return f"Error getting training data: {e}" def show_stats(player_opgg_url): """Display player statistics and recent matches""" if not player_opgg_url: return "Please enter a player link to OPGG", None try: training_features = get_user_training_df(player_opgg_url) print("training_features: ", training_features, "\n") if isinstance(training_features, str): # Error message return training_features, None wins = training_features['result'].sum() losses = len(training_features) - wins winrate = f"{(wins / len(training_features)) * 100:.0f}%" favorite_champions = ( training_features['champion'] .value_counts() .head(3) .index.tolist() ) stats_html = f"""
Wins: {wins} | Losses: {losses}
Winrate: {winrate}
Favorite Champions: {', '.join(favorite_champions)}