File size: 5,363 Bytes
0868025
3943608
 
 
 
 
0868025
3943608
 
 
 
 
 
0868025
3943608
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
dd76f01
 
 
3943608
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
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()