

Bild vom Herausgeber
# Einführung
Entsprechend CrowdFlowers UmfrageDatenwissenschaftler verbringen 60 % ihrer Zeit damit, die Daten zu organisieren und zu bereinigen.
In diesem Artikel führen wir den Aufbau einer Datenbereinigungspipeline anhand eines realen Datensatzes von DoorDash durch. Es enthält quick 200.000 Lebensmittellieferungsdatensätze, von denen jeder Dutzende Funktionen wie Lieferzeit, Gesamtzahl der Artikel und Filialkategorie (z. B. mexikanische, thailändische oder amerikanische Küche) enthält.
# Vorhersage von Essenslieferzeiten mit DoorDash-Daten


Ziel von DoorDash ist es, die Zeit, die für die Lieferung von Lebensmitteln benötigt wird, genau abzuschätzen, von dem Second, in dem ein Kunde eine Bestellung aufgibt, bis zu dem Zeitpunkt, an dem es an seiner Tür ankommt. In dieses DatenprojektWir haben die Aufgabe, ein Modell zu entwickeln, das die Gesamtlieferdauer auf Foundation historischer Lieferdaten vorhersagt.
Wir werden jedoch nicht das gesamte Projekt durchführen, dh wir werden kein Vorhersagemodell erstellen. Stattdessen verwenden wir den im Projekt bereitgestellten Datensatz und erstellen eine Datenbereinigungspipeline.
Unser Workflow besteht aus zwei Hauptschritten.

# Datenexploration

Beginnen wir mit dem Laden und Anzeigen der ersten Zeilen des Datensatzes.
// Laden Sie den Datensatz und zeigen Sie eine Vorschau an
import pandas as pd
df = pd.read_csv("historical_data.csv")
df.head()
Hier ist die Ausgabe.

Dieser Datensatz enthält Datums-/Uhrzeitspalten, die den Zeitpunkt der Auftragserstellung und die tatsächliche Lieferzeit erfassen, die zur Berechnung der Lieferzeit verwendet werden können. Es enthält außerdem weitere Funktionen wie Filialkategorie, Gesamtartikelanzahl, Zwischensumme und Mindestartikelpreis, wodurch es für verschiedene Arten der Datenanalyse geeignet ist. Wir können bereits erkennen, dass es einige NaN-Werte gibt, die wir im folgenden Schritt genauer untersuchen werden.
// Entdecken Sie die Spalten mit data()
Lassen Sie uns alle Spaltennamen mit dem überprüfen Information() Verfahren. Wir werden diese Methode im gesamten Artikel verwenden, um die Änderungen in der Anzahl der Spaltenwerte anzuzeigen. Dies ist ein guter Indikator für fehlende Daten und den allgemeinen Datenzustand.
Hier ist die Ausgabe.

Wie Sie sehen, haben wir 15 Spalten, aber die Anzahl der Nicht-Null-Werte unterscheidet sich zwischen ihnen. Das bedeutet, dass einige Spalten fehlende Werte enthalten, die sich bei unsachgemäßer Handhabung auf unsere Analyse auswirken könnten. Eine letzte Sache: die erstellt_at Und tatsächliche_Lieferzeit Datentypen sind Objekte; Diese sollten datetime sein.
# Aufbau einer Datenbereinigungspipeline
In diesem Schritt erstellen wir eine strukturierte Datenbereinigungspipeline, um den Datensatz für die Modellierung vorzubereiten. In jeder Section werden häufige Probleme wie Zeitstempelformatierung, fehlende Werte und irrelevante Funktionen behandelt.

// Korrigieren der Datentypen der Datums- und Uhrzeitspalten
Bevor wir die Datenanalyse durchführen, müssen wir die Spalten korrigieren, die die Zeit anzeigen. Ansonsten gilt die von uns erwähnte Berechnung (tatsächliche_Lieferzeit – erstellt_at) wird schief gehen.
Was wir reparieren:
- erstellt_at: als die Bestellung aufgegeben wurde
- tatsächliche_Lieferzeit: als das Essen ankam
Diese beiden Spalten werden als Objekte gespeichert. Um Berechnungen korrekt durchführen zu können, müssen wir sie in das Datum-Uhrzeit-Format konvertieren. Dazu können wir Datum/Uhrzeit-Funktionen verwenden Pandas. Hier ist der Code.
import pandas as pd
df = pd.read_csv("historical_data.csv")
# Convert timestamp strings to datetime objects
df("created_at") = pd.to_datetime(df("created_at"), errors="coerce")
df("actual_delivery_time") = pd.to_datetime(df("actual_delivery_time"), errors="coerce")
df.data()
Hier ist die Ausgabe.

Wie Sie dem obigen Screenshot entnehmen können, ist die erstellt_at Und tatsächliche_Lieferzeit sind jetzt Datetime-Objekte.

