Trabajo de Fin de Grado · Ingeniería Informática

Movilidad ESII

Herramienta de escritorio desarrollada en Python para la gestión centralizada y visualización geográfica de la movilidad académica en la Escuela Superior de Ingeniería Informática en el campus de Albacete (ESIIAB).

Instalador Windows autocontenido · sin conexión a internet · código abierto

Stack Tecnológico

Frontend
Streamlit

Interfaz web reactiva con mínimo código frontend, ideal para aplicaciones de datos.

Backend
Flask

API REST ligera que desacopla la lógica de negocio de la capa de presentación.

Procesamiento
pandas

Filtrado, agregación y transformación de datos en memoria sobre DataFrames.

Visualización
Folium · Leaflet

Mapas interactivos HTML autocontenidos sin dependencia de servicios externos.

Persistencia
Excel · xlrd · openpyxl

Lectura y escritura directa de los ficheros Excel institucionales ya existentes.

Empaquetado
PyInstaller · Inno Setup

Distribución como instalador Windows sin requerir Python en el equipo de destino.

El Problema

La gestión de la movilidad académica -programas Erasmus, convenios bilaterales e intercambios nacionales- implica el manejo de grandes volúmenes de datos heterogéneos: universidades de destino, asignaturas reconocidas, estudiantes participantes, cursos académicos y países involucrados.

En la ESII este proceso se realizaba de forma manual, dispersa y dependiente de hojas de cálculo Excel. Esto generaba inconsistencias, dificultaba la consulta histórica e impedía obtener una visión global y actualizada de la movilidad.

Los coordinadores carecían de una herramienta que les permitiese explorar la información de forma interactiva, filtrar por parámetros relevantes o generar informes fácilmente, lo que ralentizaba la toma de decisiones y aumentaba la carga administrativa.

  • Datos dispersos

    Información distribuida en múltiples ficheros Excel sin estructura unificada.

  • Sin visión geográfica

    Imposible visualizar a qué países y ciudades se dirigen los estudiantes.

  • Consultas lentas

    Filtrar por titulación, curso o destino requería búsquedas manuales tediosas.

  • Sin estadísticas integradas

    Obtener métricas agregadas exigía realizar cálculos manuales puntuales fuera del sistema.

La Solución

Movilidad ESII centraliza toda la información en una aplicación de escritorio multiplataforma que combina una interfaz web local (Streamlit) con una API REST ligera (Flask), ofreciendo exploración interactiva, visualización cartográfica y exportación directa a Excel.

Datos de entrada
Ficheros Excel históricos, datos de universidades y asignaturas
Movilidad ESII
Procesamiento, almacenamiento y visualización integrados
Resultados
Mapas interactivos, estadísticas y exportación a Excel

Demostración

A continuación se muestran las principales pantallas de la aplicación.

Vista principal del mapa interactivo de destinos
Mapa interactivo de destinos
Panel de búsqueda y filtros del mapa
Búsqueda y filtrado de datos
Módulo de estadísticas con gráficos
Panel de estadísticas
Exportación de estadísticas a Excel
Exportación a Excel

Arquitectura del Sistema

El sistema se organiza en capas desacopladas que separan la presentación, la lógica de negocio, el acceso a datos y la seguridad.

Capa de Presentación
Streamlit UI Vistas de mapa Vistas de estadísticas Popups y formularios
Capa de API
Flask REST API Rutas y endpoints Validadores
Capa de Dominio
Modelos de datos Filtros de mapa Filtros de estadísticas Ciudades ES
Capa de Persistencia
Excel (.xls/.xlsx) pandas DataFrames xlrd / openpyxl Carga de datos Actualización Excel Hojas de materias
Utilidades y Seguridad
Configuración Token manager Exportación Procesado de mapas

Funcionalidades Principales

Exploración Interactiva

Búsqueda en tiempo real de estudiantes, universidades y asignaturas. Filtros combinables por titulación, curso académico, país y tipo de movilidad. Resultados paginados y ordenables.

  • Búsqueda por nombre y código
  • Filtros por ámbito y titulación
  • Panel lateral de filtros combinables

Visualización Geográfica

