মূল content-এ যাও

Python for AI/Pandas/Lesson 49

apply ও Transformations

Column-এর মান রূপান্তর — map দিয়ে dictionary, apply দিয়ে নিজের function, pd.cut দিয়ে bin, .dt দিয়ে তারিখ থেকে feature — আর কেন vectorized উপায় apply-এর চেয়ে ভালো।

সময়
24 মিনিট
Exercise
1
Challenge
1
Quiz
3 প্রশ্ন

সহজ ভাষায়

প্রায়ই একটা column-এর মান অন্য রূপে চাই — text থেকে সংখ্যা, সংখ্যা থেকে category, তারিখ থেকে ঘণ্টা। Pandas-এ এর কয়েকটা উপায়, দ্রুত থেকে ধীর:

উপায়কখনগতি
Vectorized (*, .str, .dt, np.where)যখনই সম্ভবসবচেয়ে দ্রুত
map(dict)নির্দিষ্ট মান → নির্দিষ্ট মানদ্রুত
pd.cutসংখ্যা → সীমা অনুযায়ী categoryদ্রুত
apply(function)জটিল logic, আর কোনো উপায় নেইধীর

কেন দরকার?

এটাই feature engineering — raw data-কে model-এর জন্য অর্থপূর্ণ সংখ্যায় রূপান্তর। প্রায়ই ভালো feature একটা ভালো algorithm-এর চেয়ে বেশি পার্থক্য আনে:

  • তারিখ (2026-10-02 23:15) model সরাসরি বোঝে না — কিন্তু "রাত ১১টা, শুক্রবার" বোঝে
  • বয়স ২৩, ৩৭, ৬৮ → "তরুণ", "মধ্যবয়সী", "প্রবীণ"
  • শহরের নাম → সংখ্যা

map: dictionary দিয়ে রূপান্তর

main.py

Comilla dictionary-তে নেই, তাই NaN। map-এর পর সবসময় যাচাই করো।

pd.cut: সংখ্যা থেকে category

main.py

bins=[0, 17, 35, 60, 120] মানে (0, 17], (17, 35], (35, 60], (60, 120] — প্রতিটার ডান প্রান্ত সহ। সমান সংখ্যক মান প্রতিটা দলে চাইলে pd.qcut (quantile দিয়ে)।

.dt: তারিখ থেকে feature

main.py

dayofweek: সোমবার = 0, … শুক্রবার = 4, শনিবার = 5, রবিবার = 6। বাংলাদেশে সাপ্তাহিক ছুটি শুক্র-শনি — isin([4, 5])। বিদেশি tutorial-এর >= 5 (শনি-রবি) কপি করলে বাংলাদেশের data-য় ভুল হবে!

apply: শেষ উপায়

যখন কোনো vectorized উপায় নেই:

main.py

length vectorized (.str.len()), কিন্তু positive_score-এর মতো নিজস্ব logic-এর জন্য apply।

গতির পার্থক্য

main.py

Exercise

Exercise

নম্বর থেকে grade

+20 XP

marks column থেকে grade column বানাও `pd.cut` দিয়ে:

  • 0 থেকে 59 → "F"
  • 60 থেকে 69 → "B"
  • 70 থেকে 79 → "A"
  • 80 থেকে 100 → "A+"

তারপর grade_counts = প্রতিটা grade কতজন পেয়েছে, একটা dict।

solution.py

Quiz

  1. Q1df["city"].map({"Dhaka": 1, "Sylhet": 2}) — কোনো শহর dictionary-তে না থাকলে কী হয়?
  2. Q2১০ লাখ row-এ df["price"].apply(lambda x: x * 1.15) আর df["price"] * 1.15 — কোনটা দ্রুত?
  3. Q3pd.cut(marks, bins=[0, 59, 100]) — 59 কোন bin-এ পড়ে?
0/3 answered

Challenge

Challenge

Transaction থেকে ML feature

+50 XP

Fraud detection model-এর জন্য raw transaction থেকে feature বানাও। make_features(df) function একটা নতুন DataFrame return করবে, মূলের সব column সহ এই নতুনগুলো:

  • hour — time থেকে ঘণ্টা (0–23)
  • is_weekend — শুক্র বা শনিবার হলে True (বাংলাদেশের সাপ্তাহিক ছুটি!)
  • is_night — রাত ১০টা থেকে ভোর ৬টার আগে (hour >= 22 বা hour < 6) হলে True
  • amount_level — "low" (1000-এর নিচে), "mid" (1000 থেকে 9999), "high" (10000 বা বেশি) — string

time column text হিসেবে আসবে। Loop বা apply ছাড়া, vectorized।

solution.py

বাস্তবে কোথায় ব্যবহার হয়?

এই পুরো module একসাথে — raw data থেকে model-ready table, একটা clean pipeline হিসেবে। Pandas-এর method chaining আর assign দিয়ে প্রতিটা ধাপ পড়া যায়:

main.py

Column-এর নাম পরিষ্কার → text ঠিক করা → তারিখ → missing পূরণ → নতুন feature। প্রতিটা ধাপ আলাদা লাইনে, আর মূল raw অক্ষত। এভাবে লেখা code পরে পড়া, debug করা আর production pipeline-এ নেওয়া সহজ।

Interview প্রশ্ন

  • Beginner: map আর apply-এর পার্থক্য কী?
  • Intermediate: apply কেন ধীর? কখন এটা ছাড়া উপায় নেই?
  • Advanced: Feature engineering-এর সময় train/test leakage কীভাবে এড়াবে? (যেমন pd.qcut-এর সীমা কোন data থেকে হিসাব করবে?)

এরপর কী?

অভিনন্দন! 🎉 Pandas module শেষ। তুমি এখন real-world data load, পরিষ্কার, filter, group, merge আর transform করতে পারো — একজন data analyst বা ML engineer-এর প্রতিদিনের কাজ।

পরের module: Matplotlib — সংখ্যার পেছনের গল্প চোখে দেখা। Line, scatter, histogram — data visualize করে pattern খুঁজে বের করা।