Duckdb SQL -Abfragen
Bild von Autor | Leinwand

Die Pandas Library hat eine der am schnellsten wachsenden Gemeinschaften. Diese Popularität hat die Tür für Alternativen geöffnet, wie wie Polare. In diesem Artikel werden wir eine solche Various untersuchen, Duckdb.

Duckdb ist eine SQL -Datenbank, die Sie direkt in Ihrem Pocket book ausführen können. Es ist kein Setup erforderlich, und es sind keine Server benötigt. Es ist einfach zu installieren und kann parallel mit Pandas arbeiten.

Im Gegensatz zu anderen SQL -Datenbanken müssen Sie den Server nicht konfigurieren. Es funktioniert einfach mit Ihrem Notizbuch nach der Set up. Das bedeutet, dass keine lokalen Setup -Kopfschmerzen, Sie den Code sofort schreiben. Duckdb verarbeitet Filterung, schließt sich anUnd Aggregationen mit sauberer SQL -Syntax im Vergleich zu Pandas und führt bei großen Datensätzen signifikant besser ab.

Additionally genug mit den Bedingungen, fangen wir an!

Datenprojekt – Uber -Geschäftsmodellierung

Wir werden es mit Jupyter Pocket book verwenden und es mit Python für die Datenanalyse kombinieren. Um die Dinge aufregender zu machen, werden wir an einem realen Datenprojekt arbeiten. Fangen wir an!

Ein Datenprojektbeispiel für Duckdb SQL -Abfragen

Hier ist der Hyperlink Für das Datenprojekt werden wir in diesem Artikel verwenden. Es handelt sich um ein Datenprojekt von Uber namens Geschäftsmodellierung des Companions.

Uber verwendete dieses Datenprojekt im Rekrutierungsprozess für die Knowledge Science -Positionen, und Sie werden gebeten, die Daten für zwei verschiedene Szenarien zu analysieren.

  • Szenario 1: Vergleichen Sie die Kosten für zwei Bonusprogramme, die für einen anstrengenden Tag mehr Treiber on-line machen sollen.
  • Szenario 2: Berechnen und vergleichen Sie das jährliche Nettoeinkommen eines traditionellen Taxifahrers gegenüber einem, der mit Uber zusammenarbeitet und ein Auto kauft.

Dataset laden

Laden wir zuerst den DataFrame. Dieser Schritt wird benötigt; Daher registrieren wir diesen Datensatz in den folgenden Abschnitten mit Duckdb.

import pandas as pd
df = pd.read_csv("dataset_2.csv")

Erkundung des Datensatzes

Hier sind die ersten Zeilen:

Ein Datenprojektbeispiel für Duckdb SQL -Abfragen

Lassen Sie uns alle Spalten sehen.

Hier ist die Ausgabe.

Ein Datenprojektbeispiel für Duckdb SQL -Abfragen

Schließen Sie Duckdb an und registrieren Sie den DataFrame

Intestine, es ist ein wirklich einfacher Datensatz, aber wie können wir Duckdb mit diesem Datensatz verbinden?
Erstens, wenn Sie es noch nicht installiert haben, installieren Sie Duckdb.

Die Verbindung mit Duckdb ist einfach. Wenn Sie die Dokumentation lesen möchten, lesen Sie sie auch an Hier.

Hier ist der Code, der eine Verbindung herstellt und den Datenrahmen registriert.

import duckdb
con = duckdb.join()

con.register("my_data", df)

Schließen Sie Duckdb an und registrieren Sie den DataFrame

Intestine, lassen Sie uns sieben Abfragen erkunden, die Ihnen Stunden der Pandas -Arbeit ersparen!

1. Multi-Kriterien-Filterung für komplexe Zulassungsregeln

Einer der bedeutendsten Vorteile von SQL ist, wie es auf natürliche Weise die Filterung mit der Filterung von Multi-Konditions-Filterungen mit natürlicher Weise behandelt.

