Datenanalyse mit Python - Wes McKinney - E-Book

Datenanalyse mit Python E-Book

Wes McKinney

0,0

Beschreibung

Die erste Adresse für die Analyse von Daten mit Python - Das Standardwerk in der 3. Auflage, aktualisiert auf Python 3.10 und pandas 1.4 - Versorgt Sie mit allen praktischen Details und mit wertvollem Insiderwissen, um Datenanalysen mit Python erfolgreich durchzuführen - Mit Jupyter-Notebooks für alle Codebeispiele aus jedem KapitelErfahren Sie alles über das Manipulieren, Bereinigen, Verarbeiten und Aufbereiten von Datensätzen mit Python: Aktualisiert auf Python 3.10, zeigt Ihnen dieses konsequent praxisbezogene Buch anhand konkreter Fallbeispiele, wie Sie eine Vielzahl von typischen Datenanalyse-Problemen effektiv lösen. Gleichzeitig lernen Sie die neuesten Versionen von pandas, NumPy, IPython und Jupyter kennen. Geschrieben von Wes McKinney, dem Begründer des pandas-Projekts, bietet "Datenanalyse mit Python" einen praktischen Einstieg in die Data-Science-Tools von Python. Das Buch eignet sich sowohl für Datenanalysten, für die Python Neuland ist, als auch für Python-Programmierer, die sich in Data Science und Scientific Computing einarbeiten wollen. Daten und zugehöriges Material des Buchs sind auf GitHub verfügbar.

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

Android
iOS
von Legimi
zertifizierten E-Readern

Seitenzahl: 640

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

Android
iOS
Bewertungen
0,0
0
0
0
0
0
Mehr Informationen
Mehr Informationen
Legimi prüft nicht, ob Rezensionen von Nutzern stammen, die den betreffenden Titel tatsächlich gekauft oder gelesen/gehört haben. Wir entfernen aber gefälschte Rezensionen.

Beliebtheit




Copyright und Urheberrechte:Die durch die dpunkt.verlag GmbH vertriebenen digitalen Inhalte sind urheberrechtlich geschützt. Der Nutzer verpflichtet sich, die Urheberrechte anzuerkennen und einzuhalten. Es werden keine Urheber-, Nutzungs- und sonstigen Schutzrechte an den Inhalten auf den Nutzer übertragen. Der Nutzer ist nur berechtigt, den abgerufenen Inhalt zu eigenen Zwecken zu nutzen. Er ist nicht berechtigt, den Inhalt im Internet, in Intranets, in Extranets oder sonst wie Dritten zur Verwertung zur Verfügung zu stellen. Eine öffentliche Wiedergabe oder sonstige Weiterveröffentlichung und eine gewerbliche Vervielfältigung der Inhalte wird ausdrücklich ausgeschlossen. Der Nutzer darf Urheberrechtsvermerke, Markenzeichen und andere Rechtsvorbehalte im abgerufenen Inhalt nicht entfernen.

3. AUFLAGE

Datenanalyse mit Python

Auswertung von Daten mit pandas,NumPy und Jupyter

Wes McKinney

Übersetzung von Kathrin Lichtenbergund Thomas Demmig

Wes McKinney

Lektorat: Alexandra Follenius

Übersetzung: Kathrin Lichtenberg, Thomas Demmig

Copy-Editing: Sibylle Feldmann, www.richtiger-text.de

Satz: III-satz, www.drei-satz.de

Herstellung: Stefanie Weidner

Umschlaggestaltung: Karen Montgomery, Michael Oréal, www.oreal.de

Bibliografische Information der Deutschen Nationalbibliothek

Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über http://dnb.d-nb.de abrufbar.

ISBN:

Print     978-3-96009-211-7

PDF      978-3-96010-752-1

ePub     978-3-96010-753-8

mobi     978-3-96010-754-5

3. Auflage 2023

Translation Copyright für die deutschsprachige Ausgabe © 2023 dpunkt.verlag GmbH

Wieblinger Weg 17

69123 Heidelberg

Authorized German translation of the English edition of Python for Data Analysis, 3rd Edition, ISBN 9781098104030 © 2022 Wesley McKinney. This translation is published and sold by permission of O’Reilly Media, Inc., which owns or controls all rights to publish and sell the same.

Dieses Buch erscheint in Kooperation mit O’Reilly Media, Inc. unter dem Imprint »O’REILLY«. O’REILLY ist ein Markenzeichen und eine eingetragene Marke von O’Reilly Media, Inc. und wird mit Einwilligung des Eigentümers verwendet.

Schreiben Sie uns:

Falls Sie Anregungen, Wünsche und Kommentare haben, lassen Sie es uns wissen: [email protected].

Die vorliegende Publikation ist urheberrechtlich geschützt. Alle Rechte vorbehalten. Die Verwendung der Texte und Abbildungen, auch auszugsweise, ist ohne die schriftliche Zustimmung des Verlags urheberrechtswidrig und daher strafbar. Dies gilt insbesondere für die Vervielfältigung, Übersetzung oder die Verwendung in elektronischen Systemen.

Es wird darauf hingewiesen, dass die im Buch verwendeten Soft- und Hardware-Bezeichnungen sowie Markennamen und Produktbezeichnungen der jeweiligen Firmen im Allgemeinen warenzeichen-, marken- oder patentrechtlichem Schutz unterliegen.

Alle Angaben und Programme in diesem Buch wurden mit größter Sorgfalt kontrolliert. Weder Autor noch Verlag noch Übersetzer können jedoch für Schäden haftbar gemacht werden, die in Zusammenhang mit der Verwendung dieses Buches stehen.

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

Andere Pakete

1.4Installation und Einrichtung

Miniconda auf Windows

GNU/Linux

Miniconda auf macOS

Python-Pakete installieren oder aktualisieren

Integrierte Entwicklungsumgebungen und Texteditoren

1.5Community und Konferenzen

1.6Navigation durch dieses Buch

Codebeispiele

Daten für die Beispiele

Importkonventionen

2Grundlagen von Python, IPython und Jupyter-Notebooks

2.1Der Python-Interpreter

2.2IPython-Grundlagen

Die IPython-Shell ausführen

Das Jupyter-Notebook ausführen

Befehlsergänzung mit Tab

Introspektion

2.3Grundlagen der Sprache Python

Sprachsemantik

Skalare Typen

Kontrollfluss

2.4Schlussbemerkung

3In Python integrierte Datenstrukturen, Funktionen und Dateien

3.1Datenstrukturen und Sequenzen

Tupel

Listen

Dictionarys

Set

Eingebaute Funktionen von Sequenzen

List, Set und Dictionary Comprehensions

3.2Funktionen

Namensraum, Gültigkeitsbereich und lokale Funktionen

Mehrere Rückgabewerte

Funktionen sind Objekte

Anonyme oder Lambda-Funktionen

Generatoren

Fehler und die Behandlung von Ausnahmen

3.3Dateien und das Betriebssystem

Bytes und Unicode mit Dateien

3.4Schlussbemerkung

4Grundlagen von NumPy: Arrays und vektorisierte Berechnung

4.1Das ndarray von NumPy: ein mehrdimensionales Array-Objekt

ndarrays erzeugen

Datentypen für ndarrays

Rechnen mit NumPy-Arrays

Einfaches Indizieren und Slicing

Boolesches Indizieren

Fancy Indexing

Arrays transponieren und Achsen tauschen

4.2Erzeugen von Pseudozufallszahlen

4.3Universelle Funktionen: schnelle elementweise Array-Funktionen

4.4Array-orientierte Programmierung mit Arrays

Bedingte Logik als Array-Operationen ausdrücken

Mathematische und statistische Methoden

Methoden für boolesche Arrays

Sortieren

Unique und andere Mengenlogik

4.5Dateiein- und -ausgabe bei Arrays

4.6Lineare Algebra

4.7Beispiel: Random Walks

Viele Random Walks auf einmal simulieren

4.8Schlussbemerkung

5Erste Schritte mit pandas

5.1Einführung in die pandas-Datenstrukturen

Series

DataFrame

Indexobjekte

5.2Wesentliche Funktionalität

Neuindizierung

Einträge von einer Achse löschen

Indizierung, Auswahl und Filterung

Fallstricke bei Integer-Indizes

Arithmetik und Datenausrichtung

Funktionsanwendung und Mapping

Sortieren und Rangbildung

Achsenindizes mit duplizierten Labels

