From db17e3e48eba68fb2c072600f8750aeb45e1aec3 Mon Sep 17 00:00:00 2001 From: Richard Dern Date: Mon, 17 Nov 2025 15:32:37 +0100 Subject: [PATCH] =?UTF-8?q?R=C3=A9organisation=20de=20la=20documentation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...03 - Test de l'environnement de travail.md | 4 +- docs/04 - Export des données.md | 1 + docs/05 - Ajustements.md | 138 ++++++++++++++++++ docs/06 - Downsampling.md | 132 ----------------- docs/06 - Premiers graphiques.md | 15 ++ ...- Corrélations.md => 07 - Corrélations.md} | 0 docs/07 - Premiers graphiques.md | 8 - 7 files changed, 157 insertions(+), 141 deletions(-) delete mode 100644 docs/06 - Downsampling.md create mode 100644 docs/06 - Premiers graphiques.md rename docs/{08 - Corrélations.md => 07 - Corrélations.md} (100%) delete mode 100644 docs/07 - Premiers graphiques.md diff --git a/docs/03 - Test de l'environnement de travail.md b/docs/03 - Test de l'environnement de travail.md index a9b41f2..290cc1f 100644 --- a/docs/03 - Test de l'environnement de travail.md +++ b/docs/03 - Test de l'environnement de travail.md @@ -166,4 +166,6 @@ Measurement « °C » - station_meteo_bresser_exterieur_temperature ``` -Ces informations combinées se retrouvent dans le fichier `meteo/station_config.py`. +Ces informations combinées se retrouvent dans le fichier `meteo/station_config.py` et dans `meteo/variables.py`. + +On aurait pu se passer de ces scripts pour déterminer la structure des données stockées dans Influx, mais ils évitent de se reposer sur des intuitions : ici, on demande à Influx de nous donner les informations dont on va avoir besoin au lieu de les deviner. diff --git a/docs/04 - Export des données.md b/docs/04 - Export des données.md index e548c3d..378de2f 100644 --- a/docs/04 - Export des données.md +++ b/docs/04 - Export des données.md @@ -17,3 +17,4 @@ 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 - Ajustements.md b/docs/05 - Ajustements.md index bf28ce8..20d770d 100644 --- a/docs/05 - Ajustements.md +++ b/docs/05 - Ajustements.md @@ -68,3 +68,141 @@ Fichier 1s formaté chargé : data/weather_formatted_1s.csv nd_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 : + +```shell +python -m scripts.make_minutely_dataset +``` + +Ce qui va produire le fichier `data/weather_minutely.csv`. + +On peut s'assurer que plus aucune information n'est manquante : + +```shell +python -m scripts.check_missing_values +``` + +```output +Dataset chargé : data/weather_minutely.csv + Lignes : 321881 + Colonnes : ['temperature', 'humidity', 'pressure', 'illuminance', 'wind_speed', 'wind_direction', 'r +ain_rate'] +=== Synthèse des valeurs manquantes === +Total de cellules : 2253167 +Cellules manquantes : 0 +Fraction manquante : 0.000000 +Lignes complètes : 321881 +Lignes avec des trous : 0 +Fraction lignes complètes : 1.000000 + +Valeurs manquantes par colonne : + - temperature : 0 + - humidity : 0 + - pressure : 0 + - illuminance : 0 + - wind_speed : 0 + - wind_direction : 0 + - rain_rate : 0 + +✔ Aucune valeur manquante dans le dataset minuté. +``` + +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 +``` + +```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 + +=== describe() === + temperature humidity pressure ... wind_speed wind_direction rain_rate +count 321881.000000 321881.000000 321881.000000 ... 321881.000000 321881.000000 321881.000000 +mean 15.004488 74.131993 1010.683189 ... 2.877190 181.977411 0.108216 +std 6.349077 18.885843 8.210283 ... 3.151080 88.089334 0.820691 +min -2.200000 20.000000 976.973123 ... 0.000000 0.000000 0.000000 +25% 10.277778 59.000000 1005.420000 ... 0.000000 96.000000 0.000000 +50% 14.600000 77.666667 1011.514287 ... 2.333549 210.000000 0.000000 +75% 19.000000 91.000000 1015.900000 ... 4.650000 247.666196 0.000000 +max 34.888889 99.000000 1033.187174 ... 26.554176 360.000000 42.672000 + +[8 rows x 7 columns] + +=== Min / max avec dates === +- temperature: + min = -2.2 à 2025-03-17 05:16:00+00:00 + max = 34.8888888888889 à 2025-07-02 15:59:00+00:00 +- humidity: + min = 20.0 à 2025-04-30 15:22:00+00:00 + max = 99.0 à 2025-03-11 06:29:00+00:00 +- pressure: + min = 976.973122738378 à 2025-10-23 05:06:00+00:00 + max = 1033.18717416804 à 2025-10-10 17:12:00+00:00 +- illuminance: + min = 0.0 à 2025-03-10 17:44:00+00:00 + max = 133520.394 à 2025-07-29 11:48:00+00:00 +- wind_speed: + min = 0.0 à 2025-03-10 14:31:00+00:00 + max = 26.554176 à 2025-06-26 00:10:00+00:00 +- wind_direction: + min = 0.0 à 2025-03-12 04:57:00+00:00 + max = 360.0 à 2025-03-12 07:33:00+00:00 +- rain_rate: + min = 0.0 à 2025-03-10 09:35:00+00:00 + max = 42.672 à 2025-06-15 03:10:00+00:00 + +=== Vérification de la continuité temporelle === +Différences d'intervalle (top 5): +time +0 days 00:01:00 304291 +0 days 00:02:00 9426 +0 days 00:03:00 3562 +0 days 00:04:00 1740 +0 days 00:05:00 1142 +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 +``` + +``` +Dataset minuté chargé : data/weather_minutely.csv + Lignes : 321881 + +=== Gaps temporels détectés === +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) +``` + +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. + +Ces scripts sont intéressants parce qu'ils mettent en évidence des facteurs indirects, contribuant à la qualité des données soumise. +On peut prendre toutes les précautions, on peut avoir l'intuition d'avoir tout géré, et se rassurer parce qu'on utilise des outils fiables, mais il existera toujours des manques dans les données. + +Il faut être capable de les identifier, et il faut les prendre en compte dans tout calcul ultérieur. + +Une fois que tout est passé en revue, on passe d'un jeu contenant plus d'un million d'enregistrements à un jeu n'en contenant plus que 300 000. diff --git a/docs/06 - Downsampling.md b/docs/06 - Downsampling.md deleted file mode 100644 index f875e97..0000000 --- a/docs/06 - Downsampling.md +++ /dev/null @@ -1,132 +0,0 @@ -# Downsampling - -On peut maintenant s'assurer d'avoir une seule ligne par minute, avec toutes les valeurs de capteurs : - -```shell -python -m scripts.make_minutely_dataset -``` - -Ce qui va produire le fichier `data/weather_minutely.csv`. - -On peut s'assurer que plus aucune information n'est manquante : - -```shell -python -m scripts.check_missing_values -``` - -```output -Dataset chargé : data/weather_minutely.csv - Lignes : 321881 - Colonnes : ['temperature', 'humidity', 'pressure', 'illuminance', 'wind_speed', 'wind_direction', 'r -ain_rate'] -=== Synthèse des valeurs manquantes === -Total de cellules : 2253167 -Cellules manquantes : 0 -Fraction manquante : 0.000000 -Lignes complètes : 321881 -Lignes avec des trous : 0 -Fraction lignes complètes : 1.000000 - -Valeurs manquantes par colonne : - - temperature : 0 - - humidity : 0 - - pressure : 0 - - illuminance : 0 - - wind_speed : 0 - - wind_direction : 0 - - rain_rate : 0 - -✔ Aucune valeur manquante dans le dataset minuté. -``` - -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 -``` - -```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 - -=== describe() === - temperature humidity pressure ... wind_speed wind_direction rain_rate -count 321881.000000 321881.000000 321881.000000 ... 321881.000000 321881.000000 321881.000000 -mean 15.004488 74.131993 1010.683189 ... 2.877190 181.977411 0.108216 -std 6.349077 18.885843 8.210283 ... 3.151080 88.089334 0.820691 -min -2.200000 20.000000 976.973123 ... 0.000000 0.000000 0.000000 -25% 10.277778 59.000000 1005.420000 ... 0.000000 96.000000 0.000000 -50% 14.600000 77.666667 1011.514287 ... 2.333549 210.000000 0.000000 -75% 19.000000 91.000000 1015.900000 ... 4.650000 247.666196 0.000000 -max 34.888889 99.000000 1033.187174 ... 26.554176 360.000000 42.672000 - -[8 rows x 7 columns] - -=== Min / max avec dates === -- temperature: - min = -2.2 à 2025-03-17 05:16:00+00:00 - max = 34.8888888888889 à 2025-07-02 15:59:00+00:00 -- humidity: - min = 20.0 à 2025-04-30 15:22:00+00:00 - max = 99.0 à 2025-03-11 06:29:00+00:00 -- pressure: - min = 976.973122738378 à 2025-10-23 05:06:00+00:00 - max = 1033.18717416804 à 2025-10-10 17:12:00+00:00 -- illuminance: - min = 0.0 à 2025-03-10 17:44:00+00:00 - max = 133520.394 à 2025-07-29 11:48:00+00:00 -- wind_speed: - min = 0.0 à 2025-03-10 14:31:00+00:00 - max = 26.554176 à 2025-06-26 00:10:00+00:00 -- wind_direction: - min = 0.0 à 2025-03-12 04:57:00+00:00 - max = 360.0 à 2025-03-12 07:33:00+00:00 -- rain_rate: - min = 0.0 à 2025-03-10 09:35:00+00:00 - max = 42.672 à 2025-06-15 03:10:00+00:00 - -=== Vérification de la continuité temporelle === -Différences d'intervalle (top 5): -time -0 days 00:01:00 304291 -0 days 00:02:00 9426 -0 days 00:03:00 3562 -0 days 00:04:00 1740 -0 days 00:05:00 1142 -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 -``` - -``` -Dataset minuté chargé : data/weather_minutely.csv - Lignes : 321881 - -=== Gaps temporels détectés === -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) -``` - -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/docs/06 - Premiers graphiques.md b/docs/06 - Premiers graphiques.md new file mode 100644 index 0000000..ec78f74 --- /dev/null +++ b/docs/06 - Premiers graphiques.md @@ -0,0 +1,15 @@ +# Premiers graphiques + +Ces premiers graphiques devraient être similaires à ce que sortirait InfluxDB. +On s'assure juste, ici, d'être capables de produire un résultat parlant, sans erreurs, et conforme à ce qui est vérifiable dans Influx. + +Un premier script simple va nous permettre d'afficher la température des 7 derniers jours, de sorte à vérifier que tout fonctionne bien. +On pourra comparer ce graphique avec celui proposé par Home Assistant et celui proposé par InfluxDB : + +```shell +python -m scripts.plot_temperature +``` + +![](../figures/temperature_last_7_days.png) + +Maintenant que l'on peut produire des graphiques à partir d'un jeu de données adapté, on peut commencer à explorer nos données. diff --git a/docs/08 - Corrélations.md b/docs/07 - Corrélations.md similarity index 100% rename from docs/08 - Corrélations.md rename to docs/07 - Corrélations.md diff --git a/docs/07 - Premiers graphiques.md b/docs/07 - Premiers graphiques.md deleted file mode 100644 index 94ed2df..0000000 --- a/docs/07 - Premiers graphiques.md +++ /dev/null @@ -1,8 +0,0 @@ -# Premiers graphiques - -Ces premiers graphiques devraient être similaires à ce que sortirait InfluxDB. -On s'assure juste, ici, d'être capables de produire un résultat parlant, sans erreurs, et conforme à ce qui est vérifiable dans Influx. - -## Température moyenne sur les 7 derniers jours - -![](../figures/temperature_last_7_days.png)