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()