5.3Zusammenfassen und Berechnen deskriptiver Statistiken

Korrelation und Kovarianz

Eindeutigkeit, Werteanzahl und Mitgliedschaft

5.4Schlussbemerkung

6Laden und Speichern von Daten sowie Dateiformate

6.1Lesen und Schreiben von Daten im Textformat

Stückweises Lesen von Textdateien

Daten in Textformaten schreiben

Arbeiten mit anderen Formaten

JSON-Daten

XML und HTML: Web-Scraping

6.2Binäre Datenformate

Lesen von Microsoft-Excel-Dateien

Benutzung von HDF5

6.3Interaktion mit Web-APIs

6.4Interaktion mit Datenbanken

6.5Schlussbemerkung

7Daten bereinigen und vorbereiten

7.1Der Umgang mit fehlenden Daten

Fehlende Daten herausfiltern

Fehlende Daten einsetzen

7.2Datentransformation

Duplikate entfernen

Daten mithilfe einer Funktion oder eines Mappings transformieren

Werte ersetzen

Achsenindizes umbenennen

Diskretisierung und Klassifizierung

Erkennen und Filtern von Ausreißern

Permutation und zufällige Stichproben

Berechnen von Indikator-/Platzhaltervariablen

7.3Extension-Datentypen

7.4Manipulation von Strings

Methoden von String-Objekten in Python

Reguläre Ausdrücke

String-Funktionen in pandas

7.5Kategorische Daten

Hintergrund und Motivation

Der Extension-Typ Categorical in pandas

Berechnungen mit Categoricals

Kategorische Methoden

7.6Schlussbemerkung

8Datenaufbereitung: Verknüpfen, Kombinieren und Umformen

8.1Hierarchische Indizierung

Ebenen neu anordnen und sortieren

Zusammenfassende Statistiken nach Ebene

Indizierung mit den Spalten eines DataFrame

8.2Kombinieren und Verknüpfen von Datensätzen

Datenbankartige Verknüpfung von DataFrames

Daten über einen Index verknüpfen

Verketten entlang einer Achse

Überlappende Daten zusammenführen

8.3Umformen und Transponieren

Umformen mit hierarchischer Indizierung

Transponieren vom »langen« zum »breiten« Format

Transponieren vom »breiten« zum »langen« Format

8.4Schlussbemerkung

9Plotten und Visualisieren

9.1Kurze Einführung in die matplotlib-API

Diagramme und Subplots

Farben, Beschriftungen und Linienformen

Skalenstriche, Beschriftungen und Legenden

Annotationen und Zeichnungen in einem Subplot

Diagramme in Dateien abspeichern

Die Konfiguration von matplotlib

9.2Plotten mit pandas und seaborn

Liniendiagramme

Balkendiagramme

Histogramme und Dichteplots

Streu- oder Punktdiagramme

Facettenraster und kategorische Daten

9.3Andere Visualisierungswerkzeuge in Python

9.4Schlussbemerkung

10Aggregation von Daten und Gruppenoperationen

10.1Grundlagen zu Gruppierungsoperationen

Iteration über Gruppen

Auswählen einer Spalte oder einer Teilmenge von Spalten

Gruppieren mit Dictionarys und Series

Gruppieren mit Funktionen

Gruppieren nach Ebenen eines Index

10.2Aggregation von Daten

Spaltenweise und mehrfache Anwendung von Funktionen

Aggregierte Daten ohne Zeilenindizes zurückgeben

10.3Apply: Allgemeine Operationen vom Typ split-apply-combine

Unterdrücken der Gruppenschlüssel

Analyse von Quantilen und Größenklassen

Beispiel: Fehlende Daten mit gruppenspezifischen Werten auffüllen

Beispiel: Zufällige Stichproben und Permutation

Beispiel: Gewichteter Mittelwert für Gruppen und Korrelation

Beispiel: Gruppenweise lineare Regression

10.4Gruppentransformationen und »ausgepackte« GroupBys

10.5Pivot-Tabellen und Kreuztabellierung

Kreuztabellen

10.6Schlussbemerkung

11Zeitreihen

11.1Datentypen und Werkzeuge für Datum und Zeit

Konvertieren zwischen String und datetime

11.2Grundlagen von Zeitreihen

Indizieren, auswählen und Untermengen bilden

Zeitreihen mit doppelten Indizes

11.3Datumsbereiche, Frequenzen und Verschiebungen

Erzeugen von Datumsbereichen

Frequenzen und Offsets von Kalenderdaten

Verschieben von Datumsangaben (Vorlauf und Verzögerung)

11.4Berücksichtigung von Zeitzonen

Lokalisieren und Konvertieren von Zeitzonen

Operationen mit Zeitstempeln bei zugeordneter Zeitzone

Operationen zwischen unterschiedlichen Zeitzonen

11.5Perioden und Arithmetik von Perioden

Umwandlung der Frequenz von Perioden

Quartalsweise Perioden

Zeitstempel zu Perioden konvertieren (und zurück)

Erstellen eines PeriodIndex aus Arrays

11.6Resampling und Konvertieren von Frequenzen

Downsampling

Upsampling und Interpolation

Resampling mit Perioden

Gruppiertes Zeit-Resampling

11.7Funktionen mit gleitenden Fenstern

Exponentiell gewichtete Funktionen

Binäre Funktionen mit gleitendem Fenster

Benutzerdefinierte Funktionen mit gleitenden Fenstern

11.8Schlussbemerkung

12Einführung in Modellierungsbibliotheken in Python

12.1Die Kopplung zwischen pandas und dem Modellcode

12.2Modellbeschreibungen mit Patsy herstellen

Datentransformationen in Patsy-Formeln

Kategorische Daten und Patsy

12.3Einführung in statsmodels

Lineare Modelle schätzen

Zeitreihenprozesse schätzen

12.4Einführung in scikit-learn

12.5Schlussbemerkung

13Beispiele aus der Datenanalyse

13.1Bitly-Daten von 1.USA.gov

Zählen von Zeitzonen in reinem Python

Zeitzonen mit pandas zählen

13.2MovieLens-1M-Datensatz

Messen von Unterschieden in der Bewertung

13.3US-Babynamen von 1880–2010

Namenstrends analysieren

13.4Die USDA-Nahrungsmitteldatenbank

13.5Datenbank des US-Wahlausschusses von 2012

Spendenstatistik nach Beruf und Arbeitgeber

Spenden der Größe nach klassifizieren

Spendenstatistik nach Bundesstaat

13.6Schlussbemerkung

Anhang ANumPy für Fortgeschrittene

A.1Interna des ndarray-Objekts

Die Datentyphierarchie in NumPy

A.2Fortgeschrittene Manipulation von Arrays

Arrays umformen

Anordnung von Arrays in C und FORTRAN

Arrays verketten und aufspalten

Wiederholen von Elementen: tile und repeat

Alternativen zum Fancy Indexing: take und put

A.3Broadcasting

Broadcasting über andere Achsen

Werte von Arrays durch Broadcasting setzen

A.4Fortgeschrittene Nutzung von ufuncs

Instanzmethoden von ufunc

Neue ufuncs in Python schreiben

A.5Strukturierte und Record-Arrays

Geschachtelte Datentypen und mehrdimensionale Felder

Warum sollte man strukturierte Arrays verwenden?

A.6Mehr zum Thema Sortieren

Indirektes Sortieren: argsort und lexsort

Alternative Sortieralgorithmen

Arrays teilweise sortieren

numpy.searchsorted: Elemente in einem sortierten Array finden

A.7Schnelle NumPy-Funktionen mit Numba schreiben

Eigene numpy.ufunc-Objekte mit Numba herstellen

A.8Ein- und Ausgabe von Arrays für Fortgeschrittene

Memory-mapped Dateien

HDF5 und weitere Möglichkeiten zum Speichern von Arrays

A.9Tipps für eine höhere Leistung

Die Bedeutung des zusammenhängenden Speichers

Anhang BMehr zum IPython-System

B.1Tastenkürzel im Terminal

B.2Magische Befehle

Der Befehl %run

Code aus der Zwischenablage ausführen

B.3Die Befehlshistorie benutzen

Die Befehlshistorie durchsuchen und wiederverwenden

Eingabe- und Ausgabevariablen

B.4Mit dem Betriebssystem interagieren

Shell-Befehle und -Aliase

Das Verzeichnis-Bookmark-System

