So schreiben Sie Ihre SQL-Abfragen in Pandas und mehr um

Vor fünfzehn Jahren gab es nur wenige Fähigkeiten, die ein Softwareentwickler gut kennen musste, und er oder sie würde einen anständigen Schuss auf 95% der aufgelisteten Stellen haben. Diese Fähigkeiten waren:

  • Objekt orientierte Programmierung.
  • Skriptsprachen.
  • JavaScript und…
  • SQL.

SQL war ein nützliches Tool, wenn es darum ging, einen schnellen Überblick über einige Daten zu erhalten und vorläufige Schlussfolgerungen zu ziehen, die möglicherweise dazu führen, dass ein Bericht oder eine Anwendung geschrieben wird. Dies nennt man explorative Analyse.

Heutzutage gibt es Daten in vielen Formen und Formen und sie sind nicht mehr gleichbedeutend mit "relationalen Datenbanken". Möglicherweise haben Sie CSV-Dateien, Nur-Text, Parkett, HDF5 und wer weiß was noch. Hier erstrahlt die Pandas-Bibliothek.

Was ist Pandas?

Python Data Analysis Library, genannt Pandas, ist eine Python-Bibliothek, die für die Analyse und Bearbeitung von Daten erstellt wurde. Es ist Open Source und wird von Anaconda unterstützt. Es eignet sich besonders für strukturierte (tabellarische) Daten. Weitere Informationen finden Sie unter http://pandas.pydata.org/pandas-docs/stable/index.html.

Was kann ich damit machen?

Alle Abfragen, die Sie zuvor in SQL an die Daten gestellt haben, und so viele weitere Dinge!

Toll! Wo soll ich anfangen?

Dies ist der Teil, der jemanden einschüchtern kann, der es gewohnt ist, Datenfragen in SQL-Begriffen auszudrücken.

SQL ist eine deklarative Programmiersprache: https://en.wikipedia.org/wiki/List_of_programming_languages_by_type#Declarative_languages.

Mit SQL deklarieren Sie, was Sie wollen, in einem Satz, der sich fast wie Englisch liest.

Die Syntax von Pandas unterscheidet sich stark von der von SQL. In Pandas wenden Sie Vorgänge auf das Dataset an und verketten sie, um die Daten nach Ihren Wünschen zu transformieren und umzugestalten.

Wir brauchen einen Sprachführer!

Die Anatomie einer SQL-Abfrage

Eine SQL-Abfrage besteht aus einigen wichtigen Schlüsselwörtern. Zwischen diesen Schlüsselwörtern fügen Sie die Details der Daten hinzu, die genau angezeigt werden sollen. Hier ist eine Skelettabfrage ohne die Details:

WÄHLEN SIE ... AUS ... WO ...

GRUPPIEREN NACH ... HABEN ...

SORTIEREN NACH…

LIMIT… OFFSET…

Es gibt andere Begriffe, aber dies sind die wichtigsten. Wie übersetzen wir diese Begriffe in Pandas?

Zuerst müssen wir einige Daten in Pandas laden, da diese noch nicht in der Datenbank vorhanden sind. Hier ist, wie:

Ich habe diese Daten unter http://ourairports.com/data/ erhalten.

WÄHLEN SIE, WO, UNTERSCHEIDEN SIE, BEGRENZEN SIE

Hier sind einige SELECT-Anweisungen. Wir kürzen Ergebnisse mit LIMIT und filtern sie mit WHERE. Wir verwenden DISTINCT, um doppelte Ergebnisse zu entfernen.

SELECT mit mehreren Bedingungen

Wir verbinden mehrere Bedingungen mit einem &. Wenn wir nur eine Teilmenge von Spalten aus der Tabelle wollen, wird diese Teilmenge in ein anderes Paar eckiger Klammern gesetzt.

SORTIEREN NACH

Standardmäßig sortiert Pandas die Objekte in aufsteigender Reihenfolge. Um dies umzukehren, geben Sie ascending = False an.

IN ... NICHT IN

Wir wissen, wie man nach einem Wert filtert, aber was ist mit einer Liste von Werten - IN-Bedingung? In Pandas funktioniert der Operator .isin () auf die gleiche Weise. Verwenden Sie ~, um eine Bedingung zu annullieren.

GROUP BY, COUNT, ORDER BY

Die Gruppierung ist einfach: Verwenden Sie den Operator .groupby (). Zwischen der Semantik eines COUNT in SQL und Pandas besteht ein subtiler Unterschied. In Pandas gibt .count () die Anzahl der Nicht-Null- / NaN-Werte zurück. Verwenden Sie .size (), um dasselbe Ergebnis wie SQL COUNT zu erhalten.

Unten gruppieren wir uns in mehr als einem Feld. Pandas sortiert Dinge standardmäßig in der gleichen Liste von Feldern, sodass im ersten Beispiel kein .sort_values ​​() erforderlich ist. Wenn wir andere Felder für die Sortierung oder DESC anstelle von ASC verwenden möchten, wie im zweiten Beispiel, müssen wir Folgendes explizit angeben:

Was ist das für ein Trick mit .to_frame () und .reset_index ()? Da wir nach unserem berechneten Feld (Größe) sortieren möchten, muss dieses Feld Teil des DataFrame werden. Nach der Gruppierung in Pandas erhalten wir einen anderen Typ namens GroupByObject zurück. Wir müssen es also wieder in einen DataFrame konvertieren. Mit .reset_index () starten wir die Zeilennummerierung für unseren Datenrahmen neu.

