rose_des_sables / data /climatic_data.py
ElodieDaoud's picture
test
c7ad04d
import openmeteo_requests
import pandas as pd
from retry_requests import retry
import pvlib
import requests_cache
def get_tmy(latitude: float, longitude: float) -> pd.DataFrame:
tmy = pvlib.iotools.get_pvgis_tmy(
latitude,
longitude,
outputformat="json",
usehorizon=True,
userhorizon=None,
startyear=2005,
endyear=2020,
map_variables=True,
url="https://re.jrc.ec.europa.eu/api/v5_2/",
timeout=60,
)[0]
daily_tmy = tmy.groupby(tmy.index.date).agg(
{"temp_air": ["min", "max", "mean"], "wind_speed": "mean", "ghi": "sum"}
)
daily_tmy.columns = daily_tmy.columns.droplevel(0)
daily_tmy.columns = ["temp_min", "temp_max", "temp_mean", "wind", "irradiance"]
# On récupère les données de précipitations d'Open-Meteo car elles ne sont pas inclues dans la tmy
# Setup the Open-Meteo API client with cache and retry on error
# TODO : utiliser package météo
cache_session = requests_cache.CachedSession(".cache", expire_after=-1)
retry_session = retry(cache_session, retries=5, backoff_factor=0.2)
openmeteo = openmeteo_requests.Client(session=retry_session)
url = "https://archive-api.open-meteo.com/v1/archive"
params = {
"latitude": latitude,
"longitude": longitude,
"start_date": "2005-01-01",
"end_date": "2022-01-01",
"daily": "precipitation_sum",
}
responses = openmeteo.weather_api(url, params=params)
response = responses[0]
daily = response.Daily()
precipitation_sum = daily.Variables(0).ValuesAsNumpy()
daily_rain = {
"date": pd.date_range(
start=pd.to_datetime(daily.Time(), unit="s"),
end=pd.to_datetime(daily.TimeEnd(), unit="s"),
freq=pd.Timedelta(seconds=daily.Interval()),
inclusive="left",
)
}
daily_rain["rain"] = precipitation_sum
daily_rain = pd.DataFrame(data=daily_rain)
daily_rain.date = pd.to_datetime(daily_rain.date)
daily_rain = daily_rain.set_index("date")
# on sélectionne les mois de daily_rain qui sont les mois dans la tmy de pvlib
df = daily_tmy.join(daily_rain) # c'est là qu'on garde que les mois d'intérêt
df.index = df.index.map(lambda t: t.replace(year=1990))
return df
def get_open_meteo(latitude: float, longitude: float) -> pd.DataFrame:
# Setup the Open-Meteo API client with cache and retry on error
cache_session = requests_cache.CachedSession('.cache', expire_after = -1)
retry_session = retry(cache_session, retries = 5, backoff_factor = 0.2)
openmeteo = openmeteo_requests.Client(session = retry_session)
# Make sure all required weather variables are listed here
# The order of variables in hourly or daily is important to assign them correctly below
url = "https://archive-api.open-meteo.com/v1/archive"
params = {
"latitude": latitude,
"longitude": longitude,
"start_date": "2019-01-01",
"end_date": "2023-12-31",
"daily": ["temperature_2m_max", "temperature_2m_min", "temperature_2m_mean", "precipitation_sum"]
}
responses = openmeteo.weather_api(url, params=params)
response = responses[0]
# Process daily data. The order of variables needs to be the same as requested.
daily = response.Daily()
daily_temperature_2m_max = daily.Variables(0).ValuesAsNumpy()
daily_temperature_2m_min = daily.Variables(1).ValuesAsNumpy()
daily_temperature_2m_mean = daily.Variables(2).ValuesAsNumpy()
daily_precipitation_sum = daily.Variables(3).ValuesAsNumpy()
daily_data = {"date": pd.date_range(
start = pd.to_datetime(daily.Time(), unit = "s", utc = True),
end = pd.to_datetime(daily.TimeEnd(), unit = "s", utc = True),
freq = pd.Timedelta(seconds = daily.Interval()),
inclusive = "left"
)}
daily_data["temperature_2m_max"] = daily_temperature_2m_max
daily_data["temperature_2m_min"] = daily_temperature_2m_min
daily_data["temperature_2m_mean"] = daily_temperature_2m_mean
daily_data["precipitation_sum"] = daily_precipitation_sum
daily_dataframe = pd.DataFrame(data = daily_data)
daily_dataframe.date = pd.to_datetime(daily_dataframe.date)
#daily_dataframe = daily_dataframe.set_index("date")
daily_dataframe['year'] = daily_dataframe['date'].dt.year
daily_dataframe['month'] = daily_dataframe['date'].dt.month
return daily_dataframe
def climatic_indicators(daily_dataframe):
nbre_gel_tardif = daily_dataframe.loc[(daily_dataframe['month']>=3)&(daily_dataframe['month']<=5)&(daily_dataframe['temperature_2m_min']<=0)].groupby('year').count()['date'].mean()
nbre_temp_extreme = daily_dataframe.loc[(daily_dataframe['temperature_2m_max']>=35)].groupby('year').count()['date'].mean()
prec_month = daily_dataframe[(daily_dataframe['month']>=6)&(daily_dataframe['month']<=9)].groupby(['year','month'])['precipitation_sum'].sum().reset_index()
prec_moyenne = prec_month['precipitation_sum'].mean()
return nbre_gel_tardif,nbre_temp_extreme, prec_moyenne