Importer des données avec Genfromtxt

NumPyBeginner
Pratiquer maintenant

Introduction

Dans ce laboratoire, vous apprendrez à importer des données tabulaires à partir de fichiers texte en utilisant la fonction numpy.genfromtxt. NumPy (Numerical Python) est une bibliothèque fondamentale pour le calcul scientifique en Python qui fournit des structures de données et des fonctions puissantes pour travailler avec des données numériques. Sa structure de données principale est le tableau NumPy (NumPy array) – un moyen rapide et efficace en mémoire pour stocker et manipuler de grands ensembles de données.

La fonction numpy.genfromtxt est une pierre angulaire de l'analyse de données en Python, vous permettant de lire des données structurées et de les convertir en tableaux NumPy. Nous commencerons par une importation de base et ajouterons progressivement des options pour gérer des scénarios courants du monde réel tels que les en-têtes, les différents séparateurs de colonnes, les valeurs manquantes et la sélection de colonnes de données spécifiques. Toutes les opérations seront effectuées en écrivant et en exécutant des scripts Python dans le WebIDE.

Ceci est un Guided Lab, qui fournit des instructions étape par étape pour vous aider à apprendre et à pratiquer. Suivez attentivement les instructions pour compléter chaque étape et acquérir une expérience pratique. Les données historiques montrent que c'est un laboratoire de niveau débutant avec un taux de réussite de 96%. Il a reçu un taux d'avis positifs de 100% de la part des apprenants.

Chargement de données de base avec genfromtxt

Tout d'abord, familiarisons-nous avec l'environnement. Dans l'explorateur de fichiers à gauche, vous verrez deux fichiers : main.py et my_data.csv. Nous écrirons notre code Python dans main.py pour charger les données de my_data.csv.

L'utilisation la plus basique de la fonction numpy.genfromtxt nécessite un argument : le chemin vers la source de données. Essayons de charger notre fichier de données avec les paramètres par défaut.

Ouvrez le fichier main.py et ajoutez-y le code suivant :

import numpy as np  ## Ceci importe NumPy et lui donne l'alias 'np' pour plus de commodité

## Charger les données du fichier CSV
## Les chemins relatifs entraîneront un échec de validation, veuillez utiliser des chemins absolus dans le laboratoire
data = np.genfromtxt('/home/labex/project/my_data.csv')

## Afficher le tableau résultant
print(data)

Maintenant, enregistrez le fichier et exécutez-le depuis le terminal en bas de l'IDE.

python main.py

Vous verrez la sortie suivante :

[nan nan nan nan]

Cette sortie peut être surprenante. Le résultat est un tableau de valeurs nan (Not a Number). NaN est une valeur spéciale à virgule flottante qui représente des résultats numériques indéfinis ou non représentables – c'est la façon dont NumPy indique qu'une valeur n'a pas pu être correctement convertie en nombre. Cela se produit parce que genfromtxt essaie par défaut de diviser les lignes par des espaces blancs et d'interpréter tout comme un nombre à virgule flottante. Notre fichier my_data.csv utilise des virgules comme séparateurs et contient une ligne d'en-tête non numérique, ce qui entraîne l'échec de l'importation par défaut. Dans la prochaine étape, nous corrigerons cela.

Spécifier les délimiteurs et ignorer les en-têtes

Pour analyser correctement notre fichier my_data.csv, nous devons indiquer deux choses à genfromtxt :

  1. Les données sont séparées par des virgules.
  2. La première ligne est un en-tête et doit être ignorée.

Nous pouvons y parvenir en utilisant les arguments delimiter et skip_header.

  • delimiter=',' : Ceci indique à la fonction d'utiliser une virgule pour séparer les valeurs.
  • skip_header=1 : Ceci indique à la fonction d'ignorer la première ligne du fichier.

Modifiez votre fichier main.py avec le code mis à jour :

import numpy as np  ## Importer la bibliothèque NumPy

## Charger les données, en spécifiant le délimiteur et en sautant l'en-tête
data = np.genfromtxt('/home/labex/project/my_data.csv', delimiter=',', skip_header=1)

## Afficher le tableau résultant
print(data)

Enregistrez le fichier et exécutez-le à nouveau dans le terminal :

python main.py

La sortie ressemblera maintenant beaucoup mieux :

[[ 1.   22.5  45. ]
 [ 2.   23.1  48. ]
 [ 3.    nan  46. ]
 [ 4.   23.5  52. ]]

