

Bild von Autor | Leinwand
Haben Sie jemals ein Python -Skript ausgeführt und wünscht sich sofort, Sie hätten die Eingabetaste nicht gedrückt?
Das Debuggen in der Datenwissenschaft ist nicht nur eine Handlung. Es ist eine Überlebensfähigkeit – insbesondere im Umgang mit unordentlichen Datensätzen oder der Entwicklung von Vorhersagemodellen, auf die sich tatsächliche Menschen verlassen.
In diesem Artikel werden wir die Grundlagen des Debuggens untersuchen, insbesondere in Ihren Datenwissenschafts-Workflows, indem wir einen realen Datensatz aus einem Doordash-Zustellungsjob und vor allem wie ein Profi debuggen.
Doordash -Lieferdauer Vorhersage: Womit haben wir es zu tun?


In diesen Daten ProjektDoordash bat seine Datenwissenschaftskandidaten, die Lieferdauer vorherzusagen. Schauen wir uns zuerst die Datensatzinformationen an. Hier ist der Code:
Hier ist die Ausgabe:

Es scheint, dass sie die Lieferdauer nicht zur Verfügung gestellt haben, additionally sollten Sie sie hier berechnen. Es ist einfach, aber keine Sorgen, wenn Sie Anfänger sind. Mal sehen, wie es berechnet werden kann.
import pandas as pd
from datetime import datetime
# Assuming historical_data is your DataFrame
historical_data("created_at") = pd.to_datetime(historical_data('created_at'))
historical_data("actual_delivery_time") = pd.to_datetime(historical_data('actual_delivery_time'))
historical_data("actual_total_delivery_duration") = (historical_data("actual_delivery_time") - historical_data("created_at")).dt.total_seconds()
historical_data.head()
Hier ist der Kopf des Ausgangs; Sie können das sehen actual_total_delivery_duration.

Intestine, jetzt können wir anfangen! Aber davor ist hier die Datendefinitionssprache für diesen Datensatz.
Spalten in historical_data.csv
Zeitfunktionen:
- Market_ID: Eine Stadt/Area, in der Doordash tätig ist, z. B. Los Angeles, angegeben in den Daten als ID.
- erstellt_at: Zeitstempel in UTC, als der Verbraucher doordash eingereicht wurde. (Hinweis: Dieser Zeitstempel befindet sich in UTC, aber falls Sie es benötigen, conflict die tatsächliche Zeitzone der Area US/Pacific).
- TRIX_DELIVERY_TIME: Zeitstempel in UTC, wenn die Bestellung an den Verbraucher geliefert wurde.
Speicherfunktionen:
- store_id: Eine ID, die das Restaurant repräsentiert, für die die Bestellung eingereicht wurde.
- store_primary_category: Küche Kategorie des Eating places, z. B. Italienisch, Asiaten.
- Order_Protocol: Ein Geschäft kann über viele Modi Bestellungen von Doordash erhalten. Dieses Feld repräsentiert eine ID, die das Protokoll bezeichnet.
Bestellfunktionen:
- Total_items: Gesamtzahl der Elemente in der Reihenfolge.
- Subtotal: Gesamtwert der eingereichten Bestellung (in Cent).
- num_distinct_items: Anzahl der in der Reihenfolge enthaltenen unterschiedlichen Elemente.
- min_item_price: Preis des Artikels mit den geringsten Kosten in der Bestellung (in Cent).
- MAX_ITEM_PRICE: Preis des Artikels mit den höchsten Kosten in der Bestellung (in Cent).
Marktmerkmale:
Als Marktplatz haben wir Informationen über den Zustand des Marktes, wenn die Bestellung aufgegeben wird, die zur Schätzung der Lieferzeit verwendet werden können. Die folgenden Merkmale sind Werte zum Zeitpunkt von created_at (Einreichungszeit bestellen):
- Total_onShift_Dashers: Anzahl der verfügbaren Dashers, die zum Zeitpunkt der Auftragserstellung innerhalb von 10 Meilen vom Laden entfernt sind.
- Total_busy_dashers: Teilmenge des obigen
total_onshift_dashersdie derzeit an einer Bestellung arbeiten. - Total_outhting_orders: Anzahl der Bestellungen innerhalb von 10 Meilen nach dieser Bestellung, die derzeit bearbeitet werden.
Vorhersagen aus anderen Modellen:
Wir haben Vorhersagen aus anderen Modellen für verschiedene Phasen des Lieferprozesses, den wir verwenden können:
- geschätzt_order_place_duration: Geschätzte Zeit für das Restaurant, um die Bestellung von Doordash (in Sekunden) zu erhalten.
- ESTAUATATED_STORE_TO_CONSUMER_DRIVING_DIERUNG: Geschätzte Reisezeit zwischen Retailer und Verbraucher (in Sekunden).
Großartig, additionally lass uns anfangen!
Gemeinsame Python -Fehler in Datenwissenschaftsprojekten

