86 lines
2.5 KiB
Python
86 lines
2.5 KiB
Python
# scripts/plot_rain_event_composites.py
|
|
from __future__ import annotations
|
|
|
|
from pathlib import Path
|
|
from typing import Sequence
|
|
|
|
import pandas as pd
|
|
|
|
from meteo.dataset import load_raw_csv
|
|
from meteo.variables import Variable, VARIABLES_BY_KEY
|
|
from meteo.analysis import detect_threshold_events, build_event_aligned_segments
|
|
from meteo.plots import plot_event_composite
|
|
|
|
|
|
CSV_PATH = Path("data/weather_minutely.csv")
|
|
OUTPUT_PATH = Path("figures/event_composites/rain_event_composites.png")
|
|
|
|
RAIN_THRESHOLD = 0.2 # mm/h : au-dessous on considère qu'il ne pleut pas vraiment
|
|
MIN_EVENT_DURATION = 5 # minutes
|
|
MIN_EVENT_GAP = 20 # minutes nécessaires pour considérer un nouvel événement
|
|
WINDOW_BEFORE = 120 # minutes affichées avant le début de la pluie
|
|
WINDOW_AFTER = 240 # minutes après le déclenchement
|
|
|
|
COMPOSITE_VARIABLE_KEYS: Sequence[str] = [
|
|
"pressure",
|
|
"temperature",
|
|
"humidity",
|
|
"wind_speed",
|
|
]
|
|
|
|
|
|
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()
|
|
|
|
rain_series = df["rain_rate"]
|
|
events = detect_threshold_events(
|
|
rain_series,
|
|
threshold=RAIN_THRESHOLD,
|
|
min_duration=pd.Timedelta(minutes=MIN_EVENT_DURATION),
|
|
min_gap=pd.Timedelta(minutes=MIN_EVENT_GAP),
|
|
)
|
|
|
|
if not events:
|
|
print("⚠ Aucun événement de pluie détecté avec les paramètres actuels.")
|
|
return
|
|
|
|
print(f"Nombre d'événements détectés : {len(events)}")
|
|
|
|
variables: list[Variable] = [VARIABLES_BY_KEY[key] for key in COMPOSITE_VARIABLE_KEYS]
|
|
columns = [v.column for v in variables]
|
|
|
|
aligned_segments = build_event_aligned_segments(
|
|
df=df,
|
|
events=events,
|
|
columns=columns,
|
|
window_before_minutes=WINDOW_BEFORE,
|
|
window_after_minutes=WINDOW_AFTER,
|
|
resample_minutes=1,
|
|
)
|
|
|
|
if aligned_segments.empty:
|
|
print("⚠ Les segments alignés sont vides (période manquante ?).")
|
|
return
|
|
|
|
output_path = plot_event_composite(
|
|
aligned_segments=aligned_segments,
|
|
variables=variables,
|
|
output_path=OUTPUT_PATH,
|
|
quantiles=(0.2, 0.8),
|
|
baseline_label="Début de la pluie",
|
|
)
|
|
|
|
print(f"✔ Graphique composite pluie sauvegardé : {output_path}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|