diff --git a/docs/01 - Installation de l'environnement de base.md b/docs/01 - Installation de l'environnement de base.md deleted file mode 100644 index f570ee1..0000000 --- a/docs/01 - Installation de l'environnement de base.md +++ /dev/null @@ -1,17 +0,0 @@ -# Installation de l'environnement de base - -Après avoir cloné le dépôt : - -```shell -python3 -m venv .venv -source .venv/bin/activate -python -m pip install --upgrade pip -pip install -r requirements.txt -python -c "import pandas, influxdb_client, sklearn; print('OK')" -``` - -- On installe l'environnement virtuel de python -- On entre dans cet environnement -- On met à jour le gestionnaire de paquets pip -- On installe les dépendances définies dans `requirements.txt` -- On vérifie que les dépendances sont correctement installées diff --git a/docs/03 - Test de l'environnement de travail.md b/docs/01 - Installation, configuration et tests/index.md similarity index 70% rename from docs/03 - Test de l'environnement de travail.md rename to docs/01 - Installation, configuration et tests/index.md index 290cc1f..6cd9bb2 100644 --- a/docs/03 - Test de l'environnement de travail.md +++ b/docs/01 - Installation, configuration et tests/index.md @@ -1,7 +1,43 @@ -# Test de l'environnement de travail +# Installation, configuration et tests + +## Installation de l'environnement de base + +Après avoir cloné le dépôt : ```shell -python -m scripts.test_influx_connection +python3 -m venv .venv +source .venv/bin/activate +python -m pip install --upgrade pip +pip install -r requirements.txt +python -c "import pandas, influxdb_client, sklearn; print('OK')" +``` + +- On installe l'environnement virtuel de python +- On entre dans cet environnement +- On met à jour le gestionnaire de paquets pip +- On installe les dépendances définies dans `requirements.txt` +- On vérifie que les dépendances sont correctement installées + +## Configuration + +```shell +cp .env.example .env +``` + +On copie le fichier de configuration d'exemple, puis on l'ouvre pour l'adapter à notre cas. + +- `INFLUXDB_URL` : URL de l'api du serveur InfluxDB2 (cela inclue probablement le port 8086) +- `INFLUXDB_TOKEN` : le jeton d'authentification à créer dans votre compte InfluxDB2 +- `INFLUXDB_ORG` : l'organisation à laquelle le token est rattaché +- `INFLUXDB_BUCKET` : le nom du bucket dans lequel les données sont stockées +- `STATION_LATITUDE` : latitude GPS de la station météo +- `STATION_LONGITUDE` : longitude GPS de la station météo +- `STATION_ELEVATION` : altitude de la station météo + +## Tests de l'environnement de travail + +```shell +python "docs/01 - Installation, configuration et tests/scripts/test_influx_connection.py" ``` ```output @@ -24,7 +60,7 @@ Exemple de point : Ensuite, on peut demander à InfluxDB de nous détailler ce qu'il stocke : ```shell -python -m scripts.test_influx_schema +python "docs/01 - Installation, configuration et tests/scripts/test_influx_schema.py" ``` ```output @@ -82,7 +118,7 @@ Champs pour measurement « °C » : Mais pour obtenir les données dont on a besoin, il faut aussi connaitre les entités manipulées par Influx : ```shell -python -m scripts.test_influx_entities +python "docs/01 - Installation, configuration et tests/scripts/test_influx_entities.py" ``` ```output diff --git a/scripts/test_influx_connection.py b/docs/01 - Installation, configuration et tests/scripts/test_influx_connection.py similarity index 92% rename from scripts/test_influx_connection.py rename to docs/01 - Installation, configuration et tests/scripts/test_influx_connection.py index aed89e3..cdfb077 100644 --- a/scripts/test_influx_connection.py +++ b/docs/01 - Installation, configuration et tests/scripts/test_influx_connection.py @@ -1,10 +1,17 @@ # tests/test_influx_connection.py from __future__ import annotations +from pathlib import Path +import sys from contextlib import closing from influxdb_client.client.exceptions import InfluxDBError + +PROJECT_ROOT = Path(__file__).resolve().parents[3] +if str(PROJECT_ROOT) not in sys.path: + sys.path.insert(0, str(PROJECT_ROOT)) + from meteo.config import InfluxSettings from meteo.influx_client import create_influx_client, test_basic_query diff --git a/scripts/test_influx_entities.py b/docs/01 - Installation, configuration et tests/scripts/test_influx_entities.py similarity index 90% rename from scripts/test_influx_entities.py rename to docs/01 - Installation, configuration et tests/scripts/test_influx_entities.py index 8dbe27c..e11ba4b 100644 --- a/scripts/test_influx_entities.py +++ b/docs/01 - Installation, configuration et tests/scripts/test_influx_entities.py @@ -1,8 +1,15 @@ # tests/test_influx_entities.py from __future__ import annotations +from pathlib import Path +import sys from contextlib import closing + +PROJECT_ROOT = Path(__file__).resolve().parents[3] +if str(PROJECT_ROOT) not in sys.path: + sys.path.insert(0, str(PROJECT_ROOT)) + from meteo.config import InfluxSettings from meteo.influx_client import create_influx_client from meteo.schema import ( diff --git a/scripts/test_influx_schema.py b/docs/01 - Installation, configuration et tests/scripts/test_influx_schema.py similarity index 88% rename from scripts/test_influx_schema.py rename to docs/01 - Installation, configuration et tests/scripts/test_influx_schema.py index bcdd6f6..20cc620 100644 --- a/scripts/test_influx_schema.py +++ b/docs/01 - Installation, configuration et tests/scripts/test_influx_schema.py @@ -1,8 +1,15 @@ # tests/test_influx_schema.py from __future__ import annotations +from pathlib import Path +import sys from contextlib import closing + +PROJECT_ROOT = Path(__file__).resolve().parents[3] +if str(PROJECT_ROOT) not in sys.path: + sys.path.insert(0, str(PROJECT_ROOT)) + from meteo.config import InfluxSettings from meteo.influx_client import create_influx_client from meteo.schema import list_measurements, list_measurement_fields diff --git a/docs/02 - Configuration.md b/docs/02 - Configuration.md deleted file mode 100644 index 432badc..0000000 --- a/docs/02 - Configuration.md +++ /dev/null @@ -1,12 +0,0 @@ -# Configuration - -```shell -cp .env.example .env -``` - -On copie le fichier de configuration d'exemple, puis on l'ouvre pour l'adapter à notre cas. - -- `INFLUXDB_URL` : URL de l'api du serveur InfluxDB2 (cela inclue probablement le port 8086) -- `INFLUXDB_TOKEN` : le jeton d'authentification à créer dans votre compte InfluxDB2 -- `INFLUXDB_ORG` : l'organisation à laquelle le token est rattaché -- `INFLUXDB_BUCKET` : le nom du bucket dans lequel les données sont stockées diff --git a/docs/05 - Ajustements.md b/docs/02 - Préparation des données/index.md similarity index 61% rename from docs/05 - Ajustements.md rename to docs/02 - Préparation des données/index.md index 7807fc0..cd50798 100644 --- a/docs/05 - Ajustements.md +++ b/docs/02 - Préparation des données/index.md @@ -1,4 +1,34 @@ -# Ajustements +# Préparation des données + +Cette étape regroupe l'export initial depuis InfluxDB ainsi que les scripts d'ajustement nécessaires pour obtenir un dataset minuté propre. + +## Export des données + +```shell +python "docs/02 - Préparation des données/scripts/export_station_data.py" +``` + +La sortie est assez longue, et inclut un certain nombre d'avertissements qui peuvent être ignorés. +L'important est que le script se termine sur : + +```output +✔ Export terminé : /Users/richard/Documents/donnees_meteo/data/weather_raw_7d.csv +``` + +(Le chemin changera sur votre propre machine) + +Vérifiez que le fichier est bien créé et qu'il contient des données. + +À la place de `export_station_data.py`, on peut aussi lancer : + +```shell +python "docs/02 - Préparation des données/scripts/export_station_data_full.py" +``` + +Au lieu de télécharger les données des 7 derniers jours, l'ensemble des données stockées sur le serveur pour ce bucket seront téléchargées, ce qui, selon la granularité et l'ancienneté des données peut prendre un certain temps et occuper un espace disque conséquent. +Mon fichier complet contient plus d'un million d'enregistrements et pèse 70Mo. + +## Ajustements Le fichier peut être rapidement inspecté avec la commande `head` : @@ -24,7 +54,7 @@ On peut voir que HomeAssistant écrit une nouvelle entrée pour chaque capteur, Le script suivant s'occupe de regrouper les données de capteurs dont l'enregistrement est proche : ```shell -python -m scripts.format_raw_csv +python "docs/02 - Préparation des données/scripts/format_raw_csv.py" ``` ```output @@ -59,35 +89,42 @@ Il reste des cellules vides : en effet, HA n'enregistre pas la valeur d'un capte On fait donc : ```shell -python -m scripts.fill_formatted_1s +python "docs/02 - Préparation des données/scripts/fill_formatted_1s.py" ``` ```output Fichier 1s formaté chargé : data/weather_formatted_1s.csv - Lignes : 630171, colonnes : ['temperature', 'humidity', 'pressure', 'illuminance', 'wind_speed', 'wi -nd_direction', 'rain_rate'] Après propagation des dernières valeurs connues : 630171 lignes + Lignes : 630171, colonnes : ['temperature', 'humidity', 'pressure', 'illuminance', 'wind_speed', 'wind_direction', 'rain_rate'] +Après propagation des dernières valeurs connues : 630171 lignes ✔ Fichier 1s 'complet' écrit dans : /Users/richard/Documents/donnees_meteo/data/weather_filled_1s.csv ``` -On peut maintenant s'assurer d'avoir une seule ligne par minute, avec toutes les valeurs de capteurs : +## Enrichissements (saisons et position du soleil) + +Une fois les données nettoyées, on peut les enrichir avec des métadonnées météorologiques simples : + +- regrouper les points par minute, +- ajouter la saison correspondant à chaque observation (en fonction de l'hémisphère), +- calculer la hauteur du soleil si la latitude/longitude de la station sont configurées. + +Ces opérations sont réalisées par : ```shell -python -m scripts.make_minutely_dataset +python "docs/02 - Préparation des données/scripts/make_minutely_dataset.py" ``` -Ce qui va produire le fichier `data/weather_minutely.csv`. +Le script produit `data/weather_minutely.csv`. Pensez à définir `STATION_LATITUDE`, `STATION_LONGITUDE` et `STATION_ELEVATION` dans votre `.env` pour permettre le calcul de la position du soleil ; sinon, seule la colonne `season` sera ajoutée. On peut s'assurer que plus aucune information n'est manquante : ```shell -python -m scripts.check_missing_values +python "docs/02 - Préparation des données/scripts/check_missing_values.py" ``` ```output Dataset chargé : data/weather_minutely.csv Lignes : 321881 - Colonnes : ['temperature', 'humidity', 'pressure', 'illuminance', 'wind_speed', 'wind_direction', 'r -ain_rate'] + Colonnes : ['temperature', 'humidity', 'pressure', 'illuminance', 'wind_speed', 'wind_direction', 'rain_rate'] === Synthèse des valeurs manquantes === Total de cellules : 2253167 Cellules manquantes : 0 @@ -111,14 +148,13 @@ Valeurs manquantes par colonne : Le script suivant nous permet de vérifier rapidement si des problèmes majeurs peuvent être découverts : ```shell -python -m scripts.describe_minutely_dataset +python "docs/02 - Préparation des données/scripts/describe_minutely_dataset.py" ``` ```output Dataset minuté chargé : data/weather_minutely.csv Lignes : 321881 - Colonnes : ['temperature', 'humidity', 'pressure', 'illuminance', 'wind_speed', 'wind_direction', 'r -ain_rate'] Période : 2025-03-10 09:35:00+00:00 → 2025-11-17 00:41:00+00:00 + Colonnes : ['temperature', 'humidity', 'pressure', 'illuminance', 'wind_speed', 'wind_direction', 'rain_rate'] Période : 2025-03-10 09:35:00+00:00 → 2025-11-17 00:41:00+00:00 === describe() === temperature humidity pressure ... wind_speed wind_direction rain_rate @@ -169,11 +205,10 @@ Name: count, dtype: int64 Nombre d'intervalles ≠ 60s : 17589 ``` -Il y a donc des trous entre certains jeux de données. Ces écarts peuvent être identifiés avec le script suivant : ```shell -python -m scripts.list_time_gaps +python "docs/02 - Préparation des données/scripts/list_time_gaps.py" ``` ``` @@ -185,17 +220,16 @@ Nombre de gaps : 17589 Total minutes manquantes (théoriques) : 40466 Top 10 des gaps les plus longs : -- De 2025-06-21 19:09:00+00:00 à 2025-06-21 20:10:00+00:00 (durée: 0 days 01:01:00, manquants: 60, de -2025-06-21 19:10:00+00:00 à 2025-06-21 20:09:00+00:00) - De 2025-08-10 22:17:00+00:00 à 2025-08-10 23:15:00+00:00 (durée: 0 days 00:58:00, manquants: 57, de -2025-08-10 22:18:00+00:00 à 2025-08-10 23:14:00+00:00) - De 2025-09-24 20:34:00+00:00 à 2025-09-24 21:32:00+00:00 (durée: 0 days 00:58:00, manquants: 57, de -2025-09-24 20:35:00+00:00 à 2025-09-24 21:31:00+00:00) - De 2025-06-21 10:58:00+00:00 à 2025-06-21 11:55:00+00:00 (durée: 0 days 00:57:00, manquants: 56, de -2025-06-21 10:59:00+00:00 à 2025-06-21 11:54:00+00:00) - De 2025-07-10 07:17:00+00:00 à 2025-07-10 08:14:00+00:00 (durée: 0 days 00:57:00, manquants: 56, de -2025-07-10 07:18:00+00:00 à 2025-07-10 08:13:00+00:00) - De 2025-07-24 03:52:00+00:00 à 2025-07-24 04:46:00+00:00 (durée: 0 days 00:54:00, manquants: 53, de -2025-07-24 03:53:00+00:00 à 2025-07-24 04:45:00+00:00) - De 2025-10-28 08:31:00+00:00 à 2025-10-28 09:23:00+00:00 (durée: 0 days 00:52:00, manquants: 51, de -2025-10-28 08:32:00+00:00 à 2025-10-28 09:22:00+00:00) - De 2025-03-16 15:31:00+00:00 à 2025-03-16 16:20:00+00:00 (durée: 0 days 00:49:00, manquants: 48, de -2025-03-16 15:32:00+00:00 à 2025-03-16 16:19:00+00:00) - De 2025-06-21 12:22:00+00:00 à 2025-06-21 13:08:00+00:00 (durée: 0 days 00:46:00, manquants: 45, de -2025-06-21 12:23:00+00:00 à 2025-06-21 13:07:00+00:00) - De 2025-06-21 17:25:00+00:00 à 2025-06-21 18:10:00+00:00 (durée: 0 days 00:45:00, manquants: 44, de -2025-06-21 17:26:00+00:00 à 2025-06-21 18:09:00+00:00) +- De 2025-06-21 19:09:00+00:00 à 2025-06-21 20:10:00+00:00 (durée: 0 days 01:01:00, manquants: 60, de 2025-06-21 19:10:00+00:00 à 2025-06-21 20:09:00+00:00) +- De 2025-08-10 22:17:00+00:00 à 2025-08-10 23:15:00+00:00 (durée: 0 days 00:58:00, manquants: 57, de 2025-08-10 22:18:00+00:00 à 2025-08-10 23:14:00+00:00) +- De 2025-09-24 20:34:00+00:00 à 2025-09-24 21:32:00+00:00 (durée: 0 days 00:58:00, manquants: 57, de 2025-09-24 20:35:00+00:00 à 2025-09-24 21:31:00+00:00) +- De 2025-06-21 10:58:00+00:00 à 2025-06-21 11:55:00+00:00 (durée: 0 days 00:57:00, manquants: 56, de 2025-06-21 10:59:00+00:00 à 2025-06-21 11:54:00+00:00) +- De 2025-07-10 07:17:00+00:00 à 2025-07-10 08:14:00+00:00 (durée: 0 days 00:57:00, manquants: 56, de 2025-07-10 07:18:00+00:00 à 2025-07-10 08:13:00+00:00) +- De 2025-07-24 03:52:00+00:00 à 2025-07-24 04:46:00+00:00 (durée: 0 days 00:54:00, manquants: 53, de 2025-07-24 03:53:00+00:00 à 2025-07-24 04:45:00+00:00) +- De 2025-10-28 08:31:00+00:00 à 2025-10-28 09:23:00+00:00 (durée: 0 days 00:52:00, manquants: 51, de 2025-10-28 08:32:00+00:00 à 2025-10-28 09:22:00+00:00) +- De 2025-03-16 15:31:00+00:00 à 2025-03-16 16:20:00+00:00 (durée: 0 days 00:49:00, manquants: 48, de 2025-03-16 15:32:00+00:00 à 2025-03-16 16:19:00+00:00) +- De 2025-06-21 12:22:00+00:00 à 2025-06-21 13:08:00+00:00 (durée: 0 days 00:46:00, manquants: 45, de 2025-06-21 12:23:00+00:00 à 2025-06-21 13:07:00+00:00) +- De 2025-06-21 17:25:00+00:00 à 2025-06-21 18:10:00+00:00 (durée: 0 days 00:45:00, manquants: 44, de 2025-06-21 17:26:00+00:00 à 2025-06-21 18:09:00+00:00) ``` Ces trous dans les données peuvent correspondre à des pannes de connexion entre la station et mon réseau, un redémarrage de mon serveur (physique ou logiciel), au redémarrage de la box ou du point d'accès sans-fil, etc. diff --git a/scripts/check_missing_values.py b/docs/02 - Préparation des données/scripts/check_missing_values.py similarity index 92% rename from scripts/check_missing_values.py rename to docs/02 - Préparation des données/scripts/check_missing_values.py index aa1780e..19d1705 100644 --- a/scripts/check_missing_values.py +++ b/docs/02 - Préparation des données/scripts/check_missing_values.py @@ -2,6 +2,12 @@ from __future__ import annotations from pathlib import Path +import sys + + +PROJECT_ROOT = Path(__file__).resolve().parents[3] +if str(PROJECT_ROOT) not in sys.path: + sys.path.insert(0, str(PROJECT_ROOT)) from meteo.dataset import load_raw_csv from meteo.quality import summarize_missing_values diff --git a/scripts/describe_minutely_dataset.py b/docs/02 - Préparation des données/scripts/describe_minutely_dataset.py similarity index 91% rename from scripts/describe_minutely_dataset.py rename to docs/02 - Préparation des données/scripts/describe_minutely_dataset.py index ade7969..dcedc50 100644 --- a/scripts/describe_minutely_dataset.py +++ b/docs/02 - Préparation des données/scripts/describe_minutely_dataset.py @@ -2,9 +2,15 @@ from __future__ import annotations from pathlib import Path +import sys import pandas as pd + +PROJECT_ROOT = Path(__file__).resolve().parents[3] +if str(PROJECT_ROOT) not in sys.path: + sys.path.insert(0, str(PROJECT_ROOT)) + from meteo.dataset import load_raw_csv diff --git a/scripts/export_station_data.py b/docs/02 - Préparation des données/scripts/export_station_data.py similarity index 88% rename from scripts/export_station_data.py rename to docs/02 - Préparation des données/scripts/export_station_data.py index d036558..f58a8b2 100644 --- a/scripts/export_station_data.py +++ b/docs/02 - Préparation des données/scripts/export_station_data.py @@ -1,8 +1,15 @@ # tests/export_station_data.py from __future__ import annotations +from pathlib import Path +import sys from contextlib import closing + +PROJECT_ROOT = Path(__file__).resolve().parents[3] +if str(PROJECT_ROOT) not in sys.path: + sys.path.insert(0, str(PROJECT_ROOT)) + from meteo.config import InfluxSettings from meteo.influx_client import create_influx_client from meteo.station_config import default_station_config diff --git a/scripts/export_station_data_full.py b/docs/02 - Préparation des données/scripts/export_station_data_full.py similarity index 90% rename from scripts/export_station_data_full.py rename to docs/02 - Préparation des données/scripts/export_station_data_full.py index 1ea0d10..c759e80 100644 --- a/scripts/export_station_data_full.py +++ b/docs/02 - Préparation des données/scripts/export_station_data_full.py @@ -1,8 +1,15 @@ # tests/export_station_data_full.py from __future__ import annotations +from pathlib import Path +import sys from contextlib import closing + +PROJECT_ROOT = Path(__file__).resolve().parents[3] +if str(PROJECT_ROOT) not in sys.path: + sys.path.insert(0, str(PROJECT_ROOT)) + from meteo.config import InfluxSettings from meteo.influx_client import create_influx_client from meteo.station_config import default_station_config diff --git a/scripts/fill_formatted_1s.py b/docs/02 - Préparation des données/scripts/fill_formatted_1s.py similarity index 79% rename from scripts/fill_formatted_1s.py rename to docs/02 - Préparation des données/scripts/fill_formatted_1s.py index d519777..798a249 100644 --- a/scripts/fill_formatted_1s.py +++ b/docs/02 - Préparation des données/scripts/fill_formatted_1s.py @@ -2,6 +2,12 @@ from __future__ import annotations from pathlib import Path +import sys + + +PROJECT_ROOT = Path(__file__).resolve().parents[3] +if str(PROJECT_ROOT) not in sys.path: + sys.path.insert(0, str(PROJECT_ROOT)) from meteo.dataset import load_raw_csv, fill_missing_with_previous @@ -13,7 +19,7 @@ OUTPUT_CSV_PATH = Path("data/weather_filled_1s.csv") def main() -> None: if not INPUT_CSV_PATH.exists(): print(f"⚠ Fichier introuvable : {INPUT_CSV_PATH}") - print(" Lancez d'abord : python -m scripts.format_raw_csv") + print(' Lancez d\'abord : python "docs/02 - Préparation des données/scripts/format_raw_csv.py"') return df_1s = load_raw_csv(INPUT_CSV_PATH) diff --git a/scripts/format_raw_csv.py b/docs/02 - Préparation des données/scripts/format_raw_csv.py similarity index 86% rename from scripts/format_raw_csv.py rename to docs/02 - Préparation des données/scripts/format_raw_csv.py index 1fba689..8594bab 100644 --- a/scripts/format_raw_csv.py +++ b/docs/02 - Préparation des données/scripts/format_raw_csv.py @@ -1,6 +1,12 @@ from __future__ import annotations from pathlib import Path +import sys + + +PROJECT_ROOT = Path(__file__).resolve().parents[3] +if str(PROJECT_ROOT) not in sys.path: + sys.path.insert(0, str(PROJECT_ROOT)) from meteo.dataset import load_raw_csv, combine_close_observations diff --git a/scripts/list_time_gaps.py b/docs/02 - Préparation des données/scripts/list_time_gaps.py similarity index 89% rename from scripts/list_time_gaps.py rename to docs/02 - Préparation des données/scripts/list_time_gaps.py index 0c804ad..b5f5755 100644 --- a/scripts/list_time_gaps.py +++ b/docs/02 - Préparation des données/scripts/list_time_gaps.py @@ -2,6 +2,12 @@ from __future__ import annotations from pathlib import Path +import sys + + +PROJECT_ROOT = Path(__file__).resolve().parents[3] +if str(PROJECT_ROOT) not in sys.path: + sys.path.insert(0, str(PROJECT_ROOT)) from meteo.dataset import load_raw_csv from meteo.gaps import find_time_gaps diff --git a/scripts/make_minutely_dataset.py b/docs/02 - Préparation des données/scripts/make_minutely_dataset.py similarity index 88% rename from scripts/make_minutely_dataset.py rename to docs/02 - Préparation des données/scripts/make_minutely_dataset.py index 882a9bd..a2fa475 100644 --- a/scripts/make_minutely_dataset.py +++ b/docs/02 - Préparation des données/scripts/make_minutely_dataset.py @@ -2,6 +2,12 @@ from __future__ import annotations from pathlib import Path +import sys + + +PROJECT_ROOT = Path(__file__).resolve().parents[3] +if str(PROJECT_ROOT) not in sys.path: + sys.path.insert(0, str(PROJECT_ROOT)) from meteo.dataset import load_raw_csv, resample_to_minutes from meteo.config import StationLocation @@ -16,7 +22,7 @@ OUTPUT_CSV_PATH = Path("data/weather_minutely.csv") def main() -> None: if not FORMATTED_CSV_PATH.exists(): print(f"⚠ Fichier formaté introuvable : {FORMATTED_CSV_PATH}") - print(" Lancez d'abord : python -m scripts.format_raw_csv") + print(' Lancez d\'abord : python "docs/02 - Préparation des données/scripts/fill_formatted_1s.py"') return df_1s = load_raw_csv(FORMATTED_CSV_PATH) diff --git a/figures/basic/humidity_last_7_days.png b/docs/03 - Premiers graphiques/figures/humidity_last_7_days.png similarity index 100% rename from figures/basic/humidity_last_7_days.png rename to docs/03 - Premiers graphiques/figures/humidity_last_7_days.png diff --git a/figures/basic/illuminance_last_7_days.png b/docs/03 - Premiers graphiques/figures/illuminance_last_7_days.png similarity index 100% rename from figures/basic/illuminance_last_7_days.png rename to docs/03 - Premiers graphiques/figures/illuminance_last_7_days.png diff --git a/figures/basic/pressure_last_7_days.png b/docs/03 - Premiers graphiques/figures/pressure_last_7_days.png similarity index 100% rename from figures/basic/pressure_last_7_days.png rename to docs/03 - Premiers graphiques/figures/pressure_last_7_days.png diff --git a/figures/basic/rain_rate_last_7_days.png b/docs/03 - Premiers graphiques/figures/rain_rate_last_7_days.png similarity index 100% rename from figures/basic/rain_rate_last_7_days.png rename to docs/03 - Premiers graphiques/figures/rain_rate_last_7_days.png diff --git a/figures/basic/sun_elevation_last_7_days.png b/docs/03 - Premiers graphiques/figures/sun_elevation_last_7_days.png similarity index 100% rename from figures/basic/sun_elevation_last_7_days.png rename to docs/03 - Premiers graphiques/figures/sun_elevation_last_7_days.png diff --git a/figures/basic/temperature_last_7_days.png b/docs/03 - Premiers graphiques/figures/temperature_last_7_days.png similarity index 100% rename from figures/basic/temperature_last_7_days.png rename to docs/03 - Premiers graphiques/figures/temperature_last_7_days.png diff --git a/figures/basic/wind_direction_last_7_days.png b/docs/03 - Premiers graphiques/figures/wind_direction_last_7_days.png similarity index 100% rename from figures/basic/wind_direction_last_7_days.png rename to docs/03 - Premiers graphiques/figures/wind_direction_last_7_days.png diff --git a/figures/basic/wind_speed_last_7_days.png b/docs/03 - Premiers graphiques/figures/wind_speed_last_7_days.png similarity index 100% rename from figures/basic/wind_speed_last_7_days.png rename to docs/03 - Premiers graphiques/figures/wind_speed_last_7_days.png diff --git a/docs/03 - Premiers graphiques/index.md b/docs/03 - Premiers graphiques/index.md new file mode 100644 index 0000000..c608363 --- /dev/null +++ b/docs/03 - Premiers graphiques/index.md @@ -0,0 +1,69 @@ +# Premiers graphiques + +On peut désormais tracer nos premiers graphiques simples et bruts. +S'ils ne sont pas très instructifs par rapport à ce que nous fournissent Home Assistant et InfluxDB, ils nous permettent au moins de nous assurer que tout fonctionne, et que les données semblent cohérentes. +Les fichiers CSV correspondant à chaque figure sont conservés dans `data/` dans ce dossier. + +## Température + +```shell +python "docs/03 - Premiers graphiques/scripts/plot_basic_variables.py" --only temperature +``` + +![](figures/temperature_last_7_days.png) + +## Humidité relative + +```shell +python "docs/03 - Premiers graphiques/scripts/plot_basic_variables.py" --only humidity +``` + +![](figures/humidity_last_7_days.png) + +## Pression atmosphérique + +```shell +python "docs/03 - Premiers graphiques/scripts/plot_basic_variables.py" --only pressure +``` + +![](figures/pressure_last_7_days.png) + +## Précipitations instantanées + +```shell +python "docs/03 - Premiers graphiques/scripts/plot_basic_variables.py" --only rain_rate +``` + +![](figures/rain_rate_last_7_days.png) + +## Luminance + +```shell +python "docs/03 - Premiers graphiques/scripts/plot_basic_variables.py" --only illuminance +``` + +![](figures/illuminance_last_7_days.png) + +## Vitesse du vent + +```shell +python "docs/03 - Premiers graphiques/scripts/plot_basic_variables.py" --only wind_speed +``` + +![](figures/wind_speed_last_7_days.png) + +## Direction du vent + +```shell +python "docs/03 - Premiers graphiques/scripts/plot_basic_variables.py" --only wind_direction +``` + +![](figures/wind_direction_last_7_days.png) + +## Élévation solaire (si disponible après enrichissement) + +```shell +python "docs/03 - Premiers graphiques/scripts/plot_basic_variables.py" --only sun_elevation +``` + +![](figures/sun_elevation_last_7_days.png) diff --git a/scripts/plot_basic_variables.py b/docs/03 - Premiers graphiques/scripts/plot_basic_variables.py similarity index 93% rename from scripts/plot_basic_variables.py rename to docs/03 - Premiers graphiques/scripts/plot_basic_variables.py index d598a26..f08aa02 100644 --- a/scripts/plot_basic_variables.py +++ b/docs/03 - Premiers graphiques/scripts/plot_basic_variables.py @@ -5,17 +5,24 @@ from __future__ import annotations import argparse from pathlib import Path +import sys import matplotlib.pyplot as plt import pandas as pd + +PROJECT_ROOT = Path(__file__).resolve().parents[3] +if str(PROJECT_ROOT) not in sys.path: + sys.path.insert(0, str(PROJECT_ROOT)) + from meteo.dataset import load_raw_csv from meteo.plots import export_plot_dataset from meteo.variables import Variable, VARIABLES CSV_PATH = Path("data/weather_minutely.csv") -DEFAULT_OUTPUT_DIR = Path("figures/basic") +DOC_DIR = Path(__file__).resolve().parent.parent +DEFAULT_OUTPUT_DIR = DOC_DIR / "figures" def _prepare_slice(df: pd.DataFrame, *, last_days: int) -> pd.DataFrame: diff --git a/docs/04 - Corrélations binaires/figures/correlation_heatmap.png b/docs/04 - Corrélations binaires/figures/correlation_heatmap.png new file mode 100644 index 0000000..444d5e8 Binary files /dev/null and b/docs/04 - Corrélations binaires/figures/correlation_heatmap.png differ diff --git a/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_humidity_vs_illuminance.png b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_humidity_vs_illuminance.png new file mode 100644 index 0000000..e01f17f Binary files /dev/null and b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_humidity_vs_illuminance.png differ diff --git a/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_humidity_vs_pressure.png b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_humidity_vs_pressure.png new file mode 100644 index 0000000..70cd625 Binary files /dev/null and b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_humidity_vs_pressure.png differ diff --git a/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_humidity_vs_rain_rate.png b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_humidity_vs_rain_rate.png new file mode 100644 index 0000000..c17439e Binary files /dev/null and b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_humidity_vs_rain_rate.png differ diff --git a/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_humidity_vs_sun_elevation.png b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_humidity_vs_sun_elevation.png new file mode 100644 index 0000000..85986a1 Binary files /dev/null and b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_humidity_vs_sun_elevation.png differ diff --git a/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_humidity_vs_wind_direction.png b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_humidity_vs_wind_direction.png new file mode 100644 index 0000000..fe301ec Binary files /dev/null and b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_humidity_vs_wind_direction.png differ diff --git a/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_humidity_vs_wind_speed.png b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_humidity_vs_wind_speed.png new file mode 100644 index 0000000..55fe392 Binary files /dev/null and b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_humidity_vs_wind_speed.png differ diff --git a/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_illuminance_vs_sun_elevation.png b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_illuminance_vs_sun_elevation.png new file mode 100644 index 0000000..1b65209 Binary files /dev/null and b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_illuminance_vs_sun_elevation.png differ diff --git a/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_illuminance_vs_wind_direction.png b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_illuminance_vs_wind_direction.png new file mode 100644 index 0000000..c472782 Binary files /dev/null and b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_illuminance_vs_wind_direction.png differ diff --git a/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_illuminance_vs_wind_speed.png b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_illuminance_vs_wind_speed.png new file mode 100644 index 0000000..7f07a7b Binary files /dev/null and b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_illuminance_vs_wind_speed.png differ diff --git a/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_pressure_vs_illuminance.png b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_pressure_vs_illuminance.png new file mode 100644 index 0000000..e212760 Binary files /dev/null and b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_pressure_vs_illuminance.png differ diff --git a/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_pressure_vs_rain_rate.png b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_pressure_vs_rain_rate.png new file mode 100644 index 0000000..44f4bb9 Binary files /dev/null and b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_pressure_vs_rain_rate.png differ diff --git a/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_pressure_vs_sun_elevation.png b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_pressure_vs_sun_elevation.png new file mode 100644 index 0000000..b467851 Binary files /dev/null and b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_pressure_vs_sun_elevation.png differ diff --git a/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_pressure_vs_wind_direction.png b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_pressure_vs_wind_direction.png new file mode 100644 index 0000000..5aaba59 Binary files /dev/null and b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_pressure_vs_wind_direction.png differ diff --git a/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_pressure_vs_wind_speed.png b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_pressure_vs_wind_speed.png new file mode 100644 index 0000000..1f53557 Binary files /dev/null and b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_pressure_vs_wind_speed.png differ diff --git a/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_rain_rate_vs_illuminance.png b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_rain_rate_vs_illuminance.png new file mode 100644 index 0000000..0c5337a Binary files /dev/null and b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_rain_rate_vs_illuminance.png differ diff --git a/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_rain_rate_vs_sun_elevation.png b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_rain_rate_vs_sun_elevation.png new file mode 100644 index 0000000..133baaf Binary files /dev/null and b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_rain_rate_vs_sun_elevation.png differ diff --git a/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_rain_rate_vs_wind_direction.png b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_rain_rate_vs_wind_direction.png new file mode 100644 index 0000000..62dd448 Binary files /dev/null and b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_rain_rate_vs_wind_direction.png differ diff --git a/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_rain_rate_vs_wind_speed.png b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_rain_rate_vs_wind_speed.png new file mode 100644 index 0000000..b240634 Binary files /dev/null and b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_rain_rate_vs_wind_speed.png differ diff --git a/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_temperature_vs_humidity.png b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_temperature_vs_humidity.png new file mode 100644 index 0000000..cdebe69 Binary files /dev/null and b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_temperature_vs_humidity.png differ diff --git a/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_temperature_vs_illuminance.png b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_temperature_vs_illuminance.png new file mode 100644 index 0000000..1f0f8c7 Binary files /dev/null and b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_temperature_vs_illuminance.png differ diff --git a/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_temperature_vs_pressure.png b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_temperature_vs_pressure.png new file mode 100644 index 0000000..b59358e Binary files /dev/null and b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_temperature_vs_pressure.png differ diff --git a/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_temperature_vs_rain_rate.png b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_temperature_vs_rain_rate.png new file mode 100644 index 0000000..df2a64c Binary files /dev/null and b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_temperature_vs_rain_rate.png differ diff --git a/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_temperature_vs_sun_elevation.png b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_temperature_vs_sun_elevation.png new file mode 100644 index 0000000..1121c93 Binary files /dev/null and b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_temperature_vs_sun_elevation.png differ diff --git a/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_temperature_vs_wind_direction.png b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_temperature_vs_wind_direction.png new file mode 100644 index 0000000..989e26e Binary files /dev/null and b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_temperature_vs_wind_direction.png differ diff --git a/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_temperature_vs_wind_speed.png b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_temperature_vs_wind_speed.png new file mode 100644 index 0000000..33604eb Binary files /dev/null and b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_temperature_vs_wind_speed.png differ diff --git a/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_wind_direction_vs_sun_elevation.png b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_wind_direction_vs_sun_elevation.png new file mode 100644 index 0000000..935fdc4 Binary files /dev/null and b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_wind_direction_vs_sun_elevation.png differ diff --git a/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_wind_speed_vs_sun_elevation.png b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_wind_speed_vs_sun_elevation.png new file mode 100644 index 0000000..bf89c1d Binary files /dev/null and b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_wind_speed_vs_sun_elevation.png differ diff --git a/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_wind_speed_vs_wind_direction.png b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_wind_speed_vs_wind_direction.png new file mode 100644 index 0000000..e555e9a Binary files /dev/null and b/docs/04 - Corrélations binaires/figures/pairwise_scatter/scatter_wind_speed_vs_wind_direction.png differ diff --git a/docs/04 - Corrélations binaires/index.md b/docs/04 - Corrélations binaires/index.md new file mode 100644 index 0000000..568a885 --- /dev/null +++ b/docs/04 - Corrélations binaires/index.md @@ -0,0 +1,72 @@ +# Corrélations binaires + +Cette étape regroupe l'ensemble des scripts dédiés aux corrélations et comparaisons directes entre variables. +Chaque figure déposée dans `figures/` possède son CSV compagnon exporté dans le dossier `data/` au même emplacement. + +```shell +python "docs/04 - Corrélations binaires/scripts/plot_all_pairwise_scatter.py" +``` + +![](figures/pairwise_scatter/scatter_humidity_vs_illuminance.png) + +![](figures/pairwise_scatter/scatter_humidity_vs_pressure.png) + +![](figures/pairwise_scatter/scatter_humidity_vs_rain_rate.png) + +![](figures/pairwise_scatter/scatter_humidity_vs_sun_elevation.png) + +![](figures/pairwise_scatter/scatter_humidity_vs_wind_direction.png) + +![](figures/pairwise_scatter/scatter_humidity_vs_wind_speed.png) + +![](figures/pairwise_scatter/scatter_illuminance_vs_sun_elevation.png) + +![](figures/pairwise_scatter/scatter_illuminance_vs_wind_direction.png) + +![](figures/pairwise_scatter/scatter_illuminance_vs_wind_speed.png) + +![](figures/pairwise_scatter/scatter_pressure_vs_illuminance.png) + +![](figures/pairwise_scatter/scatter_pressure_vs_rain_rate.png) + +![](figures/pairwise_scatter/scatter_pressure_vs_sun_elevation.png) + +![](figures/pairwise_scatter/scatter_pressure_vs_wind_direction.png) + +![](figures/pairwise_scatter/scatter_pressure_vs_wind_speed.png) + +![](figures/pairwise_scatter/scatter_rain_rate_vs_illuminance.png) + +![](figures/pairwise_scatter/scatter_rain_rate_vs_sun_elevation.png) + +![](figures/pairwise_scatter/scatter_rain_rate_vs_wind_direction.png) + +![](figures/pairwise_scatter/scatter_rain_rate_vs_wind_speed.png) + +![](figures/pairwise_scatter/scatter_temperature_vs_humidity.png) + +![](figures/pairwise_scatter/scatter_temperature_vs_illuminance.png) + +![](figures/pairwise_scatter/scatter_temperature_vs_pressure.png) + +![](figures/pairwise_scatter/scatter_temperature_vs_rain_rate.png) + +![](figures/pairwise_scatter/scatter_temperature_vs_sun_elevation.png) + +![](figures/pairwise_scatter/scatter_temperature_vs_wind_direction.png) + +![](figures/pairwise_scatter/scatter_temperature_vs_wind_speed.png) + +![](figures/pairwise_scatter/scatter_wind_direction_vs_sun_elevation.png) + +![](figures/pairwise_scatter/scatter_wind_speed_vs_sun_elevation.png) + +![](figures/pairwise_scatter/scatter_wind_speed_vs_wind_direction.png) + +## Heatmap globale + +```shell +python "docs/04 - Corrélations binaires/scripts/plot_correlation_heatmap.py" +``` + +![](figures/correlation_heatmap.png) diff --git a/scripts/plot_all_pairwise_scatter.py b/docs/04 - Corrélations binaires/scripts/plot_all_pairwise_scatter.py similarity index 83% rename from scripts/plot_all_pairwise_scatter.py rename to docs/04 - Corrélations binaires/scripts/plot_all_pairwise_scatter.py index 6f706a3..89d142f 100644 --- a/scripts/plot_all_pairwise_scatter.py +++ b/docs/04 - Corrélations binaires/scripts/plot_all_pairwise_scatter.py @@ -2,6 +2,12 @@ from __future__ import annotations from pathlib import Path +import sys + + +PROJECT_ROOT = Path(__file__).resolve().parents[3] +if str(PROJECT_ROOT) not in sys.path: + sys.path.insert(0, str(PROJECT_ROOT)) from meteo.dataset import load_raw_csv from meteo.variables import iter_variable_pairs @@ -9,7 +15,8 @@ from meteo.plots import plot_scatter_pair CSV_PATH = Path("data/weather_minutely.csv") -OUTPUT_DIR = Path("figures/pairwise_scatter") +DOC_DIR = Path(__file__).resolve().parent.parent +OUTPUT_DIR = DOC_DIR / "figures" / "pairwise_scatter" def main() -> None: diff --git a/scripts/plot_correlation_heatmap.py b/docs/04 - Corrélations binaires/scripts/plot_correlation_heatmap.py similarity index 81% rename from scripts/plot_correlation_heatmap.py rename to docs/04 - Corrélations binaires/scripts/plot_correlation_heatmap.py index 1dffaef..fda13ed 100644 --- a/scripts/plot_correlation_heatmap.py +++ b/docs/04 - Corrélations binaires/scripts/plot_correlation_heatmap.py @@ -2,6 +2,12 @@ from __future__ import annotations from pathlib import Path +import sys + + +PROJECT_ROOT = Path(__file__).resolve().parents[3] +if str(PROJECT_ROOT) not in sys.path: + sys.path.insert(0, str(PROJECT_ROOT)) from meteo.dataset import load_raw_csv from meteo.variables import VARIABLES @@ -10,7 +16,8 @@ from meteo.plots import plot_correlation_heatmap CSV_PATH = Path("data/weather_minutely.csv") -OUTPUT_PATH = Path("figures/correlation_heatmap.png") +DOC_DIR = Path(__file__).resolve().parent.parent +OUTPUT_PATH = DOC_DIR / "figures" / "correlation_heatmap.png" def main() -> None: diff --git a/docs/04 - Corrélations binaires/scripts/plot_correlations.py b/docs/04 - Corrélations binaires/scripts/plot_correlations.py new file mode 100644 index 0000000..876b205 --- /dev/null +++ b/docs/04 - Corrélations binaires/scripts/plot_correlations.py @@ -0,0 +1,96 @@ +# scripts/plot_correlations.py +"""Produit les nuages de points ciblés entre variables sélectionnées.""" + +from __future__ import annotations + +import argparse +from pathlib import Path +import sys +from typing import Sequence + +import pandas as pd + + +PROJECT_ROOT = Path(__file__).resolve().parents[3] +if str(PROJECT_ROOT) not in sys.path: + sys.path.insert(0, str(PROJECT_ROOT)) + +from meteo.dataset import load_raw_csv +from meteo.variables import Variable, VARIABLES, VARIABLES_BY_KEY, iter_variable_pairs +from meteo.plots import plot_scatter_pair + + +CSV_PATH = Path("data/weather_minutely.csv") +DOC_DIR = Path(__file__).resolve().parent.parent +SCATTER_DIR = DOC_DIR / "figures" / "pairwise_scatter" + + +def _select_variables(keys: Sequence[str] | None) -> list[Variable]: + if not keys: + return list(VARIABLES) + try: + selected = [VARIABLES_BY_KEY[key] for key in keys] + except KeyError as exc: + raise SystemExit(f"Variable inconnue : {exc.args[0]!r}.") from exc + return selected + + +def _generate_pairwise_scatter( + df: pd.DataFrame, + variables: Sequence[Variable], + *, + sample_step: int, +) -> None: + pairs = iter_variable_pairs() + selected = [(vx, vy) for vx, vy in pairs if vx in variables and vy in variables] + if not selected: + print("⚠ Aucun couple sélectionné pour les nuages de points.") + return + + SCATTER_DIR.mkdir(parents=True, exist_ok=True) + for var_x, var_y in selected: + output_path = SCATTER_DIR / f"scatter_{var_x.key}_vs_{var_y.key}.png" + print(f"→ Scatter {var_y.key} vs {var_x.key}") + plot_scatter_pair(df, var_x=var_x, var_y=var_y, output_path=output_path, sample_step=sample_step) + print(f"✔ {len(selected)} nuage(s) de points généré(s) dans {SCATTER_DIR}.") + + +def main(argv: list[str] | None = None) -> int: + parser = argparse.ArgumentParser(description="Génère des nuages de points pairwise entre variables.") + parser.add_argument( + "--dataset", + type=Path, + default=CSV_PATH, + help="Dataset à utiliser (par défaut : data/weather_minutely.csv).", + ) + parser.add_argument( + "--variables", + nargs="*", + help="Restreint l'analyse à certaines clés de variables.", + ) + parser.add_argument( + "--scatter-step", + type=int, + default=20, + help="Pas d'échantillonnage pour les nuages de points individuels.", + ) + + args = parser.parse_args(argv) + + dataset_path = args.dataset + if not dataset_path.exists(): + raise SystemExit(f"Dataset introuvable : {dataset_path}") + + df = load_raw_csv(dataset_path) + print(f"Dataset chargé : {dataset_path} ({len(df)} lignes)") + print() + + variables = _select_variables(args.variables) + + _generate_pairwise_scatter(df, variables, sample_step=args.scatter_step) + print("✔ Terminé.") + return 0 + + +if __name__ == "__main__": # pragma: no cover + raise SystemExit(main()) diff --git a/docs/04 - Export des données.md b/docs/04 - Export des données.md deleted file mode 100644 index 378de2f..0000000 --- a/docs/04 - Export des données.md +++ /dev/null @@ -1,20 +0,0 @@ -# Export des données - -```shell -python -m scripts.export_station_data -``` - -La sortie est assez longue, et inclut un certain nombre d'avertissements qui peuvent être ignorés. -L'important est que le script se termine sur : - -```output -✔ Export terminé : /Users/richard/Documents/donnees_meteo/data/weather_raw_7d.csv -``` - -(Le chemin changera sur votre propre machine) - -Vérifiez que le fichier est bien créé et qu'il contient des données. - -À la place de `scripts.export_station_data`, on pourrait aussi lancer `scripts.export_station_data_full`. -Au lieu de télécharger les données des 7 derniers jours, l'ensemble des données stockées sur le serveur pour ce bucket seront téléchargées, ce qui, selon la granularité et l'ancienneté des données peut prendre un certain temps et occuper un espace disque conséquent. -Mon fichier complet contient plus d'un million d'enregistrements et pèse 70Mo. diff --git a/docs/05 - Corrélations binaires avancées/figures/lagged_correlations/lagcorr_humidity_to_rain_rate.png b/docs/05 - Corrélations binaires avancées/figures/lagged_correlations/lagcorr_humidity_to_rain_rate.png new file mode 100644 index 0000000..923db1e Binary files /dev/null and b/docs/05 - Corrélations binaires avancées/figures/lagged_correlations/lagcorr_humidity_to_rain_rate.png differ diff --git a/docs/05 - Corrélations binaires avancées/figures/lagged_correlations/lagcorr_illuminance_to_temperature.png b/docs/05 - Corrélations binaires avancées/figures/lagged_correlations/lagcorr_illuminance_to_temperature.png new file mode 100644 index 0000000..e66cdc8 Binary files /dev/null and b/docs/05 - Corrélations binaires avancées/figures/lagged_correlations/lagcorr_illuminance_to_temperature.png differ diff --git a/docs/05 - Corrélations binaires avancées/figures/lagged_correlations/lagcorr_pressure_to_illuminance.png b/docs/05 - Corrélations binaires avancées/figures/lagged_correlations/lagcorr_pressure_to_illuminance.png new file mode 100644 index 0000000..3f68628 Binary files /dev/null and b/docs/05 - Corrélations binaires avancées/figures/lagged_correlations/lagcorr_pressure_to_illuminance.png differ diff --git a/docs/05 - Corrélations binaires avancées/figures/lagged_correlations/lagcorr_pressure_to_rain_rate.png b/docs/05 - Corrélations binaires avancées/figures/lagged_correlations/lagcorr_pressure_to_rain_rate.png new file mode 100644 index 0000000..5559058 Binary files /dev/null and b/docs/05 - Corrélations binaires avancées/figures/lagged_correlations/lagcorr_pressure_to_rain_rate.png differ diff --git a/docs/05 - Corrélations binaires avancées/figures/lagged_correlations/lagcorr_pressure_to_wind_speed.png b/docs/05 - Corrélations binaires avancées/figures/lagged_correlations/lagcorr_pressure_to_wind_speed.png new file mode 100644 index 0000000..19df9a8 Binary files /dev/null and b/docs/05 - Corrélations binaires avancées/figures/lagged_correlations/lagcorr_pressure_to_wind_speed.png differ diff --git a/docs/05 - Corrélations binaires avancées/figures/lagged_correlations/lagcorr_temperature_to_humidity.png b/docs/05 - Corrélations binaires avancées/figures/lagged_correlations/lagcorr_temperature_to_humidity.png new file mode 100644 index 0000000..a7b4a82 Binary files /dev/null and b/docs/05 - Corrélations binaires avancées/figures/lagged_correlations/lagcorr_temperature_to_humidity.png differ diff --git a/docs/05 - Corrélations binaires avancées/figures/lagged_correlations/lagcorr_temperature_to_rain_rate.png b/docs/05 - Corrélations binaires avancées/figures/lagged_correlations/lagcorr_temperature_to_rain_rate.png new file mode 100644 index 0000000..321a227 Binary files /dev/null and b/docs/05 - Corrélations binaires avancées/figures/lagged_correlations/lagcorr_temperature_to_rain_rate.png differ diff --git a/docs/05 - Corrélations binaires avancées/figures/rolling_correlations/rolling_correlation_heatmap.png b/docs/05 - Corrélations binaires avancées/figures/rolling_correlations/rolling_correlation_heatmap.png new file mode 100644 index 0000000..5afd191 Binary files /dev/null and b/docs/05 - Corrélations binaires avancées/figures/rolling_correlations/rolling_correlation_heatmap.png differ diff --git a/docs/05 - Corrélations binaires avancées/index.md b/docs/05 - Corrélations binaires avancées/index.md new file mode 100644 index 0000000..a05943f --- /dev/null +++ b/docs/05 - Corrélations binaires avancées/index.md @@ -0,0 +1,29 @@ +# Corrélations binaires avancées + +## Corrélations décalées + +```shell +python "docs/05 - Corrélations binaires avancées/scripts/plot_lagged_correlations.py" +``` + +![](figures/lagged_correlations/lagcorr_humidity_to_rain_rate.png) + +![](figures/lagged_correlations/lagcorr_illuminance_to_temperature.png) + +![](figures/lagged_correlations/lagcorr_pressure_to_illuminance.png) + +![](figures/lagged_correlations/lagcorr_pressure_to_rain_rate.png) + +![](figures/lagged_correlations/lagcorr_pressure_to_wind_speed.png) + +![](figures/lagged_correlations/lagcorr_temperature_to_humidity.png) + +![](figures/lagged_correlations/lagcorr_temperature_to_rain_rate.png) + +## Corrélations glissantes + +```shell +python "docs/05 - Corrélations binaires avancées/scripts/plot_rolling_correlation_heatmap.py" +``` + +![](figures/rolling_correlations/rolling_correlation_heatmap.png) diff --git a/scripts/plot_lagged_correlations.py b/docs/05 - Corrélations binaires avancées/scripts/plot_lagged_correlations.py similarity index 74% rename from scripts/plot_lagged_correlations.py rename to docs/05 - Corrélations binaires avancées/scripts/plot_lagged_correlations.py index bb00ed6..4306ca7 100644 --- a/scripts/plot_lagged_correlations.py +++ b/docs/05 - Corrélations binaires avancées/scripts/plot_lagged_correlations.py @@ -2,28 +2,23 @@ from __future__ import annotations from pathlib import Path +import sys + + +PROJECT_ROOT = Path(__file__).resolve().parents[3] +if str(PROJECT_ROOT) not in sys.path: + sys.path.insert(0, str(PROJECT_ROOT)) from meteo.dataset import load_raw_csv from meteo.variables import VARIABLES_BY_KEY from meteo.analysis import compute_lagged_correlation from meteo.plots import plot_lagged_correlation +from meteo.correlation_presets import DEFAULT_LAGGED_PAIRS CSV_PATH = Path("data/weather_minutely.csv") -OUTPUT_DIR = Path("figures/lagged_correlations") - - -# Paires à analyser (clé de variable X, clé de variable Y) -# Convention : X précède potentiellement Y -INTERESTING_PAIRS: list[tuple[str, str]] = [ - ("temperature", "humidity"), - ("temperature", "rain_rate"), - ("pressure", "rain_rate"), - ("pressure", "wind_speed"), - ("pressure", "illuminance"), - ("illuminance", "temperature"), - ("humidity", "rain_rate"), -] +DOC_DIR = Path(__file__).resolve().parent.parent +OUTPUT_DIR = DOC_DIR / "figures" / "lagged_correlations" def main() -> None: @@ -37,7 +32,7 @@ def main() -> None: print(f" Colonnes : {list(df.columns)}") print() - for key_x, key_y in INTERESTING_PAIRS: + for key_x, key_y in DEFAULT_LAGGED_PAIRS: var_x = VARIABLES_BY_KEY[key_x] var_y = VARIABLES_BY_KEY[key_y] diff --git a/scripts/plot_rolling_correlation_heatmap.py b/docs/05 - Corrélations binaires avancées/scripts/plot_rolling_correlation_heatmap.py similarity index 80% rename from scripts/plot_rolling_correlation_heatmap.py rename to docs/05 - Corrélations binaires avancées/scripts/plot_rolling_correlation_heatmap.py index b19b425..21b501a 100644 --- a/scripts/plot_rolling_correlation_heatmap.py +++ b/docs/05 - Corrélations binaires avancées/scripts/plot_rolling_correlation_heatmap.py @@ -2,23 +2,23 @@ from __future__ import annotations from pathlib import Path +import sys + + +PROJECT_ROOT = Path(__file__).resolve().parents[3] +if str(PROJECT_ROOT) not in sys.path: + sys.path.insert(0, str(PROJECT_ROOT)) from meteo.dataset import load_raw_csv from meteo.variables import VARIABLES_BY_KEY from meteo.analysis import compute_rolling_correlations_for_pairs from meteo.plots import plot_rolling_correlation_heatmap +from meteo.correlation_presets import DEFAULT_ROLLING_PAIRS CSV_PATH = Path("data/weather_minutely.csv") -OUTPUT_PATH = Path("figures/rolling_correlations/rolling_correlation_heatmap.png") - -ROLLING_PAIRS: list[tuple[str, str]] = [ - ("temperature", "humidity"), - ("pressure", "rain_rate"), - ("pressure", "wind_speed"), - ("illuminance", "temperature"), - ("humidity", "rain_rate"), -] +DOC_DIR = Path(__file__).resolve().parent.parent +OUTPUT_PATH = DOC_DIR / "figures" / "rolling_correlations" / "rolling_correlation_heatmap.png" WINDOW_MINUTES = 180 # 3 heures pour observer les tendances synoptiques STEP_MINUTES = 30 # on n'échantillonne qu'un point sur 30 minutes @@ -35,7 +35,7 @@ def main() -> None: print(f" Colonnes : {list(df.columns)}") print() - pairs = [(VARIABLES_BY_KEY[a], VARIABLES_BY_KEY[b]) for a, b in ROLLING_PAIRS] + pairs = [(VARIABLES_BY_KEY[a], VARIABLES_BY_KEY[b]) for a, b in DEFAULT_ROLLING_PAIRS] rolling_df = compute_rolling_correlations_for_pairs( df=df, diff --git a/docs/06 - Corrélations multiples/figures/hexbin_explorations/hexbin_lux_humidity_color_temp.png b/docs/06 - Corrélations multiples/figures/hexbin_explorations/hexbin_lux_humidity_color_temp.png new file mode 100644 index 0000000..4b5559c Binary files /dev/null and b/docs/06 - Corrélations multiples/figures/hexbin_explorations/hexbin_lux_humidity_color_temp.png differ diff --git a/docs/06 - Corrélations multiples/figures/hexbin_explorations/hexbin_pressure_rain_color_wind.png b/docs/06 - Corrélations multiples/figures/hexbin_explorations/hexbin_pressure_rain_color_wind.png new file mode 100644 index 0000000..3573c77 Binary files /dev/null and b/docs/06 - Corrélations multiples/figures/hexbin_explorations/hexbin_pressure_rain_color_wind.png differ diff --git a/docs/06 - Corrélations multiples/figures/hexbin_explorations/hexbin_temp_humidity_color_rain.png b/docs/06 - Corrélations multiples/figures/hexbin_explorations/hexbin_temp_humidity_color_rain.png new file mode 100644 index 0000000..b42a28c Binary files /dev/null and b/docs/06 - Corrélations multiples/figures/hexbin_explorations/hexbin_temp_humidity_color_rain.png differ diff --git a/docs/06 - Corrélations multiples/index.md b/docs/06 - Corrélations multiples/index.md new file mode 100644 index 0000000..e954d78 --- /dev/null +++ b/docs/06 - Corrélations multiples/index.md @@ -0,0 +1,13 @@ +# Corrélations multiples + +## Hexbin colorés + +```shell +python "docs/06 - Corrélations multiples/scripts/plot_hexbin_explorations.py" +``` + +![](figures/hexbin_explorations/hexbin_lux_humidity_color_temp.png) + +![](figures/hexbin_explorations/hexbin_pressure_rain_color_wind.png) + +![](figures/hexbin_explorations/hexbin_temp_humidity_color_rain.png) diff --git a/docs/06 - Corrélations multiples/scripts/plot_hexbin_explorations.py b/docs/06 - Corrélations multiples/scripts/plot_hexbin_explorations.py new file mode 100644 index 0000000..6c9e609 --- /dev/null +++ b/docs/06 - Corrélations multiples/scripts/plot_hexbin_explorations.py @@ -0,0 +1,70 @@ +# scripts/plot_hexbin_explorations.py +from __future__ import annotations + +from pathlib import Path +import sys + +PROJECT_ROOT = Path(__file__).resolve().parents[3] +if str(PROJECT_ROOT) not in sys.path: + sys.path.insert(0, str(PROJECT_ROOT)) + +from meteo.dataset import load_raw_csv +from meteo.variables import VARIABLES_BY_KEY +from meteo.plots import plot_hexbin_with_third_variable +from meteo.correlation_presets import DEFAULT_HEXBIN_SCENARIOS + + +CSV_PATH = Path("data/weather_minutely.csv") +DOC_DIR = Path(__file__).resolve().parent.parent +OUTPUT_DIR = DOC_DIR / "figures" / "hexbin_explorations" + + +def main() -> None: + if not CSV_PATH.exists(): + print(f"⚠ Fichier introuvable : {CSV_PATH}") + return + + df = load_raw_csv(CSV_PATH) + print(f"Dataset minuté chargé : {CSV_PATH}") + print(f" Lignes : {len(df)}") + print(f" Colonnes : {list(df.columns)}") + print() + + for scenario in DEFAULT_HEXBIN_SCENARIOS: + var_x = VARIABLES_BY_KEY[scenario.key_x] + var_y = VARIABLES_BY_KEY[scenario.key_y] + var_color = VARIABLES_BY_KEY[scenario.key_color] + + filename = scenario.filename + output_path = OUTPUT_DIR / filename + + reduce_func = scenario.get_reduce_func() + reduce_label = scenario.get_reduce_label() + + gridsize = scenario.gridsize + mincnt = scenario.mincnt + + description = scenario.description + print(f"→ Hexbin {var_y.key} vs {var_x.key} (couleur = {var_color.key})") + print(f" {description}") + + plot_hexbin_with_third_variable( + df=df, + var_x=var_x, + var_y=var_y, + var_color=var_color, + output_path=output_path, + gridsize=gridsize, + mincnt=mincnt, + reduce_func=reduce_func, + reduce_func_label=reduce_label, + cmap="magma", + ) + print(f" ✔ Graphique enregistré : {output_path}") + print() + + print("✔ Tous les graphiques hexbin ont été générés.") + + +if __name__ == "__main__": + main() diff --git a/docs/06 - Premiers graphiques.md b/docs/06 - Premiers graphiques.md deleted file mode 100644 index 3bfa1db..0000000 --- a/docs/06 - Premiers graphiques.md +++ /dev/null @@ -1,68 +0,0 @@ -# Premiers graphiques - -On peut désormais tracer nos premiers graphiques simples et bruts. -S'ils ne sont pas très instructifs par rapport à ce que nous fournissent Home Assistant et InfluxDB, ils nous permettent au moins de nous assurer que tout fonctionne, et que les données semblent cohérentes. - -## Température - -```shell -python -m scripts.plot_basic_variables --only temperature -``` - -![](../figures/basic/temperature_last_7_days.png) - -## Humidité relative - -```shell -python -m scripts.plot_basic_variables --only humidity -``` - -![](../figures/basic/humidity_last_7_days.png) - -## Pression atmosphérique - -```shell -python -m scripts.plot_basic_variables --only pressure -``` - -![](../figures/basic/pressure_last_7_days.png) - -## Précipitations instantanées - -```shell -python -m scripts.plot_basic_variables --only rain_rate -``` - -![](../figures/basic/rain_rate_last_7_days.png) - -## Luminance - -```shell -python -m scripts.plot_basic_variables --only illuminance -``` - -![](../figures/basic/illuminance_last_7_days.png) - -## Vitesse du vent - -```shell -python -m scripts.plot_basic_variables --only wind_speed -``` - -![](../figures/basic/wind_speed_last_7_days.png) - -## Direction du vent - -```shell -python -m scripts.plot_basic_variables --only wind_direction -``` - -![](../figures/basic/wind_direction_last_7_days.png) - -## Élévation solaire (si disponible après enrichissement) - -```shell -python -m scripts.plot_basic_variables --only sun_elevation -``` - -![](../figures/basic/sun_elevation_last_7_days.png) diff --git a/figures/basic/humidity_last_7_days.csv b/figures/basic/humidity_last_7_days.csv deleted file mode 100644 index 5f511ac..0000000 --- a/figures/basic/humidity_last_7_days.csv +++ /dev/null @@ -1,170 +0,0 @@ -time,humidity -2025-11-11 08:00:00+00:00,90.4396551724138 -2025-11-11 09:00:00+00:00,86.38333333333334 -2025-11-11 10:00:00+00:00,82.6 -2025-11-11 11:00:00+00:00,78.49166666666666 -2025-11-11 12:00:00+00:00,72.68333333333334 -2025-11-11 13:00:00+00:00,71.3 -2025-11-11 14:00:00+00:00,71.54166666666667 -2025-11-11 15:00:00+00:00,70.40833333333333 -2025-11-11 16:00:00+00:00,83.8804347826087 -2025-11-11 17:00:00+00:00,87.92391304347827 -2025-11-11 18:00:00+00:00,88.80188679245283 -2025-11-11 19:00:00+00:00,90.4375 -2025-11-11 20:00:00+00:00,91.75 -2025-11-11 21:00:00+00:00,91.14285714285714 -2025-11-11 22:00:00+00:00,91.14 -2025-11-11 23:00:00+00:00,89.47058823529412 -2025-11-12 00:00:00+00:00,84.83962264150944 -2025-11-12 01:00:00+00:00,79.8859649122807 -2025-11-12 02:00:00+00:00,79.98979591836735 -2025-11-12 03:00:00+00:00,76.77678571428571 -2025-11-12 04:00:00+00:00,71.28448275862068 -2025-11-12 05:00:00+00:00,68.91176470588235 -2025-11-12 06:00:00+00:00,71.91666666666667 -2025-11-12 07:00:00+00:00,72.00877192982456 -2025-11-12 08:00:00+00:00,67.0 -2025-11-12 09:00:00+00:00,62.127272727272725 -2025-11-12 10:00:00+00:00,60.05 -2025-11-12 11:00:00+00:00,54.725 -2025-11-12 12:00:00+00:00,51.375 -2025-11-12 13:00:00+00:00,54.416666666666664 -2025-11-12 14:00:00+00:00,58.83898305084746 -2025-11-12 15:00:00+00:00,64.99166666666666 -2025-11-12 16:00:00+00:00,74.32558139534883 -2025-11-12 17:00:00+00:00,79.30851063829788 -2025-11-12 18:00:00+00:00,77.97674418604652 -2025-11-12 19:00:00+00:00,80.41836734693878 -2025-11-12 20:00:00+00:00,76.67073170731707 -2025-11-12 21:00:00+00:00,69.82075471698113 -2025-11-12 22:00:00+00:00,65.98305084745763 -2025-11-12 23:00:00+00:00,74.3970588235294 -2025-11-13 00:00:00+00:00,73.43243243243244 -2025-11-13 01:00:00+00:00,56.75 -2025-11-13 02:00:00+00:00,61.583333333333336 -2025-11-13 03:00:00+00:00,75.79729729729729 -2025-11-13 04:00:00+00:00,81.54651162790698 -2025-11-13 05:00:00+00:00,69.05 -2025-11-13 06:00:00+00:00,57.28333333333333 -2025-11-13 07:00:00+00:00,49.30833333333333 -2025-11-13 08:00:00+00:00,47.06666666666667 -2025-11-13 09:00:00+00:00,48.18333333333333 -2025-11-13 10:00:00+00:00,46.19491525423729 -2025-11-13 11:00:00+00:00,44.059322033898304 -2025-11-13 12:00:00+00:00,43.21666666666667 -2025-11-13 13:00:00+00:00,42.45 -2025-11-13 14:00:00+00:00,39.9 -2025-11-13 15:00:00+00:00,40.96666666666667 -2025-11-13 16:00:00+00:00,41.16949152542373 -2025-11-13 17:00:00+00:00,45.42307692307692 -2025-11-13 18:00:00+00:00,41.74561403508772 -2025-11-13 19:00:00+00:00,41.208333333333336 -2025-11-13 20:00:00+00:00,39.09322033898305 -2025-11-13 21:00:00+00:00,35.78813559322034 -2025-11-13 22:00:00+00:00,40.75 -2025-11-13 23:00:00+00:00,52.91860465116279 -2025-11-14 00:00:00+00:00,61.55128205128205 -2025-11-14 01:00:00+00:00,65.34848484848484 -2025-11-14 02:00:00+00:00,65.08333333333333 -2025-11-14 03:00:00+00:00,58.27777777777778 -2025-11-14 04:00:00+00:00,70.75581395348837 -2025-11-14 05:00:00+00:00,70.87837837837837 -2025-11-14 06:00:00+00:00,65.42592592592592 -2025-11-14 07:00:00+00:00,70.32203389830508 -2025-11-14 08:00:00+00:00,69.36666666666666 -2025-11-14 09:00:00+00:00,53.34166666666667 -2025-11-14 10:00:00+00:00,53.516666666666666 -2025-11-14 11:00:00+00:00,63.891666666666666 -2025-11-14 12:00:00+00:00,60.173469387755105 -2025-11-14 13:00:00+00:00,55.824074074074076 -2025-11-14 14:00:00+00:00,47.58474576271186 -2025-11-14 15:00:00+00:00,46.93333333333333 -2025-11-14 16:00:00+00:00,46.3 -2025-11-14 17:00:00+00:00,45.09322033898305 -2025-11-14 18:00:00+00:00,45.940677966101696 -2025-11-14 19:00:00+00:00,50.78846153846154 -2025-11-14 20:00:00+00:00,60.270833333333336 -2025-11-14 21:00:00+00:00,54.36607142857143 -2025-11-14 22:00:00+00:00,51.625 -2025-11-14 23:00:00+00:00,54.96666666666667 -2025-11-15 00:00:00+00:00,58.19166666666667 -2025-11-15 01:00:00+00:00,63.208333333333336 -2025-11-15 02:00:00+00:00,70.86666666666666 -2025-11-15 03:00:00+00:00,78.99 -2025-11-15 04:00:00+00:00,79.07627118644068 -2025-11-15 05:00:00+00:00,80.51785714285714 -2025-11-15 06:00:00+00:00,77.24137931034483 -2025-11-15 07:00:00+00:00,80.29310344827586 -2025-11-15 08:00:00+00:00,79.86440677966101 -2025-11-15 09:00:00+00:00,86.08333333333333 -2025-11-15 10:00:00+00:00,90.99166666666666 -2025-11-15 11:00:00+00:00,90.225 -2025-11-15 12:00:00+00:00,85.29166666666667 -2025-11-15 13:00:00+00:00,86.05 -2025-11-15 14:00:00+00:00,86.975 -2025-11-15 15:00:00+00:00,91.30833333333334 -2025-11-15 16:00:00+00:00,90.29761904761905 -2025-11-15 17:00:00+00:00,94.45833333333333 -2025-11-15 18:00:00+00:00,95.39285714285714 -2025-11-15 19:00:00+00:00,95.44117647058823 -2025-11-15 20:00:00+00:00,96.22222222222223 -2025-11-15 21:00:00+00:00,96.36111111111111 -2025-11-15 22:00:00+00:00,96.625 -2025-11-15 23:00:00+00:00,96.3076923076923 -2025-11-16 00:00:00+00:00,97.0 -2025-11-16 01:00:00+00:00,96.17777777777778 -2025-11-16 02:00:00+00:00,94.6 -2025-11-16 03:00:00+00:00,92.78181818181818 -2025-11-16 04:00:00+00:00,91.82926829268293 -2025-11-16 05:00:00+00:00,92.62857142857143 -2025-11-16 06:00:00+00:00,92.77358490566037 -2025-11-16 07:00:00+00:00,92.66666666666667 -2025-11-16 08:00:00+00:00,90.90833333333333 -2025-11-16 09:00:00+00:00,89.325 -2025-11-16 10:00:00+00:00,92.64166666666667 -2025-11-16 11:00:00+00:00,93.24166666666666 -2025-11-16 12:00:00+00:00,93.18333333333334 -2025-11-16 13:00:00+00:00,93.96666666666667 -2025-11-16 14:00:00+00:00,95.66666666666667 -2025-11-16 15:00:00+00:00,96.98305084745763 -2025-11-16 16:00:00+00:00,97.4375 -2025-11-16 17:00:00+00:00,98.0 -2025-11-16 18:00:00+00:00,98.0 -2025-11-16 19:00:00+00:00,98.0 -2025-11-16 20:00:00+00:00,96.79166666666667 -2025-11-16 21:00:00+00:00,97.10416666666667 -2025-11-16 22:00:00+00:00,98.49074074074075 -2025-11-16 23:00:00+00:00,99.0 -2025-11-17 00:00:00+00:00,99.0 -2025-11-17 01:00:00+00:00,99.0 -2025-11-17 02:00:00+00:00,99.0 -2025-11-17 03:00:00+00:00,99.0 -2025-11-17 04:00:00+00:00,99.0 -2025-11-17 05:00:00+00:00,98.15 -2025-11-17 06:00:00+00:00,97.975 -2025-11-17 07:00:00+00:00,96.175 -2025-11-17 08:00:00+00:00,93.91666666666667 -2025-11-17 09:00:00+00:00,88.98214285714286 -2025-11-17 10:00:00+00:00,84.61666666666666 -2025-11-17 11:00:00+00:00,84.85 -2025-11-17 12:00:00+00:00,84.43333333333334 -2025-11-17 13:00:00+00:00,81.31666666666666 -2025-11-17 14:00:00+00:00,80.85 -2025-11-17 15:00:00+00:00,86.2 -2025-11-17 16:00:00+00:00,84.92105263157895 -2025-11-17 17:00:00+00:00,85.67948717948718 -2025-11-17 18:00:00+00:00,88.0 -2025-11-17 19:00:00+00:00,89.3061224489796 -2025-11-17 20:00:00+00:00,92.12903225806451 -2025-11-17 21:00:00+00:00,94.94285714285714 -2025-11-17 22:00:00+00:00,95.88888888888889 -2025-11-17 23:00:00+00:00,96.12765957446808 -2025-11-18 00:00:00+00:00,96.84883720930233 -2025-11-18 01:00:00+00:00,97.0 -2025-11-18 02:00:00+00:00,97.0 -2025-11-18 03:00:00+00:00,96.61702127659575 -2025-11-18 04:00:00+00:00,96.02941176470588 -2025-11-18 05:00:00+00:00,96.83333333333333 -2025-11-18 06:00:00+00:00,97.0 -2025-11-18 07:00:00+00:00,96.95 -2025-11-18 08:00:00+00:00,96.0 diff --git a/figures/basic/illuminance_last_7_days.csv b/figures/basic/illuminance_last_7_days.csv deleted file mode 100644 index 86de3bf..0000000 --- a/figures/basic/illuminance_last_7_days.csv +++ /dev/null @@ -1,170 +0,0 @@ -time,illuminance -2025-11-11 08:00:00+00:00,8753.97920689655 -2025-11-11 09:00:00+00:00,14803.2897 -2025-11-11 10:00:00+00:00,21937.66 -2025-11-11 11:00:00+00:00,22212.36 -2025-11-11 12:00:00+00:00,17519.4696 -2025-11-11 13:00:00+00:00,12761.3898 -2025-11-11 14:00:00+00:00,6145.58 -2025-11-11 15:00:00+00:00,2410.5097 -2025-11-11 16:00:00+00:00,53.13913043478261 -2025-11-11 17:00:00+00:00,0.0 -2025-11-11 18:00:00+00:00,0.0 -2025-11-11 19:00:00+00:00,0.0 -2025-11-11 20:00:00+00:00,0.0 -2025-11-11 21:00:00+00:00,0.0 -2025-11-11 22:00:00+00:00,0.0 -2025-11-11 23:00:00+00:00,0.0 -2025-11-12 00:00:00+00:00,0.0 -2025-11-12 01:00:00+00:00,0.0 -2025-11-12 02:00:00+00:00,0.0 -2025-11-12 03:00:00+00:00,0.0 -2025-11-12 04:00:00+00:00,0.0 -2025-11-12 05:00:00+00:00,0.0 -2025-11-12 06:00:00+00:00,539.0774444444445 -2025-11-12 07:00:00+00:00,4384.2525263157895 -2025-11-12 08:00:00+00:00,9717.557789473683 -2025-11-12 09:00:00+00:00,17651.825345454545 -2025-11-12 10:00:00+00:00,19816.98 -2025-11-12 11:00:00+00:00,22230.36 -2025-11-12 12:00:00+00:00,18711.89 -2025-11-12 13:00:00+00:00,15562.1695 -2025-11-12 14:00:00+00:00,7915.596305084746 -2025-11-12 15:00:00+00:00,2137.8196 -2025-11-12 16:00:00+00:00,31.520930232558143 -2025-11-12 17:00:00+00:00,0.0 -2025-11-12 18:00:00+00:00,0.0 -2025-11-12 19:00:00+00:00,0.0 -2025-11-12 20:00:00+00:00,0.0 -2025-11-12 21:00:00+00:00,0.0 -2025-11-12 22:00:00+00:00,0.0 -2025-11-12 23:00:00+00:00,0.0 -2025-11-13 00:00:00+00:00,0.0 -2025-11-13 01:00:00+00:00,0.0 -2025-11-13 02:00:00+00:00,0.0 -2025-11-13 03:00:00+00:00,0.0 -2025-11-13 04:00:00+00:00,0.0 -2025-11-13 05:00:00+00:00,0.0 -2025-11-13 06:00:00+00:00,427.87 -2025-11-13 07:00:00+00:00,5346.1699 -2025-11-13 08:00:00+00:00,13033.1098 -2025-11-13 09:00:00+00:00,20893.089900000003 -2025-11-13 10:00:00+00:00,22835.084745762713 -2025-11-13 11:00:00+00:00,21669.111864406783 -2025-11-13 12:00:00+00:00,19302.780000000002 -2025-11-13 13:00:00+00:00,15188.7199 -2025-11-13 14:00:00+00:00,8176.39 -2025-11-13 15:00:00+00:00,2037.7799 -2025-11-13 16:00:00+00:00,18.1524406779661 -2025-11-13 17:00:00+00:00,0.0 -2025-11-13 18:00:00+00:00,0.0 -2025-11-13 19:00:00+00:00,0.0 -2025-11-13 20:00:00+00:00,0.0 -2025-11-13 21:00:00+00:00,0.0 -2025-11-13 22:00:00+00:00,0.0 -2025-11-13 23:00:00+00:00,0.0 -2025-11-14 00:00:00+00:00,0.0 -2025-11-14 01:00:00+00:00,0.0 -2025-11-14 02:00:00+00:00,0.0 -2025-11-14 03:00:00+00:00,0.0 -2025-11-14 04:00:00+00:00,0.0 -2025-11-14 05:00:00+00:00,0.0 -2025-11-14 06:00:00+00:00,286.9443333333333 -2025-11-14 07:00:00+00:00,3290.775966101695 -2025-11-14 08:00:00+00:00,8036.23 -2025-11-14 09:00:00+00:00,15955.569599999999 -2025-11-14 10:00:00+00:00,12867.2199 -2025-11-14 11:00:00+00:00,17966.7599 -2025-11-14 12:00:00+00:00,16961.644163265308 -2025-11-14 13:00:00+00:00,10758.1 -2025-11-14 14:00:00+00:00,3646.545661016949 -2025-11-14 15:00:00+00:00,1107.0993999999998 -2025-11-14 16:00:00+00:00,12.7699 -2025-11-14 17:00:00+00:00,0.0 -2025-11-14 18:00:00+00:00,0.0 -2025-11-14 19:00:00+00:00,0.0 -2025-11-14 20:00:00+00:00,0.0 -2025-11-14 21:00:00+00:00,0.0 -2025-11-14 22:00:00+00:00,0.0 -2025-11-14 23:00:00+00:00,0.0 -2025-11-15 00:00:00+00:00,0.0 -2025-11-15 01:00:00+00:00,0.0 -2025-11-15 02:00:00+00:00,0.0 -2025-11-15 03:00:00+00:00,0.0 -2025-11-15 04:00:00+00:00,0.0 -2025-11-15 05:00:00+00:00,0.0 -2025-11-15 06:00:00+00:00,194.75172413793103 -2025-11-15 07:00:00+00:00,2002.148172413793 -2025-11-15 08:00:00+00:00,4058.379559322034 -2025-11-15 09:00:00+00:00,4793.6900000000005 -2025-11-15 10:00:00+00:00,11489.619799999999 -2025-11-15 11:00:00+00:00,13446.8499 -2025-11-15 12:00:00+00:00,13169.3299 -2025-11-15 13:00:00+00:00,7882.7998 -2025-11-15 14:00:00+00:00,2470.0399 -2025-11-15 15:00:00+00:00,683.1699000000001 -2025-11-15 16:00:00+00:00,10.585428571428572 -2025-11-15 17:00:00+00:00,0.0 -2025-11-15 18:00:00+00:00,0.0 -2025-11-15 19:00:00+00:00,0.0 -2025-11-15 20:00:00+00:00,0.0 -2025-11-15 21:00:00+00:00,0.0 -2025-11-15 22:00:00+00:00,0.0 -2025-11-15 23:00:00+00:00,0.0 -2025-11-16 00:00:00+00:00,0.0 -2025-11-16 01:00:00+00:00,0.0 -2025-11-16 02:00:00+00:00,0.0 -2025-11-16 03:00:00+00:00,0.0 -2025-11-16 04:00:00+00:00,0.0 -2025-11-16 05:00:00+00:00,0.0 -2025-11-16 06:00:00+00:00,241.74305660377357 -2025-11-16 07:00:00+00:00,2991.2299 -2025-11-16 08:00:00+00:00,7205.5 -2025-11-16 09:00:00+00:00,10105.749699999998 -2025-11-16 10:00:00+00:00,14459.59 -2025-11-16 11:00:00+00:00,12687.81 -2025-11-16 12:00:00+00:00,10428.99 -2025-11-16 13:00:00+00:00,6846.9298 -2025-11-16 14:00:00+00:00,2649.51 -2025-11-16 15:00:00+00:00,637.7998983050848 -2025-11-16 16:00:00+00:00,0.0 -2025-11-16 17:00:00+00:00,0.0 -2025-11-16 18:00:00+00:00,0.0 -2025-11-16 19:00:00+00:00,0.0 -2025-11-16 20:00:00+00:00,0.0 -2025-11-16 21:00:00+00:00,0.0 -2025-11-16 22:00:00+00:00,0.0 -2025-11-16 23:00:00+00:00,0.0 -2025-11-17 00:00:00+00:00,0.0 -2025-11-17 01:00:00+00:00,0.0 -2025-11-17 02:00:00+00:00,0.0 -2025-11-17 03:00:00+00:00,0.0 -2025-11-17 04:00:00+00:00,0.0 -2025-11-17 05:00:00+00:00,0.0 -2025-11-17 06:00:00+00:00,36.38 -2025-11-17 07:00:00+00:00,2247.98 -2025-11-17 08:00:00+00:00,5345.479600000001 -2025-11-17 09:00:00+00:00,13612.317321428573 -2025-11-17 10:00:00+00:00,13954.1597 -2025-11-17 11:00:00+00:00,8618.99 -2025-11-17 12:00:00+00:00,7211.570000000001 -2025-11-17 13:00:00+00:00,10041.5799 -2025-11-17 14:00:00+00:00,6146.8598999999995 -2025-11-17 15:00:00+00:00,1435.4297000000001 -2025-11-17 16:00:00+00:00,17.263157894736842 -2025-11-17 17:00:00+00:00,0.0 -2025-11-17 18:00:00+00:00,0.0 -2025-11-17 19:00:00+00:00,0.0 -2025-11-17 20:00:00+00:00,0.0 -2025-11-17 21:00:00+00:00,0.0 -2025-11-17 22:00:00+00:00,0.0 -2025-11-17 23:00:00+00:00,0.0 -2025-11-18 00:00:00+00:00,0.0 -2025-11-18 01:00:00+00:00,0.0 -2025-11-18 02:00:00+00:00,0.0 -2025-11-18 03:00:00+00:00,0.0 -2025-11-18 04:00:00+00:00,0.0 -2025-11-18 05:00:00+00:00,0.0 -2025-11-18 06:00:00+00:00,230.0326530612245 -2025-11-18 07:00:00+00:00,2010.6299 -2025-11-18 08:00:00+00:00,3150.6 diff --git a/figures/basic/pressure_last_7_days.csv b/figures/basic/pressure_last_7_days.csv deleted file mode 100644 index 654a373..0000000 --- a/figures/basic/pressure_last_7_days.csv +++ /dev/null @@ -1,170 +0,0 @@ -time,pressure -2025-11-11 08:00:00+00:00,1006.8025357788998 -2025-11-11 09:00:00+00:00,1007.4336885582467 -2025-11-11 10:00:00+00:00,1007.4336885582462 -2025-11-11 11:00:00+00:00,1006.9821700728662 -2025-11-11 12:00:00+00:00,1006.51936362535 -2025-11-11 13:00:00+00:00,1006.1863687423846 -2025-11-11 14:00:00+00:00,1006.1525048559816 -2025-11-11 15:00:00+00:00,1006.09606504531 -2025-11-11 16:00:00+00:00,1006.0960650453098 -2025-11-11 17:00:00+00:00,1006.0224479009556 -2025-11-11 18:00:00+00:00,1005.6935320559875 -2025-11-11 19:00:00+00:00,1005.605038692461 -2025-11-11 20:00:00+00:00,1005.8928817268919 -2025-11-11 21:00:00+00:00,1005.8219288220467 -2025-11-11 22:00:00+00:00,1005.6626072993489 -2025-11-11 23:00:00+00:00,1005.7175863149204 -2025-11-12 00:00:00+00:00,1005.4571237924154 -2025-11-12 01:00:00+00:00,1005.2762025323852 -2025-11-12 02:00:00+00:00,1004.9350175114786 -2025-11-12 03:00:00+00:00,1004.6568498731625 -2025-11-12 04:00:00+00:00,1004.8524430101495 -2025-11-12 05:00:00+00:00,1005.0735084754837 -2025-11-12 06:00:00+00:00,1005.2745522455234 -2025-11-12 07:00:00+00:00,1005.5554310693974 -2025-11-12 08:00:00+00:00,1005.4544335134557 -2025-11-12 09:00:00+00:00,1005.5357716520901 -2025-11-12 10:00:00+00:00,1005.7066303516732 -2025-11-12 11:00:00+00:00,1005.2268919609563 -2025-11-12 12:00:00+00:00,1004.6004100624923 -2025-11-12 13:00:00+00:00,1004.4593105358116 -2025-11-12 14:00:00+00:00,1004.1503264875583 -2025-11-12 15:00:00+00:00,1004.2391952741922 -2025-11-12 16:00:00+00:00,1004.2611149215926 -2025-11-12 17:00:00+00:00,1004.633433355969 -2025-11-12 18:00:00+00:00,1004.4186213699787 -2025-11-12 19:00:00+00:00,1004.1264308361359 -2025-11-12 20:00:00+00:00,1004.1137887680413 -2025-11-12 21:00:00+00:00,1004.1153471613409 -2025-11-12 22:00:00+00:00,1004.1216282787423 -2025-11-12 23:00:00+00:00,1004.1737914935902 -2025-11-13 00:00:00+00:00,1003.8994886299554 -2025-11-13 01:00:00+00:00,1003.3367854124415 -2025-11-13 02:00:00+00:00,1003.0200953636644 -2025-11-13 03:00:00+00:00,1003.386954133039 -2025-11-13 04:00:00+00:00,1004.2296136319123 -2025-11-13 05:00:00+00:00,1004.572190157155 -2025-11-13 06:00:00+00:00,1004.7358656081044 -2025-11-13 07:00:00+00:00,1005.0801484532092 -2025-11-13 08:00:00+00:00,1005.3792794497713 -2025-11-13 09:00:00+00:00,1005.8364419162203 -2025-11-13 10:00:00+00:00,1005.8607397330167 -2025-11-13 11:00:00+00:00,1005.2810359149227 -2025-11-13 12:00:00+00:00,1005.1083683585458 -2025-11-13 13:00:00+00:00,1004.8600331915857 -2025-11-13 14:00:00+00:00,1004.5778341382222 -2025-11-13 15:00:00+00:00,1004.5157503464834 -2025-11-13 16:00:00+00:00,1004.5693203362734 -2025-11-13 17:00:00+00:00,1005.0475870239753 -2025-11-13 18:00:00+00:00,1004.4622810521628 -2025-11-13 19:00:00+00:00,1004.0924517664458 -2025-11-13 20:00:00+00:00,1004.06423186111 -2025-11-13 21:00:00+00:00,1003.6509776541492 -2025-11-13 22:00:00+00:00,1003.3305143223666 -2025-11-13 23:00:00+00:00,1002.7490530170666 -2025-11-14 00:00:00+00:00,1001.9976664857203 -2025-11-14 01:00:00+00:00,1001.1293617061444 -2025-11-14 02:00:00+00:00,1000.2150367732527 -2025-11-14 03:00:00+00:00,999.6092494720353 -2025-11-14 04:00:00+00:00,999.8194330770515 -2025-11-14 05:00:00+00:00,1000.1836135273107 -2025-11-14 06:00:00+00:00,1000.2890356361329 -2025-11-14 07:00:00+00:00,1000.4769557590513 -2025-11-14 08:00:00+00:00,1000.344848337799 -2025-11-14 09:00:00+00:00,1000.2263247353866 -2025-11-14 10:00:00+00:00,999.955413644161 -2025-11-14 11:00:00+00:00,999.9159057766907 -2025-11-14 12:00:00+00:00,999.4960626952586 -2025-11-14 13:00:00+00:00,999.0787152517155 -2025-11-14 14:00:00+00:00,999.0707435270442 -2025-11-14 15:00:00+00:00,998.9902928816622 -2025-11-14 16:00:00+00:00,999.0072248248639 -2025-11-14 17:00:00+00:00,999.145358869967 -2025-11-14 18:00:00+00:00,999.1797967205467 -2025-11-14 19:00:00+00:00,999.2907263353949 -2025-11-14 20:00:00+00:00,999.1962981906162 -2025-11-14 21:00:00+00:00,999.4381830934977 -2025-11-14 22:00:00+00:00,999.7042564866678 -2025-11-14 23:00:00+00:00,1000.1078011329762 -2025-11-15 00:00:00+00:00,1000.2545446407224 -2025-11-15 01:00:00+00:00,1000.4182200916727 -2025-11-15 02:00:00+00:00,1000.1247330761779 -2025-11-15 03:00:00+00:00,999.9260649426119 -2025-11-15 04:00:00+00:00,1000.0579619103316 -2025-11-15 05:00:00+00:00,999.8796230412585 -2025-11-15 06:00:00+00:00,999.9246636783472 -2025-11-15 07:00:00+00:00,1000.0706287059476 -2025-11-15 08:00:00+00:00,1000.1497961785437 -2025-11-15 09:00:00+00:00,1000.248900659657 -2025-11-15 10:00:00+00:00,1000.4295080538088 -2025-11-15 11:00:00+00:00,1000.0570053033717 -2025-11-15 12:00:00+00:00,999.780450231076 -2025-11-15 13:00:00+00:00,999.4079474806374 -2025-11-15 14:00:00+00:00,999.9328377198912 -2025-11-15 15:00:00+00:00,999.7917381932111 -2025-11-15 16:00:00+00:00,999.6216124781831 -2025-11-15 17:00:00+00:00,1000.5649635994246 -2025-11-15 18:00:00+00:00,1000.67784322077 -2025-11-15 19:00:00+00:00,1000.5284437219287 -2025-11-15 20:00:00+00:00,1000.4426773429645 -2025-11-15 21:00:00+00:00,1000.33920435673 -2025-11-15 22:00:00+00:00,1000.3392043567299 -2025-11-15 23:00:00+00:00,1000.3392043567311 -2025-11-16 00:00:00+00:00,999.9521885121229 -2025-11-16 01:00:00+00:00,999.7823315580983 -2025-11-16 02:00:00+00:00,999.2186175702913 -2025-11-16 03:00:00+00:00,999.021591322126 -2025-11-16 04:00:00+00:00,998.7946807573566 -2025-11-16 05:00:00+00:00,998.491203698717 -2025-11-16 06:00:00+00:00,998.0773523214843 -2025-11-16 07:00:00+00:00,997.9969522138283 -2025-11-16 08:00:00+00:00,997.7486170468699 -2025-11-16 09:00:00+00:00,997.7147531604664 -2025-11-16 10:00:00+00:00,997.4664179935082 -2025-11-16 11:00:00+00:00,996.7665643411713 -2025-11-16 12:00:00+00:00,996.614176852356 -2025-11-16 13:00:00+00:00,996.614176852356 -2025-11-16 14:00:00+00:00,996.591600928087 -2025-11-16 15:00:00+00:00,996.6830525535155 -2025-11-16 16:00:00+00:00,996.9739806453921 -2025-11-16 17:00:00+00:00,997.1463236386951 -2025-11-16 18:00:00+00:00,997.2726413101999 -2025-11-16 19:00:00+00:00,997.291454580424 -2025-11-16 20:00:00+00:00,997.2914545804239 -2025-11-16 21:00:00+00:00,997.2914545804239 -2025-11-16 22:00:00+00:00,997.291454580424 -2025-11-16 23:00:00+00:00,997.4868231558282 -2025-11-17 00:00:00+00:00,997.2707215887484 -2025-11-17 01:00:00+00:00,996.9592051289188 -2025-11-17 02:00:00+00:00,996.8737999814488 -2025-11-17 03:00:00+00:00,996.6326480631216 -2025-11-17 04:00:00+00:00,996.9753916406589 -2025-11-17 05:00:00+00:00,997.6696013119287 -2025-11-17 06:00:00+00:00,998.4879785666784 -2025-11-17 07:00:00+00:00,999.7240104204034 -2025-11-17 08:00:00+00:00,1000.9148904255908 -2025-11-17 09:00:00+00:00,1001.43978066484 -2025-11-17 10:00:00+00:00,1001.7501996235417 -2025-11-17 11:00:00+00:00,1001.970314885162 -2025-11-17 12:00:00+00:00,1002.4444092948122 -2025-11-17 13:00:00+00:00,1003.1781268335506 -2025-11-17 14:00:00+00:00,1004.2053313877872 -2025-11-17 15:00:00+00:00,1005.4300752793774 -2025-11-17 16:00:00+00:00,1006.8149300022945 -2025-11-17 17:00:00+00:00,1007.9716033691925 -2025-11-17 18:00:00+00:00,1009.1641331534599 -2025-11-17 19:00:00+00:00,1009.8487365385887 -2025-11-17 20:00:00+00:00,1010.5311417807217 -2025-11-17 21:00:00+00:00,1010.8176583495577 -2025-11-17 22:00:00+00:00,1011.0477177682973 -2025-11-17 23:00:00+00:00,1011.17564800582 -2025-11-18 00:00:00+00:00,1011.3095284869521 -2025-11-18 01:00:00+00:00,1011.6412764438712 -2025-11-18 02:00:00+00:00,1011.3953056473576 -2025-11-18 03:00:00+00:00,1010.9955209504839 -2025-11-18 04:00:00+00:00,1010.9764486740377 -2025-11-18 05:00:00+00:00,1011.2744176744983 -2025-11-18 06:00:00+00:00,1011.3207789475515 -2025-11-18 07:00:00+00:00,1011.4804229834554 -2025-11-18 08:00:00+00:00,1011.85292573389 diff --git a/figures/basic/rain_rate_last_7_days.csv b/figures/basic/rain_rate_last_7_days.csv deleted file mode 100644 index af38dca..0000000 --- a/figures/basic/rain_rate_last_7_days.csv +++ /dev/null @@ -1,170 +0,0 @@ -time,rain_rate -2025-11-11 08:00:00+00:00,0.0 -2025-11-11 09:00:00+00:00,0.0 -2025-11-11 10:00:00+00:00,0.0 -2025-11-11 11:00:00+00:00,0.0 -2025-11-11 12:00:00+00:00,0.0 -2025-11-11 13:00:00+00:00,0.0 -2025-11-11 14:00:00+00:00,0.0 -2025-11-11 15:00:00+00:00,0.0 -2025-11-11 16:00:00+00:00,0.0 -2025-11-11 17:00:00+00:00,0.0 -2025-11-11 18:00:00+00:00,0.0 -2025-11-11 19:00:00+00:00,0.0 -2025-11-11 20:00:00+00:00,0.0 -2025-11-11 21:00:00+00:00,0.0 -2025-11-11 22:00:00+00:00,0.0 -2025-11-11 23:00:00+00:00,0.0 -2025-11-12 00:00:00+00:00,0.0 -2025-11-12 01:00:00+00:00,0.0 -2025-11-12 02:00:00+00:00,0.0 -2025-11-12 03:00:00+00:00,0.0 -2025-11-12 04:00:00+00:00,0.0 -2025-11-12 05:00:00+00:00,0.0 -2025-11-12 06:00:00+00:00,0.0 -2025-11-12 07:00:00+00:00,0.0 -2025-11-12 08:00:00+00:00,0.0 -2025-11-12 09:00:00+00:00,0.0 -2025-11-12 10:00:00+00:00,0.0 -2025-11-12 11:00:00+00:00,0.0 -2025-11-12 12:00:00+00:00,0.0 -2025-11-12 13:00:00+00:00,0.0 -2025-11-12 14:00:00+00:00,0.0 -2025-11-12 15:00:00+00:00,0.0 -2025-11-12 16:00:00+00:00,0.0 -2025-11-12 17:00:00+00:00,0.0 -2025-11-12 18:00:00+00:00,0.0 -2025-11-12 19:00:00+00:00,0.0 -2025-11-12 20:00:00+00:00,0.0 -2025-11-12 21:00:00+00:00,0.0 -2025-11-12 22:00:00+00:00,0.0 -2025-11-12 23:00:00+00:00,0.0 -2025-11-13 00:00:00+00:00,0.0 -2025-11-13 01:00:00+00:00,0.0 -2025-11-13 02:00:00+00:00,0.0 -2025-11-13 03:00:00+00:00,0.0 -2025-11-13 04:00:00+00:00,0.0 -2025-11-13 05:00:00+00:00,0.0 -2025-11-13 06:00:00+00:00,0.0 -2025-11-13 07:00:00+00:00,0.0 -2025-11-13 08:00:00+00:00,0.0 -2025-11-13 09:00:00+00:00,0.0 -2025-11-13 10:00:00+00:00,0.0 -2025-11-13 11:00:00+00:00,0.0 -2025-11-13 12:00:00+00:00,0.0 -2025-11-13 13:00:00+00:00,0.0 -2025-11-13 14:00:00+00:00,0.0 -2025-11-13 15:00:00+00:00,0.0 -2025-11-13 16:00:00+00:00,0.0 -2025-11-13 17:00:00+00:00,0.0 -2025-11-13 18:00:00+00:00,0.0 -2025-11-13 19:00:00+00:00,0.0 -2025-11-13 20:00:00+00:00,0.0 -2025-11-13 21:00:00+00:00,0.0 -2025-11-13 22:00:00+00:00,0.0 -2025-11-13 23:00:00+00:00,0.0 -2025-11-14 00:00:00+00:00,0.0 -2025-11-14 01:00:00+00:00,0.0 -2025-11-14 02:00:00+00:00,0.0 -2025-11-14 03:00:00+00:00,0.0 -2025-11-14 04:00:00+00:00,0.0 -2025-11-14 05:00:00+00:00,0.0 -2025-11-14 06:00:00+00:00,0.0 -2025-11-14 07:00:00+00:00,0.0 -2025-11-14 08:00:00+00:00,0.0 -2025-11-14 09:00:00+00:00,0.0 -2025-11-14 10:00:00+00:00,0.0 -2025-11-14 11:00:00+00:00,0.0 -2025-11-14 12:00:00+00:00,0.0 -2025-11-14 13:00:00+00:00,0.0 -2025-11-14 14:00:00+00:00,0.0 -2025-11-14 15:00:00+00:00,0.0 -2025-11-14 16:00:00+00:00,0.0 -2025-11-14 17:00:00+00:00,0.0 -2025-11-14 18:00:00+00:00,0.0 -2025-11-14 19:00:00+00:00,0.0 -2025-11-14 20:00:00+00:00,0.0 -2025-11-14 21:00:00+00:00,0.0 -2025-11-14 22:00:00+00:00,0.0 -2025-11-14 23:00:00+00:00,0.0 -2025-11-15 00:00:00+00:00,0.0 -2025-11-15 01:00:00+00:00,0.0 -2025-11-15 02:00:00+00:00,0.0 -2025-11-15 03:00:00+00:00,0.0 -2025-11-15 04:00:00+00:00,0.0 -2025-11-15 05:00:00+00:00,0.0 -2025-11-15 06:00:00+00:00,0.0 -2025-11-15 07:00:00+00:00,0.23648275862068968 -2025-11-15 08:00:00+00:00,0.0 -2025-11-15 09:00:00+00:00,0.2413 -2025-11-15 10:00:00+00:00,0.0 -2025-11-15 11:00:00+00:00,0.0 -2025-11-15 12:00:00+00:00,0.0 -2025-11-15 13:00:00+00:00,0.0 -2025-11-15 14:00:00+00:00,2.2479 -2025-11-15 15:00:00+00:00,0.4318 -2025-11-15 16:00:00+00:00,0.0 -2025-11-15 17:00:00+00:00,0.0 -2025-11-15 18:00:00+00:00,0.0 -2025-11-15 19:00:00+00:00,0.0 -2025-11-15 20:00:00+00:00,0.0 -2025-11-15 21:00:00+00:00,0.0 -2025-11-15 22:00:00+00:00,0.0 -2025-11-15 23:00:00+00:00,0.0 -2025-11-16 00:00:00+00:00,0.0 -2025-11-16 01:00:00+00:00,0.0 -2025-11-16 02:00:00+00:00,0.0 -2025-11-16 03:00:00+00:00,0.0 -2025-11-16 04:00:00+00:00,0.278780487804878 -2025-11-16 05:00:00+00:00,0.0 -2025-11-16 06:00:00+00:00,0.0 -2025-11-16 07:00:00+00:00,0.0 -2025-11-16 08:00:00+00:00,0.0 -2025-11-16 09:00:00+00:00,0.0 -2025-11-16 10:00:00+00:00,0.0 -2025-11-16 11:00:00+00:00,0.0 -2025-11-16 12:00:00+00:00,0.0 -2025-11-16 13:00:00+00:00,0.0 -2025-11-16 14:00:00+00:00,0.0 -2025-11-16 15:00:00+00:00,0.0 -2025-11-16 16:00:00+00:00,0.0 -2025-11-16 17:00:00+00:00,0.0 -2025-11-16 18:00:00+00:00,0.0 -2025-11-16 19:00:00+00:00,0.0 -2025-11-16 20:00:00+00:00,0.0 -2025-11-16 21:00:00+00:00,0.0 -2025-11-16 22:00:00+00:00,0.0 -2025-11-16 23:00:00+00:00,0.0 -2025-11-17 00:00:00+00:00,0.7308979591836735 -2025-11-17 01:00:00+00:00,0.12939622641509435 -2025-11-17 02:00:00+00:00,0.0 -2025-11-17 03:00:00+00:00,0.0 -2025-11-17 04:00:00+00:00,0.0 -2025-11-17 05:00:00+00:00,0.2413 -2025-11-17 06:00:00+00:00,0.9779 -2025-11-17 07:00:00+00:00,0.254 -2025-11-17 08:00:00+00:00,0.0 -2025-11-17 09:00:00+00:00,0.0 -2025-11-17 10:00:00+00:00,0.0 -2025-11-17 11:00:00+00:00,0.0 -2025-11-17 12:00:00+00:00,0.0 -2025-11-17 13:00:00+00:00,0.0 -2025-11-17 14:00:00+00:00,0.0 -2025-11-17 15:00:00+00:00,0.0 -2025-11-17 16:00:00+00:00,0.0 -2025-11-17 17:00:00+00:00,0.0 -2025-11-17 18:00:00+00:00,0.0 -2025-11-17 19:00:00+00:00,0.0 -2025-11-17 20:00:00+00:00,0.0 -2025-11-17 21:00:00+00:00,0.0 -2025-11-17 22:00:00+00:00,0.0 -2025-11-17 23:00:00+00:00,0.0 -2025-11-18 00:00:00+00:00,0.0 -2025-11-18 01:00:00+00:00,0.0 -2025-11-18 02:00:00+00:00,0.0 -2025-11-18 03:00:00+00:00,0.0 -2025-11-18 04:00:00+00:00,0.0 -2025-11-18 05:00:00+00:00,0.0 -2025-11-18 06:00:00+00:00,0.0 -2025-11-18 07:00:00+00:00,0.0 -2025-11-18 08:00:00+00:00,0.0 diff --git a/figures/basic/sun_elevation_last_7_days.csv b/figures/basic/sun_elevation_last_7_days.csv deleted file mode 100644 index ef66b13..0000000 --- a/figures/basic/sun_elevation_last_7_days.csv +++ /dev/null @@ -1,170 +0,0 @@ -time,sun_elevation -2025-11-11 08:00:00+00:00,14.308718850096088 -2025-11-11 09:00:00+00:00,19.641059178244088 -2025-11-11 10:00:00+00:00,22.885323533749624 -2025-11-11 11:00:00+00:00,23.572240234780136 -2025-11-11 12:00:00+00:00,21.618490966427157 -2025-11-11 13:00:00+00:00,17.25306445556676 -2025-11-11 14:00:00+00:00,10.92273994659757 -2025-11-11 15:00:00+00:00,3.2428890451279853 -2025-11-11 16:00:00+00:00,-5.903087958357458 -2025-11-11 17:00:00+00:00,-15.22730111177631 -2025-11-11 18:00:00+00:00,-25.13232055875336 -2025-11-11 19:00:00+00:00,-35.44086364722457 -2025-11-11 20:00:00+00:00,-44.523565998887335 -2025-11-11 21:00:00+00:00,-52.15651561105852 -2025-11-11 22:00:00+00:00,-57.4261948850097 -2025-11-11 23:00:00+00:00,-58.66321971266724 -2025-11-12 00:00:00+00:00,-55.44562032226747 -2025-11-12 01:00:00+00:00,-48.668159759993486 -2025-11-12 02:00:00+00:00,-40.732158839860745 -2025-11-12 03:00:00+00:00,-30.70841126725245 -2025-11-12 04:00:00+00:00,-20.70087197418278 -2025-11-12 05:00:00+00:00,-11.276008047769148 -2025-11-12 06:00:00+00:00,-1.4046115369365415 -2025-11-12 07:00:00+00:00,6.722007914419731 -2025-11-12 08:00:00+00:00,14.074341039202734 -2025-11-12 09:00:00+00:00,19.440118242416276 -2025-11-12 10:00:00+00:00,22.613647344654602 -2025-11-12 11:00:00+00:00,23.303853471787 -2025-11-12 12:00:00+00:00,21.362421183707333 -2025-11-12 13:00:00+00:00,17.015495448098136 -2025-11-12 14:00:00+00:00,10.70222894285897 -2025-11-12 15:00:00+00:00,3.0463016121060815 -2025-11-12 16:00:00+00:00,-5.544993798508534 -2025-11-12 17:00:00+00:00,-15.11776322592283 -2025-11-12 18:00:00+00:00,-25.528577546140575 -2025-11-12 19:00:00+00:00,-35.085822187174074 -2025-11-12 20:00:00+00:00,-44.90088305749059 -2025-11-12 21:00:00+00:00,-52.65574132818778 -2025-11-12 22:00:00+00:00,-57.66044673539 -2025-11-12 23:00:00+00:00,-58.89446352252472 -2025-11-13 00:00:00+00:00,-55.72878243070744 -2025-11-13 01:00:00+00:00,-48.97177496687385 -2025-11-13 02:00:00+00:00,-41.016945559103206 -2025-11-13 03:00:00+00:00,-30.890201876327012 -2025-11-13 04:00:00+00:00,-20.461891592603692 -2025-11-13 05:00:00+00:00,-11.187801232366729 -2025-11-13 06:00:00+00:00,-1.7383875065774146 -2025-11-13 07:00:00+00:00,6.601307518106436 -2025-11-13 08:00:00+00:00,13.69215630197333 -2025-11-13 09:00:00+00:00,19.11266697722042 -2025-11-13 10:00:00+00:00,22.334002545882043 -2025-11-13 11:00:00+00:00,23.03800907600499 -2025-11-13 12:00:00+00:00,21.1120498631742 -2025-11-13 13:00:00+00:00,16.783857428915603 -2025-11-13 14:00:00+00:00,10.495797719803473 -2025-11-13 15:00:00+00:00,2.8547816773483374 -2025-11-13 16:00:00+00:00,-6.2870942727338495 -2025-11-13 17:00:00+00:00,-15.483671431330357 -2025-11-13 18:00:00+00:00,-25.737003948646695 -2025-11-13 19:00:00+00:00,-35.44333825958562 -2025-11-13 20:00:00+00:00,-44.72096585064475 -2025-11-13 21:00:00+00:00,-52.59045587027669 -2025-11-13 22:00:00+00:00,-57.75074416369176 -2025-11-13 23:00:00+00:00,-59.15644141342444 -2025-11-14 00:00:00+00:00,-56.11986608431349 -2025-11-14 01:00:00+00:00,-49.00805323466757 -2025-11-14 02:00:00+00:00,-39.81173703491096 -2025-11-14 03:00:00+00:00,-31.11224360580915 -2025-11-14 04:00:00+00:00,-21.40183358698364 -2025-11-14 05:00:00+00:00,-11.653211241034962 -2025-11-14 06:00:00+00:00,-1.6190221985650948 -2025-11-14 07:00:00+00:00,6.400317144670118 -2025-11-14 08:00:00+00:00,13.44399279955036 -2025-11-14 09:00:00+00:00,18.85434158531877 -2025-11-14 10:00:00+00:00,22.08425004289927 -2025-11-14 11:00:00+00:00,22.78297737884391 -2025-11-14 12:00:00+00:00,20.993319270722218 -2025-11-14 13:00:00+00:00,16.424629313468 -2025-11-14 14:00:00+00:00,10.305705156541737 -2025-11-14 15:00:00+00:00,2.6688454383667466 -2025-11-14 16:00:00+00:00,-6.392835813451928 -2025-11-14 17:00:00+00:00,-15.97017802504351 -2025-11-14 18:00:00+00:00,-25.746392678116898 -2025-11-14 19:00:00+00:00,-35.557566964618495 -2025-11-14 20:00:00+00:00,-44.92456295098489 -2025-11-14 21:00:00+00:00,-52.84571453471228 -2025-11-14 22:00:00+00:00,-58.291319119207664 -2025-11-14 23:00:00+00:00,-59.43572195628009 -2025-11-15 00:00:00+00:00,-56.15310326011466 -2025-11-15 01:00:00+00:00,-49.437269974595466 -2025-11-15 02:00:00+00:00,-40.7818544410004 -2025-11-15 03:00:00+00:00,-31.173920939749177 -2025-11-15 04:00:00+00:00,-21.286378610097128 -2025-11-15 05:00:00+00:00,-11.904292339354084 -2025-11-15 06:00:00+00:00,-2.065718258875086 -2025-11-15 07:00:00+00:00,6.073547715991186 -2025-11-15 08:00:00+00:00,13.242214489581697 -2025-11-15 09:00:00+00:00,18.600080475957668 -2025-11-15 10:00:00+00:00,21.82674662621842 -2025-11-15 11:00:00+00:00,22.53069229652115 -2025-11-15 12:00:00+00:00,20.62878392058985 -2025-11-15 13:00:00+00:00,16.3387262666421 -2025-11-15 14:00:00+00:00,10.093381289038067 -2025-11-15 15:00:00+00:00,2.488879059293881 -2025-11-15 16:00:00+00:00,-5.799443400851093 -2025-11-15 17:00:00+00:00,-16.184110602687074 -2025-11-15 18:00:00+00:00,-25.411854657879584 -2025-11-15 19:00:00+00:00,-36.06104724244549 -2025-11-15 20:00:00+00:00,-45.98868646753228 -2025-11-15 21:00:00+00:00,-53.2595732204459 -2025-11-15 22:00:00+00:00,-58.52517485072366 -2025-11-15 23:00:00+00:00,-59.63899728878434 -2025-11-16 00:00:00+00:00,-55.6769264482925 -2025-11-16 01:00:00+00:00,-49.912079958491944 -2025-11-16 02:00:00+00:00,-40.96494950596665 -2025-11-16 03:00:00+00:00,-31.62867310692375 -2025-11-16 04:00:00+00:00,-21.71821319742638 -2025-11-16 05:00:00+00:00,-13.338694691943978 -2025-11-16 06:00:00+00:00,-1.9246325115628766 -2025-11-16 07:00:00+00:00,5.912836575600048 -2025-11-16 08:00:00+00:00,12.957717123150797 -2025-11-16 09:00:00+00:00,18.349996001989837 -2025-11-16 10:00:00+00:00,21.57418368055951 -2025-11-16 11:00:00+00:00,22.283976426762067 -2025-11-16 12:00:00+00:00,20.396075390712685 -2025-11-16 13:00:00+00:00,16.125403220024324 -2025-11-16 14:00:00+00:00,9.901559594503782 -2025-11-16 15:00:00+00:00,2.3683048173781134 -2025-11-16 16:00:00+00:00,-6.5328577727526485 -2025-11-16 17:00:00+00:00,-17.31105292102647 -2025-11-16 18:00:00+00:00,-25.443557107213064 -2025-11-16 19:00:00+00:00,-37.467532717145275 -2025-11-16 20:00:00+00:00,-45.51725880720397 -2025-11-16 21:00:00+00:00,-54.17733196452078 -2025-11-16 22:00:00+00:00,-58.666480718842934 -2025-11-16 23:00:00+00:00,-60.00700274586307 -2025-11-17 00:00:00+00:00,-56.690411119523226 -2025-11-17 01:00:00+00:00,-49.81557665105729 -2025-11-17 02:00:00+00:00,-41.21631116519275 -2025-11-17 03:00:00+00:00,-31.593407971145812 -2025-11-17 04:00:00+00:00,-21.779455441787334 -2025-11-17 05:00:00+00:00,-12.051848256207142 -2025-11-17 06:00:00+00:00,-2.654746434168217 -2025-11-17 07:00:00+00:00,5.689528772336274 -2025-11-17 08:00:00+00:00,12.719830965357682 -2025-11-17 09:00:00+00:00,18.07716294813033 -2025-11-17 10:00:00+00:00,21.326667708461216 -2025-11-17 11:00:00+00:00,22.042928388783245 -2025-11-17 12:00:00+00:00,20.169437371222603 -2025-11-17 13:00:00+00:00,15.918351230230488 -2025-11-17 14:00:00+00:00,9.716090347681874 -2025-11-17 15:00:00+00:00,2.1471267244237136 -2025-11-17 16:00:00+00:00,-6.706949872607374 -2025-11-17 17:00:00+00:00,-16.06152026701152 -2025-11-17 18:00:00+00:00,-26.686322086852964 -2025-11-17 19:00:00+00:00,-36.06309678522945 -2025-11-17 20:00:00+00:00,-44.43295251251092 -2025-11-17 21:00:00+00:00,-53.261199765238906 -2025-11-17 22:00:00+00:00,-58.743298154177054 -2025-11-17 23:00:00+00:00,-60.22192100454561 -2025-11-18 00:00:00+00:00,-57.05924974531945 -2025-11-18 01:00:00+00:00,-50.94477626965786 -2025-11-18 02:00:00+00:00,-40.561841725348835 -2025-11-18 03:00:00+00:00,-32.68266655442553 -2025-11-18 04:00:00+00:00,-21.95606951068478 -2025-11-18 05:00:00+00:00,-13.126587978505347 -2025-11-18 06:00:00+00:00,-2.2546580915224554 -2025-11-18 07:00:00+00:00,5.469537913593991 -2025-11-18 08:00:00+00:00,9.37419719472193 diff --git a/figures/basic/temperature_last_7_days.csv b/figures/basic/temperature_last_7_days.csv deleted file mode 100644 index cc2e189..0000000 --- a/figures/basic/temperature_last_7_days.csv +++ /dev/null @@ -1,170 +0,0 @@ -time,temperature -2025-11-11 08:00:00+00:00,9.965996168582388 -2025-11-11 09:00:00+00:00,10.987500000000022 -2025-11-11 10:00:00+00:00,11.817592592592614 -2025-11-11 11:00:00+00:00,12.637500000000022 -2025-11-11 12:00:00+00:00,13.246759259259282 -2025-11-11 13:00:00+00:00,13.832870370370385 -2025-11-11 14:00:00+00:00,13.293055555555576 -2025-11-11 15:00:00+00:00,13.28472222222224 -2025-11-11 16:00:00+00:00,10.064009661835758 -2025-11-11 17:00:00+00:00,9.247584541062803 -2025-11-11 18:00:00+00:00,8.769916142557653 -2025-11-11 19:00:00+00:00,8.168750000000001 -2025-11-11 20:00:00+00:00,7.547222222222224 -2025-11-11 21:00:00+00:00,7.481481481481483 -2025-11-11 22:00:00+00:00,7.368333333333335 -2025-11-11 23:00:00+00:00,7.112745098039217 -2025-11-12 00:00:00+00:00,7.6781970649895195 -2025-11-12 01:00:00+00:00,7.887914230019497 -2025-11-12 02:00:00+00:00,7.867346938775513 -2025-11-12 03:00:00+00:00,8.201388888888891 -2025-11-12 04:00:00+00:00,8.817528735632186 -2025-11-12 05:00:00+00:00,9.174291938997824 -2025-11-12 06:00:00+00:00,8.288580246913583 -2025-11-12 07:00:00+00:00,9.045808966861609 -2025-11-12 08:00:00+00:00,12.399122807017566 -2025-11-12 09:00:00+00:00,14.626262626262648 -2025-11-12 10:00:00+00:00,15.19537037037039 -2025-11-12 11:00:00+00:00,16.255555555555585 -2025-11-12 12:00:00+00:00,16.912037037037052 -2025-11-12 13:00:00+00:00,16.73287037037038 -2025-11-12 14:00:00+00:00,15.981167608286277 -2025-11-12 15:00:00+00:00,14.130092592592625 -2025-11-12 16:00:00+00:00,11.878552971576244 -2025-11-12 17:00:00+00:00,11.139479905437371 -2025-11-12 18:00:00+00:00,10.967700258397958 -2025-11-12 19:00:00+00:00,10.130385487528358 -2025-11-12 20:00:00+00:00,11.02168021680219 -2025-11-12 21:00:00+00:00,12.440775681341744 -2025-11-12 22:00:00+00:00,13.428907721280623 -2025-11-12 23:00:00+00:00,11.055555555555577 -2025-11-13 00:00:00+00:00,10.917417417417441 -2025-11-13 01:00:00+00:00,13.5956790123457 -2025-11-13 02:00:00+00:00,11.973379629629653 -2025-11-13 03:00:00+00:00,9.185435435435439 -2025-11-13 04:00:00+00:00,8.089147286821706 -2025-11-13 05:00:00+00:00,11.47175925925928 -2025-11-13 06:00:00+00:00,14.162037037037063 -2025-11-13 07:00:00+00:00,15.731481481481506 -2025-11-13 08:00:00+00:00,16.855092592592612 -2025-11-13 09:00:00+00:00,17.668518518518546 -2025-11-13 10:00:00+00:00,18.876647834274973 -2025-11-13 11:00:00+00:00,19.14877589453864 -2025-11-13 12:00:00+00:00,19.313888888888908 -2025-11-13 13:00:00+00:00,19.311574074074095 -2025-11-13 14:00:00+00:00,18.7763888888889 -2025-11-13 15:00:00+00:00,17.792592592592612 -2025-11-13 16:00:00+00:00,17.19020715630887 -2025-11-13 17:00:00+00:00,15.861645299145321 -2025-11-13 18:00:00+00:00,17.029727095516595 -2025-11-13 19:00:00+00:00,17.23611111111114 -2025-11-13 20:00:00+00:00,17.227871939736367 -2025-11-13 21:00:00+00:00,17.860169491525443 -2025-11-13 22:00:00+00:00,15.800925925925945 -2025-11-13 23:00:00+00:00,12.624677002584006 -2025-11-14 00:00:00+00:00,11.420227920227942 -2025-11-14 01:00:00+00:00,10.823232323232341 -2025-11-14 02:00:00+00:00,10.84629629629632 -2025-11-14 03:00:00+00:00,12.197530864197555 -2025-11-14 04:00:00+00:00,10.516795865633087 -2025-11-14 05:00:00+00:00,10.442942942942969 -2025-11-14 06:00:00+00:00,11.37448559670784 -2025-11-14 07:00:00+00:00,10.394067796610189 -2025-11-14 08:00:00+00:00,11.249537037037062 -2025-11-14 09:00:00+00:00,14.907870370370398 -2025-11-14 10:00:00+00:00,15.971759259259292 -2025-11-14 11:00:00+00:00,14.7439814814815 -2025-11-14 12:00:00+00:00,15.397392290249455 -2025-11-14 13:00:00+00:00,15.906893004115249 -2025-11-14 14:00:00+00:00,16.829566854990613 -2025-11-14 15:00:00+00:00,16.5564814814815 -2025-11-14 16:00:00+00:00,16.65601851851854 -2025-11-14 17:00:00+00:00,17.032956685499077 -2025-11-14 18:00:00+00:00,16.97834274952921 -2025-11-14 19:00:00+00:00,15.650641025641049 -2025-11-14 20:00:00+00:00,14.129050925925945 -2025-11-14 21:00:00+00:00,15.676091269841294 -2025-11-14 22:00:00+00:00,17.198412698412724 -2025-11-14 23:00:00+00:00,16.954166666666687 -2025-11-15 00:00:00+00:00,16.487037037037062 -2025-11-15 01:00:00+00:00,15.979629629629647 -2025-11-15 02:00:00+00:00,14.903703703703718 -2025-11-15 03:00:00+00:00,13.74222222222224 -2025-11-15 04:00:00+00:00,13.687853107344653 -2025-11-15 05:00:00+00:00,13.51636904761907 -2025-11-15 06:00:00+00:00,13.82614942528738 -2025-11-15 07:00:00+00:00,13.79262452107282 -2025-11-15 08:00:00+00:00,14.000941619585701 -2025-11-15 09:00:00+00:00,13.451388888888914 -2025-11-15 10:00:00+00:00,13.141666666666683 -2025-11-15 11:00:00+00:00,13.591666666666681 -2025-11-15 12:00:00+00:00,14.441203703703726 -2025-11-15 13:00:00+00:00,14.339351851851868 -2025-11-15 14:00:00+00:00,14.1351851851852 -2025-11-15 15:00:00+00:00,12.209259259259293 -2025-11-15 16:00:00+00:00,11.866402116402147 -2025-11-15 17:00:00+00:00,10.611111111111128 -2025-11-15 18:00:00+00:00,10.166666666666696 -2025-11-15 19:00:00+00:00,9.468954248366018 -2025-11-15 20:00:00+00:00,8.715277777777779 -2025-11-15 21:00:00+00:00,8.26697530864198 -2025-11-15 22:00:00+00:00,7.70277777777778 -2025-11-15 23:00:00+00:00,7.004273504273505 -2025-11-16 00:00:00+00:00,6.738095238095239 -2025-11-16 01:00:00+00:00,7.212345679012348 -2025-11-16 02:00:00+00:00,7.311111111111113 -2025-11-16 03:00:00+00:00,7.605050505050508 -2025-11-16 04:00:00+00:00,7.698509485094853 -2025-11-16 05:00:00+00:00,7.150000000000001 -2025-11-16 06:00:00+00:00,7.224318658280924 -2025-11-16 07:00:00+00:00,7.32638888888889 -2025-11-16 08:00:00+00:00,8.389814814814818 -2025-11-16 09:00:00+00:00,9.316203703703705 -2025-11-16 10:00:00+00:00,9.354629629629631 -2025-11-16 11:00:00+00:00,10.327314814814834 -2025-11-16 12:00:00+00:00,10.848148148148164 -2025-11-16 13:00:00+00:00,10.535185185185213 -2025-11-16 14:00:00+00:00,9.850462962962974 -2025-11-16 15:00:00+00:00,9.65254237288136 -2025-11-16 16:00:00+00:00,9.392361111111112 -2025-11-16 17:00:00+00:00,9.074074074074074 -2025-11-16 18:00:00+00:00,8.989197530864198 -2025-11-16 19:00:00+00:00,8.902777777777779 -2025-11-16 20:00:00+00:00,9.430555555555557 -2025-11-16 21:00:00+00:00,8.921296296296298 -2025-11-16 22:00:00+00:00,8.233024691358027 -2025-11-16 23:00:00+00:00,7.8440170940170955 -2025-11-17 00:00:00+00:00,7.66666666666667 -2025-11-17 01:00:00+00:00,7.7473794549266275 -2025-11-17 02:00:00+00:00,7.88888888888889 -2025-11-17 03:00:00+00:00,7.8707070707070725 -2025-11-17 04:00:00+00:00,6.940277777777779 -2025-11-17 05:00:00+00:00,5.725000000000002 -2025-11-17 06:00:00+00:00,4.8699074074074105 -2025-11-17 07:00:00+00:00,2.8541666666666674 -2025-11-17 08:00:00+00:00,2.325462962962965 -2025-11-17 09:00:00+00:00,4.097222222222224 -2025-11-17 10:00:00+00:00,4.830555555555558 -2025-11-17 11:00:00+00:00,5.0791666666666675 -2025-11-17 12:00:00+00:00,5.517129629629631 -2025-11-17 13:00:00+00:00,5.70138888888889 -2025-11-17 14:00:00+00:00,5.449537037037037 -2025-11-17 15:00:00+00:00,3.6583333333333323 -2025-11-17 16:00:00+00:00,3.5584795321637452 -2025-11-17 17:00:00+00:00,2.7207977207977216 -2025-11-17 18:00:00+00:00,1.9255555555555568 -2025-11-17 19:00:00+00:00,1.1938775510204074 -2025-11-17 20:00:00+00:00,0.7311827956989249 -2025-11-17 21:00:00+00:00,-0.19444444444444453 -2025-11-17 22:00:00+00:00,-0.7740740740740741 -2025-11-17 23:00:00+00:00,-0.8475177304964536 -2025-11-18 00:00:00+00:00,-1.220930232558139 -2025-11-18 01:00:00+00:00,-1.2968749999999991 -2025-11-18 02:00:00+00:00,-1.6891891891891873 -2025-11-18 03:00:00+00:00,-1.6560283687943247 -2025-11-18 04:00:00+00:00,-2.1388888888888875 -2025-11-18 05:00:00+00:00,-3.0092592592592577 -2025-11-18 06:00:00+00:00,-2.7250566893424018 -2025-11-18 07:00:00+00:00,-2.1851851851851833 -2025-11-18 08:00:00+00:00,-2.2037037037037 diff --git a/figures/basic/wind_direction_last_7_days.csv b/figures/basic/wind_direction_last_7_days.csv deleted file mode 100644 index 7c2d4a2..0000000 --- a/figures/basic/wind_direction_last_7_days.csv +++ /dev/null @@ -1,170 +0,0 @@ -time,wind_direction -2025-11-11 08:00:00+00:00,247.00862068965517 -2025-11-11 09:00:00+00:00,239.95 -2025-11-11 10:00:00+00:00,249.35833333333332 -2025-11-11 11:00:00+00:00,251.28333333333333 -2025-11-11 12:00:00+00:00,235.73333333333332 -2025-11-11 13:00:00+00:00,243.49166666666667 -2025-11-11 14:00:00+00:00,230.325 -2025-11-11 15:00:00+00:00,200.49999999999997 -2025-11-11 16:00:00+00:00,136.72826086956522 -2025-11-11 17:00:00+00:00,163.06521739130434 -2025-11-11 18:00:00+00:00,160.29245283018867 -2025-11-11 19:00:00+00:00,160.6 -2025-11-11 20:00:00+00:00,152.52 -2025-11-11 21:00:00+00:00,144.14285714285714 -2025-11-11 22:00:00+00:00,154.36 -2025-11-11 23:00:00+00:00,163.38235294117646 -2025-11-12 00:00:00+00:00,161.69811320754718 -2025-11-12 01:00:00+00:00,159.48245614035088 -2025-11-12 02:00:00+00:00,162.1734693877551 -2025-11-12 03:00:00+00:00,164.61607142857142 -2025-11-12 04:00:00+00:00,180.26724137931035 -2025-11-12 05:00:00+00:00,199.58823529411762 -2025-11-12 06:00:00+00:00,206.90740740740736 -2025-11-12 07:00:00+00:00,198.140350877193 -2025-11-12 08:00:00+00:00,233.28070175438597 -2025-11-12 09:00:00+00:00,242.5909090909091 -2025-11-12 10:00:00+00:00,245.74166666666667 -2025-11-12 11:00:00+00:00,244.15 -2025-11-12 12:00:00+00:00,240.475 -2025-11-12 13:00:00+00:00,247.21666666666667 -2025-11-12 14:00:00+00:00,236.5593220338983 -2025-11-12 15:00:00+00:00,232.0583333333333 -2025-11-12 16:00:00+00:00,181.11627906976742 -2025-11-12 17:00:00+00:00,161.91489361702128 -2025-11-12 18:00:00+00:00,176.3953488372093 -2025-11-12 19:00:00+00:00,109.27551020408163 -2025-11-12 20:00:00+00:00,227.28048780487805 -2025-11-12 21:00:00+00:00,240.38679245283018 -2025-11-12 22:00:00+00:00,228.92372881355934 -2025-11-12 23:00:00+00:00,24.000000000000004 -2025-11-13 00:00:00+00:00,238.3783783783784 -2025-11-13 01:00:00+00:00,226.2535197689996 -2025-11-13 02:00:00+00:00,188.9375 -2025-11-13 03:00:00+00:00,183.25675675675674 -2025-11-13 04:00:00+00:00,180.98837209302323 -2025-11-13 05:00:00+00:00,242.95833333333334 -2025-11-13 06:00:00+00:00,239.95833333333334 -2025-11-13 07:00:00+00:00,229.53333333333333 -2025-11-13 08:00:00+00:00,252.33333333333334 -2025-11-13 09:00:00+00:00,251.24166666666667 -2025-11-13 10:00:00+00:00,241.15254237288136 -2025-11-13 11:00:00+00:00,242.85593220338984 -2025-11-13 12:00:00+00:00,244.20833333333334 -2025-11-13 13:00:00+00:00,238.5 -2025-11-13 14:00:00+00:00,230.075 -2025-11-13 15:00:00+00:00,232.19166666666666 -2025-11-13 16:00:00+00:00,231.28813559322035 -2025-11-13 17:00:00+00:00,230.6346153846154 -2025-11-13 18:00:00+00:00,230.98245614035088 -2025-11-13 19:00:00+00:00,236.85833333333332 -2025-11-13 20:00:00+00:00,232.0084745762712 -2025-11-13 21:00:00+00:00,232.26271186440678 -2025-11-13 22:00:00+00:00,253.89583333333334 -2025-11-13 23:00:00+00:00,110.0 -2025-11-14 00:00:00+00:00,115.23076923076923 -2025-11-14 01:00:00+00:00,162.0 -2025-11-14 02:00:00+00:00,162.0 -2025-11-14 03:00:00+00:00,162.0 -2025-11-14 04:00:00+00:00,242.91860465116278 -2025-11-14 05:00:00+00:00,214.54054054054055 -2025-11-14 06:00:00+00:00,187.40740740740736 -2025-11-14 07:00:00+00:00,240.9406779661017 -2025-11-14 08:00:00+00:00,227.48333333333332 -2025-11-14 09:00:00+00:00,250.35 -2025-11-14 10:00:00+00:00,125.55833333333332 -2025-11-14 11:00:00+00:00,55.19166666666667 -2025-11-14 12:00:00+00:00,99.3265306122449 -2025-11-14 13:00:00+00:00,138.77777777777777 -2025-11-14 14:00:00+00:00,234.42372881355934 -2025-11-14 15:00:00+00:00,228.48333333333332 -2025-11-14 16:00:00+00:00,231.825 -2025-11-14 17:00:00+00:00,228.77118644067798 -2025-11-14 18:00:00+00:00,243.57627118644066 -2025-11-14 19:00:00+00:00,212.39423076923077 -2025-11-14 20:00:00+00:00,211.79166666666666 -2025-11-14 21:00:00+00:00,235.44642857142858 -2025-11-14 22:00:00+00:00,235.05357142857142 -2025-11-14 23:00:00+00:00,240.96666666666667 -2025-11-15 00:00:00+00:00,233.89166666666668 -2025-11-15 01:00:00+00:00,240.85 -2025-11-15 02:00:00+00:00,239.08333333333334 -2025-11-15 03:00:00+00:00,236.62 -2025-11-15 04:00:00+00:00,227.07627118644066 -2025-11-15 05:00:00+00:00,210.51785714285714 -2025-11-15 06:00:00+00:00,229.07758620689654 -2025-11-15 07:00:00+00:00,231.2155172413793 -2025-11-15 08:00:00+00:00,160.27966101694915 -2025-11-15 09:00:00+00:00,90.825 -2025-11-15 10:00:00+00:00,0.0 -2025-11-15 11:00:00+00:00,14.025 -2025-11-15 12:00:00+00:00,108.15833333333333 -2025-11-15 13:00:00+00:00,241.16666666666666 -2025-11-15 14:00:00+00:00,156.99166666666667 -2025-11-15 15:00:00+00:00,119.84166666666667 -2025-11-15 16:00:00+00:00,217.02380952380952 -2025-11-15 17:00:00+00:00,129.375 -2025-11-15 18:00:00+00:00,161.28571428571428 -2025-11-15 19:00:00+00:00,196.0 -2025-11-15 20:00:00+00:00,232.69444444444446 -2025-11-15 21:00:00+00:00,212.79166666666663 -2025-11-15 22:00:00+00:00,209.5 -2025-11-15 23:00:00+00:00,221.99999999999997 -2025-11-16 00:00:00+00:00,252.1757175012371 -2025-11-16 01:00:00+00:00,160.11111111111111 -2025-11-16 02:00:00+00:00,166.9090909090909 -2025-11-16 03:00:00+00:00,176.79090909090908 -2025-11-16 04:00:00+00:00,163.9268292682927 -2025-11-16 05:00:00+00:00,123.6 -2025-11-16 06:00:00+00:00,175.12264150943398 -2025-11-16 07:00:00+00:00,133.84166666666667 -2025-11-16 08:00:00+00:00,197.88333333333333 -2025-11-16 09:00:00+00:00,126.83333333333333 -2025-11-16 10:00:00+00:00,109.0 -2025-11-16 11:00:00+00:00,54.275 -2025-11-16 12:00:00+00:00,24.000000000000004 -2025-11-16 13:00:00+00:00,216.91666666666666 -2025-11-16 14:00:00+00:00,255.75833333333333 -2025-11-16 15:00:00+00:00,135.71186440677965 -2025-11-16 16:00:00+00:00,166.875 -2025-11-16 17:00:00+00:00,192.2380952380952 -2025-11-16 18:00:00+00:00,233.72222222222223 -2025-11-16 19:00:00+00:00,176.125 -2025-11-16 20:00:00+00:00,181.91666666666666 -2025-11-16 21:00:00+00:00,226.75 -2025-11-16 22:00:00+00:00,304.9074074074074 -2025-11-16 23:00:00+00:00,295.86538461538464 -2025-11-17 00:00:00+00:00,298.90816326530614 -2025-11-17 01:00:00+00:00,259.188679245283 -2025-11-17 02:00:00+00:00,266.3833333333333 -2025-11-17 03:00:00+00:00,283.06363636363636 -2025-11-17 04:00:00+00:00,245.325 -2025-11-17 05:00:00+00:00,258.65833333333336 -2025-11-17 06:00:00+00:00,227.33333333333334 -2025-11-17 07:00:00+00:00,134.81666666666666 -2025-11-17 08:00:00+00:00,277.5 -2025-11-17 09:00:00+00:00,276.42857142857144 -2025-11-17 10:00:00+00:00,267.60833333333335 -2025-11-17 11:00:00+00:00,267.5833333333333 -2025-11-17 12:00:00+00:00,290.65 -2025-11-17 13:00:00+00:00,294.2416666666667 -2025-11-17 14:00:00+00:00,296.76666666666665 -2025-11-17 15:00:00+00:00,294.69166666666666 -2025-11-17 16:00:00+00:00,305.49122807017545 -2025-11-17 17:00:00+00:00,337.28205128205127 -2025-11-17 18:00:00+00:00,277.09999999999997 -2025-11-17 19:00:00+00:00,236.91836734693874 -2025-11-17 20:00:00+00:00,202.0806451612903 -2025-11-17 21:00:00+00:00,195.0285714285714 -2025-11-17 22:00:00+00:00,154.74444444444444 -2025-11-17 23:00:00+00:00,168.82978723404256 -2025-11-18 00:00:00+00:00,168.0 -2025-11-18 01:00:00+00:00,172.875 -2025-11-18 02:00:00+00:00,167.02702702702703 -2025-11-18 03:00:00+00:00,163.7340425531915 -2025-11-18 04:00:00+00:00,167.73529411764707 -2025-11-18 05:00:00+00:00,168.0 -2025-11-18 06:00:00+00:00,171.79591836734693 -2025-11-18 07:00:00+00:00,168.55 -2025-11-18 08:00:00+00:00,168.0 diff --git a/figures/basic/wind_speed_last_7_days.csv b/figures/basic/wind_speed_last_7_days.csv deleted file mode 100644 index 1843f65..0000000 --- a/figures/basic/wind_speed_last_7_days.csv +++ /dev/null @@ -1,170 +0,0 @@ -time,wind_speed -2025-11-11 08:00:00+00:00,4.973705379310345 -2025-11-11 09:00:00+00:00,5.52004992 -2025-11-11 10:00:00+00:00,5.595152639999999 -2025-11-11 11:00:00+00:00,5.0479756799999995 -2025-11-11 12:00:00+00:00,4.88301792 -2025-11-11 13:00:00+00:00,5.2102512 -2025-11-11 14:00:00+00:00,2.36841792 -2025-11-11 15:00:00+00:00,0.0402336 -2025-11-11 16:00:00+00:00,0.6139997217391304 -2025-11-11 17:00:00+00:00,0.9813499826086958 -2025-11-11 18:00:00+00:00,1.2054897509433962 -2025-11-11 19:00:00+00:00,1.00181664 -2025-11-11 20:00:00+00:00,0.9994026239999999 -2025-11-11 21:00:00+00:00,0.8889709714285714 -2025-11-11 22:00:00+00:00,1.197888384 -2025-11-11 23:00:00+00:00,0.870939105882353 -2025-11-12 00:00:00+00:00,1.7049936905660377 -2025-11-12 01:00:00+00:00,2.8347041684210526 -2025-11-12 02:00:00+00:00,3.1989817469387756 -2025-11-12 03:00:00+00:00,2.0389813714285716 -2025-11-12 04:00:00+00:00,2.5139063172413794 -2025-11-12 05:00:00+00:00,1.715055811764706 -2025-11-12 06:00:00+00:00,1.5303669333333334 -2025-11-12 07:00:00+00:00,2.0046214736842107 -2025-11-12 08:00:00+00:00,4.1588837052631575 -2025-11-12 09:00:00+00:00,6.605625600000001 -2025-11-12 10:00:00+00:00,7.79593056 -2025-11-12 11:00:00+00:00,6.350203199999999 -2025-11-12 12:00:00+00:00,7.30373952 -2025-11-12 13:00:00+00:00,6.31801632 -2025-11-12 14:00:00+00:00,3.342798427118644 -2025-11-12 15:00:00+00:00,0.0 -2025-11-12 16:00:00+00:00,0.5426857674418605 -2025-11-12 17:00:00+00:00,0.9912874212765957 -2025-11-12 18:00:00+00:00,0.9038525023255813 -2025-11-12 19:00:00+00:00,0.6322422857142858 -2025-11-12 20:00:00+00:00,0.2551399024390244 -2025-11-12 21:00:00+00:00,2.090628950943396 -2025-11-12 22:00:00+00:00,1.4047663728813558 -2025-11-12 23:00:00+00:00,0.0 -2025-11-13 00:00:00+00:00,0.0 -2025-11-13 01:00:00+00:00,1.9103509333333333 -2025-11-13 02:00:00+00:00,0.1391412 -2025-11-13 03:00:00+00:00,0.0 -2025-11-13 04:00:00+00:00,0.8888818604651162 -2025-11-13 05:00:00+00:00,5.5589424 -2025-11-13 06:00:00+00:00,8.65558848 -2025-11-13 07:00:00+00:00,9.86259648 -2025-11-13 08:00:00+00:00,9.02305536 -2025-11-13 09:00:00+00:00,8.524158719999999 -2025-11-13 10:00:00+00:00,8.282666196610169 -2025-11-13 11:00:00+00:00,8.476333016949154 -2025-11-13 12:00:00+00:00,6.3434976 -2025-11-13 13:00:00+00:00,6.0108998399999995 -2025-11-13 14:00:00+00:00,8.43966816 -2025-11-13 15:00:00+00:00,5.68232544 -2025-11-13 16:00:00+00:00,4.4243321491525425 -2025-11-13 17:00:00+00:00,1.4035336615384617 -2025-11-13 18:00:00+00:00,5.594587957894737 -2025-11-13 19:00:00+00:00,5.19684 -2025-11-13 20:00:00+00:00,5.674983376271187 -2025-11-13 21:00:00+00:00,5.634067850847457 -2025-11-13 22:00:00+00:00,0.7141464000000001 -2025-11-13 23:00:00+00:00,0.0 -2025-11-14 00:00:00+00:00,0.0 -2025-11-14 01:00:00+00:00,0.0 -2025-11-14 02:00:00+00:00,0.0 -2025-11-14 03:00:00+00:00,0.0 -2025-11-14 04:00:00+00:00,0.1665483906976744 -2025-11-14 05:00:00+00:00,0.07394283243243244 -2025-11-14 06:00:00+00:00,0.1475232 -2025-11-14 07:00:00+00:00,0.0 -2025-11-14 08:00:00+00:00,0.0 -2025-11-14 09:00:00+00:00,2.63798304 -2025-11-14 10:00:00+00:00,0.0 -2025-11-14 11:00:00+00:00,0.11667744 -2025-11-14 12:00:00+00:00,0.06732969795918367 -2025-11-14 13:00:00+00:00,0.12219093333333335 -2025-11-14 14:00:00+00:00,5.661344867796609 -2025-11-14 15:00:00+00:00,5.833872 -2025-11-14 16:00:00+00:00,6.4843152 -2025-11-14 17:00:00+00:00,4.365686562711865 -2025-11-14 18:00:00+00:00,3.8010523118644066 -2025-11-14 19:00:00+00:00,0.733489476923077 -2025-11-14 20:00:00+00:00,0.0972312 -2025-11-14 21:00:00+00:00,3.419856 -2025-11-14 22:00:00+00:00,6.855518057142858 -2025-11-14 23:00:00+00:00,7.08379584 -2025-11-15 00:00:00+00:00,6.4641984 -2025-11-15 01:00:00+00:00,6.46956288 -2025-11-15 02:00:00+00:00,5.25450816 -2025-11-15 03:00:00+00:00,2.159739648 -2025-11-15 04:00:00+00:00,4.705285423728813 -2025-11-15 05:00:00+00:00,2.5677658285714284 -2025-11-15 06:00:00+00:00,4.790573131034483 -2025-11-15 07:00:00+00:00,6.766181627586207 -2025-11-15 08:00:00+00:00,2.6117743728813556 -2025-11-15 09:00:00+00:00,0.18909792 -2025-11-15 10:00:00+00:00,0.017434559999999998 -2025-11-15 11:00:00+00:00,0.10460735999999998 -2025-11-15 12:00:00+00:00,0.0 -2025-11-15 13:00:00+00:00,0.0 -2025-11-15 14:00:00+00:00,1.13592864 -2025-11-15 15:00:00+00:00,2.02911456 -2025-11-15 16:00:00+00:00,1.0403259428571427 -2025-11-15 17:00:00+00:00,0.0 -2025-11-15 18:00:00+00:00,0.0 -2025-11-15 19:00:00+00:00,0.0 -2025-11-15 20:00:00+00:00,0.0 -2025-11-15 21:00:00+00:00,0.0 -2025-11-15 22:00:00+00:00,0.0 -2025-11-15 23:00:00+00:00,0.0 -2025-11-16 00:00:00+00:00,0.0 -2025-11-16 01:00:00+00:00,0.0 -2025-11-16 02:00:00+00:00,1.19530368 -2025-11-16 03:00:00+00:00,0.85441536 -2025-11-16 04:00:00+00:00,0.6457002146341464 -2025-11-16 05:00:00+00:00,0.22990628571428573 -2025-11-16 06:00:00+00:00,1.8932565735849056 -2025-11-16 07:00:00+00:00,0.43452288 -2025-11-16 08:00:00+00:00,1.7233392 -2025-11-16 09:00:00+00:00,1.20432576 -2025-11-16 10:00:00+00:00,0.0 -2025-11-16 11:00:00+00:00,0.0 -2025-11-16 12:00:00+00:00,0.0 -2025-11-16 13:00:00+00:00,0.0 -2025-11-16 14:00:00+00:00,0.0 -2025-11-16 15:00:00+00:00,0.0 -2025-11-16 16:00:00+00:00,0.0 -2025-11-16 17:00:00+00:00,0.0 -2025-11-16 18:00:00+00:00,0.0 -2025-11-16 19:00:00+00:00,0.0 -2025-11-16 20:00:00+00:00,0.0 -2025-11-16 21:00:00+00:00,0.7543799999999999 -2025-11-16 22:00:00+00:00,1.7225941333333334 -2025-11-16 23:00:00+00:00,1.587679753846154 -2025-11-17 00:00:00+00:00,0.6634438530612244 -2025-11-17 01:00:00+00:00,1.9084390641509432 -2025-11-17 02:00:00+00:00,2.4207216 -2025-11-17 03:00:00+00:00,2.4549811200000002 -2025-11-17 04:00:00+00:00,2.95851072 -2025-11-17 05:00:00+00:00,4.325112 -2025-11-17 06:00:00+00:00,3.8999769599999996 -2025-11-17 07:00:00+00:00,1.62409632 -2025-11-17 08:00:00+00:00,0.27627072 -2025-11-17 09:00:00+00:00,2.118011657142857 -2025-11-17 10:00:00+00:00,4.2714672 -2025-11-17 11:00:00+00:00,4.55846688 -2025-11-17 12:00:00+00:00,5.01042432 -2025-11-17 13:00:00+00:00,5.455676159999999 -2025-11-17 14:00:00+00:00,4.75561152 -2025-11-17 15:00:00+00:00,1.0366857600000001 -2025-11-17 16:00:00+00:00,1.6898112 -2025-11-17 17:00:00+00:00,0.44153796923076927 -2025-11-17 18:00:00+00:00,1.493471232 -2025-11-17 19:00:00+00:00,1.6306924408163266 -2025-11-17 20:00:00+00:00,1.0512650322580646 -2025-11-17 21:00:00+00:00,0.7540926171428571 -2025-11-17 22:00:00+00:00,1.09435392 -2025-11-17 23:00:00+00:00,1.7017956765957447 -2025-11-18 00:00:00+00:00,0.8664258976744186 -2025-11-18 01:00:00+00:00,1.207008 -2025-11-18 02:00:00+00:00,1.3788163459459462 -2025-11-18 03:00:00+00:00,1.8028076936170214 -2025-11-18 04:00:00+00:00,0.5632704 -2025-11-18 05:00:00+00:00,0.0 -2025-11-18 06:00:00+00:00,0.645379787755102 -2025-11-18 07:00:00+00:00,0.64641984 -2025-11-18 08:00:00+00:00,0.0 diff --git a/meteo/correlation_presets.py b/meteo/correlation_presets.py new file mode 100644 index 0000000..b6ff016 --- /dev/null +++ b/meteo/correlation_presets.py @@ -0,0 +1,119 @@ +"""Jeux de paires et scénarios standardisés pour explorer les corrélations.""" + +from __future__ import annotations + +from dataclasses import dataclass +from typing import Callable, Sequence + +import numpy as np + + +HexbinReducer = Callable[[np.ndarray], float] + + +HEXBIN_REDUCE_FUNCTIONS: dict[str, HexbinReducer] = { + "mean": np.mean, + "median": np.median, + "max": np.max, +} + +HEXBIN_REDUCE_LABELS: dict[str, str] = { + "mean": "moyenne", + "median": "médiane", + "max": "maximum", +} + + +@dataclass(frozen=True) +class HexbinScenario: + """Décrit un cas d'usage pour un nuage hexbin coloré par une 3ᵉ variable.""" + + key_x: str + key_y: str + key_color: str + filename: str + description: str + reduce: str = "mean" + gridsize: int = 60 + mincnt: int = 5 + + def get_reduce_func(self) -> HexbinReducer: + """Retourne la fonction de réduction associée (moyenne, médiane, ...).""" + + return HEXBIN_REDUCE_FUNCTIONS.get(self.reduce, np.mean) + + def get_reduce_label(self) -> str: + """Libellé français de la fonction de réduction utilisée.""" + + return HEXBIN_REDUCE_LABELS.get(self.reduce, self.reduce) + + +DEFAULT_LAGGED_PAIRS: Sequence[tuple[str, str]] = ( + ("temperature", "humidity"), + ("temperature", "rain_rate"), + ("pressure", "rain_rate"), + ("pressure", "wind_speed"), + ("pressure", "illuminance"), + ("illuminance", "temperature"), + ("humidity", "rain_rate"), +) + + +DEFAULT_ROLLING_PAIRS: Sequence[tuple[str, str]] = ( + ("temperature", "humidity"), + ("pressure", "rain_rate"), + ("pressure", "wind_speed"), + ("illuminance", "temperature"), + ("humidity", "rain_rate"), +) + + +DEFAULT_HEXBIN_SCENARIOS: Sequence[HexbinScenario] = ( + HexbinScenario( + key_x="temperature", + key_y="humidity", + key_color="rain_rate", + filename="hexbin_temp_humidity_color_rain.png", + description=( + "Mettre en évidence comment l'humidité relative plafonne lorsque la température chute " + "et comment les épisodes de pluie se situent dans une bande restreinte." + ), + reduce="max", + gridsize=50, + mincnt=8, + ), + HexbinScenario( + key_x="pressure", + key_y="rain_rate", + key_color="wind_speed", + filename="hexbin_pressure_rain_color_wind.png", + description=( + "Vérifier si des rafales accompagnent vraiment les chutes de pression. " + "On s'attend à voir beaucoup de cases vides : la corrélation est loin d'être systématique." + ), + reduce="median", + gridsize=45, + mincnt=5, + ), + HexbinScenario( + key_x="illuminance", + key_y="humidity", + key_color="temperature", + filename="hexbin_lux_humidity_color_temp.png", + description=( + "Explorer le cycle jour/nuit : l'humidité monte quand l'illuminance chute, " + "mais cela n'implique pas toujours une baisse rapide de température." + ), + reduce="mean", + gridsize=55, + mincnt=6, + ), +) + + +__all__ = [ + "HexbinScenario", + "DEFAULT_LAGGED_PAIRS", + "DEFAULT_ROLLING_PAIRS", + "DEFAULT_HEXBIN_SCENARIOS", +] diff --git a/meteo/plots/__init__.py b/meteo/plots/__init__.py index 3dcc1e9..7644bbf 100644 --- a/meteo/plots/__init__.py +++ b/meteo/plots/__init__.py @@ -11,6 +11,7 @@ from .rain import plot_daily_rainfall_hyetograph, plot_rainfall_by_season from .relationships import ( plot_event_composite, plot_hexbin_with_third_variable, + plot_pairwise_relationship_grid, plot_scatter_pair, ) from .seasonal_profiles import ( @@ -37,6 +38,7 @@ __all__ = [ "plot_rainfall_by_season", "plot_event_composite", "plot_hexbin_with_third_variable", + "plot_pairwise_relationship_grid", "plot_scatter_pair", "plot_daylight_hours", "plot_diurnal_cycle", diff --git a/meteo/plots/base.py b/meteo/plots/base.py index 8e0b8ef..8039a7e 100644 --- a/meteo/plots/base.py +++ b/meteo/plots/base.py @@ -21,6 +21,16 @@ def export_plot_dataset(data: Any, output_path: str | Path, *, suffix: str = ".c output_path = Path(output_path) dataset_path = output_path.with_suffix(suffix) + + # If the image is exported under a "figures" directory, keep the dataset in + # an equivalent "data" directory to avoid mixing assets. + parts = list(dataset_path.parts) + for idx, part in enumerate(parts): + if part == "figures": + parts[idx] = "data" + dataset_path = Path(*parts) + break + dataset_path.parent.mkdir(parents=True, exist_ok=True) def _normalize(value: Any, *, default_name: str = "value") -> pd.DataFrame: diff --git a/meteo/plots/relationships.py b/meteo/plots/relationships.py index 692fe8c..278fdda 100644 --- a/meteo/plots/relationships.py +++ b/meteo/plots/relationships.py @@ -13,7 +13,7 @@ import pandas as pd from .base import export_plot_dataset from meteo.variables import Variable -__all__ = ['plot_scatter_pair', 'plot_hexbin_with_third_variable', 'plot_event_composite'] +__all__ = ['plot_scatter_pair', 'plot_pairwise_relationship_grid', 'plot_hexbin_with_third_variable', 'plot_event_composite'] def plot_scatter_pair( @@ -193,6 +193,87 @@ def plot_scatter_pair( return output_path.resolve() + +def plot_pairwise_relationship_grid( + df: pd.DataFrame, + variables: Sequence[Variable], + output_path: str | Path, + *, + sample_step: int = 10, + hist_bins: int = 40, + scatter_kwargs: dict | None = None, +) -> Path: + """Trace un tableau de nuages de points exhaustif (sans doublon).""" + + output_path = Path(output_path) + output_path.parent.mkdir(parents=True, exist_ok=True) + + if not variables: + raise ValueError("La liste de variables ne peut pas être vide.") + + columns = [v.column for v in variables] + for col in columns: + if col not in df.columns: + raise KeyError(f"Colonne absente dans le DataFrame : {col}") + + df_pairs = df[columns].dropna() + if df_pairs.empty: + raise RuntimeError("Aucune ligne complète pour générer les nuages de points.") + + if sample_step > 1: + df_pairs = df_pairs.iloc[::sample_step, :] + + export_plot_dataset(df_pairs, output_path) + + n = len(variables) + fig_size = max(3.0, 1.8 * n) + fig, axes = plt.subplots(n, n, figsize=(fig_size, fig_size), squeeze=False) + + default_scatter_kwargs = {"s": 5, "alpha": 0.5} + scatter_kwargs = {**default_scatter_kwargs, **(scatter_kwargs or {})} + + for row_idx, var_y in enumerate(variables): + for col_idx, var_x in enumerate(variables): + ax = axes[row_idx][col_idx] + + if row_idx < col_idx: + # Triangle supérieur vide pour éviter les doublons + ax.set_visible(False) + continue + + if row_idx == col_idx: + series = df_pairs[var_x.column].dropna() + if series.empty: + ax.text(0.5, 0.5, "(vide)", ha="center", va="center") + ax.set_axis_off() + else: + bins = min(hist_bins, max(5, series.nunique())) + ax.hist(series, bins=bins, color="tab:blue", alpha=0.7) + ax.set_ylabel("") + else: + ax.scatter( + df_pairs[var_x.column], + df_pairs[var_y.column], + **scatter_kwargs, + ) + + if row_idx == n - 1: + ax.set_xlabel(var_x.label) + else: + ax.set_xticklabels([]) + + if col_idx == 0: + ax.set_ylabel(var_y.label) + else: + ax.set_yticklabels([]) + + fig.suptitle("Matrice de corrélations simples (nuages de points)") + fig.tight_layout(rect=[0, 0, 1, 0.97]) + fig.savefig(output_path, dpi=150) + plt.close(fig) + + return output_path.resolve() + def plot_hexbin_with_third_variable( df: pd.DataFrame, var_x: Variable, diff --git a/scripts/plot_hexbin_explorations.py b/scripts/plot_hexbin_explorations.py deleted file mode 100644 index bb5bbe6..0000000 --- a/scripts/plot_hexbin_explorations.py +++ /dev/null @@ -1,128 +0,0 @@ -# scripts/plot_hexbin_explorations.py -from __future__ import annotations - -from pathlib import Path -from typing import Callable - -import numpy as np - -from meteo.dataset import load_raw_csv -from meteo.variables import VARIABLES_BY_KEY -from meteo.plots import plot_hexbin_with_third_variable - - -CSV_PATH = Path("data/weather_minutely.csv") -OUTPUT_DIR = Path("figures/hexbin_explorations") - - -REDUCE_FUNCTIONS: dict[str, Callable[[np.ndarray], float]] = { - "mean": np.mean, - "median": np.median, - "max": np.max, -} - -REDUCE_LABEL_FR: dict[str, str] = { - "mean": "moyenne", - "median": "médiane", - "max": "maximum", -} - -# Chaque scénario illustre soit une corrélation bien connue, -# soit l'absence de structure entre variables. -HEXBIN_SCENARIOS: list[dict[str, object]] = [ - { - "x": "temperature", - "y": "humidity", - "color": "rain_rate", - "filename": "hexbin_temp_humidity_color_rain.png", - "description": ( - "Mettre en évidence comment l'humidité relative plafonne lorsque la température chute " - "et comment les épisodes de pluie se situent dans une bande restreinte." - ), - "reduce": "max", - "gridsize": 50, - "mincnt": 8, - }, - { - "x": "pressure", - "y": "rain_rate", - "color": "wind_speed", - "filename": "hexbin_pressure_rain_color_wind.png", - "description": ( - "Vérifier si des rafales accompagnent vraiment les chutes de pression. " - "On s'attend à voir beaucoup de cases vides : la corrélation est loin d'être systématique." - ), - "reduce": "median", - "gridsize": 45, - "mincnt": 5, - }, - { - "x": "illuminance", - "y": "humidity", - "color": "temperature", - "filename": "hexbin_lux_humidity_color_temp.png", - "description": ( - "Explorer le cycle jour/nuit : l'humidité monte quand l'illuminance chute, " - "mais cela n'implique pas toujours une baisse rapide de température." - ), - "reduce": "mean", - "gridsize": 55, - "mincnt": 6, - }, -] - - -def main() -> None: - if not CSV_PATH.exists(): - print(f"⚠ Fichier introuvable : {CSV_PATH}") - return - - df = load_raw_csv(CSV_PATH) - print(f"Dataset minuté chargé : {CSV_PATH}") - print(f" Lignes : {len(df)}") - print(f" Colonnes : {list(df.columns)}") - print() - - for scenario in HEXBIN_SCENARIOS: - key_x = scenario["x"] - key_y = scenario["y"] - key_color = scenario["color"] - - var_x = VARIABLES_BY_KEY[key_x] - var_y = VARIABLES_BY_KEY[key_y] - var_color = VARIABLES_BY_KEY[key_color] - - filename = scenario["filename"] - output_path = OUTPUT_DIR / filename - - reduce_name = scenario.get("reduce", "mean") - reduce_func = REDUCE_FUNCTIONS.get(reduce_name, np.mean) - reduce_label = REDUCE_LABEL_FR.get(reduce_name, reduce_name) - - gridsize = int(scenario.get("gridsize", 60)) - mincnt = int(scenario.get("mincnt", 5)) - - description = scenario["description"] - print(f"→ Hexbin {var_y.key} vs {var_x.key} (couleur = {var_color.key})") - print(f" {description}") - - plot_hexbin_with_third_variable( - df=df, - var_x=var_x, - var_y=var_y, - var_color=var_color, - output_path=output_path, - gridsize=gridsize, - mincnt=mincnt, - reduce_func=reduce_func, - reduce_func_label=reduce_label, - cmap="magma", - ) - print(f" ✔ Graphique enregistré : {output_path}") - print() - - print("✔ Tous les graphiques hexbin ont été générés.") - - -if __name__ == "__main__": - main() diff --git a/scripts/plot_seasonal_overview.py b/scripts/plot_seasonal_overview.py index 54d4160..9c118ed 100644 --- a/scripts/plot_seasonal_overview.py +++ b/scripts/plot_seasonal_overview.py @@ -36,7 +36,7 @@ def main() -> None: print() if "season" not in df.columns: - print("⚠ La colonne 'season' est absente. Relancez scripts.make_minutely_dataset.") + print('⚠ La colonne "season" est absente. Relancez python "docs/02 - Préparation des données/scripts/make_minutely_dataset.py".') return OUTPUT_DIR.mkdir(parents=True, exist_ok=True) diff --git a/scripts/run_all_plots.py b/scripts/run_all_plots.py index 2cf174a..d8ac163 100644 --- a/scripts/run_all_plots.py +++ b/scripts/run_all_plots.py @@ -4,78 +4,124 @@ from __future__ import annotations import argparse import subprocess import sys +from dataclasses import dataclass +from pathlib import Path from typing import Iterable -PLOT_MODULES: tuple[str, ...] = ( - "scripts.plot_basic_variables", - "scripts.plot_calendar_overview", - "scripts.plot_all_pairwise_scatter", - "scripts.plot_correlation_heatmap", - "scripts.plot_diurnal_cycle", - "scripts.plot_hexbin_explorations", - "scripts.plot_illuminance_focus", - "scripts.plot_lagged_correlations", - "scripts.plot_monthly_patterns", - "scripts.plot_rain_event_composites", - "scripts.plot_rain_hyetograph", - "scripts.plot_rolling_correlation_heatmap", - "scripts.plot_seasonal_overview", - "scripts.plot_sun_elevation_relationships", - "scripts.plot_wind_conditionals", - "scripts.plot_wind_rose", - "scripts.plot_wind_rose_rain", +PROJECT_ROOT = Path(__file__).resolve().parents[1] + + +@dataclass(frozen=True) +class PlotScript: + key: str + path: Path + + def display_path(self) -> str: + try: + return str(self.path.relative_to(PROJECT_ROOT)) + except ValueError: + return str(self.path) + + +PLOT_SCRIPTS: tuple[PlotScript, ...] = ( + PlotScript( + "plot_basic_variables", + PROJECT_ROOT / "docs" / "03 - Premiers graphiques" / "scripts" / "plot_basic_variables.py", + ), + PlotScript("plot_calendar_overview", PROJECT_ROOT / "scripts" / "plot_calendar_overview.py"), + PlotScript( + "plot_all_pairwise_scatter", + PROJECT_ROOT / "docs" / "04 - Corrélations binaires" / "scripts" / "plot_all_pairwise_scatter.py", + ), + PlotScript( + "plot_correlation_heatmap", + PROJECT_ROOT / "docs" / "04 - Corrélations binaires" / "scripts" / "plot_correlation_heatmap.py", + ), + PlotScript("plot_diurnal_cycle", PROJECT_ROOT / "scripts" / "plot_diurnal_cycle.py"), + PlotScript("plot_illuminance_focus", PROJECT_ROOT / "scripts" / "plot_illuminance_focus.py"), + PlotScript( + "plot_hexbin_explorations", + PROJECT_ROOT / "docs" / "06 - Corrélations multiples" / "scripts" / "plot_hexbin_explorations.py", + ), + PlotScript("plot_monthly_patterns", PROJECT_ROOT / "scripts" / "plot_monthly_patterns.py"), + PlotScript("plot_rain_event_composites", PROJECT_ROOT / "scripts" / "plot_rain_event_composites.py"), + PlotScript("plot_rain_hyetograph", PROJECT_ROOT / "scripts" / "plot_rain_hyetograph.py"), + PlotScript( + "plot_lagged_correlations", + PROJECT_ROOT / "docs" / "05 - Corrélations binaires avancées" / "scripts" / "plot_lagged_correlations.py", + ), + PlotScript( + "plot_rolling_correlation_heatmap", + PROJECT_ROOT / "docs" / "05 - Corrélations binaires avancées" / "scripts" / "plot_rolling_correlation_heatmap.py", + ), + PlotScript("plot_seasonal_overview", PROJECT_ROOT / "scripts" / "plot_seasonal_overview.py"), + PlotScript( + "plot_sun_elevation_relationships", + PROJECT_ROOT / "scripts" / "plot_sun_elevation_relationships.py", + ), + PlotScript("plot_wind_conditionals", PROJECT_ROOT / "scripts" / "plot_wind_conditionals.py"), + PlotScript("plot_wind_rose", PROJECT_ROOT / "scripts" / "plot_wind_rose.py"), + PlotScript("plot_wind_rose_rain", PROJECT_ROOT / "scripts" / "plot_wind_rose_rain.py"), ) -def _normalize_module(name: str) -> str: - name = name.strip() - if not name: - raise ValueError("Nom de module vide.") - return name if name.startswith("scripts.") else f"scripts.{name}" +def _normalize_key(name: str) -> str: + normalized = name.strip() + if not normalized: + raise ValueError("Nom de script vide.") + if normalized.startswith("scripts."): + normalized = normalized.split(".", 1)[1] + return normalized -def iter_modules(selected: Iterable[str] | None) -> list[str]: +def iter_scripts(selected: Iterable[str] | None) -> list[PlotScript]: if not selected: - return list(PLOT_MODULES) + return list(PLOT_SCRIPTS) - normalized = [_normalize_module(name) for name in selected] - modules: list[str] = [] + mapping = {script.key: script for script in PLOT_SCRIPTS} + normalized = [_normalize_key(name) for name in selected] + scripts: list[PlotScript] = [] missing: list[str] = [] - for module in normalized: - if module in PLOT_MODULES: - modules.append(module) + for key in normalized: + script = mapping.get(key) + if script is None: + missing.append(key) else: - missing.append(module) + scripts.append(script) if missing: - available = "\n - ".join(("",) + PLOT_MODULES) + available = "\n - ".join(("",) + tuple(script.key for script in PLOT_SCRIPTS)) missing_list = "\n - ".join(("",) + tuple(missing)) raise SystemExit( "\n".join( [ - "Les modules suivants ne sont pas reconnus :", + "Les scripts suivants ne sont pas reconnus :", missing_list, "", - "Modules disponibles :", + "Scripts disponibles :", available, ] ) ) - return modules + return scripts -def run_module(module: str) -> bool: - cmd = [sys.executable, "-m", module] - print(f"\n=== {module} ===") +def run_script(script: PlotScript) -> bool: + if not script.path.exists(): + print(f"✘ Script introuvable : {script.display_path()}") + return False + + cmd = [sys.executable, str(script.path)] + print(f"\n=== {script.key} ({script.display_path()}) ===") result = subprocess.run(cmd, check=False) if result.returncode == 0: - print(f"✔ {module} terminé avec succès.") + print(f"✔ {script.key} terminé avec succès.") return True - print(f"✘ {module} a échoué (code {result.returncode}).") + print(f"✘ {script.key} a échoué (code {result.returncode}).") return False @@ -84,21 +130,21 @@ def main(argv: list[str] | None = None) -> int: parser.add_argument( "--only", nargs="*", - help="Limiter l'exécution à certains modules (ex: plot_temperature).", + help="Limiter l'exécution à certains scripts (ex: plot_temperature).", ) args = parser.parse_args(argv) - modules = iter_modules(args.only) - print(f"Exécution de {len(modules)} script(s) de tracé…") + scripts = iter_scripts(args.only) + print(f"Exécution de {len(scripts)} script(s) de tracé…") success_count = 0 - for module in modules: - if run_module(module): + for script in scripts: + if run_script(script): success_count += 1 print() - print(f"Scripts réussis : {success_count}/{len(modules)}") - failed = len(modules) - success_count + print(f"Scripts réussis : {success_count}/{len(scripts)}") + failed = len(scripts) - success_count if failed: print(f"⚠ {failed} script(s) ont échoué. Consultez les messages ci-dessus.") return 1