Mapa interactivo basado en Folium con marcadores geolocalizados por destino. Visualización por intensidad de flujos, agrupación de puntos cercanos y popups con detalle de cada movilidad.

  • Marcadores por país y ciudad
  • Capas filtrables
  • Popups con información completa

Estadísticas Globales

Módulo de análisis con gráficos nativos de Streamlit sobre DataFrames de pandas. Distribución por países, progresión por curso académico, comparativa entre titulaciones y desglose por tipo de programa de movilidad.

  • Gráficos de barras y líneas
  • Progresión anual de intercambios
  • Comparativa por titulación

Exportación a Excel

Generación de informes Excel con openpyxl a partir de los resultados filtrados. Plantillas predefinidas, estilos aplicados automáticamente y actualización incremental de ficheros existentes.

  • Exportación de vistas filtradas
  • Plantillas con estilos
  • Actualización de ficheros existentes

Decisiones Técnicas

¿Por qué Python?

Python ofrece un ecosistema maduro para el procesamiento de datos (pandas, openpyxl), la creación de interfaces web ligeras (Streamlit, Flask) y el empaquetado de aplicaciones de escritorio (PyInstaller). Su legibilidad facilita el mantenimiento por parte del personal técnico de la ESII sin experiencia previa en el proyecto.

Frente a alternativas como Java (Swing) o Electron, Python reduce significativamente el tiempo de desarrollo al evitar capas de abstracción innecesarias para un sistema de uso interno.

¿Por qué visualización geográfica?

Los datos de movilidad tienen una dimensión espacial inherente: cada intercambio implica un origen y un destino geolocalizable. Representar esto en un mapa convierte datos abstractos en conocimiento visual inmediato, facilitando la identificación de patrones de concentración en determinados países o ciudades.

Folium, basado en Leaflet.js, permite generar mapas HTML autocontenidos que pueden abrirse sin conexión a internet, lo cual es crítico en entornos de uso institucional.

¿Por qué Streamlit + Flask?

Streamlit proporciona una interfaz reactiva con mínimo código frontend, ideal para aplicaciones de datos orientadas a usuarios no técnicos. Flask actúa como backend ligero que expone una API REST, desacoplando la lógica de negocio de la capa de presentación y facilitando futuras integraciones.

¿Por qué Excel como persistencia?

Los datos de movilidad ya existían en formato Excel en la ESII. Mantener Excel como registro oficial de datos elimina la fricción de migración: los coordinadores pueden seguir actualizando los ficheros con las herramientas que conocen, y la aplicación los lee directamente con xlrd y openpyxl.

pandas actúa como capa de procesamiento en memoria: permite filtrar, agregar y transformar los datos con un rendimiento más que suficiente para los volúmenes manejados, sin necesidad de una base de datos adicional.

Retos y Aprendizajes

Calidad e inconsistencia de los datos históricos

Los ficheros Excel de partida presentaban inconsistencias en nombres de universidades, códigos de asignaturas y formatos de fecha. El mayor reto fue diseñar un proceso de carga robusto capaz de normalizar y validar los datos de entrada sin perder información. Se implementó un pipeline de transformación con reglas configurable y registro detallado de errores.

Geolocalización sin API externa

Para no depender de servicios de geocodificación externos, las coordenadas de cada universidad de destino se mantienen en una hoja específica del propio fichero Excel institucional (Coordenadas), con las columnas país, universidad y coordenadas. Al cargar los datos, la aplicación cruza el nombre de la universidad de cada alumno con esa hoja y asigna la coordenada correspondiente sin necesidad de conexión a internet. Para el alta manual de nuevos registros se integra Nominatim (OpenStreetMap) como geocodificador opcional, con degradación elegante si no hay red disponible.

Empaquetado como aplicación de escritorio

Distribuir una aplicación Python con Streamlit como ejecutable Windows requirió resolver múltiples problemas de PyInstaller: dependencias ocultas de Streamlit, recursos estáticos, scripts de lanzamiento de procesos secundarios y scripts de instalación con Inno Setup. Cada iteración del empaquetado reveló nuevas dependencias no declaradas.

