1

Réorganisation de la documentation

This commit is contained in:
Richard Dern 2025-11-17 15:32:37 +01:00
parent 5a546688f1
commit db17e3e48e
7 changed files with 157 additions and 141 deletions

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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)