Implementierung der Multi-Kriterien-Filterung in Duckdb gegen Pandas

Mit Duckdb können Sie mehrere Filter mit SQLs anwenden, wobei Klauseln und Logik, die sich intestine skalieren, und die Anzahl der Filter wächst.

SELECT 
    *
FROM knowledge
WHERE condition_1
  AND condition_2
  AND condition_3
  AND condition_4

Lassen Sie uns nun sehen, wie wir dieselbe Logik in Pandas schreiben würden. In Pandas wird die kleine Logik mit geketteten booleschen Masken mit Klammern ausgedrückt, die unter vielen Bedingungen ausführlich werden können.

filtered_df = df(
    (df("condition_1")) &
    (df("condition_2")) &
    (df("condition_3")) &
    (df("condition_4"))
)

Beide Methoden sind gleichermaßen lesbar und für die grundlegende Verwendung anwendbar. Duckdb fühlt sich natürlicher und sauberer an, da die Logik komplexer wird.

Multi-Kriterien-Filterung für das Uber-Datenprojekt

In diesem Fall möchten wir Fahrer finden, die sich für ein bestimmtes Uber -Bonusprogramm qualifizieren.

Nach den Regeln müssen die Fahrer:

  • Mindestens 8 Stunden on-line sein
  • Führen Sie mindestens 10 Reisen ab
  • Akzeptieren Sie mindestens 90% der Fahranfragen
  • Eine Bewertung von 4,7 oder höher haben

Jetzt müssen wir nur noch eine Abfrage schreiben, die all diese Filterungen durchführt. Hier ist der Code.

SELECT 
    COUN(*) AS qualified_drivers,
    COUNT(*) * 50 AS total_payout
FROM knowledge
WHERE "Provide Hours" >= 8
  AND CAST(REPLACE("Settle for Charge", '%', '') AS DOUBLE) >= 90
  AND "Journeys Accomplished" >= 10
  AND Ranking >= 4.7

Um diesen Code mit Python auszuführen, müssen wir die Methoden von Con.execute („“ „“ „) und Fetchdf () hinzufügen, wie unten gezeigt:

con.execute("""
SELECT 
    COUNT(*) AS qualified_drivers,
    COUNT(*) * 50 AS total_payout
FROM knowledge
WHERE "Provide Hours" >= 8
  AND CAST(REPLACE("Settle for Charge", '%', '') AS DOUBLE) >= 90
  AND "Journeys Accomplished" >= 10
  AND Ranking >= 4.7
""").fetchdf()

Wir werden dies während des gesamten Artikels tun. Nachdem Sie nun wissen, wie man es in einem Jupyter -Notizbuch ausführt, werden wir von nun an nur den SQL -Code zeigen und Sie werden wissen, wie Sie ihn in die pythonische Model konvertieren.
Intestine. Denken Sie nun daran, dass das Datenprojekt möchte, dass wir die Gesamtausschüttung für Choice 1 berechnen.

Multi-Kriterien-Filterung

Wir haben die Summe des Treibers berechnet, aber wir sollten diese mit 50 US -Greenback multiplizieren, da die Auszahlung für jeden Fahrer 50 US -Greenback beträgt, additionally werden wir es mit Depend tun
* 50.

Hier ist die Ausgabe.

Multi-Kriterien-Filterung

2. Schnelle Aggregation, um geschäftliche Anreize abzuschätzen

SQL eignet sich hervorragend zum schnellen Aggregieren, insbesondere wenn Sie Daten über Zeilen zusammenfassen müssen.

Implementierung der Aggregation in Duckdb gegen Pandas

SELECT 
    COUNT(*) AS num_rows,
    SUM(column_name) AS total_value
FROM knowledge
WHERE some_condition

Mit Duckdb können Sie Werte über Zeilen hinweg mithilfe von SQL -Funktionen wie Summe und in einem kompakten Block zählen.

filtered = df(df("some_condition"))
num_rows = filtered.form(0)
total_value = filtered("column_name").sum()

