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

Datenanalyse mit Python

Auswertung von Daten mit Pandas,
NumPy und IPython

Wes McKinney

Deutsche Übersetzung von Kristian Rother,
Christian Tismer & Kathrin Lichtenberg

Wes McKinney

Lektorat: Alexandra Follenius

Bibliografische Information Der Deutschen Nationalbibliothek

ISBN:

Dieses Buch erscheint in Kooperation mit O’Reilly Media, Inc. unter dem Imprint »O’REILLY«.

2. Auflage

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

Inhalt

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

Vorwort

Neu in der 2. Auflage

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.

Konventionen in diesem Buch

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.

Benutzung von Codebeispielen

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.

Danksagungen

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.

In Memoriam: John D. Hunter (1968–2012)

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.

Danksagungen für die 2. Auflage

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.

Danksagungen für die 1. Auflage

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.

KAPITEL 1

Einleitung

1.1Worum geht es in diesem Buch?

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.

Welche Arten von Daten?

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.

1.2Warum Python für die Datenanalyse?

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.

Python als Kleister

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.

Das »Zwei-Sprachen-Problem« lösen

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.

Warum nicht Python?

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.

1.3Grundlegende Python-Bibliotheken

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

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

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

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.

IPython und Jupyter

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

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.

scikit-learn