RASP / app.py
Andrew12121212's picture
Update app.py
4df0bc7 verified
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()