gaia / visualize /visualize.py
Akram Sanad
visualize.py file added
61e4fc2
raw
history blame
4.73 kB
import pandas as pd # stress hydrique and rendement, besoin en eau
import plotly.graph_objects as go
from typing import List
import plotly.express as px
from fuzzywuzzy import process
from data_pipelines.historical_weather_data import (
download_historical_weather_data,
aggregate_hourly_weather_data,
)
def concatenate_historic_forecast(historic, forecast, cols_to_keep):
historic["period"] = "historique"
forecast["period"] = "futur"
historic = historic[cols_to_keep]
forecast = forecast[cols_to_keep]
full_data = pd.concat([historic, forecast])
return full_data
def visualize_climate(
moderate: pd.DataFrame,
historic: pd.DataFrame,
x_axis="year",
column: str = "Precipitation (mm)",
cols_to_keep: List[str] = [
"Precipitation (mm)",
"Near Surface Air Temperature (°C)",
"Surface Downwelling Shortwave Radiation (W/m²)",
"year",
"period",
],
):
concatenated_df = concatenate_historic_forecast(historic, moderate, cols_to_keep)
concatenated_df = concatenated_df.sort_values(by=x_axis) # Ensure order
fig = go.Figure()
# colors = {"historique": "blue", "forecast": "purple"}
for condition_value in concatenated_df["period"].unique():
segment = concatenated_df[concatenated_df["period"] == condition_value]
fig.add_trace(
go.Scatter(
x=segment[x_axis],
y=segment[column],
mode="lines",
name=f"{condition_value}",
line=dict(color="blue" if condition_value == "futur" else "purple"),
)
)
interpolation_df = concatenated_df[concatenated_df[x_axis] > 2023]
fig.add_trace(
go.Scatter(
x=interpolation_df[x_axis],
y=interpolation_df[column].interpolate(),
mode="lines",
line=dict(color="blue"),
showlegend=False,
),
)
fig.update_layout(
title=f"Historique et Forecast pour {column}",
xaxis_title="Date",
yaxis_title=column,
)
return fig
def aggregate_yearly(df, col_to_agg):
df[col_to_agg] = df.groupby("year")[col_to_agg].transform("mean")
return df
def generate_plots(
moderate: pd.DataFrame,
historic: pd.DataFrame,
x_axes: List[str],
cols_to_plot: List[str],
):
plots = []
for i, col in enumerate(cols_to_plot):
plots.append(visualize_climate(moderate, historic, x_axes[i], col))
return plots
if __name__ == "__main__":
cols_to_keep = [
"Precipitation (mm)",
"Near Surface Air Temperature (°C)",
"Surface Downwelling Shortwave Radiation (W/m²)",
"year",
"period",
]
cols_to_plot = [
"Precipitation (mm)",
"Near Surface Air Temperature (°C)",
"Surface Downwelling Shortwave Radiation (W/m²)",
]
x_axes = ["year"] * len(cols_to_plot)
latitude = 47
longitude = 5
start_year = 2000
end_year = 2025
cols_to_keep = [
"Precipitation (mm)",
"Near Surface Air Temperature (°C)",
"Surface Downwelling Shortwave Radiation (W/m²)",
"year",
"period",
]
cols_to_plot = [
"Precipitation (mm)",
"Near Surface Air Temperature (°C)",
"Surface Downwelling Shortwave Radiation (W/m²)",
]
x_axes = ["year"] * len(cols_to_plot)
df = download_historical_weather_data(latitude, longitude, start_year, end_year)
historic = aggregate_hourly_weather_data(df)
historic = historic.reset_index()
historic = historic.rename(
columns={
"precipitation": "Precipitation (mm)",
"air_temperature_mean": "Near Surface Air Temperature (°C)",
"irradiance": "Surface Downwelling Shortwave Radiation (W/m²)",
"index": "time",
}
)
historic["time"] = pd.to_datetime(historic["time"])
historic = historic.sort_values("time")
historic = historic[historic["time"] < "2025-01-01"]
climate_data_path = "data/data_climate_test/final_climate_data.csv" # will use a similar func to download_historical_weather_data
moderate = pd.read_csv(climate_data_path)
moderate["time"] = pd.to_datetime(moderate["time"])
moderate = moderate.sort_values("time")
moderate["year"] = moderate["time"].dt.year
historic["year"] = historic["time"].dt.year
moderate["Precipitation (mm)"] = moderate["Precipitation (mm)"] * 3600
for col in cols_to_plot:
moderate = aggregate_yearly(moderate, col)
historic = aggregate_yearly(historic, col)
plots = generate_plots(moderate, historic, x_axes, cols_to_plot) # List of 3 plots to show