Esteban00007's picture
Update app.py
dd76f01 verified
import gradio as gr
import pandas as pd
from prophet import Prophet
import pickle
import matplotlib.pyplot as plt
from datetime import datetime
# Cargar los modelos entrenados para cada isla
modelos = {
'Mallorca': pickle.load(open('model_Mallorca.pkl', 'rb')),
'Menorca': pickle.load(open('model_Menorca.pkl', 'rb')),
'Ibiza': pickle.load(open('model_Ibiza.pkl', 'rb')),
}
# Mapeo de los nombres de los meses
meses = {
"Enero": 1, "Febrero": 2, "Marzo": 3, "Abril": 4,
"Mayo": 5, "Junio": 6, "Julio": 7, "Agosto": 8,
"Septiembre": 9, "Octubre": 10, "Noviembre": 11, "Diciembre": 12
}
# Función para realizar la predicción y generar los gráficos
def predecir_turistas(isla, año, mes_nombre):
# Seleccionar el modelo de la isla elegida
modelo = modelos[isla]
mes = meses[mes_nombre] # Convertir el nombre del mes a número
# Crear una fecha con el año y mes ingresado
fecha = pd.to_datetime(f"{año}-{mes}-01")
# Generar predicciones extendidas en el tiempo
future_anual = modelo.make_future_dataframe(periods=365 * (año - datetime.now().year + 1), freq='D')
# Realizar predicciones sobre el periodo extendido
forecast_anual = modelo.predict(future_anual)
# Filtrar la predicción específica del mes y año seleccionados
prediccion_mes = forecast_anual[(forecast_anual['ds'].dt.year == año) & (forecast_anual['ds'].dt.month == mes)]
if prediccion_mes.empty:
return "No hay predicción disponible para esta fecha.", None, None, None
prediccion = prediccion_mes['yhat'].values[0]
# Filtrar las predicciones del año completo para el gráfico
forecast_anio = forecast_anual[forecast_anual['ds'].dt.year == año]
# Generar el gráfico de predicciones para el año completo
plt.figure(figsize=(10, 6))
plt.plot(forecast_anio['ds'], forecast_anio['yhat'], color='red', label="Predicciones")
plt.fill_between(forecast_anio['ds'], forecast_anio['yhat_lower'], forecast_anio['yhat_upper'], color='pink', alpha=0.3, label="Intervalo de confianza")
plt.xlabel("Fecha")
plt.ylabel("Número de Turistas")
plt.title(f"Predicción de turistas en {isla} para {año}")
plt.legend()
plt.grid(True)
# Guardar el gráfico anual
plt.savefig("prediccion_anual.png")
plt.close()
# Generar el gráfico por isla
fig_isla = modelo.plot(forecast_anual)
ax_isla = fig_isla.gca()
ax_isla.lines[0].set_color('blue') # Datos reales
ax_isla.lines[0].set_linestyle('-')
ax_isla.lines[1].set_color('red') # Predicciones
plt.title(f'Predicción de turistas en {isla}')
# Guardar el gráfico por isla
plt.savefig(f'grafico_prediccion_{isla}.png')
plt.close()
# Filtrar las predicciones solo para el mes específico
forecast_mes = forecast_anual[(forecast_anual['ds'].dt.year == año) & (forecast_anual['ds'].dt.month == mes)]
# Generar el gráfico de predicción solo para el mes
plt.figure(figsize=(10, 6))
plt.plot(forecast_mes['ds'], forecast_mes['yhat'], color='orange', label="Predicción del Mes")
plt.fill_between(forecast_mes['ds'], forecast_mes['yhat_lower'], forecast_mes['yhat_upper'], color='yellow', alpha=0.3, label="Intervalo de confianza")
plt.xlabel("Fecha")
plt.ylabel("Número de Turistas")
plt.title(f"Predicción de turistas en {isla} para {mes_nombre} {año}")
plt.legend()
plt.grid(True)
# Guardar el gráfico del mes
plt.savefig(f'grafico_prediccion_mes_{isla}_{año}_{mes_nombre}.png')
plt.close()
# Formatear la salida
prediccion_texto = f"Predicción para {isla} en {mes_nombre} {año}: {int(prediccion):,} turistas"
return prediccion_texto, "prediccion_anual.png", f'grafico_prediccion_{isla}.png', f'grafico_prediccion_mes_{isla}_{año}_{mes_nombre}.png'
# Crear la interfaz Gradio
interfaz = gr.Interface(
fn=predecir_turistas,
inputs=[
gr.Dropdown(choices=['Mallorca', 'Menorca', 'Ibiza'], label="Isla"),
gr.Number(label="Año", value=2024, precision=0),
gr.Dropdown(choices=list(meses.keys()), label="Mes")
],
outputs=[
gr.Textbox(label="Predicción del Número de Turistas"),
gr.Image(label="Gráfico de Predicción Anual"),
gr.Image(label="Gráfico de Predicción por Isla"),
gr.Image(label="Gráfico de Predicción del Mes")
],
title="Predicción de turistas por medio aéreo en las Islas Baleares",
description=(
"Seleccione una isla, un año y un mes para obtener la predicción del número de turistas y los gráficos correspondientes.\n\n"
"He desarrollado un modelo predictivo que permite anticipar el turismo aéreo en las Islas Baleares.\n"
"Para entrenar los modelos por isla, he construido una base de datos (representada en la línea azul) y he limpiado los datos (como los efectos del COVID).\n"
"Los datos fueron obtenidos de la Agencia de Estrategia Turística de las Islas Baleares, "
"Consejería de Modelo Económico, Turismo y Trabajo del Gobierno de las Islas Baleares.\n"
"Los datos son a su vez recopilados de AENA, específicamente para los pasajeros por vía aérea.\n\n"
"Autor del modelo y app: Esteban Bardolet Pomar\n\n"
"¡Interactúe con la herramienta para explorar las tendencias turísticas!\n"
)
)
# Lanzar la interfaz
interfaz.launch()