In diesem Abschnitt werden wir gemeinsame Debugging -Fehler in einem der entdecken DatenwissenschaftsprojekteBeginnen Sie mit dem Lesen des Datensatzes und dem wichtigsten Teil: Modellierung.
Lesen des Datensatzes: FileNotFoundErrorDTYPE -Warnung und Korrekturen
Fall 1: Datei nicht gefunden – Klassiker
In der Information Science begrüßt Ihr erster Fehler Sie oft bei read_csv. Und nicht mit einem Hallo. Lassen Sie uns diesen genauen Second zusammen debuggen, Linie für Linie. Hier ist der Code:
import pandas as pd
strive:
df = pd.read_csv('Strata Questions/historical_data.csv')
df.head(3)
besides FileNotFoundError as e:
import os
print("File not discovered. Here is the place Python is wanting:")
print("Working listing:", os.getcwd())
print("Accessible recordsdata:", os.listdir())
increase e
Hier ist die Ausgabe.

Sie erhöhen nicht nur einen Fehler – Sie befragen ihn. Dies zeigt, wo der Code denkt, dass er ist und was er um ihn herum sieht. Wenn Ihre Datei nicht in der Liste steht, wissen Sie jetzt. Keine Vermutung. Nur Fakten.
Ersetzen Sie den Pfad durch den vollen und voilà!

Fall 2: DTYPE -Fehlinterpretation – Pythons leise falscher Vermutung
Sie laden den Datensatz, aber etwas ist aus. Der Fehler versteckt sich in Ihren Typen.
# Assuming df is your loaded DataFrame
strive:
print("Column Varieties:n", df.dtypes)
besides Exception as e:
print("Error studying dtypes:", e)
Hier ist die Ausgabe.

Fall 3: Datum an Parsen – Der stille Saboteur
Wir haben festgestellt, dass wir zuerst die Lieferdauer berechnen sollten, und wir haben sie mit dieser Methode gemacht.
strive:
# This code was proven earlier to calculate the supply period
df("created_at") = pd.to_datetime(df('created_at'))
df("actual_delivery_time") = pd.to_datetime(df('actual_delivery_time'))
df("actual_total_delivery_duration") = (df("actual_delivery_time") - df("created_at")).dt.total_seconds()
print("Efficiently calculated supply period and checked dtypes.")
print("Related dtypes:n", df(('created_at', 'actual_delivery_time', 'actual_total_delivery_duration')).dtypes)
besides Exception as e:
print("Error throughout date processing:", e)
Hier ist die Ausgabe.

Intestine und professionell! Jetzt vermeiden wir diese roten Fehler, die unsere Stimmung erhöhen – ich weiß, dass es Ihre Motivation dämpfen kann.
Umgang mit fehlenden Daten: KeyErrorsAnwesend NaNsund logische Fallstricke
Einige Fehler stürzen Ihren Code nicht ab. Sie geben Ihnen nur die falschen Ergebnisse, bis Sie sich fragen, warum Ihr Modell Müll ist.
In diesem Abschnitt geht es zu fehlenden Daten – nicht nur, wie man sie reinigt, sondern wie man sie ordnungsgemäß debuggiert.
Fall 1: KeyError – Sie dachten, diese Spalte existierte
Hier ist unser Code.
strive:
print(df('store_rating'))
besides KeyError as e:
print("Column not discovered:", e)
print("Listed below are the accessible columns:n", df.columns.tolist())
Hier ist die Ausgabe.

