Nuestra principal misión es realizar predicciones de las alturas de las olas en la playa de Tramore (Irlanda) para mejorar la experiencia de los surfistas. Para ello, nos apoyamos en distintas fuentes como páginas web climatológicas y oceanográficas.
- Python
v3.11 - Data Manipulation:
pandas,numpy - Data Visualization:
matplotlib - Data Mining:
requests,json,Path
Creamos el entorno virtual en la carpeta venv(ejecutamos desde la raiz del proyecto)
python -m venv venv
Activamos el entorno (siempre al empezar a trabajar)
Windows:
venv\Scripts\activate.bat
Linux/Mac:
source venv/bin/activate
Estando en esa consola con el entorno activo, instalamos los modulos necesarios
pip install -r requirements.txt
Carga de datos del drive (a la carpeta raw, especidicado en archivos_info.txt)
python ./adquisicion/main.py
Preprocesamiento de datos, especificando los parámetros
python ./preprocess/main.py --ruta_boya ./raw/fuente_principal.parquet --ruta_meteo ./raw/fuente_secundaria.parquet --ruta_lunar ./raw/fuente_terciaria.parquet
Inicializar programa
python main.py
Para ejecutarlo desde el entorno virtual
python -m jupyter notebook
Los resultados se guardarán en el archivo mlruns.db
mlflow ui --port 5000 --backend-store-uri sqlite:///mlruns.db
Entrenamos el modelo
flo = MLFlow(<nombre de la técnica usada (regresion lineal/ arboles de decisión...)>)
params = {}
model = LinearRegression(**params)
model.fit(X_train, y_train)
Calcula las métricas y las guarda en mlflow
flo.persist_model_to_mlflow(X_train, X_test, y_train, y_test, model, params, "Regresión lineal")
-Link de donde se han obtenido los datos de la boya: https://www.windguru.cz/archive.php?id_spot=47761&id_model=3&date_from=2023-01-01&date_to=2024-01-01
-Link de donde se obtienen los datos climatológicos mediante la api: "https://api.weather.com/v1/location/EIWF:9:IE/observations/historical.json"
Los datos se obtienen de google drive, nuestra base de datos. Estos habían sido obtenidos previamente a través de los links anteriormente mencionados.
El preprocesamiento se divide en las siguientes etapas:
- Eliminación de columnas irrelevantes: Se eliminan todas aquellas variables que toman un único valor o tienen todo nulos.
- Tratamiento de nulos: En cuanto a nuestra fuente principal, los nulos realemte representas 0´s, por lo que simplemente reemplazamos todos lo nulos por 0. Sin embargo, hay nulos ocultos, que vienen representados por guiones (-). Al haber pocas observaciones con nulos, decidimos eliminarlas. Referente a la fuente secundaria, tan sólo hay dos variables con muchos nulos:
gus´ ywdir. Decidimos eliminar dichas variables puesto que si optamos por eliminar las observaciones que contienen algún nulo, nuestra base de datos se reduciría más de un 80%. La imputación hemos decidido descartarlas por la gran cantidad de nulos presentes en dichas variables. Una vez quitadas las variables, nos quedan 17 nulos concentrados el 1 de febrero de 2022, suponemos que se debe a un mal funcionamiento de los aparatos de medición. En este caso, eliminamos las observaciones con algún nulo. - Tratamiento de nulos
Con predicciones nos referimos a predicciones (llamado forecast en el repositorio para evitar ambiguedad) que hacen otras compañias para datos que no sea la altura de las olas.
Dado que nos basaremos en predicciones de otros datos para predecir la altura de la ola, para evaluar el rendimiento del sistema de forma más aproximada a la situación real posible hemos implementando un sistema de recoleccion (la carpeta forecasts/adquisicion) de predicciones de diferentes días/horas que se guardan en las carpetas forecasts/*-raw.
Con el código de preprocesado en esa misma carpeta (forecasts/preprocess) sacamos la antelación de las predicciones para posteriormente evaluar el rendimiento en función de la antelación.
Por último, tenemos el archivo forecasts_clean_data.py que se encarga de conseguir el dataframe limpio que junta las fuentes diferentes (merge) para poder "alimentar" estos datos al modelo ya.
La evaluación se hace con la monitorización de la deriva en el notebook forecasts/monitorizacion.ipynb para las variables explicativas. Mientras que las predicciones segùn cada antelación se evaluan en forecasts/evaluacion.ipynb
├── adquisicion (lógica de captura de la api/descarga de los datos del drive)
├── preprocess (lógica de preprocesado y limpieza de los datos)
├── metadata (descripción de los datos)
├── forecasts (aduisicion, almacenamiento y preprocesado de los datos de predicciones(NO reales))
│ ├── evaluacion.ipynb - evaluacion de los fallos segùn la antelación
│ ├── monitorizacion.ipynb - evaluación de los cambios entre los conjuntos de observaciones y forecasts
│ ├── forecasts_clean_data.py - guarda el dataframe uniendo
│ │ predicciones de diferentes fuentes (sirven ya como input del modelo)
│ ├── clean - datos preprocesados
│ ├── preprocess - preprocesamiento de datos de predicciones
│ ├── adquisicion - adquisicion de los datos de predicciones
│ ├── boya-raw - continene los archivos de predicciones de datos de la boya
│ │ cuyo nombre representa la fecha y hora(sin minutos) en la que se hizo la predicción, ej 13h_03_05_2024.csv
│ ├── luna-raw - continene los archivos de predicciones de la fase lunar
│ │ cuyo nombre representa la fecha en la que se hizo la predicción, ej 03_05_2024.json
│ └── meteo-raw - continene los archivos de predicciones de datos meteorologicos adicionales
│ cuyo nombre representa la fecha y hora(sin minutos) en la que se hizo la predicción, ej 13h_03_05_2024.json
│
├── modelos (entrenamiento y evaluacion de modelos)
│ ├── modelo_definitivo - carpeta que guarda el modelo definitivo en el formato pickle, que se usará en producción
│ ├── metrics_utils.py - ayuda a calcular las métricas de evalución
│ ├── ml_flow_utils.py - ayuda a guardar el modelo en MLFLow o cargarlo de ahi
│ ├── subsets_manager.py - clase encargada de separar los datos en subconjuntos train, validacion y test
│ ├── analisis.ipynb - notebook que analiza los datos para sacar conclusiones (antes entrenar los modelos)
│ │
│ ├── evaluacion (evaluacion de los modelos obtenidos)
│ │ ├── runs (guarda las ejecuciones exportadas de mlflow para evaluar de forma mas facil los modelos)
│ │ │
│ │ ├── evaluacion-lineales.ipynb (evaluacion de los modelos lineales)
│ │ ├── evaluacion-forest.ipynb (evaluacion de los modelos que usan random forest)
│ │ ├── evaluacion-mlp.ipynb (evaluacion de los modelos de MLP)
│ │ │
│ │ └── evaluacion-best.ipynb (eligiendo el mejor modelo)
│ │
│ │ (en las siguentes subcarpetas hay notebooks para entrenar los modelos asociados)
│ ├── dummy (modelo que solo devuelve la media, sin importar el input)
│ ├── lineal (entrenamiento de varios tipos de modelos lineales)
│ ├── mlperceptron (entrenamiento del modelo de MLP (redes neuronales))
│ └── random_forest (entrenamiento del modelo de random forest)
│
├── utils (herramientas de uso adicional)
└── exploracion
