1
donnees_meteo/scripts/plot_sun_elevation_relationships.py

129 lines
3.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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()