In Pandas müssen Sie zunächst den Datenrahmen filtern und dann separat mithilfe von Kettenmethoden zählen und summen.

Duckdb ist prägnanter und leichter zu lesen und erfordert keine Zwischenvariablen.

Aggregation im Uber -Datenprojekt

  • Intestine, gehen wir zum zweiten Bonusprogramm, Choice 2. Nach der Projektbeschreibung erhalten die Fahrer 4 USD professional Reise, wenn:
  • Sie absolvieren mindestens 12 Reisen.

Eine Bewertung von 4,7 oder besser haben.

SELECT 
    COUNT(*) AS qualified_drivers,
    SUM("Journeys Accomplished") * 4 AS total_payout
FROM knowledge
WHERE "Journeys Accomplished" >= 12
  AND Ranking >= 4.7

Anstatt nur die Treiber zu zählen, müssen wir diesmal die Anzahl der Reisen hinzufügen, die sie abgeschlossen haben, da der Bonus professional Reise nicht professional Particular person bezahlt wird.

Die Anzahl hier sagt uns, wie viele Fahrer qualifiziert sind. Um die Gesamtauszahlung zu berechnen, berechnen wir ihre Reisen und multiplizieren Sie sie mit 4 US -Greenback, wie dies in Choice 2 erforderlich ist.

Aggregation in Duckdb

Hier ist die Ausgabe.

Aggregation in Duckdb

Mit Duckdb müssen wir nicht durch die Zeilen schauen oder benutzerdefinierte Aggregationen erstellen. Die Summenfunktion kümmert sich um alles, was wir brauchen.

3.. Erkennen Sie Überlappungen und Unterschiede unter Verwendung der Booleschen Logik

In SQL können Sie die Bedingungen problemlos mit einer Booleschen Logik wie und, oder und nicht verwenden.

Implementierung der Booleschen Logik in Duckdb gegen Pandas

SELECT *
FROM knowledge
WHERE condition_a
  AND condition_b
  AND NOT (condition_c)

Duckdb unterstützt die Boolesche Logik nativ in der WHERE -Klausel mit und, oder, und nicht.

filtered = df(
    (df("condition_a")) &
    (df("condition_b")) &
    ~(df("condition_c"))
)

Pandas benötigt eine Kombination von logischen Operatoren mit Masken und Klammern, einschließlich der Verwendung von „~“ zur Negation.

Während beide funktionsfähig sind, ist Duckdb leichter zu argumentieren, wann die Logik Ausschlüsse oder verschachtelte Bedingungen beinhaltet.

Boolesche Logik für das Uber -Datenprojekt

Jetzt haben wir Choice 1 und Choice 2 berechnet. Was kommt als nächstes? Jetzt ist es Zeit, den Vergleich durchzuführen. Erinnere dich an unsere nächste Frage.

Boolesche Logik in Duckdb

SELECT COUNT(*) AS only_option1
FROM knowledge
WHERE "Provide Hours" >= 8
  AND CAST(REPLACE("Settle for Charge", '%', '') AS DOUBLE) >= 90
  AND "Journeys Accomplished" >= 10
  AND Ranking >= 4.7
  AND NOT ("Journeys Accomplished" >= 12 AND Ranking >= 4.7)

Hier können wir die Boolesche Logik verwenden. Wir werden eine Kombination von und und nicht verwenden.

Hier ist die Ausgabe.

Boolesche Logik in Duckdb

  • Lassen Sie es uns aufschlüsseln:
  • Die ersten vier Bedingungen finden Sie für Choice 1.

Der nicht (..) Teil wird verwendet, um Treiber auszuschließen, die sich auch für Choice 2 qualifizieren.

Es ist ziemlich einfach, oder?

4.. Schnelle Kohortengrößen mit bedingten Filtern

Manchmal möchten Sie verstehen, wie groß eine bestimmte Gruppe oder Kohorte in Ihren Daten ist.

