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.
La tabla ya no es editable. Haz clic en una fila para ver el resumen correcto. """ ) 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()