Pandas & NumPy Academy · पाठ

डेटा सफ़ाई और फ़ीचर इंजीनियरिंग

उन्नत सफ़ाई जाँच-सूची लागू कीजिए, तारीख़ के फ़ीचर और अनुपात वाले कॉलम तैयार कीजिए तथा assertions से साफ़ डेटासेट का सत्यापन कीजिए।

पाठ 2, कुल 4 में से13 चरण

डेटा सफ़ाई और फ़ीचर इंजीनियरिंग, CoddyKit पर Pandas & NumPy Academy का एक निःशुल्क पाठ है। यह 4 में से 2वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह Pandas & NumPy Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Pandas & NumPy Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

ऑडिट किए गए डेटासेट को लोड करना

कैपस्टोन प्रोजेक्ट को जारी रखते हुए, पिछले चरण में सहेजे गए साफ़ Parquet चेकपॉइंट को लोड करें। इससे सफ़ाई चरण, डेटा ग्रहण प्रक्रिया से अलग हो जाता है — आप धीमी merge और parse प्रक्रियाओं को दोबारा चलाए बिना सफ़ाई के तर्क पर काम कर सकते हैं। साफ़ किए गए orders Parquet को पढ़ें और सत्यापित करें कि पंक्तियों की संख्या और dtypes ऑडिट सारांश की अपेक्षाओं से मेल खाते हैं। Parquet फ़ाइल categorical कॉलम सहित सभी dtypes को सुरक्षित रखती है, इसलिए दोबारा प्रकार बदलने की आवश्यकता नहीं है।

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()}')

उन्नत सफ़ाई जाँच-सूची लागू करना

मर्ज किए गए डेटासेट को लोड करने के बाद उन्नत सफ़ाई जाँच-सूची लागू करें: order_id पर पूर्ण और आंशिक डुप्लिकेट हटाएँ, IQR सीमा-पद्धति का उपयोग करके unit_price में असामान्य मानों की सीमा तय करें, असंगत category मानों को मानकीकृत करें (जैसे, 'Electronics', 'electronics' और 'ELECTRONIC'), और सत्यापित करें कि सामान्य orders के लिए quantity × unit_price हमेशा धनात्मक हो। प्रत्येक चरण एक ऐसा फ़ंक्शन है जो DataFrame स्वीकार करता और लौटाता है, जिससे pipeline का परीक्षण और उसे पहले की स्थिति में लौटाना आसान होता है।

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.')

तारीख संबंधी विशेषताएँ तैयार करना

.dt accessor का उपयोग करके order date से समय-संबंधी विशेषताएँ निकालें। year, month, quarter, day_of_week और week_of_year कॉलम बनाएँ। ये विशेषताएँ groupby विश्लेषण (मासिक revenue), समय-आधारित फ़िल्टर (केवल Q3) और विज़ुअलाइज़ेशन के लिए उपयोगी हैं। साथ ही, चार्ट के अक्षों के लिए मनुष्यों द्वारा आसानी से पढ़े जाने वाला अवधि-लेबल देने हेतु year_month स्ट्रिंग कॉलम बनाएँ (जैसे, '2024-06')।

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())

लाइन-आइटम revenue की गणना करना

बिक्री डेटासेट की सबसे मूलभूत विशेषता लाइन-आइटम revenue है: revenue = quantity × unit_price। इसे एक नए कॉलम के रूप में बनाएँ। यदि लागत का डेटा उपलब्ध हो, तो gross_margin कॉलम भी बनाएँ: margin = (price - cost) / price। ये व्युत्पन्न कॉलम सभी revenue KPI के आधार हैं। हमेशा लूप के बजाय वेक्टराइज़्ड कॉलम संचालन का उपयोग करें — पूरे कॉलम पर एक बार किया गया असाइनमेंट पंक्ति-दर-पंक्ति दोहराने की तुलना में कई गुना तेज़ होता है।

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))

ग्राहक कोहोर्ट निर्धारित करना