HABEN

In SQL können Sie gruppierte Daten zusätzlich mit einer HAVING-Bedingung filtern. In Pandas können Sie .filter () verwenden und eine Python-Funktion (oder ein Lambda) bereitstellen, die True zurückgibt, wenn die Gruppe in das Ergebnis aufgenommen werden soll.

Top N Datensätze

Nehmen wir an, wir haben einige vorläufige Abfragen durchgeführt und verfügen nun über einen Datenrahmen mit dem Namen by_country, der die Anzahl der Flughäfen pro Land enthält:

Im nächsten Beispiel ordnen wir die Dinge nach airport_count und wählen nur die zehn Länder mit der höchsten Anzahl aus. Zweites Beispiel ist der kompliziertere Fall, in dem wir "die nächsten 10 nach den Top 10" wollen:

Aggregatfunktionen (MIN, MAX, MEAN)

Nun, unter Berücksichtigung dieser Datenrahmen- oder Landebahndaten:

Berechnen Sie die minimale, maximale, mittlere und mittlere Länge einer Landebahn:

Sie werden feststellen, dass bei dieser SQL-Abfrage jede Statistik eine Spalte ist. Aber mit dieser Pandas-Aggregation ist jede Statistik eine Zeile:

Keine Sorge - transponieren Sie den Datenrahmen einfach mit .T, um Spalten zu erhalten:

BEITRETEN

Verwenden Sie .merge (), um Pandas-Datenrahmen zu verbinden. Sie müssen angeben, für welche Spalten ein Join erstellt werden soll (left_on und right_on), und den Join-Typ angeben: inner (Standard), left (entspricht LEFT OUTER in SQL), right (RIGHT OUTER) oder outer (FULL OUTER).

UNION ALL und UNION

Verwenden Sie pd.concat (), um ALLE zwei Datenrahmen zu UNIONIEREN:

Um Dinge zu deduplizieren (entspricht UNION), müssen Sie auch .drop_duplicates () hinzufügen.

EINFÜGEN

Bisher haben wir Dinge ausgewählt, aber Sie müssen möglicherweise auch Dinge im Verlauf Ihrer explorativen Analyse ändern. Was ist, wenn Sie fehlende Datensätze hinzufügen möchten?

In Pandas gibt es kein INSERT. Stattdessen würden Sie einen neuen Datenrahmen erstellen, der neue Datensätze enthält, und dann die beiden folgenden Elemente zusammenfassen:

AKTUALISIEREN

Jetzt müssen wir einige fehlerhafte Daten im ursprünglichen Datenrahmen korrigieren:

LÖSCHEN

Die einfachste (und am besten lesbare) Möglichkeit, Objekte aus einem Pandas-Datenframe zu „löschen“, besteht darin, den Datenframe in Zeilen zu unterteilen, die Sie beibehalten möchten. Alternativ können Sie die Indizes der zu löschenden Zeilen und .drop () -Zeilen mithilfe dieser Indizes abrufen:

Unveränderlichkeit

Ich muss eine wichtige Sache erwähnen - Unveränderlichkeit. Standardmäßig geben die meisten Operatoren, die auf einen Pandas-Datenrahmen angewendet wurden, ein neues Objekt zurück. Einige Operatoren akzeptieren den Parameter inplace = True, sodass Sie stattdessen mit dem ursprünglichen Datenrahmen arbeiten können. Beispiel: So setzen Sie einen Index an Ort und Stelle zurück:

Der Operator .loc im obigen UPDATE-Beispiel sucht jedoch einfach nach Indizes von Datensätzen, die aktualisiert werden sollen, und die Werte werden direkt geändert. Auch wenn Sie alle Werte in einer Spalte aktualisiert haben:

oder fügte eine neue berechnete Spalte hinzu:

Diese Dinge würden an Ort und Stelle passieren.

Und mehr!

Das Schöne an Pandas ist, dass es mehr als nur eine Suchmaschine ist. Sie können andere Dinge mit Ihren Daten tun, wie zum Beispiel:

  • Export in eine Vielzahl von Formaten:
  • Plotten Sie es:

um ein paar wirklich schöne Charts zu sehen!

  • Teilt es.

Jupyter-Notizbücher (http://jupyter.org/) sind das beste Medium, um Pandas Abfrageergebnisse, Diagramme und ähnliches zu teilen. Tatsächlich veröffentlichen einige Leute (wie Jake Vanderplas, der erstaunlich ist) die ganzen Bücher in Jupyter-Notizbüchern: https://github.com/jakevdp/PythonDataScienceHandbook.

So einfach erstellen Sie ein neues Notizbuch:

Nachdem:
- navigiere zu localhost: 8888
- Klicken Sie auf "Neu" und geben Sie Ihrem Notizbuch einen Namen
- Daten abfragen und anzeigen
- Erstellen Sie ein GitHub-Repository und fügen Sie Ihr Notizbuch hinzu (die Datei mit der Erweiterung .ipynb).

GitHub hat einen großartigen eingebauten Viewer, um Jupyter-Notizbücher mit Markdown-Formatierung anzuzeigen.

Und jetzt beginnt Ihre Pandareise!

Ich hoffe, Sie sind jetzt davon überzeugt, dass die Pandas-Bibliothek Ihnen und Ihrem alten Freund SQL zur explorativen Datenanalyse dienen kann - und in einigen Fällen sogar noch besser. Es ist an der Zeit, einige Daten zum Abfragen in die Hände zu bekommen!