Spaces:
Sleeping
Sleeping
| import pandas as pd | |
| import gradio as gr | |
| # Cargar el CSV | |
| csv_url = "https://huggingface.co/datasets/Andrew12121212/RASP/resolve/main/pronosticos.csv" | |
| df = pd.read_csv(csv_url) | |
| # Agregar un ID único e inmutable (índice original) | |
| df["ID"] = df.index | |
| # Función para crear la tabla con numeración visual | |
| def numerar(data): | |
| data = data.copy() | |
| data.insert(0, "N°", range(1, len(data)+1)) | |
| return data | |
| columnas_tabla = ["N°", "Equipo A", "Equipo B", "Fecha", "Recomendación", "Cuota", "ID"] | |
| if "Resumen" not in df.columns: | |
| df["Resumen"] = "" | |
| def filtrar_tabla(equipo="", fecha=""): | |
| data = df.copy() | |
| if equipo: | |
| data = data[ | |
| data["Equipo A"].str.contains(equipo, case=False, na=False) | | |
| data["Equipo B"].str.contains(equipo, case=False, na=False) | |
| ] | |
| if fecha: | |
| data = data[data["Fecha"].str.contains(fecha, na=False)] | |
| data = data.reset_index(drop=True) | |
| data = numerar(data) | |
| return data | |
| with gr.Blocks(theme=gr.themes.Soft()) as demo: | |
| gr.Markdown( | |
| """ | |
| # ⚽️ Pronósticos de Fútbol | |
| Visualiza los partidos raspados, con filtro por equipo o fecha.<br> | |
| <small>La tabla ya no es editable. Haz clic en una fila para ver el resumen correcto.</small> | |
| """ | |
| ) | |
| with gr.Row(): | |
| equipo_input = gr.Textbox(label="Buscar equipo", placeholder="Ejemplo: América") | |
| fecha_input = gr.Textbox(label="Buscar fecha", placeholder="Ejemplo: 2025-06-07 o 07 junio 2025") | |
| tabla = gr.Dataframe( | |
| value=numerar(df)[columnas_tabla], | |
| headers=columnas_tabla, | |
| interactive=False, # SOLO LECTURA | |
| wrap=True, | |
| label="Pronósticos", | |
| show_label=True | |
| ) | |
| resumen_md = gr.Markdown("Selecciona una fila para ver el resumen.") | |
| tabla_filtrada_state = gr.State(numerar(df)) | |
| def actualizar_tabla(equipo, fecha): | |
| tabla_filtrada = filtrar_tabla(equipo, fecha) | |
| return tabla_filtrada[columnas_tabla], tabla_filtrada | |
| equipo_input.change( | |
| actualizar_tabla, | |
| inputs=[equipo_input, fecha_input], | |
| outputs=[tabla, tabla_filtrada_state] | |
| ) | |
| fecha_input.change( | |
| actualizar_tabla, | |
| inputs=[equipo_input, fecha_input], | |
| outputs=[tabla, tabla_filtrada_state] | |
| ) | |
| def on_select(tabla_filtrada, fila): | |
| if tabla_filtrada is None or fila is None or len(tabla_filtrada) == 0: | |
| return "Selecciona una fila para ver el resumen." | |
| # Recupera el ID único de la fila seleccionada | |
| id_fila = int(tabla_filtrada.iloc[fila]["ID"]) | |
| # Busca el resumen en el DataFrame original usando el ID | |
| resumen = df.loc[df["ID"] == id_fila, "Resumen"].values[0] | |
| equipoA = tabla_filtrada.iloc[fila]["Equipo A"] | |
| equipoB = tabla_filtrada.iloc[fila]["Equipo B"] | |
| fecha = tabla_filtrada.iloc[fila]["Fecha"] | |
| return f"### {equipoA} vs {equipoB} ({fecha})\n\n{resumen}" | |
| # NOTA: En modo interactive=False, el evento .select podría no estar disponible en todas las versiones de Gradio. | |
| # Si no funciona, deberás usar interactive=True pero con editable=False (en versiones nuevas de Gradio). | |
| tabla.select( | |
| on_select, | |
| inputs=[tabla_filtrada_state, gr.Number()], | |
| outputs=resumen_md | |
| ) | |
| demo.launch() | |