Datenanalyse mit Python - Wes McKinney - E-Book

Datenanalyse mit Python E-Book

Wes McKinney

0,0

Beschreibung

Erfahren Sie alles über das Manipulieren, Bereinigen, Verarbeiten und Aufbereiten von Datensätzen mit Python: Aktualisiert auf Python 3.6, 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. Aus dem Inhalt: - Nutzen Sie die IPython-Shell und Jupyter Notebook für das explorative Computing - Lernen Sie Grundfunktionen und fortgeschrittene Features von NumPy kennen - Setzen Sie die Datenanalyse-Tools der pandasBibliothek ein - Verwenden Sie flexible Werkzeuge zum Laden, Bereinigen, Transformieren, Zusammenführen und Umformen von Daten - Erstellen Sie interformative Visualisierungen mit matplotlib - Wenden Sie die GroupBy-Mechanismen von pandas an, um Datensätzen zurechtzuschneiden, umzugestalten und zusammenzufassen - Analysieren und manipulieren Sie verschiedenste Zeitreihen-DatenFür diese aktualisierte 2. Auflage wurde der gesamte Code an Python 3.6 und die neuesten Versionen der pandas-Bibliothek angepasst. Neu in dieser Auflage: Informationen zu fortgeschrittenen pandas-Tools sowie eine kurze Einführung in statsmodels und scikit-learn.

Sie lesen das E-Book in den Legimi-Apps auf:

Android
iOS
von Legimi
zertifizierten E-Readern

Seitenzahl: 609

Das E-Book (TTS) können Sie hören im Abo „Legimi Premium” in Legimi-Apps auf:

Android
iOS



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

Ü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

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:

Der gesamte Code einschließlich des Python-Tutorials wurde an Python 3.6 angepasst (die 1. englischsprachige Auflage benutzte Python 2.7, die 1. deutsche Auflage war für Python 3.4 bearbeitet worden).

Aktualisierte Python-Installationsanweisungen für die Anaconda-Python-Distribution und andere notwendige Python-Pakete.

Updates auf die neuesten Versionen der pandas-Bibliothek aus dem Jahr 2017.

Ein neues Kapitel über einige fortgeschrittene pandas-Tools mit weiteren Anwendungstipps.

Eine kurze Einführung in die Benutzung von statsmodels und scikit-learn.

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 [email protected]

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:

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.

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:

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

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:

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.

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

