EC221 : traitement de données

Évaluation en contrôle continu

Vous pouvez utiliser toutes les ressources à disposition sur internet, à commencer par mon cours Python, à partir du moment que cela reste un travail personnel.

Je suis conscient que l'enseignement à distance n'a pas facilité l'acquisition des compétences en programmation. Je n'ai pas encore défini de barème donc traitez un maximum d'exercices et j'ajusterai les notes en fonction des productions de la promotion.

Qualité de l'air dans la région Grand Est

ATMO Grand Est, association agréée par le Ministère chargé de l’environnement, est en charge de la surveillance de la qualité de l’air dans la région Grand Est à l'aide d'un réseau de stations de mesure réparties sur le territoire. Elle met à disposition, via son site internet, l'ensemble des mesures collectées. Nous allons utiliser le fichier atmo_grand_est.csv comme matière première de cette activité de traitement de données avec Python.

Télécharger

Commencez par étudier attentivement la structure de ce fichier CSV en l'ouvrant avec Microsoft Excel éventuellement. Dans cette activité, nous allons nous focaliser sur l'analyse de la concentration en NO2 en zone urbaine. Pour ce type d'environnement, le fichier fournit deux valeurs de concentration :

Fond
correspond à la concentration liée à l'activité humaine (chauffage, industrie, ...)
Trafic
correspond à la pollution liée au trafic automobile

Exercice

Écrivez un premier script no2_reims_statistics.py afin d'extraire des statistiques sur la concentration de NO2 liée au trafic à Reims.


Concentration de NO2 à Reims

Concentration maximale      : 146 µg/m3
Concentration minimale      : 2 µg/m3
Concentration moyenne       : 37 µg/m3
Écart type de concentration : 23 µg/m3
      
Correction
import pandas as pd

# Chargement des données issues du fichier CSV
df = pd.read_csv('atmo_grand_est.csv', sep=';')

# Filtrage des lignes en fonction de la commune, de l'influence et du polluant
df_no2_trafic_reims = df[ (df['nom_com']=='Reims') & (df['influence']=='Trafic') & (df['nom_poll']=='NO2') ]

# Calcul des valeurs statistiques
no2_max = df_no2_trafic_reims['valeur'].max()
no2_min = df_no2_trafic_reims['valeur'].min()
no2_mean = df_no2_trafic_reims['valeur'].mean()
no2_std = df_no2_trafic_reims['valeur'].std()

# Affichage des résultats
print('\n\nConcentration de NO2 à Reims\n')
print('Concentration maximale :', round(no2_max), 'µg/m3')
print('Concentration minimale :', round(no2_min), 'µg/m3')
print('Concentration moyenne :', round(no2_mean), 'µg/m3')
print('Écart type de concentration :', round(no2_std), 'µg/m3')

Afin d'améliorer le script no2_reims_statistics.py, on pourrait proposer à l'utilisateur de choisir la ville dont il veut obtenir les statistiques de pollution au NO2.

Exercice

Écrivez un nouveau script no2_statistics.py afin d'extraire des statistiques sur la concentration de NO2 liée au trafic dans la ville choisie par l'utilisateur.


Ville de la région Grand Est ? Nancy

Concentration de NO2 à Nancy 

Concentration maximale      : 87 µg/m3
Concentration minimale      : 2 µg/m3
Concentration moyenne       : 25 µg/m3
Écart type de concentration : 15 µg/m3
      
Correction
import pandas as pd

# Chargement des données issues du fichier CSV
df = pd.read_csv('atmo_grand_est.csv', sep=';')

# Choix de la commune
town = input('\n\nVille de la région Grand Est ? ')

# Filtrage des lignes en fonction de la commune, de l'influence et du polluant
df_no2_trafic_reims = df[ (df['nom_com']==town) & (df['influence']=='Trafic') & (df['nom_poll']=='NO2') ]

# Calcul des valeurs statistiques
no2_max = df_no2_trafic_reims['valeur'].max()
no2_min = df_no2_trafic_reims['valeur'].min()
no2_mean = df_no2_trafic_reims['valeur'].mean()
no2_std = df_no2_trafic_reims['valeur'].std()

# Affichage des résultats
print('\nConcentration de NO2 à', town, '\n')
print('Concentration maximale :', round(no2_max), 'µg/m3')
print('Concentration minimale :', round(no2_min), 'µg/m3')
print('Concentration moyenne :', round(no2_mean), 'µg/m3')
print('Écart type de concentration :', round(no2_std), 'µg/m3')

