import gradio as gr import pandas as pd import numpy as np from datetime import datetime import joblib from tensorflow.keras.models import load_model from huggingface_hub import hf_hub_download # Configuración HF_USER = "DomiDelgado2314" REPO_NAME = "ProyectoFIN" CSV_EJEMPLO_URL = f"https://huggingface.co/{HF_USER}/{REPO_NAME}/resolve/main/ejemplo_para_usuario.csv" # Descargar archivos del repositorio Hugging Face scaler_path = hf_hub_download(repo_id=f"{HF_USER}/{REPO_NAME}", filename="scaler.save") model_path = hf_hub_download(repo_id=f"{HF_USER}/{REPO_NAME}", filename="modelo_bitcoin.keras") # Cargar scaler y modelo scaler = joblib.load(scaler_path) model = load_model(model_path) # Columnas esperadas por el modelo model_columns = [ 'Volumen_Bitcoin', 'Tasa_Deposito_BCE', 'Indice_Materias_Pri_BCOM', 'IPC_China', 'Indice_Dolar_DXY', 'IPC_Zona_Euro', 'Tasa_Desempleo_Zona_Euro', 'Tasa_Fondos_FED', 'Precio_Oro_USD', 'Cierre_Nasdaq', 'Direcciones_Activas_Bitcoin', 'Cierre_SP500', 'Cierre_Stoxx50', 'IPC_EEUU', 'Tasa_Desempleo_EEUU', 'Indice_Volatilidad_VIX', 'Volumen_Comercio_Global' ] # Validar formato de fecha def validar_fecha(fecha_str): try: fecha = datetime.strptime(fecha_str, "%Y-%m-%d") except: return False, "Formato de fecha inválido. Usa YYYY-MM-DD." if fecha <= datetime(2025, 5, 16): return False, "Fecha debe ser posterior al 2025-05-16." if fecha > datetime(2025, 12, 31): return False, "Fecha no puede ser posterior al 2025-12-31." return True, fecha # Función de predicción def predecir_precio(csv_file, fecha_str): valido, res = validar_fecha(fecha_str) if not valido: return res fecha = res try: df_user = pd.read_csv(csv_file.name) except Exception as e: return f"Error al leer CSV: {e}" faltantes = [col for col in model_columns if col not in df_user.columns] if faltantes: return f"Faltan columnas obligatorias en CSV: {faltantes}" df_vars = df_user[model_columns].copy() try: X_scaled = scaler.transform(df_vars) except Exception as e: return f"Error al escalar variables: {e}" año, mes, dia = fecha.year, fecha.month, fecha.day X_df = pd.DataFrame(X_scaled, columns=model_columns) X_df["Año"], X_df["Mes"], X_df["Día"] = año, mes, dia X_input = X_df.to_numpy() try: pred_scaled = model.predict(X_input) except Exception as e: return f"Error en la predicción: {e}" precio_pred = pred_scaled.flatten()[0] return f"Predicción de Precio de Bitcoin para {fecha_str}: {precio_pred:,.2f} USD" # Interfaz Gradio with gr.Blocks() as demo: gr.Markdown("## 🪙 Predicción Precio Bitcoin") gr.Markdown(f"📥 [Descarga aquí el CSV de ejemplo]({CSV_EJEMPLO_URL})") csv_input = gr.File(label="Sube tu archivo CSV con las variables") fecha_input = gr.Textbox(label="Fecha a predecir (YYYY-MM-DD)", value="2025-05-17") btn_predict = gr.Button("Predecir Precio") output_msg = gr.Textbox(label="Resultado", interactive=False) btn_predict.click( fn=predecir_precio, inputs=[csv_input, fecha_input], outputs=output_msg ) demo.launch()