Der Code brach wegen der Logik nicht; Es brach wegen einer Annahme. Genau das ist der Debugging -Debugging. Pay attention Sie Ihre Spalten immer auf, bevor Sie sie blind zugreifen.
Fall 2: Nan Depend – Fehlende Werte, die Sie nicht erwartet haben
Sie nehmen an, alles ist sauber. Aber reale Daten vereinen immer Lücken. Lassen Sie uns nach ihnen suchen.
strive:
null_counts = df.isnull().sum()
print("Nulls per column:n", null_counts(null_counts > 0))
besides Exception as e:
print("Failed to examine nulls:", e)
Hier ist die Ausgabe.

Dies enthüllt die stillen Unruhestifter. Vielleicht store_primary_category fehlt in Tausenden von Reihen. Vielleicht fehlgeschlagen Zeitstempel die Konvertierung und sind jetzt jetzt NaT.
Sie hätten es nicht gewusst, wenn Sie nicht überprüft hätten. Debugging – Bestätigung jeder Annahme.
Fall 3: Logische Fallstricke – Fehlende Daten, die tatsächlich nicht fehlen
Nehmen wir an, Sie versuchen, Bestellungen zu filtern, bei denen der Subtotal von mehr als 1.000.000 liegt und Hunderte von Reihen erwartet. Aber das gibt dir Null:
strive:
filtered = df(df('subtotal') > 1000000)
print("Rows with subtotal > 1,000,000:", filtered.form(0))
besides Exception as e:
print("Filtering error:", e)
Das ist kein Codefehler – es ist ein logischer Fehler. Sie haben hochwertige Bestellungen erwartet, aber vielleicht gibt es keine über dieser Schwelle. Debuggen Sie es mit einem Reichweitescheck:
print("Subtotal vary:", df('subtotal').min(), "to", df('subtotal').max())
Hier ist die Ausgabe.

Fall 4: isna() ≠ Null bedeutet nicht, dass es sauber ist
Selbst wenn isna().sum() Zeigt Null an, es gibt möglicherweise schmutzige Daten wie Whitespace oder ‚None‘ als Zeichenfolge. Führen Sie eine aggressivere Überprüfung durch:
strive:
fake_nulls = df(df('store_primary_category').isin(('', ' ', 'None', None)))
print("Rows with faux lacking classes:", fake_nulls.form(0))
besides Exception as e:
print("Pretend lacking worth test failed:", e)
Dies fängt versteckten Müll, das isnull() Fehler.

Function Engineering -Störungen: TypeErrorsDatum an Parsen und mehr
Function Engineering scheint zunächst Spaß zu haben, bis Ihre neue Spalte jedes Modell bricht oder a wirft TypeError Mittelpipeline. Hier erfahren Sie, wie Sie diese Section debuggen, wie jemand, der zuvor verbrannt wurde.
Fall 1: Sie denken, Sie können sich teilen, aber Sie können nicht
Lassen Sie uns eine neue Funktion erstellen. Wenn ein Fehler auftritt, ist unser try-except Block wird es fangen.
strive:
df('value_per_item') = df('subtotal') / df('total_items')
print("value_per_item created efficiently")
besides Exception as e:
print("Error occurred:", e)
Hier ist die Ausgabe.

Keine Fehler? Intestine. Aber schauen wir uns genauer an.
print(df(('subtotal', 'total_items', 'value_per_item')).pattern(3))
Hier ist die Ausgabe.

Fall 2: Datum der Parsen schief gegangen
Jetzt ändern Sie Ihre dtype Ist wichtig, aber was ist, wenn Sie der Meinung sind, dass alles richtig gemacht wurde, aber Probleme bestehen bleiben?
# That is the usual method, however it may fail silently on blended sorts
df("created_at") = pd.to_datetime(df("created_at"))
df("actual_delivery_time") = pd.to_datetime(df("actual_delivery_time"))
Sie denken vielleicht, dass es in Ordnung ist, aber wenn Ihre Spalte gemischte Typen hat, kann sie stillschweigend scheitern oder Ihre Pipeline brechen. Deshalb ist es anstatt direkt Transformationen vorzunehmen, eine robuste Funktion zu verwenden.
from datetime import datetime
def parse_date_debug(df, col):
strive:
parsed = pd.to_datetime(df(col))
print(f"(SUCCESS) '{col}' parsed efficiently.")
return parsed
besides Exception as e:
print(f"(ERROR) Did not parse '{col}':", e)
# Discover non-date-like values to debug
non_datetimes = df(pd.to_datetime(df(col), errors="coerce").isna())(col).distinctive()
print("Pattern values inflicting difficulty:", non_datetimes(:5))
increase
df("created_at") = parse_date_debug(df, "created_at")
df("actual_delivery_time") = parse_date_debug(df, "actual_delivery_time")
Hier ist die Ausgabe.

Dies hilft Ihnen, fehlerhafte Zeilen zu verfolgen, wenn die Parsen von DateTime abfällt.
Fall 3: Naive Division, die irreführen könnte
Dies macht keinen Fehler in unseren Datenrahmen, da die Spalten bereits numerisch sind. Aber hier ist das Drawback: Einige Datensätze schleichen sich an Objekttypen, auch wenn sie wie Zahlen aussehen. Das führt zu:
- Irreführende Verhältnisse
- Falsches Modellverhalten
- Keine Warnungen
df("busy_dashers_ratio") = df("total_busy_dashers") / df("total_onshift_dashers")
Validieren wir vor dem Computertypen, auch wenn der Vorgang keinen Fehler macht.
import numpy as np
def create_ratio_debug(df, num_col, denom_col, new_col):
num_type = df(num_col).dtype
denom_type = df(denom_col).dtype
if not np.issubdtype(num_type, np.quantity) or not np.issubdtype(denom_type, np.quantity):
print(f"(TYPE WARNING) '{num_col}' or '{denom_col}' is just not numeric.")
print(f"{num_col}: {num_type}, {denom_col}: {denom_type}")
df(new_col) = np.nan
return df
if (df(denom_col) == 0).any():
print(f"(DIVISION WARNING) '{denom_col}' incorporates zeros.")
df(new_col) = df(num_col) / df(denom_col)
return df
df = create_ratio_debug(df, "total_busy_dashers", "total_onshift_dashers", "busy_dashers_ratio")
Hier ist die Ausgabe.

Dies gibt eine Sichtbarkeit in potenziellen Problemen von Division zu Null und verhindert stille Fehler.
Modellierungsfehler: Formen Sie Mismatch und Bewertungsverwirrung
Fall 1: NAN -Werte in Funktionen bewirken das Modell zum Absturz
Nehmen wir an, wir wollen ein lineares Regressionsmodell erstellen. LinearRegression() unterstützt NAN -Werte nicht nativ. Wenn eine Zeile in X einen fehlenden Wert hat, weigert sich das Modell zu trainieren.
Hier ist der Code, der absichtlich eine Formfehlanpassung erstellt, um einen Fehler auszulösen:
from sklearn.linear_model import LinearRegression
X_train = df(("estimated_order_place_duration", "estimated_store_to_consumer_driving_duration")).iloc(:-10)
y_train = df("actual_total_delivery_duration").iloc(:-5)
mannequin = LinearRegression()
mannequin.match(X_train, y_train)
Hier ist die Ausgabe.

Lassen Sie uns dieses Drawback debuggen. Erstens suchen wir nach Nans.
print(X_train.isna().sum())
Hier ist die Ausgabe.

Intestine, lass uns auch die andere Variable überprüfen.
print(y_train.isna().sum())
Hier ist die Ausgabe.

Die Mismatch- und NAN -Werte müssen gelöst werden. Hier ist der Code, um ihn zu beheben.
from sklearn.linear_model import LinearRegression
# Re-align X and y to have the identical size
X = df(("estimated_order_place_duration", "estimated_store_to_consumer_driving_duration"))
y = df("actual_total_delivery_duration")
# Step 1: Drop rows with NaN in options (X)
valid_X = X.dropna()
# Step 2: Align y to match the remaining indices of X
y_aligned = y.loc(valid_X.index)
# Step 3: Discover indices the place y is just not NaN
valid_idx = y_aligned.dropna().index
# Step 4: Create closing clear datasets
X_clean = valid_X.loc(valid_idx)
y_clean = y_aligned.loc(valid_idx)
mannequin = LinearRegression()
mannequin.match(X_clean, y_clean)
print("✅ Mannequin educated efficiently!")
Und voilà! Hier ist die Ausgabe.

Fall 2: Objektspalten (Daten) stürmen das Modell ab
Angenommen, Sie versuchen, ein Modell mit einem Zeitstempel wie zu trainieren actual_delivery_time.
Aber – oh nein – es ist immer noch ein Objekt oder ein DateTime -Typ, und Sie mischen es versehentlich mit numerischen Spalten. Lineare Regression magazine das nicht ein bisschen.
from sklearn.linear_model import LinearRegression
X = df(("actual_delivery_time", "estimated_order_place_duration"))
y = df("actual_total_delivery_duration")
mannequin = LinearRegression()
mannequin.match(X, y)
Hier ist der Fehlercode:

Sie kombinieren zwei inkompatible Datentypen in der X -Matrix:
- Eine Spalte (
actual_delivery_time) Istdatetime64. - Der andere (
estimated_order_place_duration) Istint64.
Scikit-Be taught erwartet, dass alle Funktionen gleich numerisch sind. Es kann nicht gemischte Typen wie DateTime und int verarbeiten. Lassen Sie es uns lösen, indem Sie die DateTime -Spalte in eine numerische Darstellung konvertieren (UNIX -Zeitstempel).
# Guarantee datetime columns are parsed accurately, coercing errors to NaT
df("actual_delivery_time") = pd.to_datetime(df("actual_delivery_time"), errors="coerce")
df("created_at") = pd.to_datetime(df("created_at"), errors="coerce")
# Recalculate period in case of recent NaNs
df("actual_total_delivery_duration") = (df("actual_delivery_time") - df("created_at")).dt.total_seconds()
# Convert datetime to a numeric function (Unix timestamp in seconds)
df("delivery_time_timestamp") = df("actual_delivery_time").astype("int64") // 10**9
Intestine. Nachdem die DTypes numerisch sind, wenden wir das ML -Modell an.
from sklearn.linear_model import LinearRegression
# Use the brand new numeric timestamp function
X = df(("delivery_time_timestamp", "estimated_order_place_duration"))
y = df("actual_total_delivery_duration")
# Drop any remaining NaNs from our function set and goal
X_clean = X.dropna()
y_clean = y.loc(X_clean.index).dropna()
X_clean = X_clean.loc(y_clean.index)
mannequin = LinearRegression()
mannequin.match(X_clean, y_clean)
print("✅ Mannequin educated efficiently!")
Hier ist die Ausgabe.

Toller Job!
Letzte Gedanken: Debuggen intelligenter, nicht härter
Modellabstürze stammen nicht immer aus komplexen Fehlern – manchmal ist es nur eine streunende Nan oder eine nicht konvertierte Date -Spalte, die sich in Ihre Datenpipeline schlich.
Anstatt mit kryptischen Stapelspuren oder Werfen zu ringen try-except Blöcke wie Darts im Dunkeln, graben früh in Ihren Datenrahmen ein. Blick auf .information()überprüfen .isna().sum()und scheuen Sie sich nicht vor .dtypes. Diese einfachen Schritte enthüllen versteckte Landminen, bevor Sie überhaupt getroffen haben match().
Ich habe Ihnen gezeigt, dass selbst ein übersehener Objekttyp oder ein hinterhältiger fehlender Wert ein Modell sabotieren kann. Mit einem schärferen Auge, einer saubereren Vorbereitung und einer absichtlichen Function -Extraktion wechseln Sie jedoch von Debugging reaktiv zum Aufbau clever.
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.
