Datenimport mit Genfromtxt

NumPyBeginner
Jetzt üben

Einführung

In diesem Lab lernen Sie, wie Sie tabellarische Daten aus Textdateien mit der Funktion numpy.genfromtxt importieren. NumPy (Numerical Python) ist eine grundlegende Bibliothek für wissenschaftliches Rechnen in Python, die leistungsstarke Datenstrukturen und Funktionen für die Arbeit mit numerischen Daten bereitstellt. Ihre Kern-Datenstruktur ist das NumPy-Array – eine schnelle, speichereffiziente Methode zur Speicherung und Manipulation großer Datensätze.

Die Funktion numpy.genfromtxt ist ein Eckpfeiler der Datenanalyse in Python und ermöglicht es Ihnen, strukturierte Daten zu lesen und in NumPy-Arrays zu konvertieren. Wir beginnen mit einem einfachen Import und fügen schrittweise Optionen hinzu, um gängige reale Szenarien wie Header, unterschiedliche Spaltentrennzeichen, fehlende Werte und die Auswahl spezifischer Datenspalten zu behandeln. Alle Operationen werden durch Schreiben und Ausführen von Python-Skripten in der WebIDE durchgeführt.

Dies ist ein Guided Lab, das schrittweise Anweisungen bietet, um Ihnen beim Lernen und Üben zu helfen. Befolgen Sie die Anweisungen sorgfältig, um jeden Schritt abzuschließen und praktische Erfahrungen zu sammeln. Historische Daten zeigen, dass dies ein Labor der Stufe Anfänger mit einer Abschlussquote von 96% ist. Es hat eine positive Bewertungsrate von 100% von den Lernenden erhalten.

Grundlegender Datenladevorgang mit genfromtxt

Zuerst machen wir uns mit der Umgebung vertraut. Im Dateiexplorer auf der linken Seite sehen Sie zwei Dateien: main.py und my_data.csv. Wir werden unseren Python-Code in main.py schreiben, um Daten aus my_data.csv zu laden.

Die grundlegendste Verwendung der Funktion numpy.genfromtxt erfordert ein Argument: den Pfad zur Datenquelle. Versuchen wir, unsere Datendatei mit den Standardeinstellungen zu laden.

Öffnen Sie die Datei main.py und fügen Sie folgenden Code hinzu:

import numpy as np  ## Dies importiert NumPy und gibt ihm den Alias 'np' zur einfacheren Verwendung

## Daten aus der CSV-Datei laden
## Relative Pfade führen zu einem Validierungsfehler, bitte verwenden Sie absolute Pfade im Lab
data = np.genfromtxt('/home/labex/project/my_data.csv')

## Das resultierende Array ausgeben
print(data)

Speichern Sie nun die Datei und führen Sie sie im Terminal am unteren Rand der IDE aus.

python main.py

Sie sehen die folgende Ausgabe:

[nan nan nan nan]

Diese Ausgabe mag überraschend sein. Das Ergebnis ist ein Array von nan (Not a Number) Werten. NaN ist ein spezieller Gleitkommawert, der undefinierte oder nicht darstellbare numerische Ergebnisse repräsentiert – es ist die Art und Weise von NumPy, anzuzeigen, dass ein Wert nicht ordnungsgemäß in eine Zahl konvertiert werden konnte. Dies geschieht, weil genfromtxt standardmäßig versucht, Zeilen nach Leerzeichen zu trennen und alles als Gleitkommazahl zu interpretieren. Unsere Datei my_data.csv verwendet Kommas als Trennzeichen und enthält eine nicht-numerische Kopfzeile, was dazu führt, dass der Standardimport fehlschlägt. Im nächsten Schritt werden wir dies beheben.

Festlegen von Trennzeichen und Überspringen von Kopfzeilen

Um unsere Datei my_data.csv korrekt zu parsen, müssen wir genfromtxt zwei Dinge mitteilen:

  1. Die Daten sind durch Kommas getrennt.
  2. Die erste Zeile ist ein Header und sollte ignoriert werden.

Dies können wir mit den Argumenten delimiter und skip_header erreichen.

  • delimiter=',': Dies weist die Funktion an, ein Komma zur Trennung von Werten zu verwenden.
  • skip_header=1: Dies weist die Funktion an, die erste Zeile der Datei zu ignorieren.

Ändern Sie Ihre main.py-Datei mit dem aktualisierten Code:

import numpy as np  ## NumPy-Bibliothek importieren

## Daten laden, Trennzeichen angeben und Header überspringen
data = np.genfromtxt('/home/labex/project/my_data.csv', delimiter=',', skip_header=1)

## Das resultierende Array ausgeben
print(data)

Speichern Sie die Datei und führen Sie sie erneut im Terminal aus:

python main.py

Die Ausgabe wird nun viel besser aussehen:

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

