1

Ajout de l'élévation solaire et visualisations

This commit is contained in:
2025-11-17 22:20:54 +01:00
parent 268d5d65ec
commit 01cf686af3
13 changed files with 487 additions and 1 deletions

View File

@@ -4,6 +4,8 @@ from __future__ import annotations
from pathlib import Path
from meteo.dataset import load_raw_csv, resample_to_minutes
from meteo.config import StationLocation
from meteo.solar import add_solar_elevation_column
FORMATTED_CSV_PATH = Path("data/weather_filled_1s.csv")
@@ -23,6 +25,29 @@ def main() -> None:
df_min = resample_to_minutes(df_1s)
print(f"Après resampling 60s : {len(df_min)} lignes")
try:
location = StationLocation.from_env(optional=True)
except RuntimeError as exc:
print(f"⚠ Coordonnées GPS invalides : {exc}")
location = None
if location is not None:
print(
f"Ajout de l'élévation solaire (lat={location.latitude}, lon={location.longitude}, "
f"alt={location.elevation_m} m)..."
)
add_solar_elevation_column(
df_min,
latitude=location.latitude,
longitude=location.longitude,
elevation_m=location.elevation_m,
)
else:
print(
" Coordonnées GPS non définies (STATION_LATITUDE / STATION_LONGITUDE). "
"La colonne sun_elevation ne sera pas ajoutée."
)
OUTPUT_CSV_PATH.parent.mkdir(parents=True, exist_ok=True)
df_min.to_csv(OUTPUT_CSV_PATH, index_label="time")
print(f"✔ Dataset minuté écrit dans : {OUTPUT_CSV_PATH.resolve()}")

View File

@@ -0,0 +1,128 @@
# scripts/plot_sun_elevation_relationships.py
from __future__ import annotations
from pathlib import Path
import numpy as np
from meteo.dataset import load_raw_csv
from meteo.variables import VARIABLES_BY_KEY
from meteo.analysis import compute_binned_statistics
from meteo.plots import plot_binned_profiles, plot_hexbin_with_third_variable
from meteo.config import StationLocation
from meteo.solar import add_solar_elevation_column
CSV_PATH = Path("data/weather_minutely.csv")
OUTPUT_DIR = Path("figures/sun")
def ensure_sun_elevation(df):
if "sun_elevation" in df.columns:
return df
print(" La colonne 'sun_elevation' est absente, tentative de calcul à la volée.")
location = StationLocation.from_env(optional=True)
if location is None:
print(
"⚠ Impossible de calculer l'élévation solaire : définissez STATION_LATITUDE et STATION_LONGITUDE "
"puis regénérez le dataset (scripts/make_minutely_dataset)."
)
return None
print(
f"→ Calcul d'élévation solaire avec lat={location.latitude}, lon={location.longitude}, "
f"alt={location.elevation_m} m."
)
add_solar_elevation_column(
df,
latitude=location.latitude,
longitude=location.longitude,
elevation_m=location.elevation_m,
)
return df
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()
df = ensure_sun_elevation(df)
if df is None or "sun_elevation" not in df.columns:
return
OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
profile_keys = ["temperature", "humidity", "illuminance"]
profile_vars = [VARIABLES_BY_KEY[key] for key in profile_keys]
bins = np.arange(-90, 95, 5) # bins de 5°
stats = compute_binned_statistics(
df=df,
bin_source_column="sun_elevation",
target_columns=[v.column for v in profile_vars],
bins=bins,
min_count=100,
quantiles=(0.2, 0.8),
)
profile_output = OUTPUT_DIR / "sun_elevation_profiles.png"
plot_binned_profiles(
stats=stats,
variables=profile_vars,
output_path=profile_output,
xlabel="Élévation solaire (°)",
title="Profils moyens en fonction de l'élévation solaire",
show_counts=True,
)
print(f"✔ Profils sun vs variables : {profile_output}")
hexbin_scenarios = [
{
"x": "sun_elevation",
"y": "illuminance",
"color": "temperature",
"filename": "hexbin_sun_elevation_vs_illuminance.png",
"description": "Illuminance en fonction de l'élévation du soleil, couleur = température.",
},
{
"x": "sun_elevation",
"y": "temperature",
"color": "humidity",
"filename": "hexbin_sun_elevation_vs_temperature.png",
"description": "Température en fonction de l'élévation, couleur = humidité relative.",
},
]
for scenario in hexbin_scenarios:
var_x = VARIABLES_BY_KEY[scenario["x"]]
var_y = VARIABLES_BY_KEY[scenario["y"]]
var_color = VARIABLES_BY_KEY[scenario["color"]]
output_path = OUTPUT_DIR / scenario["filename"]
print(f"{scenario['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=60,
mincnt=10,
reduce_func_label="moyenne",
cmap="cividis",
)
print(f" ✔ Hexbin enregistré : {output_path}")
print("✔ Tous les graphiques liés à l'élévation solaire ont été produits.")
if __name__ == "__main__":
main()