Comme vous pouvez le constater, les données sont maintenant structurées en un tableau 2D (tableau à deux dimensions). Pensez-y comme à une table ou une feuille de calcul avec des lignes et des colonnes – notre tableau a 4 lignes (une pour chaque lecture de capteur) et 3 colonnes (ID du capteur, Température, Humidité). Les nombres sont correctement analysés comme des floats (nombres à virgule flottante, qui peuvent représenter des valeurs décimales comme 22.5). Cependant, remarquez le nan dans la troisième ligne. C'est parce que notre fichier source contient le texte NA pour représenter une lecture de température manquante, et genfromtxt ne le reconnaît pas comme un nombre. Nous allons aborder cela dans la prochaine étape.

Gestion des valeurs manquantes

Les jeux de données du monde réel sont souvent incomplets. genfromtxt offre un moyen propre de gérer cela en utilisant les arguments missing_values et filling_values.

  • missing_values : Une chaîne de caractères ou une liste de chaînes de caractères qui doivent être interprétées comme des données manquantes.
  • filling_values : Une valeur pour remplacer toute entrée manquante.

Dans nos données, la valeur manquante est représentée par NA. Indiquons à genfromtxt de reconnaître NA comme une valeur manquante et de la remplacer par -99 pour une identification facile.

Mettez à jour votre fichier main.py comme suit :

import numpy as np  ## Importer la bibliothèque NumPy

## Gérer les valeurs manquantes
data = np.genfromtxt('/home/labex/project/my_data.csv', delimiter=',', skip_header=1,
                     missing_values='NA', filling_values=-99)

## Afficher le tableau résultant
print(data)

Enregistrez le fichier et exécutez-le :

python main.py

La sortie affiche maintenant un tableau numérique complet, avec la valeur manquante remplacée :

[[  1.    22.5   45.  ]
 [  2.    23.1   48.  ]
 [  3.   -99.    46.  ]
 [  4.    23.5   52.  ]]

Nos données sont maintenant propres et entièrement numériques, prêtes pour les calculs.

Sélection des colonnes et définition des types de données

Parfois, vous n'avez besoin que d'un sous-ensemble des données. L'argument usecols vous permet de spécifier quelles colonnes importer. Il prend un tuple (une séquence immuable de valeurs, comme (1, 2)) d'indices de colonnes (en commençant par 0). Par exemple, usecols=(1, 2) signifie "importer uniquement les colonnes 1 et 2".

De plus, vous pouvez imposer un type de données spécifique à toutes les données importées en utilisant l'argument dtype. En programmation, les types de données déterminent comment les valeurs sont stockées et quelles opérations peuvent être effectuées sur elles. Par exemple, dtype=int convertira toutes les valeurs en entiers (nombres entiers), dtype=float garantira qu'elles restent des nombres à virgule flottante (décimaux), et dtype=str les traitera comme du texte. Notez que dtype=int tronquera toute partie décimale (22.5 deviendra 22).

Modifions notre script pour importer uniquement la Température (colonne 1) et l'Humidité (colonne 2) et nous assurer qu'elles sont traitées comme des nombres à virgule flottante.

Mettez à jour main.py une dernière fois :

import numpy as np  ## Importer la bibliothèque NumPy

## Sélectionner des colonnes spécifiques et définir le type de données
data = np.genfromtxt('/home/labex/project/my_data.csv', delimiter=',', skip_header=1,
                     missing_values='NA', filling_values=0,
                     usecols=(1, 2), dtype=float)

## Afficher le tableau résultant
print(data)

Note : Nous avons changé filling_values en 0 pour cet exemple.

Enregistrez le fichier et exécutez-le depuis le terminal :

python main.py

La sortie finale sera un tableau 2D contenant uniquement les données de température et d'humidité :

[[22.5 45. ]
 [23.1 48. ]
 [ 0.  46. ]
 [23.5 52. ]]

Vous avez importé et nettoyé avec succès un jeu de données en sélectionnant uniquement les colonnes pertinentes et en gérant toutes les incohérences de données en cours de route.

Résumé

Dans ce laboratoire, vous avez appris à utiliser efficacement numpy.genfromtxt pour importer des données d'un fichier texte dans un tableau NumPy. Vous avez pratiqué l'utilisation de plusieurs arguments clés pour gérer les défis des données du monde réel :

  • delimiter : Pour spécifier comment les colonnes sont séparées.
  • skip_header : Pour ignorer les lignes d'en-tête dans le fichier de données.
  • missing_values : Pour identifier les chaînes de caractères personnalisées qui représentent des données manquantes.
  • filling_values : Pour remplacer les données manquantes par une valeur spécifique.
  • usecols : Pour importer uniquement un sous-ensemble spécifique de colonnes.
  • dtype : Pour contrôler le type de données du tableau résultant.

Maîtriser genfromtxt est une compétence fondamentale pour tout scientifique ou ingénieur des données travaillant avec Python et NumPy.