Seit dem Beginn des Projekts im Jahr 2010 ist scikit-learn (http://scikit-learn.org) zum wichtigsten Machine-Learning-Toolkit für Python-Programmierer geworden. Mehr als 1.500 Menschen aus der ganzen Welt haben in den sieben Jahren 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

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 oder 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 benutzt.

1.4Installation und Einrichtung

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 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 kostenlose Anaconda-Distribution. Als ich das Buch geschrieben habe, gab es Anaconda sowohl mit Python 2.7 als auch mit 3.6. Das kann sich aber irgendwann ändern. Dieses Buch nutzt Python 3.6, verwenden Sie daher ebenfalls diese oder auch eine höhere Version.

Windows

Um auf Windows loslegen zu können, laden Sie den Anaconda-Installer (http://anaconda.com/downloads) herunter. Ich empfehle Ihnen, den Installationsanweisungen für Windows zu folgen, die Sie auf der Anaconda-Downloadseite finden.

Stellen Sie nun sicher, dass alles korrekt konfiguriert ist. Um ein Kommandozeilenfenster zu öffnen, klicken Sie auf das Startmenü und gehen in die Eingabeaufforderung (auch bekannt als cmd.exe). Versuchen Sie, den Python-Interpreter zu starten, indem Sie python eintippen. Sie sollten eine Nachricht sehen, die Ihre soeben installierte Version von Anaconda angibt:

C:\Users\wesm>python

Python 3.5.2 |Anaconda 4.1.1 (64-bit)| (default, Jul 5 2016, 11:41:13)

[MSC v.1900 64 bit (AMD64)] on win32

>>>

Sie beenden das Kommandozeilenfenster mit Strg-Z oder durch Eintippen des Befehls exit() und Drücken der Enter-Taste.

Apple (OS X, macOS)

Laden Sie den OS X-Anaconda-Installer herunter, der Anaconda3-4.1.0-MacOSX-x86_64.pkg oder ähnlich heißen sollte. Doppelklicken Sie zum Starten des Installers auf die .pkg-Datei. Wenn der Installer läuft, hängt er den ausführbaren Anaconda-Pfad automatisch an Ihre .bash_profile-Datei an. Diese befindet sich unter /Users/$USER/.bash_profile.

Um zu prüfen, ob alles funktioniert, starten Sie IPython in einem Kommandozeilenfenster (Sie erhalten eine Kommandozeile im Programm Terminal):

$ ipython

Zum Verlassen der Shell drücken Sie Ctrl-D oder tippen exit() ein und drücken die Enter-Taste.

GNU/Linux

Unter Linux hängen die genauen Einzelheiten von Ihrer jeweiligen Linux-Fassung ab. Ich beschreibe das Vorgehen hier für Distributionen wie Debian, Ubuntu, CentOS und Fedora. Abgesehen von der Installation von Anaconda verläuft das Einrichten ähnlich wie bei macOS. Der Installer ist ein Shell-Skript, das im Terminal ausgeführt werden muss. Je nachdem, ob Sie ein 32-Bit- oder 64-Bit-System haben, müssen Sie entweder den x86-(32-Bit-) oder den x86_64-(64-Bit-)Installer installieren. Sie haben dann eine Datei, die Anaconda3-4.1.0-Linux-x86_64.sh oder ähnlich heißt. Um sie zu installieren, führen Sie dieses Skript mit der bash-Shell aus:

$ bash Anaconda3-4.1.0-Linux-x86_64.sh

Manche Linux-Distributionen enthalten Versionen aller erforderlichen Python-Pakete. Sie können mit dem eingebauten Paketmanager installiert werden, etwa mit apt. Ich demonstriere das hier mit Anaconda, weil es sich einfach auf andere Distributionen übertragen und auf die neuesten Versionen aktualisieren lässt.

Nach dem Akzeptieren der Lizenz können Sie auswählen, wo die Anaconda-Dateien abgelegt werden sollen. Ich empfehle Ihnen, die Dateien an der vorgegebenen Stelle in Ihrem Home-Verzeichnis zu installieren – zum Beispiel /home/$USER/anaconda (natürlich mit Ihrem Benutzernamen).

Der Anaconda-Installer fragt Sie möglicherweise, ob er Ihrer $PATH-Variablen das bin/-Verzeichnis voranstellen soll. Falls Sie nach der Installation irgendwelche Probleme haben, können Sie das auch selbst erledigen. Ändern Sie dazu Ihre .bashrc (oder .zshrc, falls Sie die zsh-Shell benutzen) folgendermaßen:

export PATH=/home/$USER/anaconda/bin:$PATH

Anschließend können Sie entweder einen neuen Terminalprozess starten oder Ihre .bashrc erneut ausführen mit source ~/.bashrc.

Python-Pakete installieren oder aktualisieren

Irgendwann werden Sie beim Lesen dieses Buchs den Wunsch verspüren, Python-Pakete zu installieren, die nicht Teil der Anaconda-Distribution sind. Im Allgemeinen können Sie das mit dem folgenden Befehl erledigen:

conda install package_name

Sollte das nicht funktionieren, hilft Ihnen das pip-Paketverwaltungsprogramm:

pip install package_name

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 benutzen, um Pakete zu installieren, Sie sollten jedoch nicht versuchen, conda-Pakete mit pip zu aktualisieren, da dies zu Umgebungsproblemen führen könnte. Bei der Benutzung von Anaconda oder Miniconda ist es am besten, wenn Sie die Aktualisierung zuerst mit conda versuchen.

Python 2 und Python 3

Die erste Version der Python 3.x-Interpreter-Serie wurde Ende 2008 veröffentlicht. Sie brachte eine Reihe von Änderungen mit sich, die dazu führten, das älterer Python 2.x-Code inkompatibel wurde. Da seit der allerersten Veröffentlichung von Python im Jahr 1991 bereits 17 Jahre vergangen waren, wurde der »Schnitt« durch die Freigabe von Python 3 angesichts der Lehren aus dieser Zeit als positiver Schritt betrachtet.

2012 benutzte ein Großteil der Wissenschafts- und Datenanalysegemeinschaft immer noch Python 2.x, weil viele Pakete noch nicht vollständig kompatibel zu Python 3 waren. Daher setzte die 1. englischsprachige Auflage dieses Buchs ebenfalls auf Python 2.7, für die 1. deutsche Auflage war es auf Python 3.4 überarbeitet worden. Benutzer können nun jedoch frei zwischen Python 2.x und 3.x wählen und genießen im Allgemeinen in beiden Varianten volle Bibliotheksunterstützung.

Allerdings wird Python 2.x ab dem Jahr 2020 nicht mehr weiterentwickelt werden (und das schließt auch wichtige Sicherheitspatches ein). Daher ist es keine gute Idee, neue Projekte in Python 2.7 zu starten. Aus diesem Grund benutzen wir in diesem Buch Python 3.6, eine weitverbreitete, gut unterstützte stabile Version. Wir sind dazu übergegangen, Python 2.x als »Legacy Python« zu bezeichnen, Python 3.x dagegen nennen wir einfach »Python«. Ich rate Ihnen, das ganz einfach genauso zu machen.

Dieses Buch nutzt Python 3.6 als Grundlage. Sie haben vielleicht eine neuere Version, doch die Codebeispiele sollten aufwärtskompatibel sein. In Python 2.7 dagegen könnten manche Codebeispiele anders oder gar nicht funktionieren.

Integrierte Entwicklungsumgebungen (Integrated Development Environments – IDEs) und Texteditoren

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 eine einfache Benutzung in der Shell vorgesehen.

Manche Nutzer ziehen jedoch eine reich ausgestattete IDE den vergleichsweise primitiven Texteditoren wie Emacs oder Vim vor. 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 Atom und Sublime Text 2, ausgezeichnete Python-Unterstützung.

1.5Community und Konferenzen

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 (

[email protected]

) 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)

1.6Navigation durch dieses Buch

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.

Codebeispiele

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.

Daten für die Beispiele

Datasätze für die Beispiele in den einzelnen Kapiteln werden in einem GitHub-Repository (http://github.com/wesm/pydata-book) vorgehalten. 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). Dort finden Sie aktuelle Anweisungen dazu, wie Sie an das Material für das Buch kommen.

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 (http://bit.ly/pyDataAnalysis_errata).

Importkonventionen

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 *).

Jargon

Ich werde ein paar Begriffe aus der Programmierung und der Datenwissenschaft benutzen, die Ihnen vielleicht nicht geläufig sind. Hier sind daher einige kurze Definitionen:

Munge/Munging/Wrangling

Beschreibt den gesamten Prozess des Manipulierens von unstrukturierten und/oder ungeordneten Daten in eine strukturierte oder saubere Form. Die Begriffe werden heute von vielen Datenhackern verwendet. »Munge« reimt sich auf »Grunge«.

Pseudocode

Die Beschreibung eines Algorithmus oder Prozesses, der eine codeartige Form aufweist, auch wenn er eigentlich kein gültiger Quellcode ist.

Syntaktischer Zucker

Programmiersyntax, die keine neue Funktionalität mit sich bringt, die es aber komfortabler oder einfacher macht, etwas zu schreiben.

KAPITEL 2

Grundlagen von Python, IPython und Jupyter-Notebooks

Als ich 2011 und 2012 die 1. 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. 2017 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.

Meiner Meinung nach ist es nicht notwendig, gute Software in Python schreiben zu können, um eine Datenanalyse durchzuführen. Ich empfehle Ihnen, die IPython-Shell und Jupyter-Notebooks zu benutzen, um mit den Codebeispielen zu experimentieren und die Dokumentation der verschiedenen Typen, Funktionen und Methoden zu erkunden. Ich habe mich zwar bemüht, das Material so aufzubereiten, dass es aufeinander aufbaut, aber dennoch könnten Ihnen gelegentlich Dinge begegnen, die noch nicht komplett eingeführt worden sind.

Ein Großteil dieses Buchs konzentriert sich auf die tabellenorientierte Analytik sowie auf die Werkzeuge zum Vorbereiten der Arbeit mit großen Datenmengen. Damit Sie diese Werkzeuge benutzen können, müssen Sie oft erst ein paar Umbauten (Munging) vornehmen, um ungeordnete Daten in eine hübschere tabellarische (oder strukturierte) Form zu bringen. Zum Glück eignet sich Python ideal zum Aufräumen Ihrer Daten. Je besser Ihre Fähigkeiten im Umgang mit der Sprache Python 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:

•Programmieren lernen mit Python, 2. Auflage, von Allen B. Downey (O’Reilly)

•Python von Kopf bis Fuß, 2. Auflage, von Paul Barry (O’Reilly)

•Fluent Python von Luciano Ramalho (O’Reilly)

•Effective Python von Brett Slatkin (Pearson)

2.1Der Python-Interpreter

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 und zum Befehlsprompt zurückzukehren, können Sie entweder exit() eintippen oder Ctrl-D drücken.

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.6.0 | packaged by conda-forge | (default, Jan 13 2017, 23:17:12)

Type "copyright", "credits" or "license" for more information.

IPython 5.1.0 -- An enhanced Interactive Python.

? -> Introduction and overview of IPython's features.

%quickref -> Quick reference.

help -> Python's own help system.

object? -> Details about 'object', use 'object??' for extra details.

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 >>>.

2.2IPython-Grundlagen

In diesem Abschnitt machen wir Sie mit der IPython-Shell und dem Jupyter-Notebook bekannt und stellen Ihnen einige grundlegende Konzepte vor.

Die IPython-Shell ausführen

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.

Das Jupyter-Notebook ausführen

Eine der wichtigsten Komponenten des Jupyter-Projekts ist das Notebook (Notizbuch), eine Art interaktives Dokument für Code, Text (mit oder ohne Auszeichnungen), Datenvisualisierungen und andere Ausgaben. Das Jupyter-Notebook interagiert mit Kernels, bei denen es sich um Implementierungen des interaktiven Rechenprotokolls von Jupyter in einer Vielzahl 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/

[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.

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://localhost:8888/. 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 oder conda [default]. 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.

Abbildung 2-2: Ein neues Notebook in Jupyter

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. 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 doppelklicken 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

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.

Befehlsergänzung mit Tab

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:

Beachten Sie, dass IPython in diesem Beispiel beide von mir definierten Variablen sowie das Python-Schlüsselwort and und die eingebaute Funktion 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>

datetime.date datetime.MAXYEAR datetime.timedelta

datetime.datetime datetime.MINYEAR datetime.timezone

datetime.datetime_CAPI datetime.time datetime.tzinfo

Im Jupyter-Notebook sowie in neueren Versionen von IPython (ab 5.0) zeigen sich die automatischen Ergänzungen in einer Drop-down-Box statt als Textausgabe.

Beachten Sie, dass IPython standardmäßig Methoden und Attribute ausblendet, die mit Unterstrichen beginnen, wie etwa magische Methoden sowie interne »private« Methoden und Attribute. Das verhindert ein Überladen der Anzeige (und das Verwirren eines Neulings). Auch diese können mittels Tabulatoren ergänzt werden, allerdings müssen Sie zuerst einen Unterstrich eintippen, um sie anzuzeigen. Ist es Ihnen lieber, dass diese Methoden bei der Befehlsergänzung mit angezeigt werden, ändern Sie die entsprechende Einstellung in der IPython-Konfiguration. Die IPython-Dokumentation verrät Ihnen, wie das geht.

Die Befehlsergänzung mit Tab funktioniert auch in vielen weiteren Kontexten als dem Durchsuchen des interaktiven Namensraums und dem Ergänzen von Objektoder Modulattributen. Wenn Sie etwas eintippen, das wie ein Dateipfad aussieht (selbst in einem Python-String), wird dies nach dem Drücken der Tab-Taste durch alles aus dem Dateisystem Ihres Computers ergänzt, das der Eingabe entspricht:

In Kombination mit dem Befehl %run (siehe »Der %run-Befehl« auf Seite 26) kann Ihnen diese Funktionalität viel Arbeit beim Tippen ersparen.

Ein anderer Bereich, in dem die Befehlsergänzung Zeit spart, ist die Ergänzung der Keyword-Argumente von Funktionen – inklusive -Zeichen (siehe Abbildung 2-4).

Abbildung 2-4: Automatische Ergänzung von Funktions-Keywords in Jupyter-Notebook

Wir werden in Kürze einen genaueren Blick auf Funktionen werfen.

Introspektion

Setzen Sie ein Fragezeichen (?) vor oder hinter eine Variable, werden Ihnen allgemeine Informationen über das Objekt angezeigt:

Das bezeichnet man als Objektintrospektion. Wenn das Objekt eine Funktion oder Instanzmethode ist, wird deren Dokumentation ebenfalls angezeigt, falls vorhanden. Angenommen, wir hätten folgende Funktion geschrieben (die Sie in IPython oder Jupyter reproduzieren können):

def add_numbers(a, b):

"""

Add two numbers together

Returns

-------

the_sum : type of arguments

"""

return a + b

Dann zeigt uns ? den Docstring:

In [11]: add_numbers?

Signature: add_numbers(a, b)

Docstring:

Add two numbers together

Returns

-------

the_sum : type of arguments

File: <ipython-input-9-6a548a216e27>

Type: function

Gibt man ?? ein, wird, falls möglich, auch noch der Quellcode der Funktion gezeigt:

In [12]: add_numbers??

Signature: add_numbers(a, b)

Source:

def add_numbers(a, b):

"""

Add two numbers together

Returns

-------

the_sum : type of arguments

"""

return a + b

File: <ipython-input-9-6a548a216e27>

Type: function

? hat einen weiteren Verwendungszweck: das Durchsuchen des IPython-Namensraums ähnlich der normalen Unix- oder Windows-Kommandozeile. Eine Anzahl Zeichen, kombiniert mit dem Wildcard-Zeichen *, zeigt alle Namen an, die dem Wildcard-Ausdruck entsprechen. Zum Beispiel könnten wir eine Liste aller Funktionen in der obersten Ebene des NumPy-Namensraums abrufen, die load enthalten:

In [13]: np.*load*?

np.__loader__

np.load

np.loads

np.loadtxt

np.pkgload

Der %run-Befehl

Jede Datei mit dem Befehl %run kann innerhalb der Umgebung Ihrer IPython-Sitzung als Python-Programm ausgeführt werden. Nehmen wir einmal an, Sie haben das folgende einfache Skript in ipython_script_test.py gespeichert:

Sie führen es aus, indem Sie den Dateinamen an %run übergeben:

In [14]: %run ipython_script_test.py

Das Skript wird in einem leeren Namensraum ausgeführt (ohne importierte Module oder definierte Variablen), sodass es sich genau so verhält, als würde das Programm auf der Kommandozeile mit python script.py ausgeführt werden. Alle Variablen (Importe, Funktionen und globale Variablen), die in der Datei definiert sind (und zwar bis zu einem ersten Ausnahmefehler), sind dann in der IPython-Shell zugreifbar:

In [15]: c

Out [15]: 7.5

In [16]: result

Out[16]: 1.4666666666666666

Erwartet ein Python-Skript Kommandozeilenargumente (zu finden in sys.argv), können diese wie beim Ausführen auf der Kommandozeile nach dem Dateipfad angegeben werden.

Falls Sie einem Skript Zugriff auf Variablen geben wollen, die bereits im interaktiven IPython-Namensraum definiert sind, nutzen Sie %run -i anstelle des einfachen %run.

Im Jupyter-Notebook können Sie auch die verwandte magische Funktion %load einsetzen, die ein Skript in eine Codezelle importiert:

Laufenden Code unterbrechen

Wenn Sie Ctrl-C drücken, während irgendwelcher Code läuft – ob ein Skript mit %run oder ein lang laufender Befehl –, wird ein KeyboardInterrupt ausgelöst. Dadurch werden nahezu alle Python-Programme gestoppt. Ausgenommen sind bestimmte ungewöhnliche Fälle.

Hat ein Stück Python-Code kompilierte Erweiterungsmodule aufgerufen, wird die Programmausführung nicht immer sofort durch das Drücken von Ctrl-C gestoppt. In solchen Fällen müssen Sie entweder warten, bis die Kontrolle wieder zurück an den Python-Interpreter geht, oder im schlimmsten Fall den Python-Prozess gewaltsam beenden.

Code aus der Zwischenablage ausführen

Beim Einsatz des Jupyter-Notebooks können Sie Code kopieren und ihn zum Ausführen in eine beliebige Codezelle einfügen. Außerdem ist es möglich, Code aus der Zwischenablage in der IPython-Shell auszuführen. Nehmen Sie einmal an, Sie hätten den folgenden Code in einer anderen Anwendung:

Die sichersten Methoden sind die magischen Funktionen %paste und %cpaste. %paste nimmt den Inhalt der Zwischenablage und führt ihn als einen einzigen Block in der Shell aus:

%cpaste ist ähnlich, stellt aber einen speziellen Prompt bereit, in den Sie den Code einfügen:

Beim %cpaste-Block steht es Ihnen frei, so viel Code einzufügen, wie Sie wollen, bevor Sie ihn ausführen. Sie könnten %cpaste zum Beispiel benutzen, um sich den eingefügten Code anzuschauen, bevor Sie ihn ausführen. Sollten Sie versehentlich den falschen Code eingefügt haben, können Sie die %cpaste-Eingabe mit Ctrl-C abbrechen.