Wie ich mit einem unordentlichen DoorDash-Datensatz eine Datenbereinigungspipeline erstellt habeWie ich mit einem unordentlichen DoorDash-Datensatz eine Datenbereinigungspipeline erstellt habe
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

Vorhersage von Essenslieferzeiten mit DoorDash-DatenVorhersage 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.

DatenbereinigungspipelineDatenbereinigungspipeline

# Datenexploration

DatenbereinigungspipelineDatenbereinigungspipeline

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.

DatenbereinigungspipelineDatenbereinigungspipeline

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.

DatenbereinigungspipelineDatenbereinigungspipeline

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.

Aufbau einer DatenbereinigungspipelineAufbau einer Datenbereinigungspipeline

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

Aufbau einer DatenbereinigungspipelineAufbau einer Datenbereinigungspipeline

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

Aufbau einer DatenbereinigungspipelineAufbau einer Datenbereinigungspipeline

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.

Datenimputation mit ModusDatenimputation mit Modus

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.

Datenimputation mit ModusDatenimputation mit Modus

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.

Datenimputation mit ModusDatenimputation mit Modus

Und sehen wir uns den Datensatz nach der Imputation an.

Datenimputation mit ModusDatenimputation mit Modus

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

NaNs fallen lassenNaNs fallen lassen

Hier ist der Code.

df.dropna(inplace=True)
df.data()

Hier ist die Ausgabe.

NaNs fallen lassenNaNs fallen lassen

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.

NaNs fallen lassenNaNs fallen lassen

// 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:

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



Von admin

Schreibe einen Kommentar

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