Afin d'observer l'évolution de la concentration de NO2 au fil du temps, on peut générer le graphique suivant :

Résultat du script Python no2_reims_month.py

Exercice

Écrivez un script no2_reims_month.py qui génère un graphique à l'aide du module matplotlib à partir des mesures de concentration liées au trafic à Reims, relevées à 8h du matin.

Correction
import pandas as pd
import matplotlib.pyplot as plt

# Chargement des données issues du fichier CSV
df = pd.read_csv('atmo_grand_est.csv', sep=';')

# Filtrage des lignes en fonction de la commune, de l'influence et du polluant et de l'heure
df_no2_trafic_reims = df[ (df['nom_com']=='Reims') & (df['influence']=='Trafic') & (df['nom_poll']=='NO2') & (df['date_debut'].str.contains(' 08')) ]

# Création du graphique
plt.plot(df_no2_trafic_reims['date_debut'].str[:10], df_no2_trafic_reims['valeur'], label='Trafic')
plt.title('Concentration de NO2 relevée à Reims à 8h')
plt.xlabel('date')
plt.xticks(rotation=90)
plt.ylabel('concentration (µg/m3)')
plt.show()

Par ailleurs, pour comparer l'évolution des concentrations de NO2 de fond et liée au trafic, on peut générer un nouveau graphique comme suit :

Résultat du script Python no2_reims_day.py

Exercice

Écrivez un script no2_reims_day.py qui génère un nouveau graphique à partir des mesures de concentration de fond et celles liées au trafic à Reims, relevées le 31 mars 2021.

Correction
import pandas as pd
import matplotlib.pyplot as plt

# Chargement des données issues du fichier CSV
df = pd.read_csv('atmo_grand_est.csv', sep=';')

# Filtrage des lignes en fonction de la commune, de l'influence et du polluant et de la date
df_no2_trafic_reims = df[ (df['nom_com']=='Reims') & (df['influence']=='Trafic') & (df['nom_poll']=='NO2') & (df['date_debut'].str.contains('2021/03/31')) ]
df_no2_fond_reims = df[ (df['nom_com']=='Reims') & (df['influence']=='Fond') & (df['nom_poll']=='NO2') & (df['date_debut'].str.contains('2021/03/31')) ]

# Création du graphique
plt.plot(df_no2_trafic_reims['date_debut'].str[11:13], df_no2_trafic_reims['valeur'], label='Trafic')
plt.plot(df_no2_fond_reims['date_debut'].str[11:13], df_no2_fond_reims['valeur'], label='Fond')
plt.title('Concentration de NO2 relevée à Reims le 31/03/2021')
plt.xlabel('heure')
plt.xticks(rotation=90)
plt.ylabel('concentration (µg/m3)')
plt.legend()
plt.show()

Comme pour les statistiques de concentration en NO2, il peut être intéressant de pouvoir choisir une ville de la région Grand Est ainsi que la date des relevés pour la génération du graphique.


Ville de la région Grand Est ? Strasbourg
Date au format AAAA/MM/JJ ? 2021/04/01
    

Exercice

Écrivez un script no2_day.py qui génère un graphique à partir des mesures de concentration de fond et celles liées au trafic dans la ville et à la date choisie par l'utilisateur.

Correction
import pandas as pd
import matplotlib.pyplot as plt

# Chargement des données issues du fichier CSV
df = pd.read_csv('atmo_grand_est.csv', sep=';')

town = input('\n\nVille de la région Grand Est ? ')
date = input('Date au format AAAA/MM/JJ ? ')

# Filtrage des lignes en fonction de la commune, de l'influence et du polluant et de la date
df_no2_trafic_reims = df[ (df['nom_com']==town) & (df['influence']=='Trafic') & (df['nom_poll']=='NO2') & (df['date_debut'].str.contains(date)) ]
df_no2_fond_reims = df[ (df['nom_com']==town) & (df['influence']=='Fond') & (df['nom_poll']=='NO2') & (df['date_debut'].str.contains(date)) ]