कोहोर्ट ऐसे ग्राहकों का समूह है जिनमें कोई समान विशेषता होती है — आमतौर पर वह समय-अवधि जब उन्होंने पहली बार खरीदारी की। प्रत्येक ग्राहक की पहली order date ढूँढ़कर उसे उसके अधिग्रहण कोहोर्ट में रखें। प्रत्येक ग्राहक की पहली order date निकालने के लिए groupby('customer_id')['order_date'].min() का उपयोग करें, फिर उसे वर्ष-माह अवधि में बदलकर cohort_month कॉलम बनाएँ। यह कोहोर्ट लेबल अगले पाठ में retention matrix का आधार होगा।

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()}')

ग्राहक जीवनकाल मूल्य की विशेषताएँ

ग्राहक-स्तरीय सारांश विशेषताओं की गणना करें: कुल orders, कुल revenue, औसत order value, पहली/अंतिम खरीदारी के बाद बीते दिन और खरीदी गई अलग-अलग categories की संख्या। इन्हें ग्राहक-स्तरीय enrichment कॉलम के रूप में मुख्य DataFrame में वापस merge करें। इन विशेषताओं का उपयोग segmentation (जैसे, उच्च-मूल्य बनाम कम-मूल्य ग्राहक) और churn या upsell की संभावना का अनुमान लगाने वाले machine learning मॉडल के inputs के रूप में किया जाता है।

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))

Assertions से स्कीमा सत्यापन

विशेषताएँ तैयार करने के बाद स्कीमा सत्यापन assertions चलाएँ, ताकि विश्लेषण चरण में भेजने से पहले यह सुनिश्चित हो सके कि डेटा अपेक्षाओं के अनुरूप है। जाँचें कि सभी अपेक्षित कॉलम मौजूद हैं, सामान्य orders के लिए revenue ऋणात्मक नहीं है, cohort_month का मान null नहीं है और year_month विश्लेषण वर्ष से मेल खाता है। ये assertions एक अनुबंध की तरह काम करते हैं: इनमें से कोई भी विफल होने पर pipeline तुरंत स्पष्ट त्रुटि संदेश के साथ रुक जाती है, बजाय इसके कि चुपचाप गलत परिणाम बनाए।

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)

कम-आवृत्ति वाली categories को संभालना

वास्तविक डेटासेट में कुछ categories या क्षेत्र केवल कुछ ही बार दिखाई देते हैं — सार्थक विश्लेषण के लिए यह संख्या बहुत कम होती है। कम-आवृत्ति वाले मानों को 'Other' से बदलें, ताकि एक-order वाली दर्जनों categories से चार्ट अव्यवस्थित न हों। एक व्यावहारिक सीमा यह है: 0.5% से कम पंक्तियों में दिखाई देने वाले मानों को एक साथ मिला दिया जाए। यह machine learning के लिए भी महत्वपूर्ण है: 200 दुर्लभ categories की one-hot encoding मेमोरी बर्बाद करती है और शोर बढ़ाती है।

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())

विशेषता-निर्मित डेटासेट को सहेजना

पूरी तरह साफ़ किए गए और विशेषता-निर्मित DataFrame को Parquet चेकपॉइंट के रूप में सहेजें। यह विश्लेषण के लिए तैयार डेटासेट है — सभी डेटा ग्रहण, सफ़ाई और विशेषता निर्माण चरणों का परिणाम। pipeline के बाद के चरण (KPI गणना, विज़ुअलाइज़ेशन, रिपोर्टिंग) इसी चेकपॉइंट से पढ़ते हैं। चेकपॉइंट स्वयं भी एक डिलिवरेबल है: इसे टीम के सदस्यों के साथ साझा किया जा सकता है या डेटा लेक पर अपलोड किया जा सकता है, ताकि अन्य लोग SQL या 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')

विशेषता निर्माण का सारांश

