You've already forked donnees_meteo
Commit initial
This commit is contained in:
17
docs/01 - Installation de l'environnement de base.md
Normal file
17
docs/01 - Installation de l'environnement de base.md
Normal file
@@ -0,0 +1,17 @@
|
||||
# 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
|
||||
12
docs/02 - Configuration.md
Normal file
12
docs/02 - Configuration.md
Normal file
@@ -0,0 +1,12 @@
|
||||
# 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
|
||||
169
docs/03 - Test de l'environnement de travail.md
Normal file
169
docs/03 - Test de l'environnement de travail.md
Normal file
@@ -0,0 +1,169 @@
|
||||
# Test de l'environnement de travail
|
||||
|
||||
```shell
|
||||
python -m scripts.test_influx_connection
|
||||
```
|
||||
|
||||
```output
|
||||
Configuration InfluxDB chargée :
|
||||
URL : http://10.0.3.2:8086
|
||||
Org : Dern
|
||||
Bucket : weather
|
||||
|
||||
→ Ping du serveur InfluxDB…
|
||||
✔ Ping OK
|
||||
→ Requête de test sur le bucket…
|
||||
✔ Requête de test réussie : 18 table(s), 58 enregistrement(s) trouvés.
|
||||
Exemple de point :
|
||||
time : 2025-11-16 22:30:50.263360+00:00
|
||||
measurement : %
|
||||
field : device_class_str
|
||||
value : humidity
|
||||
```
|
||||
|
||||
Ensuite, on peut demander à InfluxDB de nous détailler ce qu'il stocke :
|
||||
|
||||
```shell
|
||||
python -m scripts.test_influx_schema
|
||||
```
|
||||
|
||||
```output
|
||||
Bucket InfluxDB : weather
|
||||
|
||||
Measurements disponibles :
|
||||
- %
|
||||
- hPa
|
||||
- km/h
|
||||
- lx
|
||||
- mm/h
|
||||
- °
|
||||
- °C
|
||||
|
||||
Champs pour measurement « % » :
|
||||
- device_class_str (type: unknown)
|
||||
- friendly_name_str (type: unknown)
|
||||
- state_class_str (type: unknown)
|
||||
- value (type: unknown)
|
||||
|
||||
Champs pour measurement « hPa » :
|
||||
- device_class_str (type: unknown)
|
||||
- friendly_name_str (type: unknown)
|
||||
- state_class_str (type: unknown)
|
||||
- value (type: unknown)
|
||||
|
||||
Champs pour measurement « km/h » :
|
||||
- device_class_str (type: unknown)
|
||||
- friendly_name_str (type: unknown)
|
||||
- state_class_str (type: unknown)
|
||||
- value (type: unknown)
|
||||
|
||||
Champs pour measurement « lx » :
|
||||
- device_class_str (type: unknown)
|
||||
- friendly_name_str (type: unknown)
|
||||
- value (type: unknown)
|
||||
|
||||
Champs pour measurement « mm/h » :
|
||||
- device_class_str (type: unknown)
|
||||
- friendly_name_str (type: unknown)
|
||||
- state_class_str (type: unknown)
|
||||
- value (type: unknown)
|
||||
|
||||
Champs pour measurement « ° » :
|
||||
- friendly_name_str (type: unknown)
|
||||
- value (type: unknown)
|
||||
|
||||
Champs pour measurement « °C » :
|
||||
- device_class_str (type: unknown)
|
||||
- friendly_name_str (type: unknown)
|
||||
- state_class_str (type: unknown)
|
||||
- value (type: unknown)
|
||||
```
|
||||
|
||||
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
|
||||
```
|
||||
|
||||
```output
|
||||
Bucket InfluxDB : weather
|
||||
|
||||
Measurement « % »
|
||||
Tag keys :
|
||||
- _field
|
||||
- _measurement
|
||||
- _start
|
||||
- _stop
|
||||
- domain
|
||||
- entity_id
|
||||
entity_id possibles :
|
||||
- station_meteo_bresser_exterieur_humidite_relative
|
||||
|
||||
Measurement « hPa »
|
||||
Tag keys :
|
||||
- _field
|
||||
- _measurement
|
||||
- _start
|
||||
- _stop
|
||||
- domain
|
||||
- entity_id
|
||||
entity_id possibles :
|
||||
- station_meteo_bresser_exterieur_pression_atmospherique
|
||||
|
||||
Measurement « km/h »
|
||||
Tag keys :
|
||||
- _field
|
||||
- _measurement
|
||||
- _start
|
||||
- _stop
|
||||
- domain
|
||||
- entity_id
|
||||
entity_id possibles :
|
||||
- station_meteo_bresser_exterieur_vitesse_du_vent
|
||||
|
||||
Measurement « lx »
|
||||
Tag keys :
|
||||
- _field
|
||||
- _measurement
|
||||
- _start
|
||||
- _stop
|
||||
- domain
|
||||
- entity_id
|
||||
entity_id possibles :
|
||||
- station_meteo_bresser_exterieur_luminance
|
||||
|
||||
Measurement « mm/h »
|
||||
Tag keys :
|
||||
- _field
|
||||
- _measurement
|
||||
- _start
|
||||
- _stop
|
||||
- domain
|
||||
- entity_id
|
||||
entity_id possibles :
|
||||
- station_meteo_bresser_exterieur_precipitations
|
||||
|
||||
Measurement « ° »
|
||||
Tag keys :
|
||||
- _field
|
||||
- _measurement
|
||||
- _start
|
||||
- _stop
|
||||
- domain
|
||||
- entity_id
|
||||
entity_id possibles :
|
||||
- station_meteo_bresser_exterieur_direction_du_vent
|
||||
|
||||
Measurement « °C »
|
||||
Tag keys :
|
||||
- _field
|
||||
- _measurement
|
||||
- _start
|
||||
- _stop
|
||||
- domain
|
||||
- entity_id
|
||||
entity_id possibles :
|
||||
- station_meteo_bresser_exterieur_temperature
|
||||
```
|
||||
|
||||
Ces informations combinées se retrouvent dans le fichier `meteo/station_config.py`.
|
||||
19
docs/04 - Export des données.md
Normal file
19
docs/04 - Export des données.md
Normal file
@@ -0,0 +1,19 @@
|
||||
# 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.
|
||||
70
docs/05 - Ajustements.md
Normal file
70
docs/05 - Ajustements.md
Normal file
@@ -0,0 +1,70 @@
|
||||
# Ajustements
|
||||
|
||||
Le fichier peut être rapidement inspecté avec la commande `head` :
|
||||
|
||||
```shell
|
||||
head data/weather_raw_full.csv
|
||||
```
|
||||
|
||||
```output
|
||||
time,temperature,humidity,pressure,illuminance,wind_speed,wind_direction,rain_rate
|
||||
2025-03-10 09:35:23.156646+00:00,,,996.95,,,,
|
||||
2025-03-10 09:35:23.158538+00:00,10.6,,,,,,
|
||||
2025-03-10 09:35:23.162398+00:00,,83.0,,,,,
|
||||
2025-03-10 09:35:23.164634+00:00,,,,,7.4,,
|
||||
2025-03-10 09:35:23.170122+00:00,,,,,,256.0,
|
||||
2025-03-10 09:35:23.183555+00:00,,,,,,,0.0
|
||||
2025-03-10 09:35:41.211148+00:00,,,,20551.2,,,
|
||||
2025-03-10 09:36:22.638255+00:00,,,,,12.2,,
|
||||
2025-03-10 09:36:22.640356+00:00,,,,,,306.0,
|
||||
```
|
||||
|
||||
On peut voir que HomeAssistant écrit une nouvelle entrée pour chaque capteur, alors qu'on aurait pu s'attendre à une ligne unique pour l'ensemble des capteurs.
|
||||
|
||||
Le script suivant s'occupe de regrouper les données de capteurs dont l'enregistrement est proche :
|
||||
|
||||
```shell
|
||||
python -m scripts.format_raw_csv
|
||||
```
|
||||
|
||||
```output
|
||||
Fichier brut chargé : data/weather_raw_full.csv
|
||||
Lignes : 1570931, colonnes : ['temperature', 'humidity', 'pressure', 'illuminance', 'wind_speed', 'wind_direction', 'rain_rate']
|
||||
Type d'index : <class 'pandas.core.indexes.datetimes.DatetimeIndex'>
|
||||
Après combinaison (1s) : 630171 lignes
|
||||
✔ Fichier formaté écrit dans : /Users/richard/Documents/donnees_meteo/data/weather_formatted_1s.csv
|
||||
```
|
||||
|
||||
Un nouveau document CSV intermédiaire est donc créé.
|
||||
|
||||
```shell
|
||||
head data/weather_formatted_1s.csv
|
||||
```
|
||||
|
||||
```output
|
||||
time,temperature,humidity,pressure,illuminance,wind_speed,wind_direction,rain_rate
|
||||
2025-03-10 09:35:23+00:00,10.6,83.0,996.95,,7.4,256.0,0.0
|
||||
2025-03-10 09:35:41+00:00,,,,20551.2,,,
|
||||
2025-03-10 09:36:22+00:00,,,,20247.6,12.2,306.0,
|
||||
2025-03-10 09:36:52+00:00,,,,20199.6,9.3,246.0,
|
||||
2025-03-10 09:37:22+00:00,,,,20034.0,7.9,,
|
||||
2025-03-10 09:37:52+00:00,,,,20124.0,7.4,284.0,
|
||||
2025-03-10 09:38:22+00:00,,,,19860.0,9.7,215.0,
|
||||
2025-03-10 09:39:22+00:00,,,,19722.0,11.4,203.0,
|
||||
2025-03-10 09:40:22+00:00,,,,19720.8,10.0,209.0,
|
||||
```
|
||||
|
||||
Il reste des cellules vides : en effet, HA n'enregistre pas la valeur d'un capteur si elle n'a pas changé depuis la dernière fois.
|
||||
|
||||
On fait donc :
|
||||
|
||||
```shell
|
||||
python -m scripts.fill_formatted_1s
|
||||
```
|
||||
|
||||
```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
|
||||
✔ Fichier 1s 'complet' écrit dans : /Users/richard/Documents/donnees_meteo/data/weather_filled_1s.csv
|
||||
```
|
||||
132
docs/06 - Downsampling.md
Normal file
132
docs/06 - Downsampling.md
Normal file
@@ -0,0 +1,132 @@
|
||||
# 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.
|
||||
8
docs/07 - Premiers graphiques.md
Normal file
8
docs/07 - Premiers graphiques.md
Normal file
@@ -0,0 +1,8 @@
|
||||
# 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
|
||||
|
||||

|
||||
Reference in New Issue
Block a user