Debuggen von Python -ProblemenDebuggen von Python -Problemen
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?

Debugging von Python -Problemen bei der Vorhersage der LieferdauerDebugging von Python -Problemen bei der Vorhersage der Lieferdauer

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:

  Debugging Python -Problem bei der Vorhersage der Lieferdauer  Debugging Python -Problem bei der Vorhersage der Lieferdauer

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.

Ausgabe des Debuggens des Python -Problems der Lieferdauer VorhersageAusgabe des Debuggens des Python -Problems der Lieferdauer Vorhersage

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_dashers die 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

Gemeinsame Python -Fehler in DatenwissenschaftsprojektenGemeinsame 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.

Debugging von Python -Fehlern in DatenwissenschaftsprojektenDebugging von Python -Fehlern in Datenwissenschaftsprojekten

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à!

Debugging von Python -Fehlern in der nicht gefundenen DateiDebugging von Python -Fehlern in der nicht gefundenen Datei

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.

Debugging Python -Fehler bei der Fehlinterpretation von DTYPEDebugging Python -Fehler bei der Fehlinterpretation von DTYPE

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.

Debugging von Python -Fehlern bei der Analyse von DatenDebugging von Python -Fehlern bei der Analyse von Daten

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.

KeyError beim Debuggen von Python -ProblemenKeyError beim Debuggen von Python -Problemen

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.

NAN -Zählung bei der Debugie von Python -ProblemenNAN -Zählung bei der Debugie von Python -Problemen

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.

Logische Fallstricke beim Debuggen von PythonproblemenLogische Fallstricke beim Debuggen von Pythonproblemen

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.

Umgang mit fehlenden Daten bei der Debugie von Python -ProblemenUmgang mit fehlenden Daten bei der Debugie von Python -Problemen

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.

Feature Engineering -Störungen bei Debuggen von Python -ProblemenFeature Engineering -Störungen bei Debuggen von Python -Problemen

Keine Fehler? Intestine. Aber schauen wir uns genauer an.

print(df(('subtotal', 'total_items', 'value_per_item')).pattern(3))

Hier ist die Ausgabe.

Feature Engineering -Störungen bei Debuggen von Python -ProblemenFeature Engineering -Störungen bei Debuggen von Python -Problemen

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.

Falsches Datum analysieren bei Debuggen von Python -ProblemenFalsches Datum analysieren bei Debuggen von Python -Problemen

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.

Naive Division irreführend bei der Debugie von Python -ProblemenNaive Division irreführend bei der Debugie von Python -Problemen

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.

Modellierungsfehler bei der Debugie von PythonproblemenModellierungsfehler bei der Debugie von Pythonproblemen

Lassen Sie uns dieses Drawback debuggen. Erstens suchen wir nach Nans.

print(X_train.isna().sum())

Hier ist die Ausgabe.

Debuggen von Pythonproblemen bei NAN -WertenDebuggen von Pythonproblemen bei NAN -Werten

Intestine, lass uns auch die andere Variable überprüfen.

print(y_train.isna().sum())

Hier ist die Ausgabe.

Debuggen von Pythonproblemen bei NAN -WertenDebuggen von Pythonproblemen bei NAN -Werten

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.

Datensatz des Debuggens von Python -ProblemenDatensatz des Debuggens von Python -Problemen

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:

Debugging Python in ObjektspaltenDebugging Python in Objektspalten

Sie kombinieren zwei inkompatible Datentypen in der X -Matrix:

  • Eine Spalte (actual_delivery_time) Ist datetime64.
  • Der andere (estimated_order_place_duration) Ist int64.

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.

Debugging Python in ObjektspaltenDebugging Python in Objektspalten

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.



Von admin

Schreibe einen Kommentar

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