Jimin Park
debug
2279bd3
raw
history blame
5.99 kB
# app.py
import gradio as gr
import xgboost as xgb
from huggingface_hub import hf_hub_download
from app_training_df_getter import create_app_user_training_df
# 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"
]
# Load model
try:
model_path = hf_hub_download(
repo_id="ivwhy/champion-predictor-model",
filename="champion_predictor.json"
)
model = xgb.Booster()
model.load_model(model_path)
except Exception as e:
print(f"Error loading model: {e}")
model = None
# 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)
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"""
<div style='padding: 20px; background: #f5f5f5; border-radius: 10px;'>
<h3>Player Stats</h3>
<p>Wins: {wins} | Losses: {losses}</p>
<p>Winrate: {winrate}</p>
<p>Favorite Champions: {', '.join(favorite_champions)}</p>
</div>
"""
return stats_html, None
except Exception as e:
return f"Error processing stats: {e}", None
def predict_champion(player_opgg_url, *champions):
"""Make prediction based on selected champions"""
if not player_opgg_url or None in champions:
return "Please fill in all fields"
try:
if model is None:
return "Model not loaded properly"
features = get_user_training_df(player_opgg_url)
if isinstance(features, str): # Error message
return features
prediction = model.predict(features)
predicted_champion = CHAMPIONS[prediction[0]]
return f"Predicted champion: {predicted_champion}"
except Exception as e:
return f"Error making prediction: {e}"
# Define your interface
with gr.Blocks() as demo:
gr.Markdown("# League of Legends Champion Prediction")
with gr.Row():
player_opgg_url = gr.Textbox(label="OPGG Player URL")
show_button = gr.Button("Show Player Stats")
with gr.Row():
stats_output = gr.HTML(label="Player Statistics")
recent_matches = gr.HTML(label="Recent Matches")
with gr.Row():
champion_dropdowns = [
gr.Dropdown(choices=CHAMPIONS, label=f"Champion {i+1}")
for i in range(9)
]
with gr.Row():
predict_button = gr.Button("Predict")
prediction_output = gr.Text(label="Prediction")
# Set up event handlers
show_button.click(
fn=show_stats,
inputs=[player_opgg_url],
outputs=[stats_output, recent_matches]
)
predict_button.click(
fn=predict_champion,
inputs=[player_opgg_url] + champion_dropdowns,
outputs=prediction_output
)
# Enable queuing
#demo.queue(debug = True)
demo.launch(debug=True)
# For local testing
if __name__ == "__main__":
demo.launch()