B.5Werkzeuge zur Softwareentwicklung

Interaktiver Debugger

Zeitmessung bei Code: %time und %timeit

Grundlegende Profilierung: %prun and %run -p

Eine Funktion Zeile für Zeile profilieren

B.6Tipps für eine produktive Codeentwicklung mit IPython

Modulabhängigkeiten neu laden

Tipps für das Codedesign

B.7Fortgeschrittene IPython-Funktionen

Profile und Konfiguration

B.8Schlussbemerkung

Index

Vorwort

Die erste (englischsprachige) Auflage dieses Buchs wurde 2012 veröffentlicht, als die Open-Source-Bibliotheken zur Datenanalyse mit Python (insbesondere pandas) ganz neu waren und sich rasant weiterentwickelten. Als es an der Zeit war, 2016/2017 die zweite Auflage zu schreiben, musste ich das Buch nicht nur an Python 3.6 anpassen (in der ersten Auflage kam noch Python 2.7 zum Einsatz), sondern auch den neuen Funktionalitäten Rechnung tragen, die sich in den fünf Jahren dazwischen entwickelt haben. Jetzt ist es 2022, und es gab weniger Änderungen an Python (wir sind aktuell bei Erscheinen dieses Buchs bei Python 3.11), aber pandas hat sich stets weiterentwickelt.

In dieser dritten Auflage ist es mein Ziel, die Inhalte an die aktuellen Versionen von Python, NumPy, pandas und anderen Projekten anzupassen, dabei aber in Bezug auf neuere Python-Projekte aus den letzten paar Jahren eher zurückhaltend vorzugehen. Da dieses Buch für viele Vorlesungen an Universitäten und für Experten in ihrem beruflichen Alltag zu einer wichtigen Quelle geworden ist, möchte ich Themen vermeiden, die eventuell in ein oder zwei Jahren schon wieder unwichtig geworden sind. So sollte sich das Buch auch noch 2023 oder 2024 gut nutzen lassen.

Ein neues Feature der dritten Auflage ist die (englischsprachige) Open-Access-Onlineversion auf meiner Website unter https://wesmckinney.com/book, die als Ressource und praktischer Rückgriff für Besitzer der Papier- oder Digitalversion dieses Buchs dient. Ich plane, den Inhalt dort möglichst aktuell zu halten – wenn Sie also die gedruckte Version dieses Buchs besitzen und über etwas stolpern, das nicht richtig funktioniert, sollten Sie dort nachschauen, ob sich etwas geändert hat.

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öriges Material für jedes Kapitel im GitHub-Repository dieses Buchs unter http://github.com/wesm/pydata-book, auch gespiegelt nach https://gitee.com/wesmckinn/pydata-book, falls Sie keinen Zugriff auf GitHub haben.

Das Buch soll Ihnen bei Ihrer Arbeit helfen. Ganz allgemein gilt: Wenn in diesem Buch Beispielcode angeboten wird, können Sie ihn in Ihren Programmen und Dokumentationen verwenden. Sie müssen sich dafür nicht unsere Erlaubnis einholen, es sei denn, Sie reproduzieren einen großen Teil des Codes. Schreiben Sie zum Beispiel ein Programm, das mehrere Teile des Codes aus diesem Buch benutzt, brauchen Sie keine Erlaubnis. Verkaufen oder vertreiben Sie Beispiele aus O’Reilly-Büchern, brauchen Sie eine Erlaubnis. Beantworten Sie eine Frage, indem Sie dieses Buch und Beispielcode daraus zitieren, brauchen Sie keine Erlaubnis. Binden Sie einen großen Anteil des Beispielcodes aus diesem Buch in die Dokumentation Ihres Produkts ein, brauchen Sie eine Erlaubnis.

Wir freuen uns über eine Erwähnung, verlangen sie aber nicht. Eine Erwähnung enthält üblicherweise Titel, Autor, Verlag und ISBN, zum Beispiel: »Datenanalyse mit Python von Wes McKinney, O’Reilly 2023, ISBN 978-3-96009-211-7.«

Falls Sie befürchten, zu viele Codebeispiele zu verwenden oder die oben genannten Befugnisse zu überschreiten, kontaktieren Sie uns unter [email protected].

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 erste Auflage dieses Buchs fertiggestellt.

Man kann Johns Einfluss und Vermächtnis in der wissenschaftlichen Python-Gemeinde nicht hoch genug einschätzen. Er entwickelte nicht nur matplotlib Anfang der 2000er-Jahre (in einer Zeit, als Python nicht annähernd so beliebt war), sondern war auch an der Herausbildung der Kultur einer wichtigen Generation von Open-Source-Entwicklern beteiligt, die zu den Säulen des Python-Ökosystems gehören, das wir heute oft als so selbstverständlich hinnehmen.

Ich hatte das Glück, John zu Beginn meiner Open-Source-Karriere im Januar 2010 kennenzulernen, gerade als pandas 0.1 herausgekommen war. Seine Inspiration und seine Unterstützung halfen mir selbst in den düstersten Zeiten, meine Vision von pandas und Python als erstklassige Datenanalysesprache voranzutreiben.

John stand Fernando Pérez und Brian Granger sehr nahe, die IPython, Jupyter und vielen anderen Initiativen in der Python-Gemeinde den Weg bereiteten. Wir vier hatten gehofft, gemeinsam an einem Buch zu arbeiten, doch am Ende war ich derjenige mit der meisten freien Zeit. Ich bin mir sicher, er wäre stolz auf das gewesen, was wir einzeln und als Gemeinschaft im Laufe der letzten fünf Jahre erreicht haben.

Danksagungen für die dritte Auflage (2022)

Vor mehr als zehn Jahren habe ich mit dem Schreiben der ersten Auflage dieses Buchs begonnen, und vor mehr als 15 Jahren begann meine Reise als Python-Programmierer. Seitdem hat sich viel geändert! Python hat sich von einer relativen Nischensprache für die Datenanalyse zur beliebtesten und am weitesten verbreiteten Sprache entwickelt, die die Mehrzahl (wenn nicht sogar die Mehrheit!) der Arbeiten in den Bereichen Data Science, maschinelles Lernen und künstliche Intelligenz unterstützt.

Ich habe seit 2013 nicht mehr aktiv zum Open-Source-Projekt pandas beigetragen, aber seine weltweite Gemeinschaft ist weiter gewachsen und kann als Modell einer Community-getriebenen Open-Source-Softwareentwicklung dienen. Viele »Next Generation«-Python-Projekte, die mit Tabellendaten arbeiten, modellieren ihre Benutzeroberflächen direkt nach pandas, was zeigt, dass das Projekt einen beständigen Einfluss auf die Entwicklung des Python-Ökosystems der Data Science besitzt.

Ich hoffe, dieses Buch kann weiterhin als wertvolle Quelle für Studierende und viele andere Personen dienen, die daran interessiert sind, etwas zum Arbeiten mit Daten in Python zu lernen.

Besonders dankbar bin ich O’Reilly, dass ich eine »Open Access«-Version dieses Buchs auf meiner Website unter https://wesmckinney.com/book bereitstellen kann, sodass hoffentlich noch mehr Menschen erreicht werden können und ihnen dabei geholfen wird, besser in die Welt der Datenanalyse einzusteigen. J. J. Allaire war dabei unverzichtbar, er half mir, das Buch von Docbook XML nach Quarto (https://quarto.org) zu portieren – einem neuen und wunderbaren Publishing-System (Druck und Web) für Wissenschaft und Technik.

Vielen Dank auch an meine Fachkorrektoren Paul Barry, Jean-Christophe Leyder, Abdullah Karasan und William Jamir, deren umfassendes Feedback die Lesbarkeit, Klarheit und Verständlichkeit dieses Buchs deutlich verbessert hat.

Danksagungen für die zweite Auflage (2017)

Es sind fast auf den Tag genau fünf Jahre vergangen, seit ich im Juli 2012 das Manuskript für die erste Auflage dieses Buchs beendet habe. Eine Menge hat sich geändert. Die Python-Gemeinde ist unglaublich gewachsen, und das sie umgebende Ökosystem der Open-Source-Software gedeiht.

