Bases de Python 4 : Nettoyage des données

Ce tutoriel explore d’autres concepts de Numpy, tels que les données catégorielles, l’indexation avancée et le traitement des données non chiffrées (NaN).

Suivez les instructions ci-dessous pour télécharger le tutoriel et l’ouvrir dans l’Environnement de test.

Télécharger le cahier d’exercices

Télécharger le carnet de notes du tutoriel Python basics 4

Pour visualiser ce notebook sur le Sandbox, vous devrez d’abord le télécharger sur votre ordinateur, puis le charger sur le Sandbox. Assurez-vous d’avoir suivi les prérequis de configuration listés dans Python basics 1 : Jupyter, puis suivez ces instructions :

  1. Téléchargez le cahier en cliquant sur le lien ci-dessus.

  2. Dans l’Environnement de test, ouvrez le dossier Training.

  3. Cliquez sur le bouton Transférer les fichiers comme indiqué ci-dessous.

Bouton de téléchargement.

  1. Sélectionnez le notebook téléchargé à l’aide du navigateur de fichiers. Cliquez sur OK.

  2. Le cahier de solutions apparaîtra dans le dossier Training. Double-cliquez dessus pour l’ouvrir.

Vous pouvez maintenant utiliser le cahier d’exercices comme une version interactive de cette page Web.

Note

Le cahier d’exercices devrait ressembler au texte et au code ci-dessous. Cependant, les sorties du cahier d’exercices sont vides (c’est-à-dire qu’aucun résultat n’apparaît après les cellules de code). Suivez les instructions du cahier pour exécuter les cellules du cahier d’exercices. Reportez-vous à cette page pour vérifier que vos résultats sont similaires.

Dictionnaires Numpy et données catégorielles

Nous allons introduire une structure numpy appelée dictionnaire. Cela sera utile pour la prochaine leçon sur xarray.

Un dictionnaire représente une correspondance entre clés et valeurs. Les clés et les valeurs sont des objets Python de n’importe quel type. On déclare un dictionnaire en utilisant des accolades {}. A l’intérieur, on spécifie la clé puis la valeur qui lui est associée, les clés et les valeurs étant séparées par un deux-points :. Les virgules , sont utilisées pour séparer les éléments du dictionnaire.

dictionary_name = {key1: value1, key2: value2, key3: value3}

Par exemple:

[ ]:
d = {1: 'one',
     2: 'two',
     3: 'apple'}

Dans le dictionnaire d ci-dessus, nous avons trois clés 1, 2, 3, et leurs valeurs respectives 'one', 'two' et 'apple'.

Nous pouvons rechercher des éléments dans un dictionnaire en utilisant la syntaxe [ nom_clé ] pour adresser la valeur stockée sous une clé. La syntaxe est la suivante :

dictionary_name[key_name]

Dans notre exemple de dictionnaire d ci-dessus, nous pouvons appeler la valeur associée au nom de clé 1 comme suit :

d[1]
[ ]:
print(d[1], " + ", d[2], " = ", d[3])

Les éléments d’un dictionnaire peuvent être modifiés ou de nouveaux éléments peuvent être ajoutés en utilisant la syntaxe nom_du_dictionnaire[nom_de_la_clé] = valeur.

[ ]:
d[3] = 'three'
d[4] = 'four'

print(d[1], " + ", d[2], " = ", d[3])

Là encore, le nom du dictionnaire, le nom de la clé et la valeur doivent être spécifiés.

Les dictionnaires sont utiles pour l’analyse des données (y compris l’analyse des données satellitaires) car ils permettent d’attribuer facilement des valeurs catégorielles à notre ensemble de données. La télédétection peut être utilisée pour créer des produits de classification qui utilisent des valeurs catégorielles. Ces produits ne contiennent pas de valeurs continues. Ils utilisent des valeurs discrètes pour représenter les différentes classes auxquelles les pixels individuels peuvent appartenir.

À titre d’exemple, les cellules suivantes simulent une image très simple contenant trois types de couverture végétale différents. La valeur 1 représente la zone couverte d’herbe, 2 les terres cultivées et 3 la ville.

Tout d’abord, nous importons les bibliothèques que nous voulons utiliser.

[4]:
%matplotlib inline

import numpy as np
from matplotlib import pyplot as plt
from matplotlib import colors

Nous allons maintenant créer un tableau numpy bidimensionnel de 100 pixels x 100 pixels où chaque valeur est égale à 1. Ceci est fait en utilisant la fonction numpy.ones. Ensuite, nous utilisons l’indexation de tableau pour attribuer à une partie de la zone la valeur 2, et à une autre partie la valeur 3.

[5]:
# grass = 1
area = np.ones((100,100))

# crops = 2
area[10:60,20:50] = 2

