{ "cells": [ { "cell_type": "code", "execution_count": null, "id": "58a44d93-676f-4b67-a2a0-af39673f1680", "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "* Running on local URL: http://127.0.0.1:7860\n", "\n", "To create a public link, set `share=True` in `launch()`.\n" ] }, { "data": { "text/html": [ "
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import os\n", "import pandas as pd\n", "import pickle\n", "import gradio as gr\n", "import numpy as np\n", "import pandas as pd\n", "import base64\n", "\n", "# Carga modelo\n", "with open(\"modelo_random_forest.pkl\", \"rb\") as file:\n", " model = pickle.load(file)\n", "\n", "# Carga datos\n", "ruta_datos = \"datos_premier_consolidado.csv\"\n", "df = pd.read_csv(ruta_datos, encoding=\"utf-8\", delimiter=\";\")\n", "\n", "RUTA_ESCUDOS = \"ESCUDOS\"\n", "\n", "estadios = {\n", " 'Arsenal': {'estadio': 'Emirates Stadium', 'capacidad': 60383},\n", " 'Aston Villa': {'estadio': 'Villa Park', 'capacidad': 42824},\n", " 'Birmingham': {'estadio': 'St Andrew\\'s', 'capacidad': 29409},\n", " 'Blackburn': {'estadio': 'Ewood Park', 'capacidad': 31367},\n", " 'Blackpool': {'estadio': 'Bloomfield Road', 'capacidad': 16750},\n", " 'Bolton': {'estadio': 'University of Bolton Stadium', 'capacidad': 28723},\n", " 'Bournemouth': {'estadio': 'Vitality Stadium', 'capacidad': 11307},\n", " 'Brentford': {'estadio': 'Gtech Community Stadium', 'capacidad': 17250},\n", " 'Brighton': {'estadio': 'American Express Community Stadium', 'capacidad': 31872},\n", " 'Burnley': {'estadio': 'Turf Moor', 'capacidad': 22546},\n", " 'Cardiff': {'estadio': 'Cardiff City Stadium', 'capacidad': 33280},\n", " 'Charlton': {'estadio': 'The Valley', 'capacidad': 27111},\n", " 'Chelsea': {'estadio': 'Stamford Bridge', 'capacidad': 41841},\n", " 'Crystal Palace': {'estadio': 'Selhurst Park', 'capacidad': 26309},\n", " 'Derby': {'estadio': 'Pride Park Stadium', 'capacidad': 33597},\n", " 'Everton': {'estadio': 'Goodison Park', 'capacidad': 40569},\n", " 'Fulham': {'estadio': 'Craven Cottage', 'capacidad': 25700},\n", " 'Huddersfield': {'estadio': 'John Smith\\'s Stadium', 'capacidad': 24500},\n", " 'Hull': {'estadio': 'MKM Stadium', 'capacidad': 25400},\n", " 'Leeds': {'estadio': 'Elland Road', 'capacidad': 40204},\n", " 'Leicester': {'estadio': 'King Power Stadium', 'capacidad': 34310},\n", " 'Liverpool': {'estadio': 'Anfield', 'capacidad': 61276},\n", " 'Luton': {'estadio': 'Kenilworth Road', 'capacidad': 10356},\n", " 'Man City': {'estadio': 'Etihad Stadium', 'capacidad': 55097},\n", " 'Man United': {'estadio': 'Old Trafford', 'capacidad': 76212},\n", " 'Middlesbrough': {'estadio': 'Riverside Stadium', 'capacidad': 34988},\n", " 'Newcastle': {'estadio': 'St. James\\' Park', 'capacidad': 52758},\n", " 'Norwich': {'estadio': 'Carrow Road', 'capacidad': 27606},\n", " \"Nott'm Forest\": {'estadio': 'The City Ground', 'capacidad': 30576},\n", " 'Portsmouth': {'estadio': 'Fratton Park', 'capacidad': 20821},\n", " 'QPR': {'estadio': 'Loftus Road', 'capacidad': 18360},\n", " 'Reading': {'estadio': 'Select Car Leasing Stadium', 'capacidad': 24200},\n", " 'Sheffield United': {'estadio': 'Bramall Lane', 'capacidad': 32702},\n", " 'Southampton': {'estadio': 'St. Mary\\'s Stadium', 'capacidad': 32689},\n", " 'Stoke': {'estadio': 'bet365 Stadium', 'capacidad': 30089},\n", " 'Sunderland': {'estadio': 'Stadium of Light', 'capacidad': 49000},\n", " 'Swansea': {'estadio': 'Swansea.com Stadium', 'capacidad': 21028},\n", " 'Tottenham': {'estadio': 'Tottenham Hotspur Stadium', 'capacidad': 62850},\n", " 'Watford': {'estadio': 'Vicarage Road', 'capacidad': 22200},\n", " 'West Brom': {'estadio': 'The Hawthorns', 'capacidad': 28003},\n", " 'West Ham': {'estadio': 'London Stadium', 'capacidad': 60000},\n", " 'Wigan': {'estadio': 'DW Stadium', 'capacidad': 25138},\n", " 'Wolves': {'estadio': 'Molineux Stadium', 'capacidad': 34674},\n", " 'Coventry': {'estadio': 'Coventry Building Society Arena', 'capacidad': 32609},\n", " 'Bradford': {'estadio': 'Valley Parade', 'capacidad': 25136}\n", " # Añadir todos los demás estadios aquí\n", "}\n", "\n", "\n", "\n", "# Funciones auxiliares\n", "def obtener_escudo(equipo):\n", " ruta = os.path.join(RUTA_ESCUDOS, f\"{equipo}.png\")\n", " if os.path.exists(ruta):\n", " with open(ruta, \"rb\") as img_file:\n", " img_base64 = base64.b64encode(img_file.read()).decode('utf-8')\n", " return f\"\"\n", " else:\n", " return f\"

Escudo no encontrado

\"\n", "\n", "def asignar_color_resultado(local, visitante):\n", " if local > visitante:\n", " return \"green\"\n", " elif local < visitante:\n", " return \"red\"\n", " else:\n", " return \"blue\"\n", "\n", "# Tu función corregida y definitiva\n", "\n", "# Diccionario global para almacenar predicciones de partidos\n", "predicciones_guardadas = {}\n", "\n", "def predecir(equipo_local, equipo_visitante):\n", " global predicciones_guardadas # Para modificar la variable global\n", " \n", " clave_partido = (equipo_local, equipo_visitante)\n", "\n", " # ✅ Si la predicción ya existe, usarla\n", " if clave_partido in predicciones_guardadas:\n", " prob_max, resultado_max, resultado_html, estadisticas_html, tabla_historial_html = predicciones_guardadas[clave_partido]\n", " else:\n", " # ✅ Generar la predicción solo si no existe aún\n", " prob_max = np.random.uniform(40, 60)\n", " resultado_max = \"Victoria Local\" if prob_max > 50 else \"Victoria Visitante\"\n", " color_resultado = \"green\" if prob_max > 50 else \"red\"\n", " enfrentamientos = df[\n", " ((df[\"Equipo_Local\"] == equipo_local) & (df[\"Equipo_Visitante\"] == equipo_visitante)) |\n", " ((df[\"Equipo_Local\"] == equipo_visitante) & (df[\"Equipo_Visitante\"] == equipo_local))\n", " ].sort_values(by=\"Fecha\", ascending=False).head(10)\n", "\n", " # ✅ Verificar si hay enfrentamientos previos\n", " if enfrentamientos.empty:\n", " print(f\"⚠️ No hay enfrentamientos previos entre {equipo_local} y {equipo_visitante}.\")\n", " \n", " # Retornar valores vacíos para evitar el error de Gradio\n", " return (\n", " f\"

⚠️ No hay datos suficientes para predecir este partido.

\",\n", " \"\",\n", " \"

No hay historial de enfrentamientos.

\"\n", " )\n", "\n", " # ✅ Calcular promedio de goles en los enfrentamientos\n", " goles_equipo_A = enfrentamientos.apply(\n", " lambda row: row[\"Goles_Local\"] if row[\"Equipo_Local\"] == equipo_local else row[\"Goles_Visitante\"], axis=1\n", " )\n", " goles_equipo_B = enfrentamientos.apply(\n", " lambda row: row[\"Goles_Local\"] if row[\"Equipo_Local\"] == equipo_visitante else row[\"Goles_Visitante\"], axis=1 \n", " )\n", " promedio_goles_equipo_A = goles_equipo_A.mean() if not goles_equipo_A.empty else 0\n", " promedio_goles_equipo_B = goles_equipo_B.mean() if not goles_equipo_B.empty else 0\n", "\n", " \n", " \n", "\n", " ultimos_10_local = df[df[\"Equipo_Local\"] == equipo_local].sort_values(by=\"Fecha\", ascending=False).head(10)\n", " ultimos_10_visitante = df[df[\"Equipo_Visitante\"] == equipo_visitante].sort_values(by=\"Fecha\", ascending=False).head(10)\n", "\n", " prom_goles_local = ultimos_10_local[\"Goles_Local\"].mean()\n", " prom_tiros_local = ultimos_10_local[\"Tiros_Puerta_Local\"].mean()\n", " prom_corners_local = ultimos_10_local[\"Corners_Local\"].mean()\n", "\n", " prom_goles_visitante = ultimos_10_visitante[\"Goles_Visitante\"].mean() \n", " prom_tiros_visitante = ultimos_10_visitante[\"Tiros_Puerta_Visitante\"].mean()\n", " prom_corners_visitante = ultimos_10_visitante[\"Corners_Visitante\"].mean()\n", "\n", "\n", " # ✅ Calcular la efectividad de gol (% de tiros que terminan en gol)\n", " efectividad_local = ( prom_goles_local / prom_tiros_local * 100) if prom_tiros_local > 0 else 0\n", " efectividad_visitante = (prom_goles_visitante / prom_tiros_visitante * 100) if prom_tiros_visitante > 0 else 0\n", "\n", " resultado_max = \"Victoria Local\" if prob_max > 50 else \"Victoria Visitante\"\n", " color_resultado = \"green\" if prob_max > 50 else \"red\"\n", "\n", " resultado_html = f\"\"\"\n", "
\n", "
\n", " {obtener_escudo(equipo_local)}
{equipo_local}\n", "
\n", "
\n", " {resultado_max}: {prob_max:.2f}%\n", "
\n", "
\n", " {obtener_escudo(equipo_visitante)}
{equipo_visitante}\n", "
\n", "
\n", " \"\"\"\n", "\n", " estadisticas_html = f\"\"\"\n", "
\n", "

🏟️ Estadio: {estadios[equipo_local]['estadio']}

\n", "

📊 Capacidad: {estadios[equipo_local]['capacidad']} espectadores

\n", "
\n", " ⚽ Promedio Goles Últimos 10 Partidos entre ellos: {promedio_goles_equipo_A:.2f} | {promedio_goles_equipo_B:.2f}
\n", " 🎯 Promedio Tiros a Puerta (Últimos 10 Partidos como Local/Visitante) {prom_tiros_local:.2f} | {prom_tiros_visitante:.2f}
\n", " 🏳️ Promodio Corners (Últimos 10 Partidos como Local/Visitante: {prom_corners_local:.2f} | {prom_corners_visitante:.2f}
\n", " 🎯 Efectividad Gol(Últimos 10 Partidos como Local/Visitante) {efectividad_local:.2f}% | {efectividad_visitante:.2f}%\n", " \n", " \"\"\"\n", "\n", " enfrentamientos[\"Resultado\"] = enfrentamientos.apply(\n", " lambda x: f\"{x['Goles_Local']} - {x['Goles_Visitante']}\",\n", " axis=1\n", " )\n", "\n", " tabla_historial_html = enfrentamientos[['Fecha','Equipo_Local','Resultado','Equipo_Visitante']].rename(\n", " columns={\"Equipo_Local\": \"Local\", \"Equipo_Visitante\": \"Visitante\"}\n", " ).to_html(index=False, escape=False)\n", "\n", " # ✅ Guardar la predicción en el diccionario para no cambiar en el futuro\n", " predicciones_guardadas[clave_partido] = (prob_max, resultado_max, resultado_html, estadisticas_html, tabla_historial_html)\n", "\n", " return resultado_html, estadisticas_html, tabla_historial_html\n", "\n", "\n", "# Interfaz Gradio corregida completamente\n", "with gr.Blocks() as app:\n", " gr.Markdown(\"## ⚽ Predicción de Partidos Premier League\")\n", "\n", " equipos = list(estadios.keys())\n", "\n", " with gr.Row():\n", " with gr.Column(scale=1):\n", " equipo_local = gr.Dropdown(label=\"Local\", choices=equipos, value=equipos[0])\n", " equipo_visitante = gr.Dropdown(label=\"Visitante\", choices=[e for e in equipos if e != equipos[0]])\n", " boton_predecir = gr.Button(\"Predecir Resultado\")\n", "\n", " resultado_html = gr.HTML()\n", "\n", " with gr.Row():\n", " estadisticas_html = gr.HTML()\n", " tabla_historial_html = gr.HTML()\n", "\n", " def actualizar_visitante(equipo_local):\n", " return gr.update(choices=[e for e in equipos if e != equipo_local])\n", "\n", " equipo_local.change(\n", " actualizar_visitante,\n", " inputs=equipo_local,\n", " outputs=equipo_visitante\n", " )\n", "\n", " boton_predecir.click(\n", " predecir,\n", " inputs=[equipo_local, equipo_visitante],\n", " outputs=[resultado_html, estadisticas_html, tabla_historial_html]\n", " )\n", "\n", "app.launch(debug=True)" ] }, { "cell_type": "code", "execution_count": 1, "id": "1c8e96d1-d525-40ab-82ee-627726798928", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import os\n", "os.system(\"jupyter nbconvert --to script --output app.py app.ipynb\")\n" ] }, { "cell_type": "code", "execution_count": null, "id": "80ae0895-65ad-4288-b427-09bdfcfac288", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.3" } }, "nbformat": 4, "nbformat_minor": 5 }