Zu den Schlüsselspalten gehören store_primary_category hat die wenigsten Nicht-Null-Werte (192.668), was bedeutet, dass es die meisten fehlenden Daten aufweist. Deshalb konzentrieren wir uns zunächst auf die Reinigung.
// Datenimputation mit mode()
Eine der chaotischsten Spalten im Datensatz, erkennbar an der hohen Anzahl fehlender Werte, ist store_primary_category. Es zeigt uns, welche Arten von Lebensmittelgeschäften es gibt, etwa mexikanische, amerikanische und thailändische. Allerdings fehlen diese Informationen in vielen Zeilen, was ein Downside darstellt. Es kann beispielsweise die Artwork und Weise einschränken, wie wir die Daten gruppieren oder analysieren können. Wie beheben wir das Downside?
Wir werden diese Zeilen füllen, anstatt sie zu löschen. Dazu nutzen wir eine intelligentere Imputation.
Wir schreiben ein Wörterbuch, das jeden abbildet store_id Ordnen Sie der am häufigsten vorkommenden Kategorie zu und verwenden Sie dann diese Zuordnung, um fehlende Werte zu ergänzen. Sehen wir uns vorher den Datensatz an.

Hier ist der Code.
import numpy as np
# International most-frequent class as a fallback
global_mode = df("store_primary_category").mode().iloc(0)
# Construct store-level mapping to essentially the most frequent class (quick and sturdy)
store_mode = (
df.groupby("store_id")("store_primary_category")
.agg(lambda s: s.mode().iloc(0) if not s.mode().empty else np.nan)
)
# Fill lacking classes utilizing the store-level mode, then fall again to world mode
df("store_primary_category") = (
df("store_primary_category")
.fillna(df("store_id").map(store_mode))
.fillna(global_mode)
)
df.data()
Hier ist die Ausgabe.

Wie Sie dem obigen Screenshot entnehmen können, ist die store_primary_category Die Spalte hat jetzt eine höhere Nicht-Null-Anzahl. Aber überprüfen wir es noch einmal mit diesem Code.
df("store_primary_category").isna().sum()
Hier ist die Ausgabe, die die Anzahl der NaN-Werte zeigt. Es ist Null; wir haben sie alle losgeworden.

Und sehen wir uns den Datensatz nach der Imputation an.


// Verbleibende NaNs löschen
Im vorherigen Schritt haben wir das korrigiert store_primary_categoryaber ist dir etwas aufgefallen? Die Nicht-Null-Zählungen in den Spalten stimmen immer noch nicht überein!
Dies ist ein klares Zeichen dafür, dass es in einigen Teilen des Datensatzes immer noch um fehlende Werte geht. Wenn es um die Datenbereinigung geht, haben wir nun zwei Möglichkeiten:
- Füllen Sie diese fehlenden Werte aus
- Lass sie fallen
Angesichts der Tatsache, dass dieser Datensatz quick 200.000 Zeilen enthält, können wir es uns leisten, einige zu verlieren. Bei kleineren Datensätzen müssen Sie vorsichtiger sein. In diesem Fall ist es ratsam, jede Spalte zu analysieren, Requirements festzulegen (zu entscheiden, wie fehlende Werte gefüllt werden – unter Verwendung des Mittelwerts, des Medians, des häufigsten Werts oder domänenspezifischer Standardwerte) und sie dann zu füllen.
Um die NaNs zu entfernen, verwenden wir die dropna() Methode aus der Pandas-Bibliothek. Wir stellen ein inplace=True um die Änderungen direkt auf den DataFrame anzuwenden, ohne ihn erneut zuweisen zu müssen. Sehen wir uns den Datensatz an dieser Stelle an.

Hier ist der Code.
df.dropna(inplace=True)
df.data()
Hier ist die Ausgabe.

Wie Sie dem Screenshot oben entnehmen können, enthält jede Spalte nun die gleiche Anzahl an Nicht-Null-Werten.
Sehen wir uns den Datensatz nach allen Änderungen an.

// Was können Sie als nächstes tun?
Da wir nun über einen sauberen Datensatz verfügen, können Sie als Nächstes Folgendes tun:
- Führen Sie EDA durch Liefermuster zu verstehen.
- Entwickeln Sie neue Funktionen wie Lieferzeiten oder die Quote der ausgelasteten Mitarbeiter, um Ihrer Analyse mehr Aussagekraft zu verleihen.
- Zusammenhänge analysieren zwischen Variablen, um die Leistung Ihres Modells zu steigern.
- Erstellen Sie verschiedene Regressionsmodelle und finden Sie das leistungsstärkste Modell.
- Prognostizieren Sie die Lieferzeit mit dem leistungsstärksten Modell.
# Letzte Gedanken
In diesem Artikel haben wir den realen Datensatz von DoorDash bereinigt, indem wir häufig auftretende Datenqualitätsprobleme behoben haben, z. B. die Korrektur falscher Datentypen und die Behandlung fehlender Werte. Wir haben eine einfache, auf dieses Datenprojekt zugeschnittene Datenbereinigungspipeline erstellt und mögliche nächste Schritte untersucht.
Datensätze aus der realen Welt können chaotischer sein, als Sie denken, aber es gibt auch viele Methoden und Methods, um diese Probleme zu lösen. Danke fürs Lesen!
Nate Rosidi ist Datenwissenschaftler und in der Produktstrategie tätig. Er ist außerdem außerordentlicher Professor für Analytik und Gründer von StrataScratch, einer Plattform, die Datenwissenschaftlern hilft, sich mit echten Interviewfragen von Prime-Unternehmen auf ihre Interviews vorzubereiten. Nate schreibt über die neuesten Traits auf dem Karrieremarkt, gibt Ratschläge zu Vorstellungsgesprächen, stellt Knowledge-Science-Projekte vor und behandelt alles rund um SQL.
