Réorganisation
@ -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
|
||||
@ -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
|
||||
@ -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
|
||||
|
||||
@ -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 (
|
||||
@ -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
|
||||
@ -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
|
||||
@ -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.
|
||||
@ -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
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
@ -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
|
||||
@ -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)
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
@ -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)
|
||||
|
Before Width: | Height: | Size: 65 KiB After Width: | Height: | Size: 65 KiB |
|
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 62 KiB |
|
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 62 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 71 KiB After Width: | Height: | Size: 71 KiB |
|
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 58 KiB |
|
Before Width: | Height: | Size: 79 KiB After Width: | Height: | Size: 79 KiB |
|
Before Width: | Height: | Size: 77 KiB After Width: | Height: | Size: 77 KiB |
69
docs/03 - Premiers graphiques/index.md
Normal file
@ -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
|
||||
```
|
||||
|
||||

|
||||
|
||||
## Humidité relative
|
||||
|
||||
```shell
|
||||
python "docs/03 - Premiers graphiques/scripts/plot_basic_variables.py" --only humidity
|
||||
```
|
||||
|
||||

|
||||
|
||||
## Pression atmosphérique
|
||||
|
||||
```shell
|
||||
python "docs/03 - Premiers graphiques/scripts/plot_basic_variables.py" --only pressure
|
||||
```
|
||||
|
||||

|
||||
|
||||
## Précipitations instantanées
|
||||
|
||||
```shell
|
||||
python "docs/03 - Premiers graphiques/scripts/plot_basic_variables.py" --only rain_rate
|
||||
```
|
||||
|
||||

|
||||
|
||||
## Luminance
|
||||
|
||||
```shell
|
||||
python "docs/03 - Premiers graphiques/scripts/plot_basic_variables.py" --only illuminance
|
||||
```
|
||||
|
||||

|
||||
|
||||
## Vitesse du vent
|
||||
|
||||
```shell
|
||||
python "docs/03 - Premiers graphiques/scripts/plot_basic_variables.py" --only wind_speed
|
||||
```
|
||||
|
||||

|
||||
|
||||
## Direction du vent
|
||||
|
||||
```shell
|
||||
python "docs/03 - Premiers graphiques/scripts/plot_basic_variables.py" --only wind_direction
|
||||
```
|
||||
|
||||

|
||||
|
||||
## Élévation solaire (si disponible après enrichissement)
|
||||
|
||||
```shell
|
||||
python "docs/03 - Premiers graphiques/scripts/plot_basic_variables.py" --only sun_elevation
|
||||
```
|
||||
|
||||

|
||||
@ -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:
|
||||
BIN
docs/04 - Corrélations binaires/figures/correlation_heatmap.png
Normal file
|
After Width: | Height: | Size: 127 KiB |
|
After Width: | Height: | Size: 497 KiB |
|
After Width: | Height: | Size: 432 KiB |
|
After Width: | Height: | Size: 83 KiB |
|
After Width: | Height: | Size: 610 KiB |
|
After Width: | Height: | Size: 587 KiB |
|
After Width: | Height: | Size: 379 KiB |
|
After Width: | Height: | Size: 235 KiB |
|
After Width: | Height: | Size: 364 KiB |
|
After Width: | Height: | Size: 351 KiB |
|
After Width: | Height: | Size: 390 KiB |
|
After Width: | Height: | Size: 102 KiB |
|
After Width: | Height: | Size: 505 KiB |
|
After Width: | Height: | Size: 479 KiB |
|
After Width: | Height: | Size: 325 KiB |
|
After Width: | Height: | Size: 88 KiB |
|
After Width: | Height: | Size: 111 KiB |
|
After Width: | Height: | Size: 108 KiB |
|
After Width: | Height: | Size: 97 KiB |
|
After Width: | Height: | Size: 445 KiB |
|
After Width: | Height: | Size: 430 KiB |
|
After Width: | Height: | Size: 363 KiB |
|
After Width: | Height: | Size: 92 KiB |
|
After Width: | Height: | Size: 512 KiB |
|
After Width: | Height: | Size: 471 KiB |
|
After Width: | Height: | Size: 340 KiB |
|
After Width: | Height: | Size: 574 KiB |
|
After Width: | Height: | Size: 403 KiB |
|
After Width: | Height: | Size: 201 KiB |
72
docs/04 - Corrélations binaires/index.md
Normal file
@ -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"
|
||||
```
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
## Heatmap globale
|
||||
|
||||
```shell
|
||||
python "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 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:
|
||||
@ -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:
|
||||
96
docs/04 - Corrélations binaires/scripts/plot_correlations.py
Normal file
@ -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())
|
||||
@ -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.
|
||||
|
After Width: | Height: | Size: 52 KiB |
|
After Width: | Height: | Size: 50 KiB |
|
After Width: | Height: | Size: 51 KiB |
|
After Width: | Height: | Size: 55 KiB |
|
After Width: | Height: | Size: 54 KiB |
|
After Width: | Height: | Size: 57 KiB |
|
After Width: | Height: | Size: 48 KiB |
|
After Width: | Height: | Size: 256 KiB |
29
docs/05 - Corrélations binaires avancées/index.md
Normal file
@ -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"
|
||||
```
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
## Corrélations glissantes
|
||||
|
||||
```shell
|
||||
python "docs/05 - Corrélations binaires avancées/scripts/plot_rolling_correlation_heatmap.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]
|
||||
|
||||
@ -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,
|
||||
|
After Width: | Height: | Size: 174 KiB |
|
After Width: | Height: | Size: 83 KiB |
|
After Width: | Height: | Size: 93 KiB |
13
docs/06 - Corrélations multiples/index.md
Normal file
@ -0,0 +1,13 @@
|
||||
# Corrélations multiples
|
||||
|
||||
## Hexbin colorés
|
||||
|
||||
```shell
|
||||
python "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()
|
||||
@ -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
|
||||
```
|
||||
|
||||

|
||||
|
||||
## Humidité relative
|
||||
|
||||
```shell
|
||||
python -m scripts.plot_basic_variables --only humidity
|
||||
```
|
||||
|
||||

|
||||
|
||||
## Pression atmosphérique
|
||||
|
||||
```shell
|
||||
python -m scripts.plot_basic_variables --only pressure
|
||||
```
|
||||
|
||||

|
||||
|
||||
## Précipitations instantanées
|
||||
|
||||
```shell
|
||||
python -m scripts.plot_basic_variables --only rain_rate
|
||||
```
|
||||
|
||||

|
||||
|
||||
## Luminance
|
||||
|
||||
```shell
|
||||
python -m scripts.plot_basic_variables --only illuminance
|
||||
```
|
||||
|
||||

|
||||
|
||||
## Vitesse du vent
|
||||
|
||||
```shell
|
||||
python -m scripts.plot_basic_variables --only wind_speed
|
||||
```
|
||||
|
||||

|
||||
|
||||
## Direction du vent
|
||||
|
||||
```shell
|
||||
python -m scripts.plot_basic_variables --only wind_direction
|
||||
```
|
||||
|
||||

|
||||
|
||||
## Élévation solaire (si disponible après enrichissement)
|
||||
|
||||
```shell
|
||||
python -m scripts.plot_basic_variables --only sun_elevation
|
||||
```
|
||||
|
||||

|
||||
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
119
meteo/correlation_presets.py
Normal file
@ -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",
|
||||
]
|
||||
@ -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",
|
||||
|
||||
@ -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:
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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()
|
||||
@ -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)
|
||||
|
||||
@ -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
|
||||
|
||||