Skip to content
Snippets Groups Projects

Fix changes

Closed Benoît Courty requested to merge fix/export_climat_mens into master
1 file
+ 73
55
Compare changes
  • Side-by-side
  • Inline
@@ -5,21 +5,34 @@ from sqlalchemy import text
import pandas as pd
import numpy as np
def comparaison_normale(df, annee_debut : int = 1991, annee_fin : int= 2020):
"""Réalise le calcul de la différence entre la valeur d'une année
par rapport à la période 1991_2020."""
df_norm = df.loc[(df["annee"]< datetime(annee_fin, 12, 31)) & (datetime(annee_debut, 1, 1) < df["annee"])]
df[f"temperature_delta_{annee_debut}_{annee_fin}"] = df.temperature - df_norm.temperature.mean()
df[f"precipitation_delta_{annee_debut}_{annee_fin}"] = (df.precipitation - df_norm.precipitation.mean()
def comparaison_normale(df, annee_debut: int = 1991, annee_fin: int = 2020):
"""Réalise le calcul de la différence entre la valeur d'une année par
rapport à la période 1991_2020."""
# selection des années précédant 2020 et succédant à 1991
df_norm = df.loc[
(df["annee"] < datetime(annee_fin, 12, 31))
& (datetime(annee_debut, 1, 1) < df["annee"])
]
# différence de la température et des précipitations aux moyennes de ces années
df[f"temperature_delta_{annee_debut}_{annee_fin}"] = (
df.temperature - df_norm.temperature.mean()
)
df[f"precipitation_delta_{annee_debut}_{annee_fin}"] = (
df.precipitation - df_norm.precipitation.mean()
)
return df
def fusion_echelle(df_circo, df_france, df_europe, df_monde, var_merge : str = 'annee'):
"""Fusionne les dataframe de la France, Europe et monde sur la variable d'année"""
def fusion_echelle(df_circo, df_france, df_europe, df_monde, var_merge: str = "annee"):
"""Fusionne les dataframe de la France, Europe et monde sur la variable
d'année."""
# On choisit de préciser une variable merge au cas où l'on voudrait écrire
# Une fonction plus générale. ici àa ne vaut que pour les années.
df = df_france.merge(
df_circo, on=[var_merge], how="inner", suffixes=("_fr", "_circo")
)
if var_merge == "annee" :
if var_merge == "annee":
df = df.merge(df_europe, on=[var_merge], how="inner")
df.rename(
{
@@ -100,11 +113,14 @@ class GetMeteo:
self.current_year = datetime.today().year
self.data.meteo.sources = utilitaires.get_sources("meteo")
def get_mean_as_df(self, table, var_merge : str = "annee"):
def get_mean_as_df(self, table, var_merge: str = "annee"):
"""Fonction qui calcule la moyenne des températures sur toutes les variables.
Faire la somme des précipitations n'a pas de sens lorsqu'on aggrège par mois."""
agg = 'sum' if var_merge == "annee" else 'avg'
sql = f"""select
m.{var_merge},
avg(m.temperature) as temperature,
sum(m.precipitation) as precipitation
{agg}(m.precipitation) as precipitation
from {table} as m
where annee != {self.current_year}
group by 1
@@ -112,12 +128,12 @@ class GetMeteo:
"""
with self.engine.connect() as con:
df = pd.read_sql_query(text(sql), con)
if var_merge == "annee" :
if var_merge == "annee":
df["annee"] = pd.to_datetime(df["annee"], format="%Y")
return comparaison_normale(df)
if var_merge == "mois" :
if var_merge == "mois":
df["mois"] = pd.to_datetime(df["mois"], format="%m")
# pour ajouter l'écart de chaque année à la moyenne d'un intervalle
# pour ajouter l'écart de chaque année à la moyenne d'un intervalle
return df
def get_meteo(self):
@@ -228,30 +244,13 @@ class GetMeteo:
self.data.meteo.df_precipitation["MA10_monde"] = (
self.data.meteo.df_precipitation["precipitation_monde"].rolling(10).mean()
)
def get_mean_as_df_mens(self,table):
""" On calcule la moyenne des températures et la
somme des précipitations agregées par mois."""
# Calcul sur la table ?
sql = f"""select
m.mois
avg(m.temperature) as temperature,
sum(m.precipitation) as precipitation
from {table} as m
group by 1
order by 1;
"""
with self.engine.connect() as con:
df = pd.read_sql_query(text(sql), con)
df["mois"] = pd.to_datetime(df["mois"], format="%m")
return comparaison_normale_mens(df)
def get_meteo_mens(self):
"""Fonction permettant de récupérer les données de météo."""
circo = self.data.circo
engine = self.engine
# On aggrège les données aux différentes échelles
sql = f"""select
sql = """select
m.mois,
avg(m.temperature) as temperature_fr,
avg(m.precipitation) as precipitation_fr
@@ -263,7 +262,7 @@ class GetMeteo:
with self.engine.connect() as con:
df_france = pd.read_sql_query(text(sql), con)
df_france["mois"] = pd.to_datetime(df_france["mois"], format="%m")
# On s'intéresse aux données moyennes sur la circonscription entre 1960 et 2023
sql = f"""SELECT monthly.mois, avg(monthly.temperature) as temperature_circo, avg(monthly.precipitation) as precipitation_circo
FROM (select m.annee, m.mois,
@@ -290,18 +289,24 @@ class GetMeteo:
group by 1,2) as monthly
group by 1
order by 1;
"""
"""
with engine.connect() as con:
df_circo_avg = pd.read_sql_query(text(sql), con)
df_circo_avg["mois"] = pd.to_datetime(df_circo_avg["mois"], format="%m")
df_avg = df_circo_avg.merge(df_france, on = "mois")
df_avg["mois"] = df_avg["mois"].apply(lambda x : x.strftime("%m"))
df_avg["delta_circo_france_temperature"] = df_avg['temperature_circo'] - df_avg['temperature_fr']
df_avg["delta_circo_france_precipitation"] = df_avg['precipitation_circo'] - df_avg['precipitation_fr']
df_avg = df_circo_avg.merge(df_france, on="mois")
df_avg["mois"] = df_avg["mois"].apply(lambda x: x.strftime("%m"))
df_avg["delta_circo_france_temperature"] = (
df_avg["temperature_circo"] - df_avg["temperature_fr"]
)
df_avg["delta_circo_france_precipitation"] = (
df_avg["precipitation_circo"] - df_avg["precipitation_fr"]
)
# On importe les données de circonscirption année par année POUR LA TEMPERATURE
colonnes = 'mois TEXT, '+ ', '.join([f'"{year}" FLOAT' for year in range(1960, 2024)])
sql =f"""SELECT *
colonnes = "mois TEXT, " + ", ".join(
[f'"{year}" FLOAT' for year in range(1960, 2024)]
)
sql = f"""SELECT *
FROM crosstab(
$$SELECT meteo.mois, meteo.annee, avg(meteo.temperature) FROM (
SELECT m.* FROM meteo_era5_circo m
@@ -314,8 +319,8 @@ class GetMeteo:
with engine.connect() as con:
df_circo_temp = pd.read_sql_query(text(sql), con)
# Si taille réduite
if len(df_circo_temp) <1:
sql =f"""SELECT *
if len(df_circo_temp) < 1:
sql = f"""SELECT *
FROM crosstab(
$$SELECT meteo.mois, meteo.annee, avg(meteo.temperature) as temperature FROM (
SELECT m.* FROM meteo_era5_circo m
@@ -328,16 +333,23 @@ class GetMeteo:
with engine.connect() as con:
df_circo_temp = pd.read_sql_query(text(sql), con)
df_circo_temp["mois"] = pd.to_datetime(df_circo_temp["mois"], format="%m")
df_circo_temp["mois"] = df_circo_temp["mois"].apply(lambda x : x.strftime("%m"))
df_circo_historique_temp = df_circo_temp.merge(df_avg, on = "mois")
df_circo_temp["mois"] = df_circo_temp["mois"].apply(lambda x: x.strftime("%m"))
df_circo_historique_temp = df_circo_temp.merge(df_avg, on="mois")
df_circo_historique_temp.drop(
columns = ['precipitation_fr', 'precipitation_circo', 'delta_circo_france_precipitation'],
inplace = True)
columns=[
"precipitation_fr",
"precipitation_circo",
"delta_circo_france_precipitation",
],
inplace=True,
)
self.data.historique_temp_mens = df_circo_historique_temp.set_index("mois")
# On importe les données de circonscirption année par année POUR LES PRECIPITATIONS
colonnes = 'mois TEXT, '+ ', '.join([f'"{year}" FLOAT' for year in range(1960, 2024)])
sql =f"""SELECT *
colonnes = "mois TEXT, " + ", ".join(
[f'"{year}" FLOAT' for year in range(1960, 2024)]
)
sql = f"""SELECT *
FROM crosstab(
$$SELECT meteo.mois, meteo.annee, avg(meteo.precipitation) as precipitation FROM (
SELECT m.* FROM meteo_era5_circo m
@@ -350,8 +362,8 @@ class GetMeteo:
with engine.connect() as con:
df_circo_precip = pd.read_sql_query(text(sql), con)
# Si taille réduite
if len(df_circo_precip) <1:
sql =f"""SELECT *
if len(df_circo_precip) < 1:
sql = f"""SELECT *
FROM crosstab(
$$SELECT meteo.mois, meteo.annee, avg(meteo.precipitation) as precipitation FROM (
SELECT m.* FROM meteo_era5_circo m
@@ -364,10 +376,16 @@ class GetMeteo:
with engine.connect() as con:
df_circo_precip = pd.read_sql_query(text(sql), con)
df_circo_precip["mois"] = pd.to_datetime(df_circo_precip["mois"], format="%m")
df_circo_precip["mois"] = df_circo_precip["mois"].apply(lambda x : x.strftime("%m"))
df_circo_historique_precip = df_circo_precip.merge(df_avg, on = "mois")
df_circo_precip["mois"] = df_circo_precip["mois"].apply(
lambda x: x.strftime("%m")
)
df_circo_historique_precip = df_circo_precip.merge(df_avg, on="mois")
df_circo_historique_precip.drop(
columns = ['temperature_fr', 'temperature_circo', 'delta_circo_france_temperature'],
inplace = True)
columns=[
"temperature_fr",
"temperature_circo",
"delta_circo_france_temperature",
],
inplace=True,
)
self.data.historique_precip_mens = df_circo_historique_precip.set_index("mois")
Loading