Erhalten Sie Zugang zu diesem und mehr als 300000 Büchern ab EUR 5,99 monatlich.
Die erste Adresse für die Analyse von Daten mit Python - Das Standardwerk in der 3. Auflage, aktualisiert auf Python 3.10 und pandas 1.4 - Versorgt Sie mit allen praktischen Details und mit wertvollem Insiderwissen, um Datenanalysen mit Python erfolgreich durchzuführen - Mit Jupyter-Notebooks für alle Codebeispiele aus jedem KapitelErfahren Sie alles über das Manipulieren, Bereinigen, Verarbeiten und Aufbereiten von Datensätzen mit Python: Aktualisiert auf Python 3.10, zeigt Ihnen dieses konsequent praxisbezogene Buch anhand konkreter Fallbeispiele, wie Sie eine Vielzahl von typischen Datenanalyse-Problemen effektiv lösen. Gleichzeitig lernen Sie die neuesten Versionen von pandas, NumPy, IPython und Jupyter kennen. Geschrieben von Wes McKinney, dem Begründer des pandas-Projekts, bietet "Datenanalyse mit Python" einen praktischen Einstieg in die Data-Science-Tools von Python. Das Buch eignet sich sowohl für Datenanalysten, für die Python Neuland ist, als auch für Python-Programmierer, die sich in Data Science und Scientific Computing einarbeiten wollen. Daten und zugehöriges Material des Buchs sind auf GitHub verfügbar.
Sie lesen das E-Book in den Legimi-Apps auf:
Seitenzahl: 640
Das E-Book (TTS) können Sie hören im Abo „Legimi Premium” in Legimi-Apps auf:
Copyright und Urheberrechte:Die durch die dpunkt.verlag GmbH vertriebenen digitalen Inhalte sind urheberrechtlich geschützt. Der Nutzer verpflichtet sich, die Urheberrechte anzuerkennen und einzuhalten. Es werden keine Urheber-, Nutzungs- und sonstigen Schutzrechte an den Inhalten auf den Nutzer übertragen. Der Nutzer ist nur berechtigt, den abgerufenen Inhalt zu eigenen Zwecken zu nutzen. Er ist nicht berechtigt, den Inhalt im Internet, in Intranets, in Extranets oder sonst wie Dritten zur Verwertung zur Verfügung zu stellen. Eine öffentliche Wiedergabe oder sonstige Weiterveröffentlichung und eine gewerbliche Vervielfältigung der Inhalte wird ausdrücklich ausgeschlossen. Der Nutzer darf Urheberrechtsvermerke, Markenzeichen und andere Rechtsvorbehalte im abgerufenen Inhalt nicht entfernen.
3. AUFLAGE
Auswertung von Daten mit pandas,NumPy und Jupyter
Wes McKinney
Übersetzung von Kathrin Lichtenbergund Thomas Demmig
Wes McKinney
Lektorat: Alexandra Follenius
Übersetzung: Kathrin Lichtenberg, Thomas Demmig
Copy-Editing: Sibylle Feldmann, www.richtiger-text.de
Satz: III-satz, www.drei-satz.de
Herstellung: Stefanie Weidner
Umschlaggestaltung: Karen Montgomery, Michael Oréal, www.oreal.de
Bibliografische Information der Deutschen Nationalbibliothek
Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über http://dnb.d-nb.de abrufbar.
ISBN:
Print 978-3-96009-211-7
PDF 978-3-96010-752-1
ePub 978-3-96010-753-8
mobi 978-3-96010-754-5
3. Auflage 2023
Translation Copyright für die deutschsprachige Ausgabe © 2023 dpunkt.verlag GmbH
Wieblinger Weg 17
69123 Heidelberg
Authorized German translation of the English edition of Python for Data Analysis, 3rd Edition, ISBN 9781098104030 © 2022 Wesley McKinney. This translation is published and sold by permission of O’Reilly Media, Inc., which owns or controls all rights to publish and sell the same.
Dieses Buch erscheint in Kooperation mit O’Reilly Media, Inc. unter dem Imprint »O’REILLY«. O’REILLY ist ein Markenzeichen und eine eingetragene Marke von O’Reilly Media, Inc. und wird mit Einwilligung des Eigentümers verwendet.
Schreiben Sie uns:
Falls Sie Anregungen, Wünsche und Kommentare haben, lassen Sie es uns wissen: [email protected].
Die vorliegende Publikation ist urheberrechtlich geschützt. Alle Rechte vorbehalten. Die Verwendung der Texte und Abbildungen, auch auszugsweise, ist ohne die schriftliche Zustimmung des Verlags urheberrechtswidrig und daher strafbar. Dies gilt insbesondere für die Vervielfältigung, Übersetzung oder die Verwendung in elektronischen Systemen.
Es wird darauf hingewiesen, dass die im Buch verwendeten Soft- und Hardware-Bezeichnungen sowie Markennamen und Produktbezeichnungen der jeweiligen Firmen im Allgemeinen warenzeichen-, marken- oder patentrechtlichem Schutz unterliegen.
Alle Angaben und Programme in diesem Buch wurden mit größter Sorgfalt kontrolliert. Weder Autor noch Verlag noch Übersetzer können jedoch für Schäden haftbar gemacht werden, die in Zusammenhang mit der Verwendung dieses Buches stehen.
Vorwort
1Einleitung
1.1Worum geht es in diesem Buch?
Welche Arten von Daten?
1.2Warum Python für die Datenanalyse?
Python als Kleister
Das »Zwei-Sprachen-Problem« lösen
Warum nicht Python?
1.3Grundlegende Python-Bibliotheken
NumPy
pandas
matplotlib
IPython und Jupyter
SciPy
scikit-learn
statsmodels
Andere Pakete
1.4Installation und Einrichtung
Miniconda auf Windows
GNU/Linux
Miniconda auf macOS
Python-Pakete installieren oder aktualisieren
Integrierte Entwicklungsumgebungen und Texteditoren
1.5Community und Konferenzen
1.6Navigation durch dieses Buch
Codebeispiele
Daten für die Beispiele
Importkonventionen
2Grundlagen von Python, IPython und Jupyter-Notebooks
2.1Der Python-Interpreter
2.2IPython-Grundlagen
Die IPython-Shell ausführen
Das Jupyter-Notebook ausführen
Befehlsergänzung mit Tab
Introspektion
2.3Grundlagen der Sprache Python
Sprachsemantik
Skalare Typen
Kontrollfluss
2.4Schlussbemerkung
3In Python integrierte Datenstrukturen, Funktionen und Dateien
3.1Datenstrukturen und Sequenzen
Tupel
Listen
Dictionarys
Set
Eingebaute Funktionen von Sequenzen
List, Set und Dictionary Comprehensions
3.2Funktionen
Namensraum, Gültigkeitsbereich und lokale Funktionen
Mehrere Rückgabewerte
Funktionen sind Objekte
Anonyme oder Lambda-Funktionen
Generatoren
Fehler und die Behandlung von Ausnahmen
3.3Dateien und das Betriebssystem
Bytes und Unicode mit Dateien
3.4Schlussbemerkung
4Grundlagen von NumPy: Arrays und vektorisierte Berechnung
4.1Das ndarray von NumPy: ein mehrdimensionales Array-Objekt
ndarrays erzeugen
Datentypen für ndarrays
Rechnen mit NumPy-Arrays
Einfaches Indizieren und Slicing
Boolesches Indizieren
Fancy Indexing
Arrays transponieren und Achsen tauschen
4.2Erzeugen von Pseudozufallszahlen
4.3Universelle Funktionen: schnelle elementweise Array-Funktionen
4.4Array-orientierte Programmierung mit Arrays
Bedingte Logik als Array-Operationen ausdrücken
Mathematische und statistische Methoden
Methoden für boolesche Arrays
Sortieren
Unique und andere Mengenlogik
4.5Dateiein- und -ausgabe bei Arrays
4.6Lineare Algebra
4.7Beispiel: Random Walks
Viele Random Walks auf einmal simulieren
4.8Schlussbemerkung
5Erste Schritte mit pandas
5.1Einführung in die pandas-Datenstrukturen
Series
DataFrame
Indexobjekte
5.2Wesentliche Funktionalität
Neuindizierung
Einträge von einer Achse löschen
Indizierung, Auswahl und Filterung
Fallstricke bei Integer-Indizes
Arithmetik und Datenausrichtung
Funktionsanwendung und Mapping
Sortieren und Rangbildung
Achsenindizes mit duplizierten Labels
5.3Zusammenfassen und Berechnen deskriptiver Statistiken
Korrelation und Kovarianz
Eindeutigkeit, Werteanzahl und Mitgliedschaft
5.4Schlussbemerkung
6Laden und Speichern von Daten sowie Dateiformate
6.1Lesen und Schreiben von Daten im Textformat
Stückweises Lesen von Textdateien
Daten in Textformaten schreiben
Arbeiten mit anderen Formaten
JSON-Daten
XML und HTML: Web-Scraping
6.2Binäre Datenformate
Lesen von Microsoft-Excel-Dateien
Benutzung von HDF5
6.3Interaktion mit Web-APIs
6.4Interaktion mit Datenbanken
6.5Schlussbemerkung
7Daten bereinigen und vorbereiten
7.1Der Umgang mit fehlenden Daten
Fehlende Daten herausfiltern
Fehlende Daten einsetzen
7.2Datentransformation
Duplikate entfernen
Daten mithilfe einer Funktion oder eines Mappings transformieren
Werte ersetzen
Achsenindizes umbenennen
Diskretisierung und Klassifizierung
Erkennen und Filtern von Ausreißern
Permutation und zufällige Stichproben
Berechnen von Indikator-/Platzhaltervariablen
7.3Extension-Datentypen
7.4Manipulation von Strings
Methoden von String-Objekten in Python
Reguläre Ausdrücke
String-Funktionen in pandas
7.5Kategorische Daten
Hintergrund und Motivation
Der Extension-Typ Categorical in pandas
Berechnungen mit Categoricals
Kategorische Methoden
7.6Schlussbemerkung
8Datenaufbereitung: Verknüpfen, Kombinieren und Umformen
8.1Hierarchische Indizierung
Ebenen neu anordnen und sortieren
Zusammenfassende Statistiken nach Ebene
Indizierung mit den Spalten eines DataFrame
8.2Kombinieren und Verknüpfen von Datensätzen
Datenbankartige Verknüpfung von DataFrames
Daten über einen Index verknüpfen
Verketten entlang einer Achse
Überlappende Daten zusammenführen
8.3Umformen und Transponieren
Umformen mit hierarchischer Indizierung
Transponieren vom »langen« zum »breiten« Format
Transponieren vom »breiten« zum »langen« Format
8.4Schlussbemerkung
9Plotten und Visualisieren
9.1Kurze Einführung in die matplotlib-API
Diagramme und Subplots
Farben, Beschriftungen und Linienformen
Skalenstriche, Beschriftungen und Legenden
Annotationen und Zeichnungen in einem Subplot
Diagramme in Dateien abspeichern
Die Konfiguration von matplotlib
9.2Plotten mit pandas und seaborn
Liniendiagramme
Balkendiagramme
Histogramme und Dichteplots
Streu- oder Punktdiagramme
Facettenraster und kategorische Daten
9.3Andere Visualisierungswerkzeuge in Python
9.4Schlussbemerkung
10Aggregation von Daten und Gruppenoperationen
10.1Grundlagen zu Gruppierungsoperationen
Iteration über Gruppen
Auswählen einer Spalte oder einer Teilmenge von Spalten
Gruppieren mit Dictionarys und Series
Gruppieren mit Funktionen
Gruppieren nach Ebenen eines Index
10.2Aggregation von Daten
Spaltenweise und mehrfache Anwendung von Funktionen
Aggregierte Daten ohne Zeilenindizes zurückgeben
10.3Apply: Allgemeine Operationen vom Typ split-apply-combine
Unterdrücken der Gruppenschlüssel
Analyse von Quantilen und Größenklassen
Beispiel: Fehlende Daten mit gruppenspezifischen Werten auffüllen
Beispiel: Zufällige Stichproben und Permutation
Beispiel: Gewichteter Mittelwert für Gruppen und Korrelation
Beispiel: Gruppenweise lineare Regression
10.4Gruppentransformationen und »ausgepackte« GroupBys
10.5Pivot-Tabellen und Kreuztabellierung
Kreuztabellen
10.6Schlussbemerkung
11Zeitreihen
11.1Datentypen und Werkzeuge für Datum und Zeit
Konvertieren zwischen String und datetime
11.2Grundlagen von Zeitreihen
Indizieren, auswählen und Untermengen bilden
Zeitreihen mit doppelten Indizes
11.3Datumsbereiche, Frequenzen und Verschiebungen
Erzeugen von Datumsbereichen
Frequenzen und Offsets von Kalenderdaten
Verschieben von Datumsangaben (Vorlauf und Verzögerung)
11.4Berücksichtigung von Zeitzonen
Lokalisieren und Konvertieren von Zeitzonen
Operationen mit Zeitstempeln bei zugeordneter Zeitzone
Operationen zwischen unterschiedlichen Zeitzonen
11.5Perioden und Arithmetik von Perioden
Umwandlung der Frequenz von Perioden
Quartalsweise Perioden
Zeitstempel zu Perioden konvertieren (und zurück)
Erstellen eines PeriodIndex aus Arrays
11.6Resampling und Konvertieren von Frequenzen
Downsampling
Upsampling und Interpolation
Resampling mit Perioden
Gruppiertes Zeit-Resampling
11.7Funktionen mit gleitenden Fenstern
Exponentiell gewichtete Funktionen
Binäre Funktionen mit gleitendem Fenster
Benutzerdefinierte Funktionen mit gleitenden Fenstern
11.8Schlussbemerkung
12Einführung in Modellierungsbibliotheken in Python
12.1Die Kopplung zwischen pandas und dem Modellcode
12.2Modellbeschreibungen mit Patsy herstellen
Datentransformationen in Patsy-Formeln
Kategorische Daten und Patsy
12.3Einführung in statsmodels
Lineare Modelle schätzen
Zeitreihenprozesse schätzen
12.4Einführung in scikit-learn
12.5Schlussbemerkung
13Beispiele aus der Datenanalyse
13.1Bitly-Daten von 1.USA.gov
Zählen von Zeitzonen in reinem Python
Zeitzonen mit pandas zählen
13.2MovieLens-1M-Datensatz
Messen von Unterschieden in der Bewertung
13.3US-Babynamen von 1880–2010
Namenstrends analysieren
13.4Die USDA-Nahrungsmitteldatenbank
13.5Datenbank des US-Wahlausschusses von 2012
Spendenstatistik nach Beruf und Arbeitgeber
Spenden der Größe nach klassifizieren
Spendenstatistik nach Bundesstaat
13.6Schlussbemerkung
Anhang ANumPy für Fortgeschrittene
A.1Interna des ndarray-Objekts
Die Datentyphierarchie in NumPy
A.2Fortgeschrittene Manipulation von Arrays
Arrays umformen
Anordnung von Arrays in C und FORTRAN
Arrays verketten und aufspalten
Wiederholen von Elementen: tile und repeat
Alternativen zum Fancy Indexing: take und put
A.3Broadcasting
Broadcasting über andere Achsen
Werte von Arrays durch Broadcasting setzen
A.4Fortgeschrittene Nutzung von ufuncs
Instanzmethoden von ufunc
Neue ufuncs in Python schreiben
A.5Strukturierte und Record-Arrays
Geschachtelte Datentypen und mehrdimensionale Felder
Warum sollte man strukturierte Arrays verwenden?
A.6Mehr zum Thema Sortieren
Indirektes Sortieren: argsort und lexsort
Alternative Sortieralgorithmen
Arrays teilweise sortieren
numpy.searchsorted: Elemente in einem sortierten Array finden
A.7Schnelle NumPy-Funktionen mit Numba schreiben
Eigene numpy.ufunc-Objekte mit Numba herstellen
A.8Ein- und Ausgabe von Arrays für Fortgeschrittene
Memory-mapped Dateien
HDF5 und weitere Möglichkeiten zum Speichern von Arrays
A.9Tipps für eine höhere Leistung
Die Bedeutung des zusammenhängenden Speichers
Anhang BMehr zum IPython-System
B.1Tastenkürzel im Terminal
B.2Magische Befehle
Der Befehl %run
Code aus der Zwischenablage ausführen
B.3Die Befehlshistorie benutzen
Die Befehlshistorie durchsuchen und wiederverwenden
Eingabe- und Ausgabevariablen
B.4Mit dem Betriebssystem interagieren
Shell-Befehle und -Aliase
Das Verzeichnis-Bookmark-System
B.5Werkzeuge zur Softwareentwicklung
Interaktiver Debugger
Zeitmessung bei Code: %time und %timeit
Grundlegende Profilierung: %prun and %run -p
Eine Funktion Zeile für Zeile profilieren
B.6Tipps für eine produktive Codeentwicklung mit IPython
Modulabhängigkeiten neu laden
Tipps für das Codedesign
B.7Fortgeschrittene IPython-Funktionen
Profile und Konfiguration
B.8Schlussbemerkung
Index
Die erste (englischsprachige) Auflage dieses Buchs wurde 2012 veröffentlicht, als die Open-Source-Bibliotheken zur Datenanalyse mit Python (insbesondere pandas) ganz neu waren und sich rasant weiterentwickelten. Als es an der Zeit war, 2016/2017 die zweite Auflage zu schreiben, musste ich das Buch nicht nur an Python 3.6 anpassen (in der ersten Auflage kam noch Python 2.7 zum Einsatz), sondern auch den neuen Funktionalitäten Rechnung tragen, die sich in den fünf Jahren dazwischen entwickelt haben. Jetzt ist es 2022, und es gab weniger Änderungen an Python (wir sind aktuell bei Erscheinen dieses Buchs bei Python 3.11), aber pandas hat sich stets weiterentwickelt.
In dieser dritten Auflage ist es mein Ziel, die Inhalte an die aktuellen Versionen von Python, NumPy, pandas und anderen Projekten anzupassen, dabei aber in Bezug auf neuere Python-Projekte aus den letzten paar Jahren eher zurückhaltend vorzugehen. Da dieses Buch für viele Vorlesungen an Universitäten und für Experten in ihrem beruflichen Alltag zu einer wichtigen Quelle geworden ist, möchte ich Themen vermeiden, die eventuell in ein oder zwei Jahren schon wieder unwichtig geworden sind. So sollte sich das Buch auch noch 2023 oder 2024 gut nutzen lassen.
Ein neues Feature der dritten Auflage ist die (englischsprachige) Open-Access-Onlineversion auf meiner Website unter https://wesmckinney.com/book, die als Ressource und praktischer Rückgriff für Besitzer der Papier- oder Digitalversion dieses Buchs dient. Ich plane, den Inhalt dort möglichst aktuell zu halten – wenn Sie also die gedruckte Version dieses Buchs besitzen und über etwas stolpern, das nicht richtig funktioniert, sollten Sie dort nachschauen, ob sich etwas geändert hat.
Folgende typografische Konventionen gelten in diesem Buch:
Kursiv
Kennzeichnet neue Begriffe, URLs, E-Mail-Adressen, Dateinamen und Dateierweiterungen.
Nichtproportionalschrift
Kennzeichnet Programmlistings sowie Programmelemente in Absätzen, wie etwa Variablen- oder Funktionsnamen, Datenbanken, Datentypen, Umgebungsvariablen, Anweisungen und Schlüsselwörter.
Nichtproportionalschrift fett
Stellt Befehle oder anderen Text dar, der wortwörtlich vom Benutzer eingetippt werden sollte.
Nichtproportionalschrift kursiv
Zeigt Text, der durch Werte ersetzt werden soll, die der Benutzer vorgibt oder die sich aus dem Kontext ergeben.
Dieses Symbol kennzeichnet einen Tipp oder Vorschlag.
Hinter diesem Symbol verbirgt sich eine allgemeine Bemerkung.
Dieses Element symbolisiert einen Warnhinweis.
Sie finden die Daten und dazugehöriges Material für jedes Kapitel im GitHub-Repository dieses Buchs unter http://github.com/wesm/pydata-book, auch gespiegelt nach https://gitee.com/wesmckinn/pydata-book, falls Sie keinen Zugriff auf GitHub haben.
Das Buch soll Ihnen bei Ihrer Arbeit helfen. Ganz allgemein gilt: Wenn in diesem Buch Beispielcode angeboten wird, können Sie ihn in Ihren Programmen und Dokumentationen verwenden. Sie müssen sich dafür nicht unsere Erlaubnis einholen, es sei denn, Sie reproduzieren einen großen Teil des Codes. Schreiben Sie zum Beispiel ein Programm, das mehrere Teile des Codes aus diesem Buch benutzt, brauchen Sie keine Erlaubnis. Verkaufen oder vertreiben Sie Beispiele aus O’Reilly-Büchern, brauchen Sie eine Erlaubnis. Beantworten Sie eine Frage, indem Sie dieses Buch und Beispielcode daraus zitieren, brauchen Sie keine Erlaubnis. Binden Sie einen großen Anteil des Beispielcodes aus diesem Buch in die Dokumentation Ihres Produkts ein, brauchen Sie eine Erlaubnis.
Wir freuen uns über eine Erwähnung, verlangen sie aber nicht. Eine Erwähnung enthält üblicherweise Titel, Autor, Verlag und ISBN, zum Beispiel: »Datenanalyse mit Python von Wes McKinney, O’Reilly 2023, ISBN 978-3-96009-211-7.«
Falls Sie befürchten, zu viele Codebeispiele zu verwenden oder die oben genannten Befugnisse zu überschreiten, kontaktieren Sie uns unter [email protected].
Dieses Werk ist das Produkt aus vielen Jahren der Zusammenarbeit und Hilfe sowie fruchtbarer Diskussionen mit und von Menschen auf der ganzen Welt. Ich möchte einigen von ihnen danken.
Unser lieber Freund und Kollege John D. Hunter verstarb am 28. August 2012 an Darmkrebs. Erst kurz zuvor hatte ich das Manuskript für die erste Auflage dieses Buchs fertiggestellt.
Man kann Johns Einfluss und Vermächtnis in der wissenschaftlichen Python-Gemeinde nicht hoch genug einschätzen. Er entwickelte nicht nur matplotlib Anfang der 2000er-Jahre (in einer Zeit, als Python nicht annähernd so beliebt war), sondern war auch an der Herausbildung der Kultur einer wichtigen Generation von Open-Source-Entwicklern beteiligt, die zu den Säulen des Python-Ökosystems gehören, das wir heute oft als so selbstverständlich hinnehmen.
Ich hatte das Glück, John zu Beginn meiner Open-Source-Karriere im Januar 2010 kennenzulernen, gerade als pandas 0.1 herausgekommen war. Seine Inspiration und seine Unterstützung halfen mir selbst in den düstersten Zeiten, meine Vision von pandas und Python als erstklassige Datenanalysesprache voranzutreiben.
John stand Fernando Pérez und Brian Granger sehr nahe, die IPython, Jupyter und vielen anderen Initiativen in der Python-Gemeinde den Weg bereiteten. Wir vier hatten gehofft, gemeinsam an einem Buch zu arbeiten, doch am Ende war ich derjenige mit der meisten freien Zeit. Ich bin mir sicher, er wäre stolz auf das gewesen, was wir einzeln und als Gemeinschaft im Laufe der letzten fünf Jahre erreicht haben.
Vor mehr als zehn Jahren habe ich mit dem Schreiben der ersten Auflage dieses Buchs begonnen, und vor mehr als 15 Jahren begann meine Reise als Python-Programmierer. Seitdem hat sich viel geändert! Python hat sich von einer relativen Nischensprache für die Datenanalyse zur beliebtesten und am weitesten verbreiteten Sprache entwickelt, die die Mehrzahl (wenn nicht sogar die Mehrheit!) der Arbeiten in den Bereichen Data Science, maschinelles Lernen und künstliche Intelligenz unterstützt.
Ich habe seit 2013 nicht mehr aktiv zum Open-Source-Projekt pandas beigetragen, aber seine weltweite Gemeinschaft ist weiter gewachsen und kann als Modell einer Community-getriebenen Open-Source-Softwareentwicklung dienen. Viele »Next Generation«-Python-Projekte, die mit Tabellendaten arbeiten, modellieren ihre Benutzeroberflächen direkt nach pandas, was zeigt, dass das Projekt einen beständigen Einfluss auf die Entwicklung des Python-Ökosystems der Data Science besitzt.
Ich hoffe, dieses Buch kann weiterhin als wertvolle Quelle für Studierende und viele andere Personen dienen, die daran interessiert sind, etwas zum Arbeiten mit Daten in Python zu lernen.
Besonders dankbar bin ich O’Reilly, dass ich eine »Open Access«-Version dieses Buchs auf meiner Website unter https://wesmckinney.com/book bereitstellen kann, sodass hoffentlich noch mehr Menschen erreicht werden können und ihnen dabei geholfen wird, besser in die Welt der Datenanalyse einzusteigen. J. J. Allaire war dabei unverzichtbar, er half mir, das Buch von Docbook XML nach Quarto (https://quarto.org) zu portieren – einem neuen und wunderbaren Publishing-System (Druck und Web) für Wissenschaft und Technik.
Vielen Dank auch an meine Fachkorrektoren Paul Barry, Jean-Christophe Leyder, Abdullah Karasan und William Jamir, deren umfassendes Feedback die Lesbarkeit, Klarheit und Verständlichkeit dieses Buchs deutlich verbessert hat.
Es sind fast auf den Tag genau fünf Jahre vergangen, seit ich im Juli 2012 das Manuskript für die erste Auflage dieses Buchs beendet habe. Eine Menge hat sich geändert. Die Python-Gemeinde ist unglaublich gewachsen, und das sie umgebende Ökosystem der Open-Source-Software gedeiht.
Diese neue Auflage des Buchs hätte es ohne die unablässigen Bemühungen der pandas-Entwickler nicht gegeben, die das Projekt und seine Gemeinschaft zu einem der Eckpfeiler des Python-Data-Science-Ökosystems gemacht haben. Zu ihnen gehören unter anderem Tom Augspurger, Joris Van den Bossche, Chris Bartak, Phillip Cloud, gfyoung, Andy Hayden, Masaaki Horikoshi, Stephan Hoyer, Adam Klein, Wouter Overmeire, Jeff Reback, Chang She, Skipper Seabold, Jeff Tratner und y-p.
Für ihre Hilfe und Geduld beim Schreiben dieser zweiten Auflage möchte ich den O’Reilly-Mitarbeitern danken: Marie Beaugureau, Ben Lorica und Colleen Toporek. Ihr technisches Expertenwissen brachten Tom Augspurger, Paul Barry, Hugh Brown, Jonathan Coe und Andreas Müller ein. Danke schön.
Die erste Auflage dieses Buchs wurde in viele Sprachen übersetzt, darunter Chinesisch, Französisch, Deutsch, Japanisch, Koreanisch und Russisch. Das Übersetzen des Inhalts, der dadurch einem viel breiteren Publikum zugänglich wird, ist eine gigantische und oft undankbare Aufgabe. Ich danke den Übersetzern, dass sie Menschen auf der ganzen Welt helfen, das Programmieren und die Benutzung von Datenanalysewerkzeugen zu erlernen.
Ich hatte außerdem das Glück, dass mich Cloudera und Two Sigma Investments in den letzten Jahren bei meinen Open-Source-Entwicklungsarbeiten unterstützt haben. Oft sind Open-Source-Projekte trotz einer nicht unbeträchtlichen Benutzerbasis äußerst armselig mit Ressourcen ausgestattet. Deshalb wird es immer wichtiger – und ist auch das einzig Richtige –, dass Unternehmen die Entwicklung von wichtigen Open-Source-Projekten unterstützen.
Dieses Buch hätte ich ohne die Unterstützung vieler Menschen niemals schreiben können.
Unter den O’Reilly-Mitarbeitern bin ich meinen Lektorinnen Meghan Blanchette und Julie Steele unheimlich dankbar, die mich durch den Prozess begleitet haben. Mike Loukides arbeitete mit mir während der Entwurfsphase zusammen und half mir, das Buch real werden zu lassen.
Viele Menschen haben mich als technische Gutachter unterstützt. Besonders danken möchte ich Martin Blais und Hugh Brown für ihre Hilfe bei den Beispielen für dieses Buch, bei der Übersichtlichkeit und beim Aufbau. James Long, Drew Conway, Fernando Pérez, Brian Granger, Thomas Kluyver, Adam Klein, Josh Klein, Chang She und Stéfan van der Walt haben jeweils ein oder mehrere Kapitel begutachtet, umfangreich kritisiert und von vielen verschiedenen Gesichtspunkten aus beleuchtet.
Diverse großartige Ideen für Beispiele und Datensätze kamen von Freunden und Kollegen in der Datencommunity, darunter Mike Dewar, Jeff Hammerbacher, James Johndrow, Kristian Lum, Adam Klein, Hilary Mason, Chang She und Ashley Williams.
Ich stehe natürlich in der Schuld zahlreicher Pioniere in der wissenschaftlichen Open-Source-Python-Community. Sie haben mir geholfen, das Fundament meiner Entwicklungsarbeit zu legen, und mich beim Schreiben dieses Buchs ermutigt: das IPython-Kernteam (Fernando Pérez, Brian Granger, Min Ragan-Kelly, Thomas Kluyver und andere), John Hunter, Skipper Seabold, Travis Oliphant, Peter Wang, Eric Jones, Robert Kern, Josef Perktold, Francesc Alted, Chris Fonnesbeck und viele weitere, die hier nicht erwähnt werden können. Verschiedene Menschen gaben mir darüber hinaus ihre Unterstützung sowie Ideen und Ermutigung: Drew Conway, Sean Taylor, Giuseppe Paleologo, Jared Lander, David Epstein, John Krowas, Joshua Bloom, Den Pilsworth, John Myles-White und viele andere, die ich vergessen habe.
Ich möchte außerdem einer Reihe von Menschen aus meinen Lehrjahren danken. Zuallererst danke ich meinen früheren Kollegen bei AQR, die mich über die Jahre bei meiner Arbeit an pandas angefeuert haben: Alex Reyfman, Michael Wong, Tim Sargen, Oktay Kurbanov, Matthew Tschantz, Roni Israelov, Michael Katz, Aris Levine, Chris Uga, Prasad Ramanan, Ted Square und Hoon Kim. Und schließlich danke ich meinen akademischen Lehrmeistern Haynes Miller (MIT) und Mike West (Duke University).
Eine Menge Hilfe bekam ich im Jahr 2014 von Phillip Cloud und Joris Van den Bossche beim Aktualisieren der Codebeispiele in diesem Buch und beim Beheben einiger anderer Ungenauigkeiten, die Änderungen in pandas geschuldet waren.
Auf persönlicher Ebene danke ich Casey, die meinen tagtäglichen Schreibprozess unterstützte und meine Höhen und Tiefen tolerierte, als ich trotz eines überfüllten Terminplans den endgültigen Entwurf zusammenschrieb. Meine Eltern schließlich lehrten mich, immer meinen Träumen zu folgen und mich nie mit weniger zufriedenzugeben.
Dieses Buch befasst sich mit dem Manipulieren, Verarbeiten, Sortieren und Komprimieren von Daten in Python. Mein Ziel ist es, einen Wegweiser zu den Teilen der Programmiersprache Python und ihrem datenorientierten Bibliothekssystem zu bieten, die Ihnen helfen, zu einem effektiven Datenanalytiker zu werden. Auch wenn das Wort »Datenanalyse« im Titel dieses Buchs auftaucht, liegt der Fokus eher auf der Python-Programmierung, seinen Bibliotheken und Tools als auf einer Methodologie zur Datenanalyse. Es ist die Python-Programmierung, die sie für die Datenanalyse brauchen.
Dieses Buch wurde erstmals 2012 veröffentlicht. Später begannen die Leute damit, Data Science als Oberbegriff für alles, von einfachen, deskriptiven Statistiken bis hin zu ausgefeilteren statistischen Analysen und maschinellem Lernen, zu verwenden. Das Python-Open-Source-Ökosystem für Datenanalyse (oder Data Science) hat sich seitdem auch deutlich vergrößert. Es gibt jetzt viele weitere Bücher, deren Fokus spezifisch auf diesen fortgeschritteneren Methodiken liegt. Ich hoffe, dass dieses Buch als adäquate Vorbereitung dient, nach der Sie sich den domänenspezifischeren Quellen zuwenden können.
Manche mögen einen Großteil dieses Buchs eher dem Bereich der »Datenverarbeitung« statt der »Datenanalyse« zuordnen. Wir verwenden dafür im Englischen auch gern die Begriffe Wrangling oder Munging.
Was meine ich, wenn ich von »Daten« spreche? Der hauptsächliche Fokus liegt auf strukturierten Daten, einem bewusst vage gehaltenen Begriff, der viele verschiedene verbreitete Formen von Daten umfasst, wie etwa:
Tabellarische oder in Spreadsheets angeordnete Daten, in denen jede Spalte einen anderen Typ aufweisen könnte (Strings, numerische, kalendarische Daten oder andere). Dies schließt die meisten Datenarten ein, die üblicherweise in relationalen Datenbanken oder in tabulator- oder kommaseparierten Textdateien gespeichert werden.
Mehrdimensionale Arrays (Matrizen).
Mehrere Tabellen mit Daten, untereinander verbunden durch Schlüsselspalten (entspricht den in SQL geläufigen Primär- und Fremdschlüsseln).
Zeitreihen mit festen oder variablen Intervallen.
Diese Liste ist keinesfalls vollständig. Auch wenn es nicht immer offensichtlich ist, kann ein großer Prozentsatz an Datensätzen in eine strukturierte Form umgewandelt werden, die sich besser für die Analyse und Modellierung eignet. Falls das nicht möglich ist, kann man möglicherweise Features aus den Datensätzen extrahieren und sie in eine strukturierte Form bringen. Beispielsweise könnte man eine Sammlung von Zeitungsartikeln zu einer Worthäufigkeitstabelle verarbeiten, mit der sich eine Stimmungsanalyse durchführen ließe.
Den meisten Benutzern von Tabellenverarbeitungsprogrammen wie Microsoft Excel, dem vielleicht am weitesten verbreiteten Datenanalysetool, sind diese Arten von Daten nicht fremd.
Für viele Menschen ist die Programmiersprache Python ausgesprochen reizvoll. Seit ihrem ersten Erscheinen im Jahr 1991 ist Python neben Perl, Ruby und anderen zu einer der beliebtesten interpretierten Programmiersprachen geworden. Die Beliebtheit von Python und Ruby hat besonders seit 2005 stark zugenommen, weil sich darin Webseiten bauen lassen – nicht zuletzt dank ihrer zahllosen Webframeworks wie Rails (Ruby) und Django (Python). Solche Sprachen werden oft als Skriptsprachen bezeichnet, weil sich mit ihnen schnell kleine Programme oder Skripte schreiben lassen, um Aufgaben zu automatisieren. Ich persönlich mag den Begriff »Skriptsprachen« nicht, da er den Beigeschmack hinterlässt, dass damit keine ernsthafte Software herzustellen ist. Unter den interpretierten Sprachen hat sich um Python herum aus verschiedenen historischen und kulturellen Gründen eine große und aktive wissenschaftliche und Datenanalysecommunity entwickelt. In den letzten 20 Jahren ist aus der Sprache Python, die man »auf eigene Gefahr« einsetzt, eine der wichtigsten Sprachen für die Datenwissenschaft, das maschinelle Lernen bzw. Machine Learning und die allgemeine Softwareentwicklung im akademischen und industriellen Bereich geworden.
Im Bereich der Datenanalyse und des interaktiven Computings sowie der Datenvisualisierung wird Python zwangsläufig mit anderen weitverbreiteten Programmiersprachen und Tools, sowohl Open Source als auch kommerzieller Art, wie R, MATLAB, SAS, Stata und anderen verglichen. In den letzten Jahren haben Pythons verbesserte Open-Source-Bibliotheken (wie etwa pandas und scikit-learn) es zu einer beliebten Alternative für Datenanalyseaufgaben werden lassen. In Kombination mit seiner Stärke als Mehrzweckprogrammiersprache ist Python eine ausgezeichnete Wahl für datenzentrierte Anwendungen.
Zum Erfolg von Python in der wissenschaftlichen Datenverarbeitung hat auch beigetragen, wie leicht sich C-, C++- und Fortran-Code integrieren lassen. Die meisten modernen Rechenumgebungen teilen einen ähnlichen Grundstock von ererbten Fortran- und C-Bibliotheken, die für lineare Algebra, Optimierung, Integration, schnelle Fourier-Transformation und weitere Algorithmen genutzt werden können. Das Gleiche ist der Fall in vielen Unternehmen und staatlichen Labors. Auch sie nutzen Python, um die Altsoftware der letzten Jahrzehnte miteinander zu verknüpfen.
Diverse Programme bestehen aus kleinen Codeteilen, die häufig ablaufen, während große Mengen an »Kleister-Code« nicht oft benutzt werden. In vielen Fällen fällt dessen Rechenzeit kaum ins Gewicht; man sollte sich daher besser um die Optimierung der programmtechnischen Flaschenhälse kümmern, wie etwa um das Umsetzen des Codes in eine maschinennahe Sprache wie C.
In vielen Unternehmen ist es üblich, zum Forschen, Experimentieren und Testen neuer Ideen eine speziellere Programmiersprache wie etwa SAS oder R zu benutzen und diese Konzepte dann später auf ein größeres Produktionssystem zu übertragen, das in Java, C# oder C++ geschrieben ist. Zunehmend stellt sich nun heraus, dass sich Python nicht nur für das Forschen und das Prototyping eignet, sondern auch zum Herstellen der Produktionssysteme. Wieso sollte man zwei Entwicklungsumgebungen vorhalten, wenn eine ausreicht? Ich glaube, dass immer mehr Unternehmen diesen Weg gehen werden, da es oft beträchtliche organisatorische Vorteile mit sich bringt, wenn sowohl die Forscher als auch die Softwareentwickler die gleichen Programmierwerkzeuge verwenden.
In den vergangenen zehn Jahren gab es ein paar neue Anläufe, das »Zwei-Sprachen-Problem« zu lösen, etwa in Form der Programmiersprache Julia. Um aus Python so viel wie möglich herauszuholen, muss man in vielen Fällen in einer Low-Level-Programmiersprache wie C oder C++ programmieren und dann Python-Bindings zu diesem Code erstellen. Daher hat die »Just-in-Time«-(JIT-)Compiler-Technologie von Bibliotheken wie Numba eine Möglichkeit geschaffen, für viele Rechenalgorithmen eine ausgezeichnete Performance zu erreichen, ohne die Programmierumgebung von Python verlassen zu müssen.
Obwohl Python eine ausgezeichnete Umgebung zum Erstellen vieler Arten analytischer Anwendungen und universeller Systeme ist, gibt es eine Reihe von Einsatzgebieten, für die es sich weniger eignet.
Python ist eine interpretierte Programmiersprache. Das heißt, im Allgemeinen läuft der meiste Python-Code deutlich langsamer als Code, der in einer kompilierten Sprache wie Java oder C++ geschrieben wurde. Da Programmierzeit oft wertvoller ist als Rechenzeit, gehen viele gern diesen Kompromiss ein. In einer Anwendung mit sehr niedrigen Latenzzeiten oder hohen Anforderungen an die Ressourcen (wie etwa in einem stark beanspruchten Handelssystem) dürfte die Zeit, die für das Programmieren in einer maschinennahen Sprache wie C++ aufgewandt wird, um eine maximal mögliche Produktivität zu erzielen, gut investiert sein.
Python ist nicht die ideale Wahl für hochparallele Multithread-Anwendungen, speziell Anwendungen mit vielen CPU-abhängigen Threads. Der Grund dafür ist das, was man als Global Interpreter Lock (GIL) bezeichnet, ein Mechanismus, der den Interpreter daran hindert, mehr als eine Python-Anweisung gleichzeitig auszuführen. Die technischen Gründe für die Existenz des GIL zu erklären, würde den Rahmen dieses Buchs sprengen. Zwar stimmt es, dass in vielen Anwendungen zur Verarbeitung von Big Data ein Cluster aus Computern nötig ist, um einen Datensatz in einer vernünftigen Zeit verarbeiten zu können, aber dennoch gibt es Situationen, in denen ein einzelner Prozess mit mehreren Threads wünschenswert ist.
Das soll jetzt nicht heißen, dass Python nicht in der Lage dazu wäre, echt parallelen multithreaded Code auszuführen. Python-C-Erweiterungen, die natives Multithreading (in C oder C++) einsetzen, können Code parallel ausführen, ohne durch das GIL beeinträchtigt zu werden, solange sie nicht regelmäßig mit Python-Objekten interagieren müssen.
Für diejenigen, die weniger vertraut sind mit dem Python-Ökosystem und den Bibliotheken, die in diesem Buch verwendet werden, möchte ich hier einen kurzen Überblick über einige von ihnen bieten.
NumPy (http://numpy.org), kurz für Numerical Python, ist schon lange einer der Eckpfeiler des wissenschaftlichen Programmierens in Python. Es bietet die Datenstrukturen, Algorithmen und den Bibliothekskleister, der für die meisten wissenschaftlichen Anwendungen nötig ist, die in Python numerische Daten verarbeiten. NumPy enthält unter anderem folgende Dinge:
Ein schnelles und effizientes mehrdimensionales Array-Objekt namens
ndarray
.
Funktionen zum Durchführen von elementweisen Berechnungen mit Arrays oder mathematischen Operationen zwischen Arrays.
Werkzeuge zum Lesen und Schreiben von Array-basierten Datenmengen auf Datenträger.
Lineare Algebra-Operationen, Fourier-Transformationen und Zufallszahlengeneratoren.
Eine ausgereifte C-API, die Python-Erweiterungen und nativen C- oder C++-Code aktiviert, die auf die Datenstrukturen und Rechenfähigkeiten von NumPy zugreifen können.
NumPy erweitert Python nicht nur um die Fähigkeit, Arrays zu verarbeiten. Ein Hauptzweck in der Datenanalyse besteht in seinem Einsatz als Container für die Daten, die zwischen Algorithmen und Bibliotheken hin- und hergereicht werden. Für numerische Daten sind NumPy-Arrays effizienter in der Speicherung und Manipulation von Daten als andere in Python integrierte Datenstrukturen. Außerdem können Bibliotheken, die in einer maschinennäheren Sprache wie etwa C oder Fortran geschrieben sind, direkt auf den Daten in einem NumPy-Array operieren, ohne sie zuvor in eine andere Speicherform kopieren zu müssen. Das bedeutet, viele numerische Berechnungswerkzeuge für Python erkennen NumPy-Arrays entweder als primäre Datenstruktur an oder arbeiten zumindest nahtlos mit NumPy zusammen.
pandas (http://pandas.pydata.org) bietet umfangreiche Datenstrukturen und Funktionen für ein intuitives und flexibles Arbeiten mit strukturierten oder tabellarischen Daten. Seit seinem Auftauchen im Jahr 2010 hat es dazu beigetragen, aus Python eine starke und produktive Datenanalyseumgebung zu machen. Die pandas-Objekte, die in diesem Buch hauptsächlich benutzt werden, sind DataFrame, eine tabellenförmige, spaltenorientierte Datenstruktur mit Titeln für Zeilen und Spalten, und Series, ein eindimensionales Array-Objekt, ebenfalls mit Titel.
pandas kombiniert die Arrays aus NumPy mit der flexiblen Datenmanipulation von Spreadsheets und relationalen Datenbanken (wie etwa SQL). Es bietet eine praktische Indizierung, wodurch man die Daten einfach umgestalten, zurechtschneiden und zusammenfassen sowie Teilmengen von Daten auswählen kann. Da die Datenmanipulation, -vorbereitung und -bereinigung eine so wichtige Fähigkeit der Datenanalyse ist, befindet sich pandas ganz besonders im Fokus dieses Buchs.
Einige Hintergrundinformationen: Ich begann Anfang 2008 mit der Entwicklung von pandas, als ich bei AQR Capital Management arbeitete, einem Finanzdienstleister. Damals hatte ich ganz klare Anforderungen, die kein Tool aus meiner Werkzeugkiste komplett allein erfüllte:
Datenstrukturen mit gekennzeichneten Achsen, die eine automatische oder explizite Datenausrichtung unterstützen – dies verhindert oft auftretende Fehler aufgrund falsch ausgerichteter Daten und das Arbeiten mit unterschiedlich indizierten Daten, die aus unterschiedlichen Quellen stammen.
Integrierte Zeitreihenfunktionalität.
Die gleichen Datenstrukturen behandeln sowohl Zeitreihendaten als auch Nichtzeitreihendaten.
Arithmetische Operationen und Reduktionen, die die Metadaten erhalten.
Flexible Behandlung fehlender Daten.
Merge und andere relationale Operationen, die in beliebten Datenbanken (z.B. SQL-basierten) zu finden sind.
Ich wollte alle diese Dinge gern an einem Ort vereint sehen, vorzugsweise in einer Sprache, die sich gut für die allgemeine Softwareentwicklung eignet. Python schien dafür ein guter Kandidat zu sein, allerdings waren damals noch keine Datenstrukturen und Werkzeuge enthalten, die diese Funktionalität geboten hätten. Da pandas anfangs vor allem zum Lösen von Finanz- und Geschäftsanalyseproblemen dienen sollte, zeichnet es sich vor allem durch seine Zeitreihenfunktionen sowie Werkzeuge für das Arbeiten mit zeitindizierten Daten aus Geschäftsprozessen aus.
Einen Großteil der Jahre 2011 und 2012 verbrachte ich damit, zusammen mit meinen ehemaligen AQR-Kollegen Adam Klein und Chang She pandas in dieser Hinsicht zu erweitern. 2013 zog ich mich aus der täglichen Projektarbeit zurück, und pandas ist seitdem zu einem komplett von der Community verantworteten und gewarteten Projekt geworden – mit mehr als 2.000 Beitragenden auf der ganzen Welt.
Anwender der Sprache R für statistische Berechnungen werden den Begriff DataFrame kennen, da das Objekt nach dem vergleichbaren R-Objekt data.frame benannt wurde. Anders als bei Python sind DataFrames in die Programmiersprache R und seine Standardbibliothek integriert. Dadurch sind viele Features, die man in pandas findet, entweder Teil der R-Kernimplementierung oder werden durch Zusatzpakete zur Verfügung gestellt.
Der Name pandas selbst ist von Panel Data (Paneldaten) abgeleitet, einem Ökonomiebegriff für mehrdimensionale strukturierte Datenmengen, sowie von Python Data Analysis selbst.
matplotlib (http://matplotlib.org) ist die beliebteste Python-Bibliothek zum Zeichnen und für andere zweidimensionale Datenvisualisierungen. Ursprünglich von John D. Hunter geschaffen, wird sie nun von einem großen Entwicklerteam betreut. Sie dient dem Herstellen von Zeichnungen, die sich für eine Veröffentlichung eignen. Es gibt zwar auch andere Visualisierungsbibliotheken für Python-Programmierer, doch matplotlib ist immer noch sehr verbreitet und ziemlich gut in das restliche Ökosystem integriert. Ich denke, sie ist eine gute Wahl als Standardvisualisierungswerkzeug.
Das IPython-Projekt (http://ipython.org) startete 2001 als Nebenprojekt von Fernando Pérez, der einen besseren interaktiven Python-Interpreter herstellen wollte. In den folgenden 20 Jahren wurde es zu einem der wichtigsten Tools im modernen Python-Werkzeugkasten. IPython bietet zwar selbst keine Rechen- oder Datenanalysewerkzeuge, erlaubt Ihnen aufgrund seiner Struktur aber, interaktiv zu arbeiten sowie in der Softwareentwicklung eingesetzt zu werden. Es unterstützt einen Execute-Explore-Workflow anstelle des typischen Edit-Compile-Run-Workflows, den man in vielen anderen Programmiersprachen pflegt. Außerdem bietet es einen integrierten Zugriff auf die Shell und das Dateisystem Ihres Betriebssystems, was in vielen Fällen den manuellen Wechsel zwischen Terminalfenster und Python-Session überflüssig macht. Da die Programmierung zur Datenanalyse zu einem Großteil auf Erkundung (Exploration), Trial-and-Error und Iterationen beruht, kann IPython Ihnen helfen, den Job schneller zu erledigen.
2014 kündigten Fernando und das IPython-Team das Jupyter-Projekt (http://jupyter.org) an, eine breitere Initiative zum Entwickeln interaktiver, sprachunabhängiger Rechenwerkzeuge. Das IPython-Web-Notebook wurde zum Jupyter-Notebook, das jetzt mehr als 40 Programmiersprachen unterstützt. Das IPython-System kann nun als Kernel (ein Programmiersprachenmodus) für die Benutzung von Python mit Jupyter verwendet werden.
IPython selbst ist eine Komponente des viel breiteren Jupyter-Open-Source-Projekts, das eine produktive Umgebung für das interaktive und untersuchende Arbeiten bietet. Sein ältester und einfachster »Modus« ist eine erweiterte Python-Shell, die das Schreiben und Testen von Python-Code sowie die Fehlersuche beschleunigen soll. Die IPython-Shell und die Jupyter-Notebooks eignen sich besonders für die Datenuntersuchung und -visualisierung. Zudem können Sie das IPython-System über Jupyter-Notebooks nutzen.
Mit dem Jupyter-Notebook können Sie darüber hinaus Inhalte in Markdown und HTML erstellen. Sie haben also eine Möglichkeit, mit Auszeichnungen versehende Dokumente mit Code und Text anzulegen.
Ich persönlich benutze IPython und Jupyter fast immer, wenn ich mit Python arbeite, etwa zum Ausführen, Debuggen und Testen von Code.
In den Begleitmaterialien zu diesem Buch auf GitHub (http://github.com/wesm/pydata-book) finden Sie Jupyter-Notebooks mit allen Codebeispielen aus den einzelnen Kapiteln. Haben Sie keinen Zugriff auf GitHub, können Sie den Mirror bei Gitee (https://gitee.com/wesmckinn/pydata-book) ausprobieren.
SciPy (http://scipy.org) ist eine Sammlung von Paketen, die sich mit einer Reihe von grundlegenden Problemfeldern beim wissenschaftlichen Rechnen befassen. Hier ist eine Auswahl der Tools aus den diversen Modulen:
scipy.integrate
Numerische Integrationsroutinen und Lösung von Differenzialgleichungen.
scipy.linalg
Routinen aus der linearen Algebra und Matrixzerlegungen, die den Rahmen von numpy.linalg übersteigen.
scipy.optimize
Funktionsoptimierer (Minimierer) und Algorithmen zur Wurzelbestimmung.
scipy.signal
Werkzeuge zur Signalverarbeitung.
scipy.sparse
Schwach besetzte Matrizen und Löser von schwach besetzten linearen Gleichungssystemen.
scipy.special
Wrapper um SPECFUN, eine FORTRAN-Bibliothek, die viele verschiedene mathematische Funktionen enthält, wie etwa die gamma-Funktion.
scipy.stats
Gewöhnliche stetige und diskrete Wahrscheinlichkeitsverteilungen (Dichtefunktionen, Stichproben, stetige Verteilungsfunktionen), verschiedene statistische Tests und weitere deskriptive Statistik.
Gemeinsam bilden NumPy und SciPy eine relativ vollständige und ausgereifte Rechengrundlage für viele traditionelle wissenschaftliche Rechenanwendungen.
Seit dem Beginn des Projekts im Jahr 2007 ist scikit-learn (http://scikit-learn.org) zum wichtigsten Machine-Learning-Toolkit für Python-Programmierer geworden. Mehr als 2.000 Menschen aus der ganzen Welt haben bereits daran mitgearbeitet. Es enthält Untermodule für Modelle wie:
Klassifizierung: SVM, nächste Nachbarn, Random Forest, logistische Regression usw.
Regression: LASSO, Ridge Regression usw.
Clusteranalyse:
k
-means, Spectral Clustering usw.
Dimensionsreduktion: PCA, Feature Selection, Matrixfaktorisierung usw.
Modellauswahl: Rastersuche, Kreuzvalidierung, Metriken
Vorverarbeitung: Feature-Extraktion, Normalisierung
Gemeinsam mit pandas, statsmodels und IPython hat scikit-learn entscheidend dazu beigetragen, aus Python eine produktive Data-Science-Programmiersprache zu machen. Ich kann zwar keine umfassende Anleitung für scikit-learn in dieses Buch aufnehmen, stelle aber kurz einige seiner Modelle vor und beschreibe, wie man diese zusammen mit anderen Werkzeugen aus diesem Buch einsetzt.
statsmodels (http://statsmodels.org) ist ein statistisches Analysepaket, das aus der Arbeit des Stanford-Statistikprofessors Jonathan Taylor hervorgegangen ist, der eine Reihe von Regressionsanalysemodellen in der Programmiersprache R implementiert hat. Skipper Seabold und Josef Perktold begründeten 2010 offiziell das neue statsmodels-Projekt, das mittlerweile zu einem Projekt mit einer beträchtlichen Nutzer- und Mitarbeiterbasis angewachsen ist. Nathaniel Smith entwickelte das Patsy-Projekt, das ein durch das Formelsystem von R inspiriertes Framework zur Formel- oder Modellspezifikation für statsmodels bietet.
Im Gegensatz zu scikit-learn enthält statsmodels Algorithmen für die klassische (vor allem frequentistische) Statistik und Ökonometrie. Dazu gehören Untermodule wie:
Regressionsmodelle: lineare Regression, generalisierte lineare Modelle, robuste lineare Modelle, lineare Mixed-Effects-Modelle usw.
Varianzanalyse (
Analysis of Variance
, ANOVA)
Zeitreihenanalyse: AR, ARMA, ARIMA, VAR und andere Modelle
nichtparametrische Methoden: Kerndichteschätzung, Kernel-Regression
Visualisierung der Ergebnisse statistischer Modelle
statsmodels konzentriert sich vor allem auf die Inferenzstatistik (schließende Statistik), für die es Unsicherheitsschätzungen und p-Werte für Parameter liefert. scikit-learn ist dagegen eher vorhersageorientiert.
Analog zu scikit-learn werde ich eine kurze Einführung in statsmodels liefern und beschreiben, wie man es mit NumPy und pandas einsetzt.
Es gibt mittlerweile viele weitere Pakete, die sich in einem Buch über Data Science behandeln ließen. Dazu gehören einige der neueren Projekte wie TensorFlow oder PyTorch, die in den Bereichen maschinelles Lernen und künstliche Intelligenz große Verbreitung gefunden haben. Da es andere Bücher gibt, die sich mehr auf diese Projekte konzentrieren, empfehle ich, dieses Buch für die Grundlagen beim Umgang mit Daten in Python zu nutzen, um sich dann fortgeschrittenen Quellen zuzuwenden, die schon mehr Wissen erwarten.
Da jeder Python für unterschiedliche Anwendungen nutzt, gibt es keine eindeutige Regel dafür, wie man es einrichtet und welche Zusatzpakete nötig sind. Viele Leserinnen und Leser haben vermutlich nicht die komplette Python-Entwicklungsumgebung, die man zur Arbeit mit diesem Buch benötigt. Deshalb werde ich hier ausführlich erläutern, wie man es auf den verschiedenen Betriebssystemen installiert. Ich empfehle die Miniconda-Distribution, bei der es sich um eine Minimalinstallation des Paketmanagers Conda handelt, und dazu conda-forge (https://condaforge.org), eine durch die Community betreute Softwaredistribution, die auf Conda basiert. Dieses Buch nutzt Python 3.10, aber wenn es eine neuere Version gibt, können Sie die gern installieren. Sollte diese Anleitung mit der Zeit veraltet sein, können Sie auf meiner Website zum Buch (https://wesmckinney.com/book) vorbeischauen, wo ich versuchen werde, die Installationsanweisungen immer aktuell zu halten.
Um auf Windows loslegen zu können, laden Sie den Miniconda-Installer für die neueste verfügbare Python-Version (aktuell 3.9) von (https://conda.io) herunter. Ich empfehle Ihnen, den Installationsanweisungen für Windows zu folgen, die Sie auf der Conda-Website finden und die sich geändert haben können, seit diese Zeilen geschrieben wurden. Die meisten Anwenderinnen und Anwender werden die 64-Bit-Version nutzen wollen, aber wenn diese nicht auf Ihrem Windows-Rechner läuft, können Sie stattdessen die 32-Bit-Version installieren.
Sollten Sie gefragt werden, ob Sie die Installation nur für sich selbst oder für alle Benutzer auf Ihrem System durchführen wollen, wählen Sie die Option, die für Sie am passendsten ist. Installieren Sie Conda nur für sich, wird das für das Nachvollziehen der Beispiele aus diesem Buch ausreichen. Sie werden auch gefragt werden, ob Sie Miniconda zur Systemumgebungsvariablen PATH hinzufügen wollen. Wählen Sie das aus (was ich normalerweise tue), überschreibt diese Miniconda-Installation eventuell andere Python-Versionen, die Sie installiert haben. Entscheiden Sie sich dagegen, müssen Sie den Shortcut im Startmenü von Windows nutzen, um dieses Miniconda verwenden zu können. Der Name des Eintrags lautet beispielsweise »Anaconda3 (64-bit)«.
Ich gehe davon aus, dass Sie Miniconda nicht Ihrem System-PATH hinzugefügt haben. Um zu prüfen, ob alles korrekt konfiguriert wurde, öffnen Sie im Startmenü den Punkt Anaconda Prompt (Miniconda3) unter Anaconda3 (64-bit). Versuchen Sie dann, den Python-Interpreter durch Eingabe von python zu starten. Sie sollten eine Ausgabe wie die folgende erhalten:
(base) C:\Users\Wes>python
Python 3.9 [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
Sie beenden das Kommandozeilenfenster durch Eintippen des Befehls exit() und Drücken der Enter-Taste.
Unter Linux hängen die genauen Einzelheiten von Ihrer jeweiligen Linux-Fassung ab. Ich beschreibe das Vorgehen hier für Distributionen wie Debian, Ubuntu, Cent-OS und Fedora. Abgesehen von der Installation von Miniconda verläuft das Einrichten ähnlich wie bei macOS. Meist wird man die Datei für den normalen 64-Bit-Installer herunterladen wollen, der für die x86-Architektur gedacht ist (aber eventuell werden in Zukunft mehr Anwender auf aarch64 basierende Systeme nutzen). Der Installer ist ein Shell-Skript, das im Terminal ausgeführt werden muss. Sie haben dann eine Datei, die Miniconda3-latest-Linux-x86_64.sh oder ähnlich heißt. Um sie zu installieren, führen Sie dieses Skript mit der bash-Shell aus:
$ bash Miniconda3-latest-Linux-x86_64.sh
Manche Linux-Distributionen enthalten Versionen aller erforderlichen Python-Pakete (wenn auch manchmal in veralteten Versionen). Sie können mit dem eingebauten Paketmanager installiert werden, etwa mit apt. Ich demonstriere das hier mit Miniconda, weil es sich einfach auf andere Distributionen übertragen und auf die neuesten Versionen aktualisieren lässt.
Sie können auswählen, wo die Miniconda-Dateien abgelegt werden sollen. Ich empfehle Ihnen, die Dateien an der vorgegebenen Stelle in Ihrem Home-Verzeichnis zu installieren – zum Beispiel in /home/$USER/miniconda (natürlich mit Ihrem Benutzernamen).
Der Installer fragt Sie möglicherweise, ob er Ihre Shell-Skripte anpassen soll, damit Miniconda automatisch aktiviert wird. Ich empfehle das (wählen Sie yes), da das sehr praktisch ist.
Starten Sie nach dem Abschluss der Installation einen neuen Terminalprozess und prüfen Sie, ob die neue Miniconda-Installation genutzt wird:
(base) $ python
Python 3.9 | (main) [GCC 10.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
Um die Python-Shell zu verlassen, geben Sie exit() ein und drücken die Enter-Taste, oder Sie drücken Strg-D.
Laden Sie den macOS-Miniconda-Installer herunter, der für auf Apple Silicon basierende macOS-Computer (ab 2020) Miniconda3-4.1.0-latest-arm64.sh oder ähnlich heißen sollte, während der Name für Intel-basierte Macs (bis 2020) Miniconda3-4.1.0-latest-x86_64.shlautet. Öffnen Sie die Terminalanwendung in macOS und starten Sie den Installer (der sich vermutlich in Ihrem Downloads-Verzeichnis befindet) mit bash:
$ bash $HOME/Downloads/Miniconda3-latest-MacOSX-arm64.sh
Wenn der Installer läuft, konfiguriert er Miniconda automatisch in Ihrer Standard-Shell-Umgebung in Ihrem Standard-Shell-Profil. Dieses befindet sich wahrscheinlich unter /Users/$USER/.zshrc. Ich empfehle, das zuzulassen – wenn Sie das nicht tun, müssen Sie in der Dokumentation zu Miniconda nachschauen, um weitermachen zu können.
Um zu prüfen, ob alles funktioniert, starten Sie Python in einem Kommandozeilenfenster (Sie erhalten eine Kommandozeile im Terminalprogramm):
$ python
Python 3.9 (main) [Clang 12.0.1 ] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
Zum Verlassen der Shell drücken Sie Strg-D oder tippen exit() ein und drücken die Enter-Taste.
Nachdem wir Miniconda auf unserem System eingerichtet haben, wollen wir nun die wichtigsten Pakete installieren, die in diesem Buch zum Einsatz kommen. Der erste Schritt ist, conda-forge als Standardpaketkanal zu konfigurieren, indem wir folgende Befehle in einer Shell ausführen:
(base) $ conda config --add channels conda-forge
(base) $ conda config --set channel_priority strict
Jetzt werden wir mit dem Befehl conda create eine neue conda-»Umgebung« erstellen, die Python 3.10 nutzt:
(base) $ conda create -y -n pydata-book python=3.10
Ist die Installation abgeschlossen, aktivieren Sie die Umgebung mit conda activate:
(base) $ conda activate pydata-book
(pydata-book) $
Sie müssen conda activate jedes Mal nutzen, um Ihre Umgebung zu aktivieren, wenn Sie ein neues Terminal öffnen. Informationen zur aktiven conda-Umgebung erhalten Sie jederzeit, wenn Sie im Terminal conda info eingeben.
Jetzt werden wir mit conda install die grundlegenden Pakete installieren, die in diesem Buch zum Einsatz kommen (und ihre Abhängigkeiten):
(pydata-book) $ conda install -y pandas jupyter matplotlib
Wir werden auch noch andere Pakete verwenden, aber die lassen sich später bei Bedarf nachinstallieren. Es gibt zwei Möglichkeiten, Pakete zu installieren: mit conda install und mit pip install. Sie sollten conda install beim Einsatz von Miniconda immer den Vorzug geben, aber manche Pakete stehen nicht über conda zur Verfügung. Schlägt conda install $package_name also fehl, versuchen Sie es mit pip install $package_name.
Wollen Sie alle Pakete installieren, die in diesem Buch eingesetzt werden, können Sie folgenden Befehl nutzen:
conda install lxml beautifulsoup4 html5lib openpyxl \
requests sqlalchemy seaborn scipy statsmodels \
patsy scikit-learn pyarrow pytables numba
Unter Windows verwenden Sie zum Fortführen der Zeile statt des unter Linux und macOS zum Einsatz kommenden \ das Caret ^.
Sie können Pakete mit dem Befehl conda update aktualisieren:
conda update package_name
pip unterstützt außerdem Upgrades mit dem Flag --upgrade:
pip install --upgrade package_name
Im Laufe des Buchs werden Sie mehrfach Gelegenheit haben, diese Befehle auszuprobieren.
Sie können sowohl conda als auch pip nutzen, um Pakete zu installieren, Sie sollten jedoch nicht versuchen, conda-Pakete mit pip zu aktualisieren (oder umgekehrt), da dies zu Umgebungsproblemen führen könnte. Ich empfehle Ihnen, sich so weit wie möglich an conda zu halten und pip nur dann zu verwenden, wenn sich Pakete nicht mit conda install installieren lassen.
Wenn ich nach meiner Standardentwicklungsumgebung gefragt werde, antworte ich fast immer: »IPython sowie ein Texteditor.« Üblicherweise schreibe ich ein Programm, teste es schrittweise und debugge dann jedes Teil in IPython- oder Jupyter-Notebooks. Dazu ist es hilfreich, wenn man interaktiv mit den Daten herumspielen und visuell bestätigen kann, dass die Manipulationen am Datensatz wunschgemäß funktionieren. Bibliotheken wie pandas und NumPy sind extra für den produktiven Einsatz in der Shell vorgesehen.
Manche Nutzer ziehen jedoch eine reich ausgestattete IDE (Integrated Development Environment) den vergleichsweise primitiven Texteditoren wie Emacs oder Vim vor, die ohne weitere Anpassungen nur eine eher minimale Umgebung bieten. Hier sind einige, die Sie einmal ausprobieren könnten:
PyDev (kostenlos), eine IDE, die auf der Eclipse-Plattform aufbaut
PyCharm von JetBrains (für kommerzielle Benutzer abobasiert, für Open-Source-Entwickler kostenlos)
Python Tools für Visual Studio (für Windows-Anwender)
Spyder (kostenlos), eine in Anaconda enthaltene IDE
Komodo IDE (kommerziell)
Aufgrund von Pythons Beliebtheit bieten die meisten Texteditoren, wie VS Code und Sublime Text 2, ausgezeichnete Python-Unterstützung.
Abgesehen von einer Internetsuche sind die Mailinglisten für wissenschaftliches Python im Allgemeinen sehr hilfreich, wenn man Fragen hat. Schauen Sie sich zum Beispiel folgende an:
pydata: eine Google-Groups-Liste für Fragen zu Python für die Datenanalyse und pandas
pystatsmodels: für Fragen zu statsmodels oder pandas
Mailingliste für scikit-learn (
) und Machine Learning in Python ganz allgemein
numpy-discussion: für NumPy-bezogene Fragen
scipy-user: für allgemeine Fragen zu SciPy oder wissenschaftliches Python
Ich habe bewusst keine URLs für diese Listen angegeben, da sich diese ändern könnten. Sie finden sie aber leicht über eine Internetsuche.
Jedes Jahr finden auf der ganzen Welt Konferenzen für Python-Programmierer statt. Wenn Sie andere Python-Programmierer treffen wollen, die Ihre Interessen teilen, sollten Sie nach Möglichkeit eine dieser Konferenzen besuchen. Viele der Konferenzen bieten finanzielle Unterstützung für Teilnehmer, die sich die Gebühren oder die Anreise zur Konferenz nicht leisten können. Hier sind einige, die Sie in Betracht ziehen sollten:
PyCon und EuroPython: die zwei wichtigsten allgemeinen Python-Konferenzen in Nordamerika bzw. Europa
SciPy und EuroSciPy: wissenschaftlich orientierte Konferenzen in Nordamerika bzw. Europa
PyData: eine weltweit stattfindende Serie von Regionalkonferenzen für Datenwissenschaften und Datenanalyse
internationale und regionale PyCon-Konferenzen (siehe (
http://pycon.org
) für eine vollständige Liste)
Falls Sie noch nie in Python programmiert haben, sollten Sie einige Zeit in den Kapiteln 2 und 3 verbringen, wo Sie ein kompaktes Tutorial zu den Eigenschaften der Sprache Python sowie der IPython-Shell und den Jupyter-Notebooks finden. Diese Inhalte sind Voraussetzung für den Rest des Buchs. Sollten Sie dagegen bereits Python-Erfahrung haben, können Sie die Kapitel streifen oder ganz auslassen.
Anschließend liefere ich eine kurze Einführung zu den wichtigsten Eigenschaften und Funktionen von NumPy, hebe mir aber komplexere Anwendungen von NumPy für Anhang A auf. Dann stelle ich pandas vor und widme den Rest des Buchs der Datenanalyse mit pandas, NumPy und matplotlib (für die Visualisierung). Ich habe mich bemüht, das Material so zu strukturieren, dass es nach Möglichkeit aufeinander aufbaut, allerdings kann es zu Überschneidungen zwischen den Kapiteln kommen sowie zu einzelnen Fällen, in denen Konzepte benutzt werden, die noch nicht vorgestellt wurden. Auch wenn Sie als Leser vermutlich unterschiedliche Ziele bei Ihrer Arbeit verfolgen, lassen sich die erforderlichen Aufgaben im Allgemeinen in bestimmte Gruppen unterteilen:
Interaktion mit der Außenwelt
Lesen und Schreiben mit einer Vielzahl von Dateiformaten und Datenbanken.
Vorbereitung
Bereinigen, Aufbereiten, Kombinieren, Normalisieren, Umformen, Schneiden und Transformieren von Daten zur Analyse.
Transformation
Anwenden mathematischer und statistischer Operationen auf Gruppen von Datensätzen zum Ableiten neuer Datensätze (zum Beispiel das Zusammenfassen einer großen Tabelle nach Gruppenvariablen).
Modellierung und Berechnung
Verbinden Ihrer Daten mit statistischen Modellen, Algorithmen für maschinelles Lernen oder anderen Rechenwerkzeugen.
Präsentation
Herstellen interaktiver oder statischer grafischer Visualisierungen oder von Übersichten in Textform.
Die meisten der Codebeispiele in diesem Buch werden mit Ein- und Ausgaben dargestellt, so wie sie auch in der IPython-Shell oder in Jupyter-Notebooks zu sehen sein würden:
In [5]: CODEBEISPIEL
Out[5]: AUSGABE
Bei einem solchen Codebeispiel gehen Sie so vor: Tippen Sie den Beispielcode in den In-Block Ihrer Programmierumgebung ein und führen Sie ihn aus, indem Sie die Enter-Taste (oder Shift-Enter in Jupyter) drücken. Die Ausgabe sollte in etwa so aussehen wie das, was im Out-Block steht.
Ich habe die Standardausgabeeinstellungen in NumPy und pandas geändert, um die Lesbarkeit und Klarheit für das Buch zu verbessern. So sehen Sie beispielsweise bei numerischen Daten mehr Nachkommastellen. Um die Ausgabe aus dem Buch exakt nachzustellen, können Sie folgenden Python-Code ausführen, bevor Sie die Codebeispiele laufen lassen:
Datensätze für die Beispiele in den einzelnen Kapiteln werden in einem GitHub-Repository (http://github.com/wesm/pydata-book) vorgehalten (oder in einem Mirror bei Gitee (https://gitee.com/wesmckinn/pydata-book), wenn Sie keinen Zugriff auf GitHub haben). Sie können diese Daten entweder mithilfe der Versionskontrolle Git auf der Kommandozeile herunterladen, oder Sie holen sich eine Zip-Datei des Repositorys von der Website. Falls Sie Probleme haben, gehen Sie auf meine Website (http://wesmckinney.com/book). Dort finden Sie aktuelle Anweisungen dazu, wie Sie an das Material zum Buch kommen.
Laden Sie eine Zip-Datei mit den Beispieldatensätzen herunter, müssen Sie den Inhalt der Datei vollständig in ein Verzeichnis auspacken und dann im Terminal dorthin navigieren, bevor Sie mit dem Ausführen der Codebeispiele im Buch fortfahren können:
$ pwd
/home/wesm/book-materials
$ ls
appa.ipynb ch05.ipynb ch09.ipynb ch13.ipynb README.md
ch02.ipynb ch06.ipynb ch10.ipynb COPYING requirements.txt
ch03.ipynb ch07.ipynb ch11.ipynb datasets
ch04.ipynb ch08.ipynb ch12.ipynb examples
Ich habe mich bemüht, alles bereitzustellen, was nötig ist, um die Beispiele nachzuvollziehen, aber auch ich mache Fehler oder habe vielleicht etwas vergessen. Sollte das der Fall sein, schicken Sie mir eine E-Mail: [email protected]. Die beste Methode zum Melden von Fehlern ist die Errata-Seite auf der O’Reilly-Website (https://oreil.ly/kmhmQ).
Die Python-Community hat eine Reihe von Namenskonventionen für verbreitete Module entwickelt:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
import statsmodels as sm
Das bedeutet, wenn Sie np.arange sehen, ist das eine Referenz auf die arange-Funktion in NumPy. Dies wird gemacht, weil es in der Softwareentwicklung mit Python als schlechte Angewohnheit gilt, alles aus einem so großen Paket wie NumPy zu importieren (from numpy import *).
Als ich 2011 und 2012 die erste Auflage dieses Buchs verfasste, gab es nur wenige Ressourcen zum Erlernen der Datenanalyse in Python. Teils war dies ein Henne-Ei-Problem; viele Bibliotheken, die wir inzwischen als selbstverständlich ansehen, wie pandas, scikit-learn und statsmodels, waren damals vergleichsweise unausgereift. 2022 gibt es eine immer größer werdende Auswahl an Literatur zu den Themen Datenwissenschaft, Datenanalyse und maschinelles Lernen, die die früheren Arbeiten über das allgemeine wissenschaftliche Rechnen für Informatiker, Physiker und Forscher aus anderen Wissenschaftsfeldern ergänzt. Darüber hinaus gibt es ausgezeichnete Bücher über das Erlernen der Programmiersprache Python selbst und wie man ein guter Programmierer wird.
Da sich dieses Buch als Einführungstext für das Arbeiten mit Daten in Python versteht, denke ich, dass es sinnvoll ist, einen Überblick über die wichtigsten Eigenschaften der in Python enthaltenen Datenstrukturen und Bibliotheken aus Sicht der Datenmanipulation zu geben. Ich werde deshalb in diesem Kapitel sowie in Kapitel 3 gerade ausreichend Informationen bieten, dass Sie in der Lage sind, den Rest des Buchs zu verstehen.
Ein Großteil dieses Buchs konzentriert sich auf die tabellenorientierte Analytik sowie auf die Werkzeuge zum Vorbereiten der Arbeit mit Datenmengen, die klein genug sind, um in Ihren PC zu passen. Damit Sie diese Werkzeuge benutzen können, müssen Sie oft erst ein paar Umbauten vornehmen, um ungeordnete Daten in eine hübschere tabellarische (oder strukturierte) Form zu bringen. Zum Glück eignet sich Python ideal dazu. Je besser Ihre Fähigkeiten im Umgang mit der Sprache Python und ihren eingebauten Datentypen sind, umso einfacher wird es für Sie, neue Datensätze zur Analyse vorzubereiten.
Einige der Werkzeuge in diesem Buch werden am besten in einer tatsächlichen IPython- oder Jupyter-Sitzung erkundet. Sobald Sie gelernt haben, wie Sie IPython und Jupyter starten, sollten Sie die Beispiele nachvollziehen, um unterschiedliche Dinge auszuprobieren. Wie in jeder konsolenartigen Umgebung, die hauptsächlich über die Tastatur bedient wird, gehört es zum Lernen, sich die wichtigsten Befehle anzueignen, um sie quasi automatisch abrufen zu können.
Es gibt einige grundlegende Python-Konzepte, wie Klassen und die objektorientierte Programmierung, die in diesem Kapitel zwar nicht behandelt werden, die bei Ihrem Vorstoß in die Datenanalyse mit Python aber trotzdem nützlich sind.
Um Ihre Kenntnisse in der Sprache Python zu vertiefen, empfehle ich Ihnen als Zusatzmaterial zu diesem Kapitel das offizielle Python-Tutorial (http://docs.python.org) sowie eventuell eines der vielen ausgezeichneten Bücher über die allgemeine Python-Programmierung. Hier einige Empfehlungen für den Einstieg:
Think Python
von Allen B. Downey (O’Reilly)
Python von Kopf bis Fuß
von Paul Barry (O’Reilly)
Fluent Python
von Luciano Ramalho (O’Reilly)
Effektiv Python programmieren
von Brett Slatkin (mitp)
Python ist eine interpretierte Sprache. Der Python-Interpreter führt ein Programm aus, indem er nacheinander die Anweisungen abarbeitet. Der normale interaktive Python-Interpreter kann auf der Kommandozeile mit dem python-Befehl aufgerufen werden:
Die Zeichenfolge >>>, die Sie oben sehen, ist der Prompt, an dem Sie die Codeausdrücke eintippen. Um den Python-Interpreter zu verlassen, können Sie entweder exit() eintippen oder Strg-D drücken (Letzteres funktioniert nur unter Linux und macOS).
Das Ausführen von Python-Programmen ist ganz einfach: Sie rufen python mit einer .py-Datei als erstes Argument auf. Nehmen wir einmal an, wir hätten die Datei hello_world.py mit diesem Inhalt erzeugt:
print("Hello world")
Sie können sie mit dem folgenden Befehl ausführen (die hello_world.py-Datei muss sich in Ihrem aktuellen Arbeitsverzeichnis befinden):
$ python hello_world.py
Hello world
Während einige Python-Programmierer ihren gesamten Python-Code auf diese Weise ausführen, nutzen andere, die Datenanalysen oder wissenschaftliche Berechnungen mit Python erledigen, IPython, einen erweiterten Python-Interpreter, oder Jupyter-Notebooks, webbasierte Code-Notizbücher, die ursprünglich innerhalb des IPython-Projekts entstanden sind. Ich gebe in diesem Kapitel eine Einführung in die Benutzung von IPython und Jupyter und werfe in Anhang A einen genaueren Blick auf die IPython-Funktionalität. Wenn Sie den Befehl %run einsetzen, führt IPython den Code in der angegebenen Datei im selben Prozess aus, wodurch es Ihnen erlaubt ist, die Ergebnisse interaktiv zu untersuchen, sobald es fertig ist:
$ ipython
Python 3.10.4 | packaged by conda-forge | (main, Mar 24 2022, 17:38:57)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.31.1 -- An enhanced Interactive Python. Type '?' for help.
In [1]: %run hello_world.py
Hello world
In [2]:
Der vorgegebene IPython-Prompt wird durchnummeriert (In [2]:), weist also einen anderen Stil auf als der Standardprompt >>>.
In diesem Abschnitt machen wir Sie mit der IPython-Shell und dem Jupyter-Notebook bekannt und stellen Ihnen einige grundlegende Konzepte vor.
Sie können die IPython-Shell genauso auf der Kommandozeile starten wie den normalen Python-Interpreter, allerdings mit dem Befehl ipython:
Zum Ausführen beliebiger Python-Anweisungen tippen Sie diese ein und drücken dann die Enter- bzw. Return-Taste. Wenn Sie nur eine Variable in IPython eingeben, gibt diese eine String-Repräsentation des Objekts aus:
Die ersten beiden Zeilen sind Python-Codeanweisungen; die zweite Anweisung erzeugt eine Variable namens data, die sich auf ein neu angelegtes Python-Dictionary bezieht. Die letzte Zeile gibt den Wert von data auf der Konsole aus.
Viele Arten von Python-Objekten sind formatiert oder pretty-printed, damit sie besser lesbar sind. Das unterscheidet sich von der normalen Funktion print. Hätten Sie die oben gezeigte data-Variable im Standard-Python-Interpreter ausgegeben, wäre das Ganze viel unübersichtlicher:
IPython bringt Hilfsmittel mit, um beliebige Codeblöcke (über das berüchtigte Copy-and-paste, also Kopieren und Einfügen) und ganze Python-Skripte auszuführen. Zum Arbeiten mit größeren Codeblöcken können Sie aber auch das Jupyter-Notebook verwenden, wie wir bald sehen werden.
Eine der wichtigsten Komponenten des Jupyter-Projekts ist das Notebook (Notizbuch), eine Art interaktives Dokument für Code, Text (einschließlich Markup), Datenvisualisierungen und andere Ausgaben. Das Jupyter-Notebook interagiert mit Kernels, bei denen es sich um Implementierungen des interaktiven Rechenprotokolls von Jupyter für eine Reihe von Programmiersprachen handelt. Pythons Jupyter-Kernel nutzt das IPython-System für sein ihm zugrunde liegendes Verhalten.
Um Jupyter zu starten, führen Sie in einem Terminal den Befehl jupyter notebook aus:
$ jupyter notebook
[I 15:20:52.739 NotebookApp] Serving notebooks from local directory:
/home/wesm/code/pydata-book
[I 15:20:52.739 NotebookApp] 0 active kernels
[I 15:20:52.739 NotebookApp] The Jupyter Notebook is running at:
http://localhost:8888/?token=0a77b52fefe52ab83e3c35dff8de121e4bb443a63f2d...
[I 15:20:52.740 NotebookApp] Use Control-C to stop this server and shut down
all kernels (twice to skip confirmation).
Created new window in existing browser session.
To access the notebook, open this file in a browser:
file:///home/wesm/.local/share/jupyter/runtime/nbserver-185259-open.html
Or copy and paste one of these URLs:
http://localhost:8888/?token=0a77b52fefe52ab83e3c35dff8de121e4...
or http://127.0.0.1:8888/?token=0a77b52fefe52ab83e3c35dff8de121e4...
Auf vielen Plattformen öffnet sich Jupyter automatisch in Ihrem Standard-Webbrowser (es sei denn, Sie starten es mit --no-browser). Sie können ansonsten auch zu der HTTP-Adresse gehen, die beim Start des Notizbuchs angegeben wurde, hier also http://local host:8888/?token=0a77b52fefe52ab83e3c35dff8de121e4bb443a63f2d3055. In Abbildung 2-1 sehen Sie, wie das Ganze in Google Chrome aussieht.
Viele Menschen nutzen Jupyter als lokale Arbeitsumgebung. Es kann aber auch auf Server ausgelagert und aus der Ferne zugegriffen werden. Ich werde darauf nicht näher eingehen. Falls es für Sie relevant ist, empfehle ich Ihnen, dieses Thema im Internet zu recherchieren.
Abbildung 2-1: Jupyter-Notebook-Startseite
Um ein neues Notebook anzulegen, klicken Sie auf New und wählen die Option Python 3. Sie sollten auf dem Bildschirm etwas sehen wie das in Abbildung 2-2. Machen Sie dies zum ersten Mal, klicken Sie probehalber einmal auf die leere »Codezelle« und geben eine Zeile Python-Code ein. Zum Ausführen des Codes drücken Sie dann Shift-Enter.
Wenn Sie das Notebook speichern (siehe Save and Checkpoint im File-Menü des Notebooks), wird eine Datei mit der Dateierweiterung .ipynb angelegt. Das ist ein eigenständiges Dateiformat, das den gesamten momentanen Inhalt des Notebooks enthält (einschließlich aller evaluierten Codeausgaben). Dieser kann dann von anderen Jupyter-Benutzern geladen und bearbeitet werden.
Abbildung 2-2: Ein neues Notebook in Jupyter
Um ein offenes Notebook umzubenennen, klicken Sie auf seinen Titel oben auf der Seite, geben den neuen Titel ein und drücken die Enter-Taste.
Um ein vorhandenes Notebook zu laden, kopieren Sie die Datei in das Verzeichnis, aus dem heraus Sie auch den Notebook-Prozess gestartet haben (oder ein Unterverzeichnis davon), und klicken dann auf den Namen in der Startseite. Sie können das mit den Notebooks aus meinem wesm/pydata-book-Repository auf GitHub einmal ausprobieren (siehe Abbildung 2-3).
Abbildung 2-3: Jupyter-Beispiel für ein vorhandenes Notebook
Wollen Sie ein Notebook schließen, klicken Sie auf das File-Menü und wählen Close and Halt. Schließen Sie einfach nur den Browser-Tab, wird der mit dem Notebook verbundene Python-Prozess im Hintergrund weiterlaufen.
Auch wenn sich das Jupyter-Notebook ganz anders anfühlt als die IPython-Shell, können fast alle Befehle und Tools aus diesem Kapitel in beiden Umgebungen benutzt werden.
Oberflächlich betrachtet, scheint die IPython-Shell nur eine anders aussehende Version des normalen Python-Interpreters im Terminal zu sein (der mit python aufgerufen wird). Eine der großen Verbesserungen gegenüber der normalen Python-Shell ist die Befehlsergänzung mit Tab, die es auch in vielen IDEs oder anderen interaktiven Analyseumgebungen gibt. Wenn Sie beim Eingeben von Ausdrücken in die Shell die Tab-Taste drücken, wird der Namensraum nach allen Variablen (Objekten, Funktionen usw.) durchsucht, die den Zeichen entsprechen, die Sie bereits eingegeben haben, und in einem praktischen Drop-down-Menü angezeigt:
Beachten Sie, dass IPython in diesem Beispiel beide von mir definierten Variablen sowie das Python-Schlüsselwort any anzeigt. Natürlich können Sie auch Methoden und Attribute für alle Objekte ergänzen, nachdem Sie einen Punkt eingetippt haben:
Das gilt auch für Module:
In [1]: import datetime
In [2]: datetime.<Tab>
date MAXYEAR timedelta
datetime MINYEAR timezone
datetime_CAPI time tzinfo