Spaces:
Sleeping
Sleeping
| 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 | |