# city = 3
area[70:90,60:80] = 3

area.shape, area.dtype
[5]:
((100, 100), dtype('float64'))
[6]:
area
[6]:
array([[1., 1., 1., ..., 1., 1., 1.],
       [1., 1., 1., ..., 1., 1., 1.],
       [1., 1., 1., ..., 1., 1., 1.],
       ...,
       [1., 1., 1., ..., 1., 1., 1.],
       [1., 1., 1., ..., 1., 1., 1.],
       [1., 1., 1., ..., 1., 1., 1.]])

Nous avons maintenant une matrice remplie de 1, 2 et 3. À ce stade, il n’y a pas d’association entre les chiffres et les différents types de couverture végétale.

Si nous voulons montrer à quoi ressemble la zone selon la désignation herbe/cultures/ville, nous pouvons donner une couleur à chacune des classifications.

[7]:
# We map the values to colours
index = {1: 'green', 2: 'yellow', 3: 'grey'}

# Create a discrete colour map
cmap = colors.ListedColormap(index.values())

# Plot
plt.imshow(area, cmap=cmap)
[7]:
<matplotlib.image.AxesImage at 0x7fe7b5487f98>
../_images/python_basics_04_cleaning_data_21_1.png

Dans le cas ci-dessus, chaque pixel avait une valeur soit de 1, 2 ou 3. Que se passe-t-il si notre jeu de données est incomplet et qu’il n’y a pas de données à certains endroits ?

C’est un problème courant dans les ensembles de données réelles. Les ensembles de données réelles peuvent être incomplets et il peut manquer des données à certains moments ou endroits. Pour y remédier, nous utilisons la valeur spéciale NaN, qui signifie Not a Number.

Les NaNs sont désignés par la fonction numpy np.nan.

[8]:
arr = np.array([1,2,3,4,5,np.nan,7,8,9], dtype=np.float32)

arr
[8]:
array([ 1.,  2.,  3.,  4.,  5., nan,  7.,  8.,  9.], dtype=float32)

Pour calculer des statistiques sur des tableaux contenant des valeurs NaN, numpy possède des versions spéciales de fonctions communes telles que mean, l’écart-type std, et sum qui ignorent les valeurs NaN. Par exemple, la cellule suivante montre la différence entre l’utilisation de la fonction habituelle mean et la fonction nanmean.

La fonction mean ne peut pas gérer les valeurs NaN, elle renvoie donc nan. La fonction nanmean n’inclut pas les valeurs NaN dans le calcul, et renvoie donc une valeur numérique.

[9]:
print(np.mean(arr))

print(np.nanmean(arr))
nan
4.875

Notez que NaN n’est généralement pas utilisé comme clé dans les entrées clé-valeur des dictionnaires car il existe différentes façons d’exprimer NaN en Python et elles ne sont pas toujours équivalentes. Cependant, il est toujours possible de visualiser des données avec des NaN ; il y aura des vides dans l’image où il n’y a pas de données.

Exercices

4.1 La saison des récoltes est arrivée et nos terres cultivées ont changé de couleur pour devenir brunes. Pouvez-vous :

4.1.1 Modifier la zone jaune pour contenir la nouvelle valeur 4 ?

4.1.2 Ajouter une nouvelle entrée au dictionnaire ``index”” en associant le numéro ``4”” à la valeur ``brown””.

4.1.3 Tracer la zone.

[ ]:
# 4.1.1 Modify the yellow area to hold the value 4

[ ]:
# 4.1.2 Add a new key-value pair to index that maps 4 to 'brown'

[ ]:
# 4.1.3 Copy the cmap definition and re-run it to add the new colour

# Plot the area

Introduction: Si vous voulez tracer la nouvelle zone, vous devez redéfinir cmap pour que la nouvelle valeur se voit attribuer une couleur dans la carte des couleurs. Copiez et collez la ligne cmap = ... du tracé original.

4.2 Définissez zone [20:40, 80:95] = np.nan. Tracez la zone maintenant.

[ ]:
# Set the nan area

[ ]:
# Plot the entire area

4.3 Trouvez la médiane du tableau area de 4.2 en utilisant np.nanmedian. Est-ce que cela correspond à votre interprétation visuelle ? Comment cela se compare-t-il à l’utilisation de np.median ?

[ ]:
# Use np.nanmedian to find the median of the area

Conclusion

Deux capacités clés de Python ont été présentées dans cette section. Nous pouvons organiser nos données à l’aide de la syntaxe du dictionnaire, et comprendre les ensembles de données incomplets qui peuvent utiliser des valeurs NaN pour afficher les blancs. La leçon suivante fournit un guide sur xarray, un package Python qui s’appuie sur ces concepts pour faciliter le chargement et l’utilisation des données multidimensionnelles.