Wie Sie sehen können, sind die Daten nun in einem 2D-Array (zweidimensionales Array) strukturiert. Stellen Sie es sich wie eine Tabelle oder eine Tabellenkalkulation mit Zeilen und Spalten vor – unser Array hat 4 Zeilen (eine für jede Sensorablesung) und 3 Spalten (Sensor-ID, Temperatur, Luftfeuchtigkeit). Die Zahlen werden korrekt als Floats (Gleitkommazahlen, die Dezimalwerte wie 22,5 darstellen können) geparst. Beachten Sie jedoch das nan in der dritten Zeile. Dies liegt daran, dass unsere Quelldatei den Text NA zur Darstellung einer fehlenden Temperaturablesung enthält, und genfromtxt dies nicht als Zahl erkennt. Dies werden wir im nächsten Schritt behandeln.

Umgang mit fehlenden Werten

Datensätze aus der realen Welt sind oft unvollständig. genfromtxt bietet eine saubere Möglichkeit, dies mit den Argumenten missing_values und filling_values zu handhaben.

  • missing_values: Ein String oder eine Liste von Strings, die als fehlende Daten interpretiert werden sollen.
  • filling_values: Ein Wert, der für fehlende Einträge eingesetzt werden soll.

In unseren Daten wird der fehlende Wert durch NA dargestellt. Lassen Sie uns genfromtxt anweisen, NA als fehlenden Wert zu erkennen und ihn durch -99 zu ersetzen, um ihn leicht identifizieren zu können.

Aktualisieren Sie Ihre main.py-Datei wie folgt:

import numpy as np  ## NumPy-Bibliothek importieren

## Fehlende Werte behandeln
data = np.genfromtxt('/home/labex/project/my_data.csv', delimiter=',', skip_header=1,
                     missing_values='NA', filling_values=-99)

## Das resultierende Array ausgeben
print(data)

Speichern Sie die Datei und führen Sie sie aus:

python main.py

Die Ausgabe zeigt nun ein vollständiges numerisches Array, wobei der fehlende Wert ersetzt wurde:

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

Jetzt sind unsere Daten sauber und vollständig numerisch, bereit für Berechnungen.

Auswählen von Spalten und Festlegen von Datentypen

Manchmal benötigen Sie nur einen Teil der Daten. Das Argument usecols ermöglicht es Ihnen, anzugeben, welche Spalten importiert werden sollen. Es nimmt ein Tupel (eine unveränderliche Sequenz von Werten, wie z. B. (1, 2)) von Spaltenindizes (beginnend bei 0) entgegen. Zum Beispiel bedeutet usecols=(1, 2), dass nur die Spalten 1 und 2 importiert werden sollen.

Zusätzlich können Sie mit dem Argument dtype einen bestimmten Datentyp für alle importierten Daten erzwingen. In der Programmierung bestimmen Datentypen, wie Werte gespeichert werden und welche Operationen mit ihnen durchgeführt werden können. Zum Beispiel konvertiert dtype=int alle Werte in ganze Zahlen (Integer), dtype=float stellt sicher, dass sie als Gleitkommazahlen (Dezimalzahlen) bleiben, und dtype=str behandelt sie als Text. Beachten Sie, dass dtype=int Dezimalteile abschneidet (22,5 wird zu 22).

Lassen Sie uns unser Skript ändern, um nur die Temperature (Spalte 1) und Humidity (Spalte 2) zu importieren und sicherzustellen, dass sie als Gleitkommazahlen behandelt werden.

Aktualisieren Sie main.py ein letztes Mal:

import numpy as np  ## NumPy-Bibliothek importieren

## Spezifische Spalten auswählen und Datentyp festlegen
data = np.genfromtxt('/home/labex/project/my_data.csv', delimiter=',', skip_header=1,
                     missing_values='NA', filling_values=0,
                     usecols=(1, 2), dtype=float)

## Das resultierende Array ausgeben
print(data)

Hinweis: Wir haben filling_values für dieses Beispiel auf 0 geändert.

Speichern Sie die Datei und führen Sie sie im Terminal aus:

python main.py

Die endgültige Ausgabe ist ein 2D-Array, das nur die Temperatur- und Luftfeuchtigkeitsdaten enthält:

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

Sie haben erfolgreich einen Datensatz importiert und bereinigt, indem Sie nur die relevanten Spalten ausgewählt und alle Dateninkonsistenzen auf dem Weg behandelt haben.

Zusammenfassung

In diesem Labor haben Sie gelernt, wie Sie numpy.genfromtxt effektiv nutzen, um Daten aus einer Textdatei in ein NumPy-Array zu importieren. Sie haben die Verwendung mehrerer wichtiger Argumente geübt, um reale Datenherausforderungen zu bewältigen:

  • delimiter: Um anzugeben, wie Spalten getrennt sind.
  • skip_header: Um Kopfzeilen in der Datendatei zu ignorieren.
  • missing_values: Um benutzerdefinierte Strings zu identifizieren, die fehlende Daten darstellen.
  • filling_values: Um fehlende Daten durch einen bestimmten Wert zu ersetzen.
  • usecols: Um nur eine bestimmte Teilmenge von Spalten zu importieren.
  • dtype: Um den Datentyp des resultierenden Arrays zu steuern.

Die Beherrschung von genfromtxt ist eine grundlegende Fähigkeit für jeden Data Scientist oder Ingenieur, der mit Python und NumPy arbeitet.