Implementierung von bedingten Filtern in Duckdb vs Pandas?

SELECT 
  ROUND(100.0 * COUNT(*) / (SELECT COUNT(*) FROM knowledge), 2) AS share
FROM knowledge
WHERE condition_1
  AND condition_2
  AND condition_3

Duckdb verarbeitet die Kohortenfilterung und die prozentuale Berechnung mit einer SQL -Abfrage, auch einschließlich Unterabfragen.

filtered = df(
    (df("condition_1")) &
    (df("condition_2")) &
    (df("condition_3"))
)
share = spherical(100.0 * len(filtered) / len(df), 2)

Pandas erfordert Filterung, Zählung und manuelle Abteilung, um Prozentsätze zu berechnen.

Duckdb hier ist sauberer und schneller. Es minimiert die Anzahl der Schritte und vermeidet wiederholten Code.

Kohortengröße für Uber -Datenprojekt

  • Jetzt sind wir in der letzten Frage von Szenario 1. In dieser Frage möchte Uber, dass wir die Treiber herausfinden, die einige Aufgaben nicht erfüllen konnten, wie Reisen und Akzeptanzrate, aber höhere Bewertungen, insbesondere die Treiber.
  • Weniger als 10 Reisen abgeschlossen
  • Hatte eine Akzeptanzrate von weniger als 90

Hatte eine Bewertung über 4,7

SELECT 
  ROUND(100.0 * COUNT(*) / (SELECT COUNT(*) FROM knowledge), 2) AS share
FROM knowledge
WHERE "Journeys Accomplished" < 10
  AND CAST(REPLACE("Settle for Charge", '%', '') AS DOUBLE) = 4.7

Nun, dies sind drei getrennte Filter, und wir möchten den Prozentsatz der Fahrer berechnen, die jeden von ihnen erfüllen. Lassen Sie uns die Abfrage sehen.

Hier ist die Ausgabe.

Kohortengrößen in Duckdb

Hier filterten wir die Reihen, in denen alle drei Bedingungen erfüllt waren, zählten sie und teilten sie durch die Gesamtzahl der Fahrer, um einen Prozentsatz zu erhalten.

5. grundlegende arithmetische Abfragen zur Einnahmenmodellierung

Nehmen wir nun an, Sie möchten eine grundlegende Mathematik machen. Sie können Ausdrücke direkt in Ihre Auswahlanweisung schreiben.

Implementierung von Arithmetik in Duckdb gegen Pandas

SELECT 
    daily_income * work_days * weeks_per_year AS annual_revenue,
    weekly_cost * weeks_per_year AS total_cost,
    (daily_income * work_days * weeks_per_year) - (weekly_cost * weeks_per_year) AS net_income
FROM knowledge

Mit Duckdb kann die Arithmetik wie ein Taschenrechner direkt in die Auswahlklausel geschrieben werden.

daily_income = 200
weeks_per_year = 49
work_days = 6
weekly_cost = 500

annual_revenue = daily_income * work_days * weeks_per_year
total_cost = weekly_cost * weeks_per_year
net_income = annual_revenue - total_cost

Pandas benötigt mehrere Zwischenberechnungen in separaten Variablen für dasselbe Ergebnis.

Duckdb vereinfacht die mathematische Logik in einem lesbaren SQL -Block, während Pandas mit variablen Zuordnungen ein wenig überfüllt ist.

Grundarithmetik im Uber -Datenprojekt

In Szenario 2 bat Uber uns zu berechnen, wie viel Geld (nach Ausgaben) der Fahrer professional Jahr verdient, ohne mit Uber zusammenzuarbeiten. Hier sind einige Ausgaben wie Gasoline, Miete und Versicherung.

Grundarithmetik in Duckdb