# Création du graphique
plt.plot(df_no2_trafic_reims['date_debut'].str[11:13], df_no2_trafic_reims['valeur'], label='Trafic')
plt.plot(df_no2_fond_reims['date_debut'].str[11:13], df_no2_fond_reims['valeur'], label='Fond')
plt.title('Concentration de NO2 relevée à ' + town + ' le ' + date)
plt.xlabel('heure')
plt.xticks(rotation=90)
plt.ylabel('concentration (µg/m3)')
plt.legend()
plt.show()

Pour finir, afin d'avoir une vue d'ensemble sur la concentration de NO2 dans la région Grand Est, je vous propose de réaliser une cartographie à l'aide du module folium.

Résultat du script Python no2_grand_est.py

Exercice

Écrivez un script no2_grand_est.py qui génère un fond de carte centré sur Nancy et ajoute un marqueur pour chaque valeur de concentration de NO2 liée au trafic relevée le 31 mars 2021 à 8h du matin.

Correction
import pandas as pd
import matplotlib.pyplot as plt
import folium

# Chargement des données issues du fichier CSV
df = pd.read_csv('atmo_grand_est.csv', sep=';')

# Filtrage des lignes en fonction de l'influence et du polluant et de la date
df_no2_trafic_20210331_08 = df[ (df['influence']=='Trafic') & (df['nom_poll']=='NO2') & (df['date_debut'].str.contains('2021/03/31 08')) ]

# Création de la carte
fmap = folium.Map(location=[48.692054, 6.184417], tiles='OpenStreetMap', zoom_start=8)

for i in df_no2_trafic_20210331_08.index:
    no2 = df_no2_trafic_20210331_08['valeur'][i]

    if no2<40:
        col = 'green'
    elif no2<60:
        color = 'orange'
    elif no2<80:
        col = 'red'
    else:
        col = 'black'

    # Création d'un marqueur
    folium.Marker([ df_no2_trafic_20210331_08['latitude'][i], df_no2_trafic_20210331_08['longitude'][i] ],
                popup='<b>' + df_no2_trafic_20210331_08['nom_com'][i] + '</b><br>NO2&nbsp;:&nbsp;' + str(no2) + '&nbsp;µg/m<sup>3</sup>',
                icon=folium.Icon(color=col)).add_to(fmap)

fmap.save('no2_grand_est.html')

Question bonus

C'est plus fort que moi, j'ai toujours une tonne d'idées dès que je commence à écrire quelques scripts. Un défaut dans les scripts s'appuyant sur une saisie clavier réside dans le fait que l'utilisateur peut mal orthographier le nom d'une ville ou tout simplement ne connaisse pas les villes équipées de stations ATMO Grand Est.

Exercice

Écrivez un script town_list.py qui affiche le nom de toutes les villes figurant dans le fichier CSV.


51 villes trouvées dans le fichier CSV :

1 Bazeilles
2 Charleville-Mézières
3 Les Mazures
4 Saint-Parres-aux-Tertres
5 Sainte-Savine
6 Troyes
7 Geispolsheim
8 Grandfontaine
9 La Petite-Pierre
10 Munchhausen
11 Schiltigheim
12 Strasbourg
13 Brunstatt-Didenheim
14 Chalampé
15 Colmar
16 Mulhouse
17 Thann
18 Vieux-Thann
19 Village-Neuf
20 Saint-Dizier
21 Bétheny
22 Châlons-en-Champagne
23 Épernay
24 Reims
25 Vitry-le-François
26 Atton
27 Blénod-lès-Pont-à-Mousson
28 Fléville-devant-Nancy
29 Frolois
30 Lunéville
31 Nancy
32 Neuves-Maisons
33 Pont-à-Mousson
34 Villers-lès-Nancy
35 Belleville-sur-Meuse
36 Houdelaincourt
37 Jonville-en-Woëvre
38 Carling
39 Forbach
40 Gandrange
41 Hayange
42 Héming
43 L'Hôpital
44 Metz
45 Schœneck
46 Scy-Chazelles
47 Spicheren
48 Thionville
49 Épinal
50 Remiremont
51 Xonrupt-Longemer
      
Correction
import pandas as pd

# Chargement des données issues du fichier CSV
df = pd.read_csv('atmo_grand_est.csv', sep=';')

# Récupération des noms de villes distincts
town_list = df['nom_com'].unique()

# Affichage des résultats
print(town_list.size, ' villes trouvées dans le fichier CSV :\n')

for i in range(town_list.size):
    print(i+1, town_list[i])

via GIPHY