🌦️ Créer une API Météo Intelligente avec Python, IA et FastAPI
Ce projet consiste à créer une API REST moderne qui interroge un service météo en temps réel, puis applique un modèle de machine learning pour prédire la température dans les prochaines heures. Le tout est exposé via une interface web performante grâce à FastAPI.
🧠 Objectif de l'API
- Collecter les données météo d'une ville via l'API OpenWeatherMap
- Appliquer un modèle IA entraîné sur des données historiques
- Exposer les résultats sous forme d’API REST
🧰 Librairies utilisées
Outil | Utilisation |
---|---|
requests | Appels HTTP à l'API météo |
pandas | Manipulation de données |
scikit-learn | Modélisation de la prédiction météo |
FastAPI | Création de l’API REST |
uvicorn | Serveur de développement performant |
pip install fastapi uvicorn requests pandas scikit-learn
📡 Récupération des données météo
Le fichier suivant interroge OpenWeatherMap avec une clé API. Le retour est simplifié pour n’extraire que les champs utiles.
import requests
API_KEY = "VOTRE_CLE_API"
def get_weather(city):
url = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={API_KEY}&units=metric"
response = requests.get(url)
if response.status_code != 200:
raise Exception(f"Erreur API météo : {response.status_code}")
data = response.json()
return {
"city": city,
"temperature": data["main"]["temp"],
"humidity": data["main"]["humidity"],
"wind": data["wind"]["speed"],
"description": data["weather"][0]["description"]
}
🤖 Modélisation IA avec scikit-learn
Le modèle de régression linéaire apprend à prédire la température future (dans 3h) à partir des conditions actuelles. Ce modèle est volontairement simple pour illustrer le concept.
import numpy as np
from sklearn.linear_model import LinearRegression
class WeatherPredictor:
def __init__(self):
self.model = LinearRegression()
def train(self, historical_data):
X = historical_data[["temperature", "humidity", "wind"]]
y = historical_data["temperature_in_3h"]
self.model.fit(X, y)
def predict(self, current):
features = np.array([[current["temperature"], current["humidity"], current["wind"]]])
return self.model.predict(features)[0]
🚀 Création de l'API REST avec FastAPI
Le cœur du projet consiste à exposer un endpoint REST qui combine données météo en direct et prédiction. L’interface Swagger est automatiquement générée.
from fastapi import FastAPI
from weather_fetcher import get_weather
from ml_model import WeatherPredictor
import pandas as pd
app = FastAPI(
title="API Météo IA",
description="Prévisions météo avec FastAPI et scikit-learn",
version="1.0"
)
historical = pd.DataFrame([
{"temperature": 20, "humidity": 65, "wind": 5, "temperature_in_3h": 21.5},
{"temperature": 25, "humidity": 55, "wind": 3, "temperature_in_3h": 26.5},
{"temperature": 30, "humidity": 45, "wind": 2, "temperature_in_3h": 32.0},
{"temperature": 15, "humidity": 80, "wind": 6, "temperature_in_3h": 16.5}
])
model = WeatherPredictor()
model.train(historical)
@app.get("/predict/{city}")
def predict(city: str):
try:
current = get_weather(city)
predicted = model.predict(current)
return {
"city": city,
"current_weather": current,
"predicted_temperature_in_3h": round(predicted, 2)
}
except Exception as e:
return {"error": str(e)}
💻 Lancement local
uvicorn main:app --reload
Accessible ensuite via l’interface interactive : http://localhost:8000/docs
🛠️ Améliorations possibles
- Connexion à une base de données (SQLite, PostgreSQL)
- Entraînement sur des données météo réelles
- Sérialisation du modèle avec joblib
- Système de cache pour éviter les appels API multiples
- Système d’authentification JWT pour sécuriser les endpoints
📁 Structure recommandée
project/
├── main.py
├── weather_fetcher.py
├── ml_model.py
├── requirements.txt
└── data/
📌 Résumé
Composant | Technologie utilisée |
---|---|
Récupération météo | requests + OpenWeatherMap |
Prédiction IA | scikit-learn |
API REST | FastAPI |
Serveur | uvicorn |
Commentaires
Enregistrer un commentaire