SELECT 
    200 * 6 * (52 - 3) AS annual_revenue,
    200 * (52 - 3) AS gas_expense,
    500 * (52 - 3) AS rent_expense,
    400 * 12 AS insurance_expense,
    (200 * 6 * (52 - 3)) 
      - (200 * (52 - 3) + 500 * (52 - 3) + 400 * 12) AS net_income

Berechnen wir nun den Jahresumsatz und subtrahieren die Ausgaben daraus.

Hier ist die Ausgabe.

Grundarithmetik in Duckdb

Mit Duckdb können Sie dies wie einen SQL -Matrixblock schreiben. Sie benötigen keine PANDAS -Datenrahmen oder manuelle Schleifen!

6. Bedingte Berechnungen für die dynamische Kostenplanung

Was ist, wenn sich Ihre Kostenstruktur anhand bestimmter Bedingungen ändert?

Implementierung bedingter Berechnungen in Duckdb gegen Pandas

SELECT 
    original_cost * 1.05 AS increased_cost,
    original_cost * 0.8 AS discounted_cost,
    0 AS removed_cost,
    (original_cost * 1.05 + original_cost * 0.8) AS total_new_cost

Mit Duckdb können Sie eine bedingte Logik unter Verwendung von arithmetischen Anpassungen innerhalb Ihrer Abfrage anwenden.

weeks_worked = 49
fuel = 200
insurance coverage = 400

gas_expense = fuel * 1.05 * weeks_worked
insurance_expense = insurance coverage * 0.8 * 12
rent_expense = 0
complete = gas_expense + insurance_expense

Pandas verwendet dieselbe Logik mit mehreren mathematischen Zeilen und manuellen Aktualisierungen für Variablen.

Duckdb verwandelt eine mehrstufige Logik in Pandas in einen einzelnen SQL-Expression.

Bedingte Berechnungen im Uber -Datenprojekt

  • In diesem Szenario modellieren wir jetzt, was passiert, wenn der Fahrer mit Uber zusammenarbeitet und ein Auto kauft. Die Ausgaben ändern sich wie
  • Die Gaskosten steigt um 5% um 5%
  • Die Versicherung nimmt um 20% ab
con.execute("""
SELECT 
    200 * 1.05 * 49 AS gas_expense,
    400 * 0.8 * 12 AS insurance_expense,
    0 AS rent_expense,
    (200 * 1.05 * 49) + (400 * 0.8 * 12) AS total_expense
""").fetchdf()

Kein Mietkosten mehr

Hier ist die Ausgabe.

Bedingte Berechnungen in Duckdb

7. Zielgetriebene Mathematik für Einnahmenziele

Manchmal kann Ihre Analyse durch ein Geschäftsziel wie das Erträge auf ein Einnahmeziel oder die Abdeckung einer einmaligen Kosten angetrieben werden.

Implementierung von zielgerichteter Mathematik in Duckdb gegen Pandas Duckdb verarbeitet eine mehrstufige Logik mithilfeCtes

WITH vars AS (
  SELECT base_income, cost_1, cost_2, target_item
),
calc AS (
  SELECT 
    base_income - (cost_1 + cost_2) AS current_profit,
    cost_1 * 1.1 + cost_2 * 0.8 + target_item AS new_total_expense
  FROM vars
),
ultimate AS (
  SELECT 
    current_profit + new_total_expense AS required_revenue,
    required_revenue / 49 AS required_weekly_income
  FROM calc
)
SELECT required_weekly_income FROM ultimate

. Es macht die Abfrage modular und leicht zu lesen.

weeks = 49
original_income = 200 * 6 * weeks
original_cost = (200 + 500) * weeks + 400 * 12
net_income = original_income - original_cost

# new bills + automobile price
new_gas = 200 * 1.05 * weeks
new_insurance = 400 * 0.8 * 12
car_cost = 40000

required_revenue = net_income + new_gas + new_insurance + car_cost
required_weekly_income = required_revenue / weeks

Pandas erfordert die Verschachtung von Berechnungen und die Wiederverwendung früherer Variablen, um eine Duplizierung zu vermeiden.

