rose_des_vents / data /climatic_data.py
pasquierjb's picture
first
9d4a2d9
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