Datarensning och egenskapsskapande
Tillämpa den avancerade checklistan för datarensning, skapa datumegenskaper och kvotkolumner och validera den rena datamängden med assertioner.
Datarensning och egenskapsskapande är en gratis lektion i Pandas & NumPy Academy på CoddyKit. Detta är lektion 2 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Pandas & NumPy Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Pandas & NumPy Academy innehåller totalt 4 lektioner.
Läsa in det granskade datasetet
Fortsätt med slutprojektet genom att läsa in den rena Parquet-kontrollpunkt som sparades i föregående steg. Det kopplar bort rensningssteget från dataimporten — ni kan iterera över rensningslogiken utan att köra om de långsamma sammanfognings- och tolkningsoperationerna. Läs in den rena clean_orders-Parquet-filen och kontrollera att antalet rader och dtypes stämmer överens med förväntningarna från granskningssammanfattningen. Parquet-filen bevarar alla dtypes, inklusive kategorikolumner, så ingen ny typkonvertering behövs.
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()}')Tillämpa den avancerade checklistan för datarensning
När det sammanfogade datasetet har lästs in tillämpar ni den avancerade checklistan för datarensning: ta bort exakta och partiella dubbletter på order_id, begränsa avvikande värden i unit_price med hjälp av IQR-gränser, standardisera inkonsekventa värden i category (till exempel 'Electronics' jämfört med 'electronics' och 'ELECTRONIC'), och kontrollera att quantity × unit_price alltid är positivt för normala order. Varje steg är en funktion som tar emot och returnerar en DataFrame, vilket gör pipelinen testbar och reversibel.
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.')Skapa datumfeatures
Extrahera tidsrelaterade features från orderdatumet med hjälp av accessorn .dt. Skapa kolumnerna year, month, quarter, day_of_week och week_of_year. Dessa features används i groupby-analyser (månadsintäkter), tidsbaserade filter (endast Q3) och visualiseringar. Skapa även en strängkolumn year_month (till exempel '2024-06') som en lättläst periodetikett för diagramaxlar.
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())Beräkna intäkt per orderrad
Den mest grundläggande featuren i ett försäljningsdataset är intäkt per orderrad: revenue = quantity × unit_price. Skapa detta som en ny kolumn. Skapa även en kolumn gross_margin om kostnadsdata finns tillgänglig: margin = (price - cost) / price. Dessa härledda kolumner utgör grunden för alla intäkts-KPI:er. Använd alltid vektoriserade kolumnoperationer i stället för loopar — en enda tilldelning för hela kolumnen är många storleksordningar snabbare än att iterera rad för rad.
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))Tilldela kundkohorter
En kohort är en grupp kunder som delar en egenskap — vanligtvis den tidsperiod då de genomförde sitt första köp. Tilldela varje kund en förvärvskohort genom att hitta datumet för den första ordern. Använd groupby('customer_id')['order_date'].min() för att beräkna det första orderdatumet per kund och skapa sedan en kolumn cohort_month genom att konvertera datumet till en år-månad-period. Denna kohortetikett utgör grunden för retentionmatrisen i nästa 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()}')Features för kundens livstidsvärde
Beräkna sammanfattande features på kundnivå: totalt antal order, totala intäkter, genomsnittligt ordervärde, antal dagar sedan det första respektive senaste köpet och antal unika kategorier som kunden har köpt från. Lägg samman dessa med huvud-DataFrame:n som berikande kolumner på kundnivå. Dessa features används för segmentering (till exempel kunder med högt respektive lågt värde) och som indata till maskininlärningsmodeller som förutsäger kundbortfall eller sannolikheten för merförsäljning.
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))Validera schemat med assertions
När ni har skapat features kör ni assertions för schemavalidering för att bekräfta att data uppfyller förväntningarna innan den skickas vidare till analyssteget. Kontrollera att alla förväntade kolumner finns, att revenue är icke-negativt för normala order, att cohort_month inte är null och att year_month motsvarar analysåret. Dessa assertions fungerar som ett kontrakt: om någon assertion misslyckas stoppas pipelinen omedelbart med ett tydligt felmeddelande i stället för att i tysthet producera felaktiga resultat.
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)Hantera kategorier med låg frekvens
I verkliga dataset förekommer vissa kategorier eller regioner bara ett fåtal gånger — för få för meningsfull analys. Ersätt värden med låg frekvens med 'Other' för att undvika diagram som fylls med dussintals kategorier med en enda order. En praktisk gräns är att slå ihop värden som förekommer i färre än 0,5 % av raderna. Detta är också viktigt för maskininlärning: one-hot-kodning av 200 sällsynta kategorier slösar minne och tillför brus.
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())Spara det featurekonstruerade datasetet
Spara den fullständigt rensade och featurekonstruerade DataFrame:n som en Parquet-kontrollpunkt. Detta är det analysklara datasetet — resultatet av alla steg för dataimport, datarensning och featurekonstruktion. Efterföljande steg i pipelinen (KPI-beräkning, visualisering och rapportering) läser från denna kontrollpunkt. Kontrollpunkten fungerar även som en leverans: den kan delas med teammedlemmar eller laddas upp till ett datasjö för att andra ska kunna fråga mot den med SQL eller Pandas.
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')Sammanfattning av featurekonstruktionen
God featurekonstruktion balanserar tillförseln av prediktiv signal mot att hålla pipelinen begriplig och testbar. De features som skapades i detta steg — intäkter, datumdelar, cohort_month, kundstatistik och sammanslagna kategorier — styrdes alla av analysmålen som definierades i projektkonfigurationen. Motstå frestelsen att skapa dussintals features på spekulation. Fråga för varje feature: kommer den att användas i minst en KPI eller visualisering? Om inte, vänta med den. Håll det analysklara datasetet litet och ändamålsenligt.
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):,}')Dokumentera beslut i koden
För varje rensnings- eller konstruktionsbeslut som inte är självklart ska ni lägga till en kommentar som förklarar varför. Ni själva i framtiden (eller en teammedlem) kommer inte att minnas varför ni satte IQR-multiplikatorn till 3 i stället för 1,5, eller varför ni använde 0,5 % som gräns för sällsynta kategorier. Inline-kommentarer och en beslutslogg (en enkel lista i projektets README eller en markdown-fil) gör pipelinen lättare att underhålla och granska. Ren och dokumenterad kod är den egentliga leveransen — utdatafilerna är bara en följd av den.
# 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)Snabbkontroll
Testa er förståelse av begrepp inom dataanalys från den här lektionen.
Sammanfattning av lektionen
I den här lektionen har ni lärt er att modulära rensningsfunktioner (ta bort dubbletter, begränsa avvikande värden och standardisera kategorier) var och en tar emot och returnerar en DataFrame för enkel testning, att featurekonstruktion skapade datumdelar, intäkt per orderrad, kundkohorter och sammanfattande statistik, samt att assertions för schemavalidering skyddar övergången från rensning till analys. Nästa steg är att beräkna projektets centrala KPI:er: månatlig kohortretention, produktintäkter och rullande aktiva användare.
Lär dig Python med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 30
- Lektioner
- 120
Vanliga frågor
Är lektionen ”Datarensning och egenskapsskapande” gratis?
Ja – hela texten till ”Datarensning och egenskapsskapande” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Pandas & NumPy Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i Pandas & NumPy Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Datarensning och egenskapsskapande”?
Tillämpa den avancerade checklistan för datarensning, skapa datumegenskaper och kvotkolumner och validera den rena datamängden med assertioner. Ni övar på Pandas & NumPy Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Pandas & NumPy Academy?
Du behöver inga förkunskaper. Utbildningen i Pandas & NumPy Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.
Hur lång tid tar lektionen ”Datarensning och egenskapsskapande”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Pandas & NumPy Academy-lektionen?
Ja. Varje Pandas & NumPy Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Projektkonfiguration och dataimport
- Datarensning och egenskapsskapande
- Analys och beräkning av KPI:er
- Slutlig visualisering och rapportexport