Mit Duckdb können Sie Schritt für Schritt eine logische Pipeline erstellen, ohne Ihr Notizbuch mit verstreuten Code zu überfüllen.

Zielgesteuerte Mathematik im Uber-Datenprojekt

Nachdem wir die neuen Kosten modelliert haben, beantworten wir die endgültige Geschäftsfrage:

  • Wie viel mehr muss der Fahrer professional Woche verdienen, um beide zu tun?
  • Zahlen Sie innerhalb eines Jahres ein 40.000 US -Greenback -Auto ab

Das gleiche jährliche Nettoeinkommen beibehalten

WITH vars AS (
  SELECT 
    52 AS total_weeks_per_year,
    3 AS weeks_off,
    6 AS days_per_week,
    200 AS fare_per_day,
    400 AS monthly_insurance,
    200 AS gas_per_week,
    500 AS vehicle_rent,
    40000 AS car_cost
),
base AS (
  SELECT 
    total_weeks_per_year,
    weeks_off,
    days_per_week,
    fare_per_day,
    monthly_insurance,
    gas_per_week,
    vehicle_rent,
    car_cost,
    total_weeks_per_year - weeks_off AS weeks_worked,
    (fare_per_day * days_per_week * (total_weeks_per_year - weeks_off)) AS original_annual_revenue,
    (gas_per_week * (total_weeks_per_year - weeks_off)) AS original_gas,
    (vehicle_rent * (total_weeks_per_year - weeks_off)) AS original_rent,
    (monthly_insurance * 12) AS original_insurance
  FROM vars
),
examine AS (
  SELECT *,
    (original_gas + original_rent + original_insurance) AS original_total_expense,
    (original_annual_revenue - (original_gas + original_rent + original_insurance)) AS original_net_income
  FROM base
),
new_costs AS (
  SELECT *,
    gas_per_week * 1.05 * weeks_worked AS new_gas,
    monthly_insurance * 0.8 * 12 AS new_insurance
  FROM examine
),
ultimate AS (
  SELECT *,
    new_gas + new_insurance + car_cost AS new_total_expense,
    original_net_income + new_gas + new_insurance + car_cost AS required_revenue,
    required_revenue / weeks_worked AS required_weekly_revenue,
    original_annual_revenue / weeks_worked AS original_weekly_revenue
  FROM new_costs
)
SELECT 
  ROUND(required_weekly_revenue, 2) AS required_weekly_revenue,
  ROUND(required_weekly_revenue - original_weekly_revenue, 2) AS weekly_uplift
FROM ultimate

Schreiben wir nun den Code, der diese Logik darstellt.

Hier ist die Ausgabe.

Zielorientierte Mathematik in Duckdb

Letzte Gedanken

In diesem Artikel haben wir untersucht, wie Sie mit Duckdb eine Verbindung herstellen und Daten analysieren. Anstatt lange Pandas -Funktionen zu verwenden, haben wir SQL -Abfragen verwendet. Wir haben dies auch anhand eines realen Datenprojekts durchgeführt, das Uber im Rekrutierungsprozess von Knowledge Scientist angefordert hat.
Für Datenwissenschaftler, die an analysierten Aufgaben arbeiten, ist es eine leichte, aber leistungsstarke Various zu Pandas. Versuchen Sie es bei Ihrem nächsten Projekt, insbesondere wenn SQL Logic besser zum Downside passt.

Nate Rosidi

ist Datenwissenschaftler und in Produktstrategie. Er ist außerdem eine zusätzliche Professorin für Lehranalysen und Gründer von Stratascratch, einer Plattform, die Datenwissenschaftlern hilft, sich auf ihre Interviews mit echten Interviewfragen von Prime -Unternehmen vorzubereiten. Nate schreibt über die neuesten Traits auf dem Karrieremarkt, gibt Interviewberatung, teilt Datenwissenschaftsprojekte und deckt alles SQL ab.

Von admin

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert