Zu diesem Buch – sowie zu vielen weiteren O’Reilly-Büchern – können Sie auch das entsprechende E-Book im PDF-Format herunterladen. Werden Sie dazu einfach Mitglied bei oreilly.plus+: www.oreilly.plus |
2. AUFLAGE
Auswertung von Daten mit Pandas,
NumPy und IPython
Deutsche Übersetzung von Kristian Rother,
Christian Tismer & Kathrin Lichtenberg
Wes McKinney
Lektorat: Alexandra Follenius
Übersetzung: Kristian Rother, Christian Tismer und Kathrin Lichtenberg
Korrektorat: 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:
Print978-3-96009-080-9
PDF 978-3-96010-213-7
ePub 978-3-96010-214-4
mobi 978-3-96010-215-1
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.
2. Auflage
Copyright © 2019 dpunkt.verlag GmbH
Wieblinger Weg 17
69123 Heidelberg
Authorized German translation of the English edition of Python for Data Analysis: Data Wrangling with Pandas, NumPy,and IPython, 2nd Edition, ISBN 978-1-491-95766-0 © 2018 William 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.
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.
Die Informationen in diesem Buch wurden mit größter Sorgfalt erarbeitet. Dennoch können Fehler nicht vollständig ausgeschlossen werden. Verlag, Autoren und Übersetzer übernehmen keine juristische Verantwortung oder irgendeine Haftung für eventuell verbliebene Fehler und deren Folgen.
5 4 3 2 1 0
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
1.4Installation und Einrichtung
Windows
Apple (OS X, macOS)
GNU/Linux
Python-Pakete installieren oder aktualisieren
Python 2 und Python 3
Integrierte Entwicklungsumgebungen (Integrated Development Environments – IDEs) und Texteditoren
1.5Community und Konferenzen
1.6Navigation durch dieses Buch
Codebeispiele
Daten für die Beispiele
Importkonventionen
Jargon
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
Der %run-Befehl
Code aus der Zwischenablage ausführen
Terminal-Tastenkürzel
Über magische Befehle
matplotlib-Integration
2.3Grundlagen der Sprache Python
Sprachsemantik
Skalare Typen
Kontrollfluss
3In Python integrierte Datenstrukturen, Funktionen und Dateien
3.1Datenstrukturen und Sequenzen
Tupel
Listen
Eingebaute Funktionen von Sequenzen
Dictionarys
Set
List, Set und Dict Comprehensions
3.2Funktionen
Namensraum, Gültigkeitsbereich und lokale Funktionen
Mehrere Rückgabewerte
Funktionen sind Objekte
Anonyme oder Lambda-Funktionen
Currying: teilweise Anwendung von Argumenten
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.2Universelle Funktionen: schnelle elementweise Array-Funktionen
4.3Array-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.4Dateiein- und -ausgabe bei Arrays
4.5Lineare Algebra
4.6Erzeugen von Pseudozufallszahlen
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
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 separierten Formaten
JSON-Daten
XML und HTML: Web-Scraping
6.2Binäre Datenformate
Benutzung von HDF5
Lesen von Microsoft Excel-Dateien
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.3Manipulation von Strings
Methoden von String-Objekten
Reguläre Ausdrücke
Vektorisierte String-Funktionen in pandas
7.4Schlussbemerkung
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.1GroupBy-Mechanismen
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.4Pivot-Tabellen und Kreuztabellierung
Kreuztabellen
10.5Schlussbemerkung
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
11.7Funktionen mit gleitenden Fenstern
Exponentiell gewichtete Funktionen
Binäre Funktionen mit gleitendem Fenster
Benutzerdefinierte Funktionen mit gleitenden Fenstern
11.8Schlussbemerkung
12pandas für Fortgeschrittene
12.1Kategorische Daten
Hintergrund und Motivation
Der Typ Categorical in pandas
Berechnungen mit Categoricals
Kategorische Methoden
12.2Erweiterter Einsatz von GroupBy
Gruppentransformationen und »ausgepackte« GroupBys
Gruppiertes Zeit-Resampling
12.3Techniken für die Verkettung von Methoden
Die Methode pipe
12.4Schlussbemerkung
13Einführung in Modellierungsbibliotheken in Python
13.1Die Kopplung zwischen pandas und dem Modellcode
13.2Modellbeschreibungen mit Patsy herstellen
Datentransformationen in Patsy-Formeln
Kategorische Daten und Patsy
13.3Einführung in statsmodels
Lineare Modelle schätzen
Zeitreihenprozesse schätzen
13.4Einführung in scikit-learn
13.5Ihre Ausbildung fortsetzen
14Beispiele aus der Datenanalyse
14.11.USA.gov-Daten von Bitly
Zählen von Zeitzonen in reinem Python
Zeitzonen mit pandas zählen
14.2MovieLens-1M-Datensatz
Messen von Unterschieden in der Bewertung
14.3US-Babynamen von 1880–2010
Namenstrends analysieren
14.4Die USDA-Nahrungsmitteldatenbank
14.5Datenbank des US-Wahlausschusses von 2012
Spendenstatistik nach Beruf und Arbeitgeber
Spenden der Größe nach klassifizieren
Spendenstatistik nach Bundesstaat
14.6Schlussbemerkung
ANumPy für Fortgeschrittene
A.1Interna des ndarray-Objekts
Die dtype-Hierarchie 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 dtypes 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
BMehr zum IPython-System
B.1Die Befehlshistorie benutzen
Die Befehlshistorie durchsuchen und wiederverwenden
Eingabe- und Ausgabevariablen
B.2Mit dem Betriebssystem interagieren
Shell-Befehle und -Aliase
Das Verzeichnis-Bookmark-System
B.3Werkzeuge zur Softwareentwicklung
Interaktiver Debugger
Zeitmessung bei Code: %time und %timeit
Grundlegende Profilierung: %prun and %run -p
Eine Funktion Zeile für Zeile profilieren
B.4Tipps für eine produktive Codeentwicklung mit IPython
Modulabhängigkeiten neu laden
Tipps für das Codedesign
B.5Fortgeschrittene IPython-Funktionen
Ihre eigenen Klassen IPython-freundlich gestalten
Profile und Konfiguration
B.6Schlussbemerkung
Index
Die 1. (englischsprachige) Auflage dieses Buchs wurde 2012 veröffentlicht, als die Open-Source-Bibliotheken zur Datenanalyse mit Python (wie etwa pandas) ganz neu waren und sich rasant weiterentwickelten. In dieser aktualisierten und erweiterten 2. Auflage habe ich die Kapitel überarbeitet, um sowohl den inkompatiblen Änderungen und überholten Teilen als auch den neuen Funktionalitäten Rechnung zu tragen, die sich in den letzten sechs Jahren gezeigt haben. Ich habe außerdem neue Inhalte hinzugefügt, in denen ich Tools vorstelle, die es 2012 noch nicht gab oder die damals noch nicht ausgereift genug waren. Und schließlich habe ich versucht, zu vermeiden, über neue oder topaktuelle Open-Source-Projekte zu schreiben, die bisher noch keine Chance hatten, zu reifen. Ich möchte nämlich, dass diese Auflage für die Leser im Jahr 2020 oder 2021 noch fast genauso relevant ist wie 2019.
Zu den wichtigsten Aktualisierungen in der 2. Auflage gehören:
Außerdem habe ich einen großen Teil des Inhalts der 1. Auflage neu organisiert, um das Buch für Anfänger leichter zugänglich zu machen.
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örendes Material für jedes Kapitel im GitHub-Repository dieses Buchs unter http://github.com/wesm/pydata-book.
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 eine CD-ROM mit Beispielen 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 2019, ISBN 978-3-96009-080-9.«
Falls Sie befürchten, zu viele Codebeispiele zu verwenden oder die oben genannten Befugnisse zu überschreiten, kontaktieren Sie uns unter kommentar@oreilly.de.
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 1. 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 kritischen 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 Anfang meiner Open-Source-Karriere im Januar 2010 kennenzulernen, gerade als pandas 0.1 herausgekommen war. Seine Inspiration und 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.
Es sind fast auf den Tag genau fünf Jahre vergangen, seit ich im Juli 2012 das Manuskript für die 1. 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 2. 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 1. 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ßerdems 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, 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.
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:
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 »Skriptsprache« 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 zehn 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 hat Pythons verbesserte Unterstützung für 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.
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:
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 schnelles, einfaches und ausdrucksstarkes 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 hohe Leistungsfähigkeit bei Arrays in NumPy mit der flexiblen Datenmanipulation von Spreadsheets und relationalen Datenbanken (wie etwa SQL). Es bietet eine ausgefeilte 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:
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.
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 die am weitesten verbreitete und daher ausgesprochen 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 16 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, Ihre Produktivität sowohl im interaktiven Arbeiten als auch in der Softwareentwicklung zu maximieren. 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 einfachen Zugriff auf die Shell und das Dateisystem Ihres Betriebssystems. 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.
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. Auch andere Programmiersprachen haben Kernel für Jupyter implementiert, sodass Sie neben Python noch weitere Sprachen in Jupyter verwenden können.
Ich persönlich benutze IPython fast immer, wenn ich mit Python arbeite, darunter zum Ausführen, Debuggen und Testen von Code.
In den Begleitmaterialien zu diesem Buch (http://github.com/wesm/pydata-book) finden Sie Jupyter-Notebooks mit allen Codebeispielen aus den einzelnen Kapiteln.
SciPy (http://scipy.org) ist eine Sammlung von Paketen, die sich mit einer Reihe von klassischen Problemfeldern beim wissenschaftlichen Rechnen befassen. Hier ist eine Auswahl der Pakete:
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.