Diese neue Auflage des Buchs hätte es ohne die unablässigen Bemühungen der pandas-Entwickler nicht gegeben, die das Projekt und seine Gemeinschaft zu einem der Eckpfeiler des Python-Data-Science-Ökosystems gemacht haben. Zu ihnen gehören unter anderem Tom Augspurger, Joris Van den Bossche, Chris Bartak, Phillip Cloud, gfyoung, Andy Hayden, Masaaki Horikoshi, Stephan Hoyer, Adam Klein, Wouter Overmeire, Jeff Reback, Chang She, Skipper Seabold, Jeff Tratner und y-p.

Für ihre Hilfe und Geduld beim Schreiben dieser zweiten Auflage möchte ich den O’Reilly-Mitarbeitern danken: Marie Beaugureau, Ben Lorica und Colleen Toporek. Ihr technisches Expertenwissen brachten Tom Augspurger, Paul Barry, Hugh Brown, Jonathan Coe und Andreas Müller ein. Danke schön.

Die erste Auflage dieses Buchs wurde in viele Sprachen übersetzt, darunter Chinesisch, Französisch, Deutsch, Japanisch, Koreanisch und Russisch. Das Übersetzen des Inhalts, der dadurch einem viel breiteren Publikum zugänglich wird, ist eine gigantische und oft undankbare Aufgabe. Ich danke den Übersetzern, dass sie Menschen auf der ganzen Welt helfen, das Programmieren und die Benutzung von Datenanalysewerkzeugen zu erlernen.

Ich hatte außerdem das Glück, dass mich Cloudera und Two Sigma Investments in den letzten Jahren bei meinen Open-Source-Entwicklungsarbeiten unterstützt haben. Oft sind Open-Source-Projekte trotz einer nicht unbeträchtlichen Benutzerbasis äußerst armselig mit Ressourcen ausgestattet. Deshalb wird es immer wichtiger – und ist auch das einzig Richtige –, dass Unternehmen die Entwicklung von wichtigen Open-Source-Projekten unterstützen.

Danksagungen für die erste Auflage (2012)

Dieses Buch hätte ich ohne die Unterstützung vieler Menschen niemals schreiben können.

Unter den O’Reilly-Mitarbeitern bin ich meinen Lektorinnen Meghan Blanchette und Julie Steele unheimlich dankbar, die mich durch den Prozess begleitet haben. Mike Loukides arbeitete mit mir während der Entwurfsphase zusammen und half mir, das Buch real werden zu lassen.

Viele Menschen haben mich als technische Gutachter unterstützt. Besonders danken möchte ich Martin Blais und Hugh Brown für ihre Hilfe bei den Beispielen für dieses Buch, bei der Übersichtlichkeit und beim Aufbau. James Long, Drew Conway, Fernando Pérez, Brian Granger, Thomas Kluyver, Adam Klein, Josh Klein, Chang She und Stéfan van der Walt haben jeweils ein oder mehrere Kapitel begutachtet, umfangreich kritisiert und von vielen verschiedenen Gesichtspunkten aus beleuchtet.

Diverse großartige Ideen für Beispiele und Datensätze kamen von Freunden und Kollegen in der Datencommunity, darunter Mike Dewar, Jeff Hammerbacher, James Johndrow, Kristian Lum, Adam Klein, Hilary Mason, Chang She und Ashley Williams.

Ich stehe natürlich in der Schuld zahlreicher Pioniere in der wissenschaftlichen Open-Source-Python-Community. Sie haben mir geholfen, das Fundament meiner Entwicklungsarbeit zu legen, und mich beim Schreiben dieses Buchs ermutigt: das IPython-Kernteam (Fernando Pérez, Brian Granger, Min Ragan-Kelly, Thomas Kluyver und andere), John Hunter, Skipper Seabold, Travis Oliphant, Peter Wang, Eric Jones, Robert Kern, Josef Perktold, Francesc Alted, Chris Fonnesbeck und viele weitere, die hier nicht erwähnt werden können. Verschiedene Menschen gaben mir darüber hinaus ihre Unterstützung sowie Ideen und Ermutigung: Drew Conway, Sean Taylor, Giuseppe Paleologo, Jared Lander, David Epstein, John Krowas, Joshua Bloom, Den Pilsworth, John Myles-White und viele andere, die ich vergessen habe.

Ich möchte außerdem einer Reihe von Menschen aus meinen Lehrjahren danken. Zuallererst danke ich meinen früheren Kollegen bei AQR, die mich über die Jahre bei meiner Arbeit an pandas angefeuert haben: Alex Reyfman, Michael Wong, Tim Sargen, Oktay Kurbanov, Matthew Tschantz, Roni Israelov, Michael Katz, Aris Levine, Chris Uga, Prasad Ramanan, Ted Square und Hoon Kim. Und schließlich danke ich meinen akademischen Lehrmeistern Haynes Miller (MIT) und Mike West (Duke University).

Eine Menge Hilfe bekam ich im Jahr 2014 von Phillip Cloud und Joris Van den Bossche beim Aktualisieren der Codebeispiele in diesem Buch und beim Beheben einiger anderer Ungenauigkeiten, die Änderungen in pandas geschuldet waren.

Auf persönlicher Ebene danke ich Casey, die meinen tagtäglichen Schreibprozess unterstützte und meine Höhen und Tiefen tolerierte, als ich trotz eines überfüllten Terminplans den endgültigen Entwurf zusammenschrieb. Meine Eltern schließlich lehrten mich, immer meinen Träumen zu folgen und mich nie mit weniger zufriedenzugeben.

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.

Dieses Buch wurde erstmals 2012 veröffentlicht. Später begannen die Leute damit, Data Science als Oberbegriff für alles, von einfachen, deskriptiven Statistiken bis hin zu ausgefeilteren statistischen Analysen und maschinellem Lernen, zu verwenden. Das Python-Open-Source-Ökosystem für Datenanalyse (oder Data Science) hat sich seitdem auch deutlich vergrößert. Es gibt jetzt viele weitere Bücher, deren Fokus spezifisch auf diesen fortgeschritteneren Methodiken liegt. Ich hoffe, dass dieses Buch als adäquate Vorbereitung dient, nach der Sie sich den domänenspezifischeren Quellen zuwenden können.

Manche mögen einen Großteil dieses Buchs eher dem Bereich der »Datenverarbeitung« statt der »Datenanalyse« zuordnen. Wir verwenden dafür im Englischen auch gern die Begriffe Wrangling oder Munging.

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 »Skriptsprachen« nicht, da er den Beigeschmack hinterlässt, dass damit keine ernsthafte Software herzustellen ist. Unter den interpretierten Sprachen hat sich um Python herum aus verschiedenen historischen und kulturellen Gründen eine große und aktive wissenschaftliche und Datenanalysecommunity entwickelt. In den letzten 20 Jahren ist aus der Sprache Python, die man »auf eigene Gefahr« einsetzt, eine der wichtigsten Sprachen für die Datenwissenschaft, das maschinelle Lernen bzw. Machine Learning und die allgemeine Softwareentwicklung im akademischen und industriellen Bereich geworden.

Im Bereich der Datenanalyse und des interaktiven Computings sowie der Datenvisualisierung wird Python zwangsläufig mit anderen weitverbreiteten Programmiersprachen und Tools, sowohl Open Source als auch kommerzieller Art, wie R, MATLAB, SAS, Stata und anderen verglichen. In den letzten Jahren haben Pythons verbesserte Open-Source-Bibliotheken (wie etwa pandas und scikit-learn) es zu einer beliebten Alternative für Datenanalyseaufgaben werden lassen. In Kombination mit seiner Stärke als Mehrzweckprogrammiersprache ist Python eine ausgezeichnete Wahl für datenzentrierte Anwendungen.

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.

In den vergangenen zehn Jahren gab es ein paar neue Anläufe, das »Zwei-Sprachen-Problem« zu lösen, etwa in Form der Programmiersprache Julia. Um aus Python so viel wie möglich herauszuholen, muss man in vielen Fällen in einer Low-Level-Programmiersprache wie C oder C++ programmieren und dann Python-Bindings zu diesem Code erstellen. Daher hat die »Just-in-Time«-(JIT-)Compiler-Technologie von Bibliotheken wie Numba eine Möglichkeit geschaffen, für viele Rechenalgorithmen eine ausgezeichnete Performance zu erreichen, ohne die Programmierumgebung von Python verlassen zu müssen.

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 intuitives und flexibles Arbeiten mit strukturierten oder tabellarischen Daten. Seit seinem Auftauchen im Jahr 2010 hat es dazu beigetragen, aus Python eine starke und produktive Datenanalyseumgebung zu machen. Die pandas-Objekte, die in diesem Buch hauptsächlich benutzt werden, sind DataFrame, eine tabellenförmige, spaltenorientierte Datenstruktur mit Titeln für Zeilen und Spalten, und Series, ein eindimensionales Array-Objekt, ebenfalls mit Titel.

