-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Utiliser directement l'API Météo-France plutôt que data.gouv.fr #24
Comments
Hello, quid de l'API open-meteo ? Avantages
Limitations
Documentationhttps://open-meteo.com/en/docs Exemple d'implémentationDépendances:!pip install openmeteo-requests
!pip install requests-cache retry-requests numpy pandas Importimport openmeteo_requests
import requests_cache
import pandas as pd
from retry_requests import retry Cachecache_session = requests_cache.CachedSession('.cache', expire_after = 3600)
retry_session = retry(cache_session, retries = 5, backoff_factor = 0.2)
openmeteo = openmeteo_requests.Client(session = retry_session) -- Exemple de cache avec Redis: async def setup_cache_session() -> requests_cache.CachedSession:
redis_client = await get_redis_client()
cache_session = requests_cache.CachedSession(
backend = "redis",
connection = redis_client,
expire_after = 600
)
return cache_session
cache_session = asyncio.run(setup_cache_session())
retry_session = retry(cache_session, retries = 5, backoff_factor = 0.5)
openmeteo = openmeteo_requests.Client(session = retry_session) Paramsforecast_url = "https://api.open-meteo.com/v1/forecast"
historical_forecast_url = "https://historical-forecast-api.open-meteo.com/v1/forecast"
openmeteo_models = ["meteofrance_arpege_europe", "meteofrance_arome_france"] # Insérer ou supprimer des modèles
# Paramètres suivants à renseigner selon besoins et selon délais (actuel, par jour, par heure)
params_current_weather = ["temperature_2m", "relative_humidity_2m", "precipitation", "wind_speed_10m"]
params_daily_weather = ["temperature_2m_max", "temperature_2m_min", "sunrise", "sunset", "precipitation_sum"]
params_hourly_weather = ["temperature_2m", "precipitation_probability", "rain", "weather_code", "surface_pressure"]
#### Requetes sur l'api
``` python
params = {
"latitude": latitude,
"longitude": longitude,
"daily": params_daily_weather,
"hourly": params_hourly_weather,
"current": params_current_weather,
"models": openmeteo_models,
"past_days": 0,
"forecast_days": 3
}
responses = openmeteo.weather_api(url, params = params)
response = responses[0] Transformation des données requetées (ici on retourne des dict) # Transform daily
daily = response.Daily()
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"
)}
for index, elt in enumerate(params_daily_weather):
daily_data[elt] = daily.Variables(index).ValuesAsNumpy()
for key, value in daily_data.items():
if isinstance(value, list) or isinstance(value, int):
pass
else:
daily_data[key] = value.tolist()
# Transform hourly
hourly = response.Hourly()
hourly_data = {"date": pd.date_range(
start = pd.to_datetime(hourly.Time(), unit = "s", utc = True),
end = pd.to_datetime(hourly.TimeEnd(), unit = "s", utc = True),
freq = pd.Timedelta(seconds = hourly.Interval()),
inclusive = "left"
)}
for index, elt in enumerate(params_hourly_weather):
values = hourly.Variables(index).ValuesAsNumpy()
hourly_data[elt] = [None if np.isnan(v) else v for v in values]
for key, value in hourly_data.items():
if isinstance(value, int) or isinstance(value, list):
pass
else:
hourly_data[key] = value.tolist()
hourly_data[key] = [float(v) if isinstance(v, np.float32) else v for v in value]
# Transform current
current = response.Current()
transformed_current = {}
for index, elt in enumerate(params_current_weather):
transformed_current[f"current_{elt}"] = current.Variables(index).Value() |
Merci @guillaumepot pour cette réponse très riche ! J'étais effectivement tombé dessus, mais je n'avais pas pris le temps l'aller autant dans les détails de l'API. Une limitation importante est le fait qu'une requête doit être faite pour une position latitude/longitude (ou bien fournir une liste exhaustive des positions). Aujourd'hui, on utilise toutes les positions disponibles sur le sol français, car on ne prend pas en considération la position des centrales ENR. Je préfèrerais pouvoir faire une requête pour un range de longitude/latitude, définissant ainsi une aire plutôt qu'un ou des points. Cela dit, il pourrait à terme être pertinent de sélectionner les positions d'intérêt plutôt que de traiter toute la France. Je pense à deux approches pour le faire :
|
Un autre point intéressant d'utiliser Open-Météo, c'est que c'est une seulle API pour plusieur modèles, chacuns ayant des aventages différents.
Le tout, avec une seule API. ça serait vraiment sympa. |
Effectivement l'utilisation d'une aire de coordonnées complique l'utilisation de l'API open-meteo. En revanche, si à l'avenir l'implementation propose à un utilisateur de s'enregistrer et d'obtenir des informations, tout est est place:
|
pourquoi
Avantages
Limitations
Comment faire
J'ai créé une interface de l'api https://portail-api.meteofrance.fr/web/fr/api/ARPEGE sur https://github.com/antoinetavant/meteofranceapi. Elle est presque fonctionnelle (quelques paramètres à changer).
il ne faut presque rien changer pour que ça marche sans souci.
The text was updated successfully, but these errors were encountered: