0Pricing
Pandas & NumPy Academy · Lektion

Datenbereinigung und Feature Engineering

Wenden Sie die erweiterte Checkliste zur Datenbereinigung an, erstellen Sie Datumsmerkmale und Verhältnis-Spalten und validieren Sie den bereinigten Datensatz mit Assertions.

Datenbereinigung und Feature Engineering ist eine kostenlose Pandas & NumPy Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Pandas & NumPy Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Pandas & NumPy Academy-Kurs umfasst insgesamt 4 Lektionen.

Laden des geprüften Datensatzes

Setzen Sie das Capstone-Projekt fort, indem Sie den im vorherigen Schritt gespeicherten, bereinigten Parquet-Prüfpunkt laden. Dadurch wird die Bereinigungsphase von der Datenaufnahme entkoppelt – Sie können die Bereinigungslogik weiterentwickeln, ohne die langsamen Zusammenführungs- und Parsing-Vorgänge erneut auszuführen. Lesen Sie den bereinigten clean_orders-Parquet-Datensatz ein und überprüfen Sie, ob die Zeilenanzahl und die Datentypen den Erwartungen aus der Prüfzusammenfassung entsprechen. Die Parquet-Datei bewahrt alle Datentypen einschließlich kategorialer Spalten, sodass keine erneute Typumwandlung erforderlich ist.

import pandas as pd

# Load from checkpoint
df = pd.read_parquet('output/clean_orders.parquet')
print(f'Loaded: {df.shape}')
print(df.dtypes)
print(f'Date range: {df["order_date"].min().date()} to {df["order_date"].max().date()}')

Anwenden der erweiterten Bereinigungscheckliste

Nachdem der zusammengeführte Datensatz geladen wurde, wenden Sie die erweiterte Bereinigungscheckliste an: Entfernen Sie vollständige und partielle Duplikate anhand von order_id, begrenzen Sie Ausreißer in unit_price mithilfe der IQR-Grenzen, vereinheitlichen Sie inkonsistente Werte in category (z. B. 'Electronics' gegenüber 'electronics' und 'ELECTRONIC') und überprüfen Sie, dass quantity × unit_price bei normalen Bestellungen immer positiv ist. Jeder Schritt ist eine Funktion, die einen DataFrame entgegennimmt und zurückgibt, wodurch die Pipeline testbar und reversibel wird.

import pandas as pd
import numpy as np

def remove_duplicates(df):
    n_before = len(df)
    df = df.drop_duplicates(subset=['order_id'], keep='first')
    print(f'Duplicates removed: {n_before - len(df)}')
    return df

def standardise_categories(df):
    df['category'] = (df['category']
                      .astype(str)
                      .str.strip()
                      .str.title())
    return df

def cap_price_outliers(df):
    q1, q3 = df['unit_price'].quantile([0.25, 0.75])
    iqr = q3 - q1
    upper = q3 + 3 * iqr
    df['unit_price'] = df['unit_price'].clip(upper=upper)
    return df

df = remove_duplicates(df)
df = standardise_categories(df)
df = cap_price_outliers(df)
print('Cleaning complete.')

Entwickeln von Datumsmerkmalen

Extrahieren Sie mithilfe des .dt-Accessors zeitbezogene Merkmale aus dem Bestelldatum. Erstellen Sie die Spalten year, month, quarter, day_of_week und week_of_year. Diese Merkmale ermöglichen groupby-Analysen (monatlicher Umsatz), zeitbasierte Filter (nur Q3) und Visualisierungen. Erstellen Sie außerdem eine String-Spalte year_month (z. B. '2024-06') als verständliche Periodenbezeichnung für die Achsen von Diagrammen.

import pandas as pd

df['year'] = df['order_date'].dt.year
df['month'] = df['order_date'].dt.month
df['quarter'] = df['order_date'].dt.quarter
df['day_of_week'] = df['order_date'].dt.dayofweek  # 0=Monday
df['week'] = df['order_date'].dt.isocalendar().week.astype('int32')
df['year_month'] = df['order_date'].dt.to_period('M').astype(str)

print('Date features created:')
print(df[['order_date', 'year', 'month', 'quarter', 'year_month']].head())

Berechnen des Umsatzes pro Position

Das grundlegendste Merkmal in einem Vertriebsdatensatz ist der Umsatz pro Position: revenue = quantity × unit_price. Erstellen Sie daraus eine neue Spalte. Erstellen Sie außerdem eine Spalte gross_margin, sofern Kostendaten verfügbar sind: margin = (price - cost) / price. Diese abgeleiteten Spalten bilden die Grundlage für alle Umsatz-KPIs. Verwenden Sie stets vektorisierte Spaltenoperationen anstelle von Schleifen – eine einzige Zuweisung für die gesamte Spalte ist um Größenordnungen schneller als die zeilenweise Verarbeitung.

import pandas as pd

# Line-item revenue
df['revenue'] = (df['quantity'] * df['unit_price']).astype('float32')

# Gross margin (if unit_cost column exists)
if 'unit_cost' in df.columns:
    df['gross_margin'] = (df['unit_price'] - df['unit_cost']) / df['unit_price']

# Discount flag: orders with more than 20% off list price
if 'list_price' in df.columns:
    df['is_discounted'] = df['unit_price'] < df['list_price'] * 0.8

print('Revenue stats:')
print(df['revenue'].describe().round(2))

Zuweisen von Kundenkohorten

Eine Kohorte ist eine Gruppe von Kunden mit einem gemeinsamen Merkmal – typischerweise dem Zeitraum, in dem sie erstmals einen Kauf getätigt haben. Weisen Sie jeden Kunden seiner Akquisitionskohorte zu, indem Sie das Datum seiner ersten Bestellung ermitteln. Verwenden Sie groupby('customer_id')['order_date'].min(), um das erste Bestelldatum pro Kunde zu berechnen, und erstellen Sie anschließend die Spalte cohort_month, indem Sie das Datum in eine Jahr-Monat-Periode umwandeln. Dieses Kohortenlabel bildet die Grundlage für die Retention-Matrix in der nächsten Lektion.

import pandas as pd

# First purchase date per customer
first_purchase = (
    df.groupby('customer_id')['order_date']
    .min()
    .dt.to_period('M')
    .astype(str)
    .rename('cohort_month')
)

# Merge back onto orders
df = df.merge(first_purchase, on='customer_id', how='left')
print('Cohort distribution (top 5):')
print(df['cohort_month'].value_counts().head())
print(f'Distinct cohorts: {df["cohort_month"].nunique()}')

Merkmale für den Customer Lifetime Value

Berechnen Sie Zusammenfassungsmerkmale auf Kundenebene: Gesamtzahl der Bestellungen, Gesamtumsatz, durchschnittlicher Bestellwert, Tage seit dem ersten bzw. letzten Kauf sowie die Anzahl der verschiedenen gekauften Kategorien. Führen Sie diese Merkmale als Anreicherungsspalten auf Kundenebene wieder mit dem Haupt-DataFrame zusammen. Diese Merkmale werden für die Segmentierung (z. B. Kunden mit hohem gegenüber niedrigem Wert) und als Eingaben für Machine-Learning-Modelle zur Vorhersage von Abwanderungs- oder Upselling-Wahrscheinlichkeiten verwendet.

import pandas as pd

customer_stats = df.groupby('customer_id').agg(
    total_orders=('order_id', 'nunique'),
    total_revenue=('revenue', 'sum'),
    avg_order_value=('revenue', 'mean'),
    categories_purchased=('category', 'nunique'),
    first_order=('order_date', 'min'),
    last_order=('order_date', 'max')
).reset_index()

customer_stats['days_as_customer'] = (
    (customer_stats['last_order'] - customer_stats['first_order'])
    .dt.days
)

print(customer_stats.describe().round(2))

Schemas validieren mit Assertions

Führen Sie nach der Entwicklung der Merkmale Assertions zur Schemavalidierung aus, um zu bestätigen, dass die Daten die Erwartungen erfüllen, bevor sie an die Analysephase übergeben werden. Überprüfen Sie, dass alle erwarteten Spalten vorhanden sind, der Umsatz bei normalen Bestellungen nicht negativ ist, cohort_month nicht null ist und year_month dem Analysejahr entspricht. Diese Assertions dienen als Vertrag: Wenn eine davon fehlschlägt, wird die Pipeline sofort mit einer klaren Fehlermeldung angehalten, statt unbemerkt falsche Ergebnisse zu erzeugen.

import pandas as pd

def validate_clean_df(df):
    required_cols = ['order_id', 'customer_id', 'revenue', 'year_month',
                     'cohort_month', 'category', 'region', 'order_date']
    missing = [c for c in required_cols if c not in df.columns]
    assert not missing, f'Missing columns: {missing}'

    assert (df['revenue'] >= 0).all(), 'Negative revenue found'
    assert df['cohort_month'].notna().all(), 'Null cohort_month values'
    assert df['order_date'].notna().all(), 'Null order dates'
    print(f'Validation passed: {len(df):,} rows, {len(df.columns)} columns')

validate_clean_df(df)

Umgang mit Kategorien mit geringer Häufigkeit

In realen Datensätzen kommen manche Kategorien oder Regionen nur wenige Male vor – zu selten für eine aussagekräftige Analyse. Ersetzen Sie Werte mit geringer Häufigkeit durch 'Other', damit Diagramme nicht mit Dutzenden von Kategorien mit jeweils nur einer Bestellung überladen werden. Ein praxisnaher Schwellenwert ist: Werte, die in weniger als 0,5 % der Zeilen vorkommen, werden zusammengefasst. Das ist auch für Machine Learning wichtig: One-Hot-Encoding von 200 seltenen Kategorien verbraucht unnötig Speicher und fügt Rauschen hinzu.

import pandas as pd

def collapse_rare_values(df, col, min_pct=0.005):
    threshold = len(df) * min_pct
    counts = df[col].value_counts()
    rare = counts[counts < threshold].index
    n_rare = len(rare)
    df[col] = df[col].apply(lambda x: 'Other' if x in rare else x)
    print(f'{col}: collapsed {n_rare} rare values into "Other"')
    return df

df = collapse_rare_values(df, 'category', min_pct=0.005)
df = collapse_rare_values(df, 'region', min_pct=0.005)
print('Category distribution after collapsing:')
print(df['category'].value_counts())

Speichern des merkmalsentwickelten Datensatzes

Speichern Sie den vollständig bereinigten und mit Merkmalen versehenen DataFrame als Parquet-Prüfpunkt. Dies ist der analysebereite Datensatz – das Ergebnis aller Schritte zur Datenaufnahme, Bereinigung und Merkmalsentwicklung. Nachfolgende Phasen der Pipeline (KPI-Berechnung, Visualisierung, Berichterstellung) lesen diesen Prüfpunkt ein. Der Prüfpunkt dient außerdem als Ergebnis, das mit Teammitgliedern geteilt oder in einen Data Lake hochgeladen werden kann, damit andere es mit SQL oder Pandas abfragen können.

import pandas as pd

# Convert category columns back to Categorical for memory efficiency
for col in ['category', 'region', 'acquisition_channel']:
    if col in df.columns:
        df[col] = df[col].astype('category')

# Save analysis-ready dataset
df.to_parquet('output/analysis_ready.parquet', index=False)

# Also save customer stats for segmentation
customer_stats.to_parquet('output/customer_stats.parquet', index=False)

print(f'Analysis-ready dataset: {df.shape}')
print(f'Memory usage: {df.memory_usage(deep=True).sum()/1e6:.1f} MB')

Zusammenfassung der Merkmalsentwicklung

Eine gute Merkmalsentwicklung findet ein ausgewogenes Verhältnis zwischen dem Hinzufügen prädiktiver Signale und einer verständlichen sowie testbaren Pipeline. Die in dieser Phase erstellten Merkmale – Umsatz, Datumsteile, cohort_month, Kundenstatistiken und zusammengefasste Kategorien – wurden alle durch die in der Projekteinstellung definierten Analyseziele bestimmt. Widerstehen Sie der Versuchung, spekulativ Dutzende von Merkmalen zu erstellen. Fragen Sie sich bei jedem Merkmal: Wird es in mindestens einer KPI oder Visualisierung verwendet? Falls nicht, verschieben Sie es. Halten Sie den analysebereiten Datensatz schlank und zweckorientiert.

import pandas as pd

# Summary of engineered features
df = pd.read_parquet('output/analysis_ready.parquet')

original_cols = ['order_id', 'customer_id', 'order_date', 'quantity', 'unit_price']
engineered_cols = [c for c in df.columns if c not in original_cols]

print('Original columns:', original_cols)
print('Engineered features:', engineered_cols)
print(f'Total columns: {len(df.columns)}')
print(f'Total rows: {len(df):,}')

Entscheidungen im Code dokumentieren

Fügen Sie für jede nicht offensichtliche Bereinigungs- oder Entwicklungsentscheidung einen Kommentar hinzu, der das Warum erklärt. Sie selbst oder ein Teammitglied werden sich später nicht daran erinnern, warum Sie den IQR-Multiplikator auf 3 statt auf 1,5 gesetzt oder warum Sie 0,5 % als Schwellenwert für seltene Kategorien verwendet haben. Inline-Kommentare und ein Entscheidungsprotokoll (eine einfache Liste in der Projekt-README oder einer Markdown-Datei) machen die Pipeline wartbar und prüfbar. Sauberer, dokumentierter Code ist das eigentliche Ergebnis – die Ausgabedateien sind nur seine Konsequenz.

# Engineering decisions log
DECISIONS = '''
# Data Cleaning & Feature Engineering Decisions

## Duplicate handling
Kept first occurrence of duplicate order_id (most likely the original order).

## Outlier capping
Unit price capped at Q3 + 3*IQR (not 1.5*IQR) because price distribution
has legitimate high-value enterprise orders that should not be removed.

## Rare category threshold: 0.5%
Values below 0.5% of total orders collapsed to "Other" to keep charts readable
and avoid spurious significance in category-level tests.

## Cohort assignment
Cohort = first purchase calendar month (not signup month), because many users
sign up but do not purchase until months later.
'''
print(DECISIONS)

Kurze Überprüfung

Testen Sie Ihr Verständnis der Konzepte zur Datenanalyse aus dieser Lektion.

Zusammenfassung der Lektion

In dieser Lektion haben Sie gelernt: Modulare Bereinigungsfunktionen (Duplikate entfernen, Ausreißer begrenzen, Kategorien vereinheitlichen) nehmen jeweils einen DataFrame entgegen und geben einen zurück, wodurch sie einfach zu testen sind; durch Merkmalsentwicklung wurden Datumsteile, Umsatz pro Position, Kundenkohorten und Zusammenfassungsstatistiken erstellt; und Assertions zur Schemavalidierung sichern den Übergang von der Bereinigung zur Analyse ab. Als Nächstes berechnen wir die zentralen KPIs des Projekts: monatliche Kohorten-Retention, Produktumsatz und rollierende aktive Nutzer.

Häufig gestellte Fragen

Ist die Lektion „Datenbereinigung und Feature Engineering“ kostenlos?

Ja — der vollständige Text von „Datenbereinigung und Feature Engineering“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Pandas & NumPy Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Pandas & NumPy Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Datenbereinigung und Feature Engineering“?

Wenden Sie die erweiterte Checkliste zur Datenbereinigung an, erstellen Sie Datumsmerkmale und Verhältnis-Spalten und validieren Sie den bereinigten Datensatz mit Assertions. Du übst Pandas & NumPy Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Pandas & NumPy Academy zu starten?

Keine Vorkenntnisse erforderlich. Pandas & NumPy Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.

Wie lange dauert die Lektion „Datenbereinigung und Feature Engineering“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Pandas & NumPy Academy-Lektion Code schreiben und ausführen?

Ja. Jede Pandas & NumPy Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Projekteinrichtung und Datenimport
  2. Datenbereinigung und Feature Engineering
  3. Analyse und KPI-Berechnung
  4. Abschließende Visualisierung und Berichtexport
← Zurück zu Pandas & NumPy Academy