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