ProyectoFIN / app.py
DomiDelgado2314's picture
Update app.py
0dcf03b verified
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()