अच्छा विशेषता निर्माण पूर्वानुमान संबंधी संकेत जोड़ने और pipeline को समझने योग्य तथा परीक्षण योग्य बनाए रखने के बीच संतुलन रखता है। इस चरण में बनाई गई विशेषताएँ — revenue, तारीख के भाग, cohort_month, ग्राहक आँकड़े और एक साथ मिलाई गई categories — सभी प्रोजेक्ट सेटअप में तय किए गए विश्लेषण लक्ष्यों से प्रेरित थीं। अनुमान के आधार पर दर्जनों विशेषताएँ बनाने के प्रलोभन से बचें। प्रत्येक विशेषता के लिए पूछें: क्या इसका उपयोग कम-से-कम एक KPI या विज़ुअलाइज़ेशन में किया जाएगा? यदि नहीं, तो इसे बाद के लिए रखें। विश्लेषण के लिए तैयार डेटासेट को संक्षिप्त और उद्देश्यपूर्ण रखें।

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):,}')

कोड में निर्णयों का दस्तावेज़ीकरण

हर ऐसी सफ़ाई या विशेषता निर्माण संबंधी प्रक्रिया के लिए जो स्वयं स्पष्ट न हो, कारण समझाने वाली टिप्पणी जोड़ें। भविष्य में आपको (या टीम के किसी सदस्य को) यह याद नहीं रहेगा कि आपने IQR गुणक को 1.5 के बजाय 3 क्यों रखा या दुर्लभ category की सीमा के लिए 0.5% का उपयोग क्यों किया। इनलाइन टिप्पणियाँ और निर्णयों का लॉग (प्रोजेक्ट README या मार्कडाउन फ़ाइल में साधारण सूची) pipeline को रखरखाव योग्य और ऑडिट योग्य बनाते हैं। साफ़ और दस्तावेज़ीकृत कोड ही वास्तविक डिलिवरेबल है — आउटपुट फ़ाइलें तो उसका परिणाम मात्र हैं।

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

त्वरित जाँच

इस पाठ से डेटा विश्लेषण की अवधारणाओं के बारे में अपनी समझ जाँचें।

पाठ का पुनरावलोकन

इस पाठ में आपने सीखा: मॉड्यूलर सफ़ाई फ़ंक्शन (डुप्लिकेट हटाना, असामान्य मानों की सीमा तय करना, categories को मानकीकृत करना) आसान परीक्षण के लिए प्रत्येक DataFrame को स्वीकार और वापस करते हैं, विशेषता निर्माण से तारीख के भाग, लाइन-आइटम revenue, ग्राहक कोहोर्ट और सारांश आँकड़े बनाए गए, और स्कीमा सत्यापन assertions सफ़ाई से विश्लेषण तक के संक्रमण की सुरक्षा करते हैं। अब हम प्रोजेक्ट के मुख्य KPI की गणना करेंगे: मासिक कोहोर्ट retention, product revenue और rolling active users।

शुरुआत निःशुल्क

एआई शिक्षक के साथ Python सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
30
पाठ
120

अक्सर पूछे जाने वाले प्रश्न

क्या “डेटा सफ़ाई और फ़ीचर इंजीनियरिंग” पाठ निःशुल्क है?

हाँ—“डेटा सफ़ाई और फ़ीचर इंजीनियरिंग” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Pandas & NumPy Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Pandas & NumPy Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“डेटा सफ़ाई और फ़ीचर इंजीनियरिंग” में मैं क्या सीखूँगा?

उन्नत सफ़ाई जाँच-सूची लागू कीजिए, तारीख़ के फ़ीचर और अनुपात वाले कॉलम तैयार कीजिए तथा assertions से साफ़ डेटासेट का सत्यापन कीजिए। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Pandas & NumPy Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या Pandas & NumPy Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Pandas & NumPy Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 2वाँ पाठ है।

“डेटा सफ़ाई और फ़ीचर इंजीनियरिंग” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस Pandas & NumPy Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर Pandas & NumPy Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. प्रोजेक्ट सेटअप और डेटा ग्रहण
  2. डेटा सफ़ाई और फ़ीचर इंजीनियरिंग
  3. विश्लेषण और KPI गणना
  4. अंतिम दृश्यांकन और रिपोर्ट निर्यात
← Pandas & NumPy Academy पर वापस जाएँ