Diseño visual e intuitivo para la gestión de datos

Aunque la gestión de la movilidad se realizaba hasta ahora con hojas de cálculo Excel, este enfoque resultaba tedioso, propenso a errores y difícil de mantener a medida que el volumen de datos crecía. El reto consistió en diseñar una interfaz visual que centralizase toda la información en un único sistema, simplificase los flujos de trabajo más habituales y ofreciese una experiencia de consulta y edición de datos mucho más ágil y clara que la navegación manual por múltiples ficheros desconectados.

Instalación

Recomendado Instalador Windows (.exe)

Descarga el instalador generado con Inno Setup mediante el workflow de GitHub Actions. No requiere Python instalado: incluye todas las dependencias empaquetadas. Hay dos variantes disponibles:

  • Con datos de demostraciónMovilidadESII_Installer_ConData.exe: incluye datos de ejemplo para explorar la aplicación desde el primer momento.
  • Sin datosMovilidadESII_Installer_SinData.exe: instalación limpia para uso en producción con los ficheros Excel reales de la institución.

Ir a la última release

  1. En la sección Assets de la release, descarga MovilidadESII_Installer_ConData.exe (con datos de demo) o MovilidadESII_Installer_SinData.exe (producción).
  2. Ejecuta el instalador y sigue los pasos del asistente.
  3. Abre Movilidad ESII desde el acceso directo del escritorio.

La release también incluye un archivo SHA256.txt con los hashes de verificación de ambos instaladores. Puedes usarlo para comprobar que el archivo descargado no ha sido alterado.

Desde código fuente

Requiere Python 3.12 y pip. Sigue los pasos indicados en el README.

  1. Clona el repositorio:
    git clone https://github.com/mariapicazosanchez/TFG-MariaPicazoSanchez
        cd TFG-MariaPicazoSanchez
  2. Instala las dependencias:
    pip install -r install_root/requirements.txt
  3. Lanza la aplicación:
    py launcher_system.py --dev

Requisitos del sistema

Componente Mínimo Recomendado
Sistema operativo Windows 10 Windows 10 / 11
Python 3.10 3.12
RAM 4 GB 8 GB
Espacio en disco 500 MB 1 GB

Advertencia de SmartScreen

Los instaladores no están firmados digitalmente, por lo que Windows los mostrará como de publicador desconocido. Esto es habitual en proyectos académicos sin certificado de firma de código. La aplicación es completamente segura; el código fuente y el pipeline de construcción son públicamente auditables en este repositorio.

¿Por qué aparece el aviso?
  • Sin firma de código. El instalador no está firmado con un certificado Authenticode reconocido por Windows, por lo que aparece como «Publicador desconocido».
  • Sin reputación acumulada. SmartScreen también evalúa cuántos usuarios han descargado y ejecutado un archivo concreto. Un binario recién publicado parte de reputación cero.

Es el comportamiento esperado en proyectos académicos y no indica ningún riesgo.

Cómo resolver la advertencia

Desbloquear desde Propiedades

El método más sencillo. No requiere ningún archivo adicional.

  1. Descarga el archivo .exe. No lo ejecutes todavía.
  2. Abre la carpeta donde se guardó el archivo.
  3. Haz clic derecho sobre el archivo → Propiedades.
  4. En la pestaña General, desplázate hasta la parte inferior. Si Windows marcó el archivo como descargado de internet, verás el siguiente aviso:
  5. Marca la casilla DesbloquearAplicarAceptar.
  6. Ya puedes ejecutar el instalador.

Si la casilla Desbloquear no aparece, el archivo ya fue desbloqueado o se descargó de forma que no activó la marca de zona. No es necesaria ninguna acción adicional.

Nota: para eliminar el aviso de publicador desconocido sería necesario un certificado de firma de código comercial emitido por una CA reconocida (DigiCert, Sectigo…). Para una distribución académica de alcance limitado, el desbloqueo manual desde Propiedades es suficiente.

María Picazo Sánchez

Grado en Ingeniería Informática

Escuela Superior de Ingeniería Informática en el campus de Albacete (ESIIAB)

Universidad de Castilla-La Mancha · Curso 2025–2026