pandas kombiniert die Arrays aus NumPy mit der flexiblen Datenmanipulation von Spreadsheets und relationalen Datenbanken (wie etwa SQL). Es bietet eine praktische Indizierung, wodurch man die Daten einfach umgestalten, zurechtschneiden und zusammenfassen sowie Teilmengen von Daten auswählen kann. Da die Datenmanipulation, -vorbereitung und -bereinigung eine so wichtige Fähigkeit der Datenanalyse ist, befindet sich pandas ganz besonders im Fokus dieses Buchs.

Einige Hintergrundinformationen: Ich begann Anfang 2008 mit der Entwicklung von pandas, als ich bei AQR Capital Management arbeitete, einem Finanzdienstleister. Damals hatte ich ganz klare Anforderungen, die kein Tool aus meiner Werkzeugkiste komplett allein erfüllte:

Datenstrukturen mit gekennzeichneten Achsen, die eine automatische oder explizite Datenausrichtung unterstützen – dies verhindert oft auftretende Fehler aufgrund falsch ausgerichteter Daten und das Arbeiten mit unterschiedlich indizierten Daten, die aus unterschiedlichen Quellen stammen.

Integrierte Zeitreihenfunktionalität.

Die gleichen Datenstrukturen behandeln sowohl Zeitreihendaten als auch Nichtzeitreihendaten.

Arithmetische Operationen und Reduktionen, die die Metadaten erhalten.

Flexible Behandlung fehlender Daten.

Merge und andere relationale Operationen, die in beliebten Datenbanken (z.B. SQL-basierten) zu finden sind.

Ich wollte alle diese Dinge gern an einem Ort vereint sehen, vorzugsweise in einer Sprache, die sich gut für die allgemeine Softwareentwicklung eignet. Python schien dafür ein guter Kandidat zu sein, allerdings waren damals noch keine Datenstrukturen und Werkzeuge enthalten, die diese Funktionalität geboten hätten. Da pandas anfangs vor allem zum Lösen von Finanz- und Geschäftsanalyseproblemen dienen sollte, zeichnet es sich vor allem durch seine Zeitreihenfunktionen sowie Werkzeuge für das Arbeiten mit zeitindizierten Daten aus Geschäftsprozessen aus.

Einen Großteil der Jahre 2011 und 2012 verbrachte ich damit, zusammen mit meinen ehemaligen AQR-Kollegen Adam Klein und Chang She pandas in dieser Hinsicht zu erweitern. 2013 zog ich mich aus der täglichen Projektarbeit zurück, und pandas ist seitdem zu einem komplett von der Community verantworteten und gewarteten Projekt geworden – mit mehr als 2.000 Beitragenden auf der ganzen Welt.

Anwender der Sprache R für statistische Berechnungen werden den Begriff DataFrame kennen, da das Objekt nach dem vergleichbaren R-Objekt data.frame benannt wurde. Anders als bei Python sind DataFrames in die Programmiersprache R und seine Standardbibliothek integriert. Dadurch sind viele Features, die man in pandas findet, entweder Teil der R-Kernimplementierung oder werden durch Zusatzpakete zur Verfügung gestellt.

Der Name pandas selbst ist von Panel Data (Paneldaten) abgeleitet, einem Ökonomiebegriff für mehrdimensionale strukturierte Datenmengen, sowie von Python Data Analysis selbst.

matplotlib

