165 lines
No EOL
6.6 KiB
Python
165 lines
No EOL
6.6 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Démonstration complète du wrapper Atmo Data API
|
|
avec connexion réelle et toutes les fonctionnalités
|
|
"""
|
|
|
|
from atmo_data_wrapper import AtmoDataClient, AtmoDataException
|
|
from datetime import datetime, timedelta
|
|
import os
|
|
|
|
def main():
|
|
"""Démonstration complète de toutes les fonctionnalités"""
|
|
print("🌍 === DÉMONSTRATION ATMO DATA API ===\n")
|
|
|
|
try:
|
|
# 1. Connexion automatique
|
|
print("1. 🔐 Connexion à l'API...")
|
|
client = AtmoDataClient()
|
|
success = client.auto_login()
|
|
|
|
if not success:
|
|
print("❌ Échec de connexion")
|
|
return
|
|
|
|
print(f"✅ Connecté à {client.base_url}")
|
|
print(f" Token: {client.token[:20]}...")
|
|
print()
|
|
|
|
# 2. Indices ATMO avec objets typés
|
|
print("2. 🏭 Récupération des indices de qualité de l'air...")
|
|
today = datetime.now().strftime('%Y-%m-%d')
|
|
indices = client.get_indices_atmo(date=today, aasqa='11') # Île-de-France
|
|
|
|
print(f"✅ {len(indices)} indices récupérés")
|
|
print(f" Résumé: {indices.to_summary()}")
|
|
|
|
# Examiner quelques indices
|
|
print("\n 📊 Exemples d'indices:")
|
|
for i, indice in enumerate(indices[:3]):
|
|
print(f" • {indice.lib_zone}: {indice.get_qualificatif()}")
|
|
if indice.is_poor_quality():
|
|
worst_pol, code = indice.get_worst_pollutant()
|
|
print(f" ⚠️ Attention: {worst_pol} élevé ({code})")
|
|
print()
|
|
|
|
# 3. Épisodes de pollution
|
|
print("3. 🚨 Vérification des épisodes de pollution...")
|
|
episodes = client.get_episodes_3jours(aasqa='11')
|
|
print(f"✅ {len(episodes)} épisodes trouvés")
|
|
|
|
alerts_actives = [ep for ep in episodes if ep.is_alert_active()]
|
|
if alerts_actives:
|
|
print(f" ⚠️ {len(alerts_actives)} alertes actives:")
|
|
for ep in alerts_actives[:3]:
|
|
print(f" • {ep.lib_zone}: {ep.get_alert_level()} - {ep.lib_pol}")
|
|
else:
|
|
print(" ✅ Aucune alerte active")
|
|
print()
|
|
|
|
# 4. Données d'émissions
|
|
print("4. 🏭 Analyse des émissions...")
|
|
emissions = client.get_emissions(aasqa='11', echelle='region')
|
|
print(f"✅ {len(emissions)} territoires analysés")
|
|
|
|
if len(emissions) > 0:
|
|
em = emissions[0]
|
|
print(f" 📍 {em.name}:")
|
|
print(f" • Population: {em.population:,.0f} habitants")
|
|
total_em = em.get_total_emissions()
|
|
print(f" • Émissions NOx: {total_em['NOx']:,.1f} t/an")
|
|
print(f" • Émissions PM10: {total_em['PM10']:,.1f} t/an")
|
|
|
|
# Calculs par habitant
|
|
nox_per_capita = em.get_emission_per_capita('nox') * 1000 # kg/hab
|
|
print(f" • NOx par habitant: {nox_per_capita:.2f} kg/hab/an")
|
|
print()
|
|
|
|
# 5. Indices pollen
|
|
print("5. 🌸 Vérification des indices pollen...")
|
|
try:
|
|
pollens = client.get_indices_pollens(aasqa='11')
|
|
print(f"✅ {len(pollens)} stations pollen")
|
|
|
|
alerts_pollen = [p for p in pollens if p.is_alert_active()]
|
|
if alerts_pollen:
|
|
print(f" ⚠️ {len(alerts_pollen)} alertes pollen actives")
|
|
for pol in alerts_pollen[:3]:
|
|
dangerous = pol.get_dangerous_pollens()
|
|
if dangerous:
|
|
print(f" • Pollens à risque: {', '.join(dangerous)}")
|
|
else:
|
|
print(" ✅ Pas d'alerte pollen majeure")
|
|
|
|
except Exception as e:
|
|
print(f" ⚠️ Indices pollen indisponibles: {e}")
|
|
print()
|
|
|
|
# 6. Sauvegarde des données
|
|
print("6. 💾 Sauvegarde des données...")
|
|
try:
|
|
# Créer le dossier de sauvegarde
|
|
save_dir = f"export_{today}"
|
|
|
|
# Sauvegarder en différents formats
|
|
json_file = client.save_to_file(indices.raw_data, f"{save_dir}/indices_idf", "json")
|
|
csv_file = client.save_to_file(indices.raw_data, f"{save_dir}/indices_idf", "csv")
|
|
|
|
print(f"✅ Données sauvegardées:")
|
|
print(f" • JSON: {json_file} ({os.path.getsize(json_file):,} bytes)")
|
|
print(f" • CSV: {csv_file} ({os.path.getsize(csv_file):,} bytes)")
|
|
|
|
except Exception as e:
|
|
print(f" ❌ Erreur sauvegarde: {e}")
|
|
print()
|
|
|
|
# 7. Analyse statistique
|
|
print("7. 📈 Analyse statistique...")
|
|
stats = indices.get_statistics()
|
|
qs = stats['quality_stats']
|
|
|
|
print(f"✅ Statistiques de qualité de l'air:")
|
|
print(f" • Qualité moyenne: {qs['moyenne']:.1f}/7")
|
|
print(f" • Bonne qualité: {qs['bon_pourcentage']:.1f}% des zones")
|
|
print(f" • Meilleur indice: {qs['min']}")
|
|
print(f" • Pire indice: {qs['max']}")
|
|
|
|
# Classification des zones
|
|
bonnes = [i for i in indices if i.is_good_quality()]
|
|
mauvaises = [i for i in indices if i.is_poor_quality()]
|
|
|
|
print(f" • Zones de bonne qualité: {len(bonnes)}")
|
|
print(f" • Zones de qualité dégradée: {len(mauvaises)}")
|
|
|
|
if mauvaises:
|
|
print(" ⚠️ Zones à surveiller:")
|
|
for zone in mauvaises[:5]:
|
|
print(f" - {zone.lib_zone}: {zone.get_qualificatif()}")
|
|
print()
|
|
|
|
# 8. Recommandations
|
|
print("8. 💡 Recommandations...")
|
|
|
|
if qs['moyenne'] <= 2:
|
|
print("✅ Qualité de l'air globalement bonne en Île-de-France")
|
|
elif qs['moyenne'] <= 3:
|
|
print("⚠️ Qualité de l'air modérée - Surveillance recommandée")
|
|
else:
|
|
print("🚨 Qualité de l'air dégradée - Précautions recommandées")
|
|
|
|
if alerts_actives:
|
|
print("🚨 Épisodes de pollution en cours - Limitez les activités extérieures")
|
|
|
|
print("\n🎉 === DÉMONSTRATION TERMINÉE ===")
|
|
print(f"📊 Données analysées: {len(indices)} indices, {len(episodes)} épisodes, {len(emissions)} territoires")
|
|
print("💾 Fichiers exportés dans le dossier export_*")
|
|
|
|
except AtmoDataException as e:
|
|
print(f"❌ Erreur API: {e}")
|
|
except Exception as e:
|
|
print(f"❌ Erreur inattendue: {e}")
|
|
import traceback
|
|
traceback.print_exc()
|
|
|
|
if __name__ == "__main__":
|
|
main() |