matplotlib (http://matplotlib.org) ist die beliebteste Python-Bibliothek zum Zeichnen und für andere zweidimensionale Datenvisualisierungen. Ursprünglich von John D. Hunter geschaffen, wird sie nun von einem großen Entwicklerteam betreut. Sie dient dem Herstellen von Zeichnungen, die sich für eine Veröffentlichung eignen. Es gibt zwar auch andere Visualisierungsbibliotheken für Python-Programmierer, doch matplotlib ist immer noch sehr verbreitet und ziemlich gut in das restliche Ökosystem integriert. Ich denke, sie ist eine gute Wahl als Standardvisualisierungswerkzeug.

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 20 Jahren wurde es zu einem der wichtigsten Tools im modernen Python-Werkzeugkasten. IPython bietet zwar selbst keine Rechen- oder Datenanalysewerkzeuge, erlaubt Ihnen aufgrund seiner Struktur aber, interaktiv zu arbeiten sowie in der Softwareentwicklung eingesetzt zu werden. Es unterstützt einen Execute-Explore-Workflow anstelle des typischen Edit-Compile-Run-Workflows, den man in vielen anderen Programmiersprachen pflegt. Außerdem bietet es einen integrierten Zugriff auf die Shell und das Dateisystem Ihres Betriebssystems, was in vielen Fällen den manuellen Wechsel zwischen Terminalfenster und Python-Session überflüssig macht. Da die Programmierung zur Datenanalyse zu einem Großteil auf Erkundung (Exploration), Trial-and-Error und Iterationen beruht, kann IPython Ihnen helfen, den Job schneller zu erledigen.

2014 kündigten Fernando und das IPython-Team das Jupyter-Projekt (http://jupyter.org) an, eine breitere Initiative zum Entwickeln interaktiver, sprachunabhängiger Rechenwerkzeuge. Das IPython-Web-Notebook wurde zum Jupyter-Notebook, das jetzt mehr als 40 Programmiersprachen unterstützt. Das IPython-System kann nun als Kernel (ein Programmiersprachenmodus) für die Benutzung von Python mit Jupyter verwendet werden.

IPython selbst ist eine Komponente des viel breiteren Jupyter-Open-Source-Projekts, das eine produktive Umgebung für das interaktive und untersuchende Arbeiten bietet. Sein ältester und einfachster »Modus« ist eine erweiterte Python-Shell, die das Schreiben und Testen von Python-Code sowie die Fehlersuche beschleunigen soll. Die IPython-Shell und die Jupyter-Notebooks eignen sich besonders für die Datenuntersuchung und -visualisierung. Zudem können Sie das IPython-System über Jupyter-Notebooks nutzen.

Mit dem Jupyter-Notebook können Sie darüber hinaus Inhalte in Markdown und HTML erstellen. Sie haben also eine Möglichkeit, mit Auszeichnungen versehende Dokumente mit Code und Text anzulegen.

Ich persönlich benutze IPython und Jupyter fast immer, wenn ich mit Python arbeite, etwa zum Ausführen, Debuggen und Testen von Code.

In den Begleitmaterialien zu diesem Buch auf GitHub (http://github.com/wesm/pydata-book) finden Sie Jupyter-Notebooks mit allen Codebeispielen aus den einzelnen Kapiteln. Haben Sie keinen Zugriff auf GitHub, können Sie den Mirror bei Gitee (https://gitee.com/wesmckinn/pydata-book) ausprobieren.

SciPy

SciPy (http://scipy.org) ist eine Sammlung von Paketen, die sich mit einer Reihe von grundlegenden Problemfeldern beim wissenschaftlichen Rechnen befassen. Hier ist eine Auswahl der Tools aus den diversen Modulen:

scipy.integrate

Numerische Integrationsroutinen und Lösung von Differenzialgleichungen.

scipy.linalg

Routinen aus der linearen Algebra und Matrixzerlegungen, die den Rahmen von numpy.linalg übersteigen.

scipy.optimize

Funktionsoptimierer (Minimierer) und Algorithmen zur Wurzelbestimmung.

scipy.signal

Werkzeuge zur Signalverarbeitung.

scipy.sparse

Schwach besetzte Matrizen und Löser von schwach besetzten linearen Gleichungssystemen.

scipy.special

Wrapper um SPECFUN, eine FORTRAN-Bibliothek, die viele verschiedene mathematische Funktionen enthält, wie etwa die gamma-Funktion.

scipy.stats

Gewöhnliche stetige und diskrete Wahrscheinlichkeitsverteilungen (Dichtefunktionen, Stichproben, stetige Verteilungsfunktionen), verschiedene statistische Tests und weitere deskriptive Statistik.

Gemeinsam bilden NumPy und SciPy eine relativ vollständige und ausgereifte Rechengrundlage für viele traditionelle wissenschaftliche Rechenanwendungen.

scikit-learn

Seit dem Beginn des Projekts im Jahr 2007 ist scikit-learn (http://scikit-learn.org) zum wichtigsten Machine-Learning-Toolkit für Python-Programmierer geworden. Mehr als 2.000 Menschen aus der ganzen Welt haben bereits daran mitgearbeitet. Es enthält Untermodule für Modelle wie:

Klassifizierung: SVM, nächste Nachbarn, Random Forest, logistische Regression usw.

Regression: LASSO, Ridge Regression usw.

Clusteranalyse:

k

-means, Spectral Clustering usw.

Dimensionsreduktion: PCA, Feature Selection, Matrixfaktorisierung usw.

Modellauswahl: Rastersuche, Kreuzvalidierung, Metriken

Vorverarbeitung: Feature-Extraktion, Normalisierung

Gemeinsam mit pandas, statsmodels und IPython hat scikit-learn entscheidend dazu beigetragen, aus Python eine produktive Data-Science-Programmiersprache zu machen. Ich kann zwar keine umfassende Anleitung für scikit-learn in dieses Buch aufnehmen, stelle aber kurz einige seiner Modelle vor und beschreibe, wie man diese zusammen mit anderen Werkzeugen aus diesem Buch einsetzt.

statsmodels

statsmodels (http://statsmodels.org) ist ein statistisches Analysepaket, das aus der Arbeit des Stanford-Statistikprofessors Jonathan Taylor hervorgegangen ist, der eine Reihe von Regressionsanalysemodellen in der Programmiersprache R implementiert hat. Skipper Seabold und Josef Perktold begründeten 2010 offiziell das neue statsmodels-Projekt, das mittlerweile zu einem Projekt mit einer beträchtlichen Nutzer- und Mitarbeiterbasis angewachsen ist. Nathaniel Smith entwickelte das Patsy-Projekt, das ein durch das Formelsystem von R inspiriertes Framework zur Formel- oder Modellspezifikation für statsmodels bietet.

Im Gegensatz zu scikit-learn enthält statsmodels Algorithmen für die klassische (vor allem frequentistische) Statistik und Ökonometrie. Dazu gehören Untermodule wie:

Regressionsmodelle: lineare Regression, generalisierte lineare Modelle, robuste lineare Modelle, lineare Mixed-Effects-Modelle usw.

Varianzanalyse (

Analysis of Variance

, ANOVA)

Zeitreihenanalyse: AR, ARMA, ARIMA, VAR und andere Modelle

nichtparametrische Methoden: Kerndichteschätzung, Kernel-Regression

Visualisierung der Ergebnisse statistischer Modelle

statsmodels konzentriert sich vor allem auf die Inferenzstatistik (schließende Statistik), für die es Unsicherheitsschätzungen und p-Werte für Parameter liefert. scikit-learn ist dagegen eher vorhersageorientiert.

Analog zu scikit-learn werde ich eine kurze Einführung in statsmodels liefern und beschreiben, wie man es mit NumPy und pandas einsetzt.

Andere Pakete

Es gibt mittlerweile viele weitere Pakete, die sich in einem Buch über Data Science behandeln ließen. Dazu gehören einige der neueren Projekte wie TensorFlow oder PyTorch, die in den Bereichen maschinelles Lernen und künstliche Intelligenz große Verbreitung gefunden haben. Da es andere Bücher gibt, die sich mehr auf diese Projekte konzentrieren, empfehle ich, dieses Buch für die Grundlagen beim Umgang mit Daten in Python zu nutzen, um sich dann fortgeschrittenen Quellen zuzuwenden, die schon mehr Wissen erwarten.

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 Leserinnen und Leser haben vermutlich nicht die komplette Python-Entwicklungsumgebung, die man zur Arbeit mit diesem Buch benötigt. Deshalb werde ich hier ausführlich erläutern, wie man es auf den verschiedenen Betriebssystemen installiert. Ich empfehle die Miniconda-Distribution, bei der es sich um eine Minimalinstallation des Paketmanagers Conda handelt, und dazu conda-forge (https://condaforge.org), eine durch die Community betreute Softwaredistribution, die auf Conda basiert. Dieses Buch nutzt Python 3.10, aber wenn es eine neuere Version gibt, können Sie die gern installieren. Sollte diese Anleitung mit der Zeit veraltet sein, können Sie auf meiner Website zum Buch (https://wesmckinney.com/book) vorbeischauen, wo ich versuchen werde, die Installationsanweisungen immer aktuell zu halten.

Miniconda auf Windows

Um auf Windows loslegen zu können, laden Sie den Miniconda-Installer für die neueste verfügbare Python-Version (aktuell 3.9) von (https://conda.io) herunter. Ich empfehle Ihnen, den Installationsanweisungen für Windows zu folgen, die Sie auf der Conda-Website finden und die sich geändert haben können, seit diese Zeilen geschrieben wurden. Die meisten Anwenderinnen und Anwender werden die 64-Bit-Version nutzen wollen, aber wenn diese nicht auf Ihrem Windows-Rechner läuft, können Sie stattdessen die 32-Bit-Version installieren.

Sollten Sie gefragt werden, ob Sie die Installation nur für sich selbst oder für alle Benutzer auf Ihrem System durchführen wollen, wählen Sie die Option, die für Sie am passendsten ist. Installieren Sie Conda nur für sich, wird das für das Nachvollziehen der Beispiele aus diesem Buch ausreichen. Sie werden auch gefragt werden, ob Sie Miniconda zur Systemumgebungsvariablen PATH hinzufügen wollen. Wählen Sie das aus (was ich normalerweise tue), überschreibt diese Miniconda-Installation eventuell andere Python-Versionen, die Sie installiert haben. Entscheiden Sie sich dagegen, müssen Sie den Shortcut im Startmenü von Windows nutzen, um dieses Miniconda verwenden zu können. Der Name des Eintrags lautet beispielsweise »Anaconda3 (64-bit)«.

Ich gehe davon aus, dass Sie Miniconda nicht Ihrem System-PATH hinzugefügt haben. Um zu prüfen, ob alles korrekt konfiguriert wurde, öffnen Sie im Startmenü den Punkt Anaconda Prompt (Miniconda3) unter Anaconda3 (64-bit). Versuchen Sie dann, den Python-Interpreter durch Eingabe von python zu starten. Sie sollten eine Ausgabe wie die folgende erhalten:

(base) C:\Users\Wes>python

Python 3.9 [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32

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

>>>

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

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, Cent-OS und Fedora. Abgesehen von der Installation von Miniconda verläuft das Einrichten ähnlich wie bei macOS. Meist wird man die Datei für den normalen 64-Bit-Installer herunterladen wollen, der für die x86-Architektur gedacht ist (aber eventuell werden in Zukunft mehr Anwender auf aarch64 basierende Systeme nutzen). Der Installer ist ein Shell-Skript, das im Terminal ausgeführt werden muss. Sie haben dann eine Datei, die Miniconda3-latest-Linux-x86_64.sh oder ähnlich heißt. Um sie zu installieren, führen Sie dieses Skript mit der bash-Shell aus:

$ bash Miniconda3-latest-Linux-x86_64.sh

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

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

Der Installer fragt Sie möglicherweise, ob er Ihre Shell-Skripte anpassen soll, damit Miniconda automatisch aktiviert wird. Ich empfehle das (wählen Sie yes), da das sehr praktisch ist.

Starten Sie nach dem Abschluss der Installation einen neuen Terminalprozess und prüfen Sie, ob die neue Miniconda-Installation genutzt wird:

(base) $ python

Python 3.9 | (main) [GCC 10.3.0] on linux

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

>>>

Um die Python-Shell zu verlassen, geben Sie exit() ein und drücken die Enter-Taste, oder Sie drücken Strg-D.

Miniconda auf macOS

Laden Sie den macOS-Miniconda-Installer herunter, der für auf Apple Silicon basierende macOS-Computer (ab 2020) Miniconda3-4.1.0-latest-arm64.sh oder ähnlich heißen sollte, während der Name für Intel-basierte Macs (bis 2020) Miniconda3-4.1.0-latest-x86_64.shlautet. Öffnen Sie die Terminalanwendung in macOS und starten Sie den Installer (der sich vermutlich in Ihrem Downloads-Verzeichnis befindet) mit bash:

$ bash $HOME/Downloads/Miniconda3-latest-MacOSX-arm64.sh

Wenn der Installer läuft, konfiguriert er Miniconda automatisch in Ihrer Standard-Shell-Umgebung in Ihrem Standard-Shell-Profil. Dieses befindet sich wahrscheinlich unter /Users/$USER/.zshrc. Ich empfehle, das zuzulassen – wenn Sie das nicht tun, müssen Sie in der Dokumentation zu Miniconda nachschauen, um weitermachen zu können.

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

$ python

Python 3.9 (main) [Clang 12.0.1 ] on darwin

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

>>>

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

Python-Pakete installieren oder aktualisieren

Nachdem wir Miniconda auf unserem System eingerichtet haben, wollen wir nun die wichtigsten Pakete installieren, die in diesem Buch zum Einsatz kommen. Der erste Schritt ist, conda-forge als Standardpaketkanal zu konfigurieren, indem wir folgende Befehle in einer Shell ausführen:

(base) $ conda config --add channels conda-forge

(base) $ conda config --set channel_priority strict

Jetzt werden wir mit dem Befehl conda create eine neue conda-»Umgebung« erstellen, die Python 3.10 nutzt:

(base) $ conda create -y -n pydata-book python=3.10

Ist die Installation abgeschlossen, aktivieren Sie die Umgebung mit conda activate:

(base) $ conda activate pydata-book

(pydata-book) $

Sie müssen conda activate jedes Mal nutzen, um Ihre Umgebung zu aktivieren, wenn Sie ein neues Terminal öffnen. Informationen zur aktiven conda-Umgebung erhalten Sie jederzeit, wenn Sie im Terminal conda info eingeben.

Jetzt werden wir mit conda install die grundlegenden Pakete installieren, die in diesem Buch zum Einsatz kommen (und ihre Abhängigkeiten):

(pydata-book) $ conda install -y pandas jupyter matplotlib

Wir werden auch noch andere Pakete verwenden, aber die lassen sich später bei Bedarf nachinstallieren. Es gibt zwei Möglichkeiten, Pakete zu installieren: mit conda install und mit pip install. Sie sollten conda install beim Einsatz von Miniconda immer den Vorzug geben, aber manche Pakete stehen nicht über conda zur Verfügung. Schlägt conda install $package_name also fehl, versuchen Sie es mit pip install $package_name.

Wollen Sie alle Pakete installieren, die in diesem Buch eingesetzt werden, können Sie folgenden Befehl nutzen:

conda install lxml beautifulsoup4 html5lib openpyxl \

requests sqlalchemy seaborn scipy statsmodels \

patsy scikit-learn pyarrow pytables numba

Unter Windows verwenden Sie zum Fortführen der Zeile statt des unter Linux und macOS zum Einsatz kommenden \ das Caret ^.

Sie können Pakete mit dem Befehl conda update aktualisieren:

conda update package_name

pip unterstützt außerdem Upgrades mit dem Flag --upgrade:

pip install --upgrade package_name

Im Laufe des Buchs werden Sie mehrfach Gelegenheit haben, diese Befehle auszuprobieren.

Sie können sowohl conda als auch pip nutzen, um Pakete zu installieren, Sie sollten jedoch nicht versuchen, conda-Pakete mit pip zu aktualisieren (oder umgekehrt), da dies zu Umgebungsproblemen führen könnte. Ich empfehle Ihnen, sich so weit wie möglich an conda zu halten und pip nur dann zu verwenden, wenn sich Pakete nicht mit conda install installieren lassen.

Integrierte Entwicklungsumgebungen 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 den produktiven Einsatz in der Shell vorgesehen.

Manche Nutzer ziehen jedoch eine reich ausgestattete IDE (Integrated Development Environment) den vergleichsweise primitiven Texteditoren wie Emacs oder Vim vor, die ohne weitere Anpassungen nur eine eher minimale Umgebung bieten. Hier sind einige, die Sie einmal ausprobieren könnten:

PyDev (kostenlos), eine IDE, die auf der Eclipse-Plattform aufbaut

PyCharm von JetBrains (für kommerzielle Benutzer abobasiert, für Open-Source-Entwickler kostenlos)

Python Tools für Visual Studio (für Windows-Anwender)

Spyder (kostenlos), eine in Anaconda enthaltene IDE

Komodo IDE (kommerziell)

Aufgrund von Pythons Beliebtheit bieten die meisten Texteditoren, wie VS Code und Sublime Text 2, ausgezeichnete Python-Unterstützung.

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.

Ich habe die Standardausgabeeinstellungen in NumPy und pandas geändert, um die Lesbarkeit und Klarheit für das Buch zu verbessern. So sehen Sie beispielsweise bei numerischen Daten mehr Nachkommastellen. Um die Ausgabe aus dem Buch exakt nachzustellen, können Sie folgenden Python-Code ausführen, bevor Sie die Codebeispiele laufen lassen:

Daten für die Beispiele

Datensätze für die Beispiele in den einzelnen Kapiteln werden in einem GitHub-Repository (http://github.com/wesm/pydata-book) vorgehalten (oder in einem Mirror bei Gitee (https://gitee.com/wesmckinn/pydata-book), wenn Sie keinen Zugriff auf GitHub haben). Sie können diese Daten entweder mithilfe der Versionskontrolle Git auf der Kommandozeile herunterladen, oder Sie holen sich eine Zip-Datei des Repositorys von der Website. Falls Sie Probleme haben, gehen Sie auf meine Website (http://wesmckinney.com/book). Dort finden Sie aktuelle Anweisungen dazu, wie Sie an das Material zum Buch kommen.

Laden Sie eine Zip-Datei mit den Beispieldatensätzen herunter, müssen Sie den Inhalt der Datei vollständig in ein Verzeichnis auspacken und dann im Terminal dorthin navigieren, bevor Sie mit dem Ausführen der Codebeispiele im Buch fortfahren können:

$ pwd

/home/wesm/book-materials

$ ls

appa.ipynb ch05.ipynb ch09.ipynb ch13.ipynb README.md

ch02.ipynb ch06.ipynb ch10.ipynb COPYING requirements.txt

ch03.ipynb ch07.ipynb ch11.ipynb datasets

ch04.ipynb ch08.ipynb ch12.ipynb examples

Ich habe mich bemüht, alles bereitzustellen, was nötig ist, um die Beispiele nachzuvollziehen, aber auch ich mache Fehler oder habe vielleicht etwas vergessen. Sollte das der Fall sein, schicken Sie mir eine E-Mail: [email protected]. Die beste Methode zum Melden von Fehlern ist die Errata-Seite auf der O’Reilly-Website (https://oreil.ly/kmhmQ).

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

KAPITEL 2

Grundlagen von Python, IPython und Jupyter-Notebooks

Als ich 2011 und 2012 die erste Auflage dieses Buchs verfasste, gab es nur wenige Ressourcen zum Erlernen der Datenanalyse in Python. Teils war dies ein Henne-Ei-Problem; viele Bibliotheken, die wir inzwischen als selbstverständlich ansehen, wie pandas, scikit-learn und statsmodels, waren damals vergleichsweise unausgereift. 2022 gibt es eine immer größer werdende Auswahl an Literatur zu den Themen Datenwissenschaft, Datenanalyse und maschinelles Lernen, die die früheren Arbeiten über das allgemeine wissenschaftliche Rechnen für Informatiker, Physiker und Forscher aus anderen Wissenschaftsfeldern ergänzt. Darüber hinaus gibt es ausgezeichnete Bücher über das Erlernen der Programmiersprache Python selbst und wie man ein guter Programmierer wird.

Da sich dieses Buch als Einführungstext für das Arbeiten mit Daten in Python versteht, denke ich, dass es sinnvoll ist, einen Überblick über die wichtigsten Eigenschaften der in Python enthaltenen Datenstrukturen und Bibliotheken aus Sicht der Datenmanipulation zu geben. Ich werde deshalb in diesem Kapitel sowie in Kapitel 3 gerade ausreichend Informationen bieten, dass Sie in der Lage sind, den Rest des Buchs zu verstehen.

Ein Großteil dieses Buchs konzentriert sich auf die tabellenorientierte Analytik sowie auf die Werkzeuge zum Vorbereiten der Arbeit mit Datenmengen, die klein genug sind, um in Ihren PC zu passen. Damit Sie diese Werkzeuge benutzen können, müssen Sie oft erst ein paar Umbauten vornehmen, um ungeordnete Daten in eine hübschere tabellarische (oder strukturierte) Form zu bringen. Zum Glück eignet sich Python ideal dazu. Je besser Ihre Fähigkeiten im Umgang mit der Sprache Python und ihren eingebauten Datentypen sind, umso einfacher wird es für Sie, neue Datensätze zur Analyse vorzubereiten.

Einige der Werkzeuge in diesem Buch werden am besten in einer tatsächlichen IPython- oder Jupyter-Sitzung erkundet. Sobald Sie gelernt haben, wie Sie IPython und Jupyter starten, sollten Sie die Beispiele nachvollziehen, um unterschiedliche Dinge auszuprobieren. Wie in jeder konsolenartigen Umgebung, die hauptsächlich über die Tastatur bedient wird, gehört es zum Lernen, sich die wichtigsten Befehle anzueignen, um sie quasi automatisch abrufen zu können.

Es gibt einige grundlegende Python-Konzepte, wie Klassen und die objektorientierte Programmierung, die in diesem Kapitel zwar nicht behandelt werden, die bei Ihrem Vorstoß in die Datenanalyse mit Python aber trotzdem nützlich sind.

Um Ihre Kenntnisse in der Sprache Python zu vertiefen, empfehle ich Ihnen als Zusatzmaterial zu diesem Kapitel das offizielle Python-Tutorial (http://docs.python.org) sowie eventuell eines der vielen ausgezeichneten Bücher über die allgemeine Python-Programmierung. Hier einige Empfehlungen für den Einstieg:

Think Python

von Allen B. Downey (O’Reilly)

Python von Kopf bis Fuß

von Paul Barry (O’Reilly)

Fluent Python

von Luciano Ramalho (O’Reilly)

Effektiv Python programmieren

von Brett Slatkin (mitp)

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, können Sie entweder exit() eintippen oder Strg-D drücken (Letzteres funktioniert nur unter Linux und macOS).

Das Ausführen von Python-Programmen ist ganz einfach: Sie rufen python mit einer .py-Datei als erstes Argument auf. Nehmen wir einmal an, wir hätten die Datei hello_world.py mit diesem Inhalt erzeugt:

print("Hello world")

Sie können sie mit dem folgenden Befehl ausführen (die hello_world.py-Datei muss sich in Ihrem aktuellen Arbeitsverzeichnis befinden):

$ python hello_world.py

Hello world

Während einige Python-Programmierer ihren gesamten Python-Code auf diese Weise ausführen, nutzen andere, die Datenanalysen oder wissenschaftliche Berechnungen mit Python erledigen, IPython, einen erweiterten Python-Interpreter, oder Jupyter-Notebooks, webbasierte Code-Notizbücher, die ursprünglich innerhalb des IPython-Projekts entstanden sind. Ich gebe in diesem Kapitel eine Einführung in die Benutzung von IPython und Jupyter und werfe in Anhang A einen genaueren Blick auf die IPython-Funktionalität. Wenn Sie den Befehl %run einsetzen, führt IPython den Code in der angegebenen Datei im selben Prozess aus, wodurch es Ihnen erlaubt ist, die Ergebnisse interaktiv zu untersuchen, sobald es fertig ist:

$ ipython

Python 3.10.4 | packaged by conda-forge | (main, Mar 24 2022, 17:38:57)

Type 'copyright', 'credits' or 'license' for more information

IPython 7.31.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]: %run hello_world.py

Hello world

In [2]:

Der vorgegebene IPython-Prompt wird durchnummeriert (In [2]:), weist also einen anderen Stil auf als der Standardprompt >>>.

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 (einschließlich Markup), Datenvisualisierungen und andere Ausgaben. Das Jupyter-Notebook interagiert mit Kernels, bei denen es sich um Implementierungen des interaktiven Rechenprotokolls von Jupyter für eine Reihe von Programmiersprachen handelt. Pythons Jupyter-Kernel nutzt das IPython-System für sein ihm zugrunde liegendes Verhalten.

Um Jupyter zu starten, führen Sie in einem Terminal den Befehl jupyter notebook aus:

$ jupyter notebook

[I 15:20:52.739 NotebookApp] Serving notebooks from local directory:

/home/wesm/code/pydata-book

[I 15:20:52.739 NotebookApp] 0 active kernels

[I 15:20:52.739 NotebookApp] The Jupyter Notebook is running at:

http://localhost:8888/?token=0a77b52fefe52ab83e3c35dff8de121e4bb443a63f2d...

[I 15:20:52.740 NotebookApp] Use Control-C to stop this server and shut down

all kernels (twice to skip confirmation).

Created new window in existing browser session.

To access the notebook, open this file in a browser:

file:///home/wesm/.local/share/jupyter/runtime/nbserver-185259-open.html

Or copy and paste one of these URLs:

http://localhost:8888/?token=0a77b52fefe52ab83e3c35dff8de121e4...

or http://127.0.0.1:8888/?token=0a77b52fefe52ab83e3c35dff8de121e4...

Auf vielen Plattformen öffnet sich Jupyter automatisch in Ihrem Standard-Webbrowser (es sei denn, Sie starten es mit --no-browser). Sie können ansonsten auch zu der HTTP-Adresse gehen, die beim Start des Notizbuchs angegeben wurde, hier also http://local host:8888/?token=0a77b52fefe52ab83e3c35dff8de121e4bb443a63f2d3055. In Abbildung 2-1 sehen Sie, wie das Ganze in Google Chrome aussieht.

Viele Menschen nutzen Jupyter als lokale Arbeitsumgebung. Es kann aber auch auf Server ausgelagert und aus der Ferne zugegriffen werden. Ich werde darauf nicht näher eingehen. Falls es für Sie relevant ist, empfehle ich Ihnen, dieses Thema im Internet zu recherchieren.

Abbildung 2-1: Jupyter-Notebook-Startseite

Um ein neues Notebook anzulegen, klicken Sie auf New und wählen die Option Python 3. Sie sollten auf dem Bildschirm etwas sehen wie das in Abbildung 2-2. Machen Sie dies zum ersten Mal, klicken Sie probehalber einmal auf die leere »Codezelle« und geben eine Zeile Python-Code ein. Zum Ausführen des Codes drücken Sie dann Shift-Enter.

Wenn Sie das Notebook speichern (siehe Save and Checkpoint im File-Menü des Notebooks), wird eine Datei mit der Dateierweiterung .ipynb angelegt. Das ist ein eigenständiges Dateiformat, das den gesamten momentanen Inhalt des Notebooks enthält (einschließlich aller evaluierten Codeausgaben). Dieser kann dann von anderen Jupyter-Benutzern geladen und bearbeitet werden.

Abbildung 2-2: Ein neues Notebook in Jupyter

Um ein offenes Notebook umzubenennen, klicken Sie auf seinen Titel oben auf der Seite, geben den neuen Titel ein und drücken die Enter-Taste.

Um ein vorhandenes Notebook zu laden, kopieren Sie die Datei in das Verzeichnis, aus dem heraus Sie auch den Notebook-Prozess gestartet haben (oder ein Unterverzeichnis davon), und klicken dann auf den Namen in der Startseite. Sie können das mit den Notebooks aus meinem wesm/pydata-book-Repository auf GitHub einmal ausprobieren (siehe Abbildung 2-3).

Abbildung 2-3: Jupyter-Beispiel für ein vorhandenes Notebook

Wollen Sie ein Notebook schließen, klicken Sie auf das File-Menü und wählen Close and Halt. Schließen Sie einfach nur den Browser-Tab, wird der mit dem Notebook verbundene Python-Prozess im Hintergrund weiterlaufen.

Auch wenn sich das Jupyter-Notebook ganz anders anfühlt als die IPython-Shell, können fast alle Befehle und Tools aus diesem Kapitel in beiden Umgebungen benutzt werden.

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, und in einem praktischen Drop-down-Menü angezeigt:

Beachten Sie, dass IPython in diesem Beispiel beide von mir definierten Variablen sowie das Python-Schlüsselwort any anzeigt. Natürlich können Sie auch Methoden und Attribute für alle Objekte ergänzen, nachdem Sie einen Punkt eingetippt haben:

Das gilt auch für Module:

In [1]: import datetime

In [2]: datetime.<Tab>

date MAXYEAR timedelta

datetime MINYEAR timezone

datetime_CAPI time tzinfo