পাঠ ১৯ · ২৫-এর মধ্যে · মডিউল ৩

Jupyter Notebook ও Colab

Jupyter & Colab — the data scientist's workbench
৬ মিনিট পড়া শুরু · Beginner ব্রাউজারেই কোড চালান

এই পাঠে যা শিখবেন

  • Notebook কী — কেন data scientist এতে কাজ করে
  • Cell type — code vs markdown, কীবোর্ড শর্টকাট
  • Jupyter local-এ চালানো — install ও first launch
  • Google Colab — login থেকে GPU activate
  • Notebook-এর সাধারণ ফাঁদ — hidden state, version control, secret leak
  • কখন .ipynb ছেড়ে .py-তে যাবেন

১ · Notebook কী?

Jupyter NotebookJupyterProject Jupyter (২০১৪, Fernando Pérez) — IPython থেকে evolve হওয়া interactive computing environment। নাম এসেছে Julia + Python + R থেকে — তিন ভাষাকেই support। আজকে data science-এর de facto interface। হলো একটি interactive document যেখানে code, output, লেখা, ছবি, গাণিতিক সূত্র — সব এক জায়গায় থাকে। Document-টি cell-এ ভাগ — প্রতিটি cell আলাদা করে run করা যায়। এক cell-এ ভেরিয়েবল declare করুন, পরের cell-এ ব্যবহার করুন — kernel state ধরে রাখে। এই workflow exploratory data analysis (EDA), data science teaching, reproducible research-এ revolutionary।

তিন ধরনের cell

১) Code cell: Python (বা R, Julia) — Shift+Enter দিয়ে run।
২) Markdown cell: ব্যাখ্যা, heading, list, link, image, math (LaTeX)।
৩) Raw cell: render না — কাঁচা text, খুব কম ব্যবহৃত।

Script (.py ফাইল) = একটি বইয়ের পাতা — উপর থেকে নিচ পর্যন্ত একসাথে পড়তে হয়। Notebook = একটি ল্যাব নোটবুক — পরীক্ষা চালান, observation লিখুন, ছবি আঁকুন, একই পাতায় পরের পরীক্ষা। Data analysis "পরীক্ষা" — তাই notebook এতটা প্রিয়।

২ · Code ও Markdown — দু'টি প্রধান cell

Code cell-এ Python চালান — পাশে output instantly। Markdown cell-এ # দিয়ে heading, **bold**, - list, $x^2$ দিয়ে math — ম্যানুয়ালি render। দু'টি interleave করেই notebook readable হয়।

Python · code cell
# Cell 1 — variable
x = 10
y = 20

# Cell 2 — গণনা (kernel state থেকে x, y এখনো পাবে)
total = x + y
print(f"Total = {total}")

# Cell 3 — last expression auto-display হয় (print ছাড়াই)
total ** 2

    
Notebook-এ একটি cell-এর শেষ expression auto-display হয় — print() ছাড়াই। এই কারণে df.head() বা model.score() এক লাইনেই output দেখা যায়।

৩ · Jupyter local-এ install ও launch

নিজের কম্পিউটারে Jupyter চালাতে — Python install থাকলে এক command-এ install ও launch:

Terminal · install
# (১) install — শুধু একবার
pip install notebook jupyterlab

# (২) launch — প্রতিবার কাজ শুরুর সময়
jupyter lab        # আধুনিক, file browser সহ
# অথবা
jupyter notebook   # classic interface

# (৩) ব্রাউজার auto-open হবে — http://localhost:8888
# (৪) New → Python 3 → প্রথম cell-এ:
print("Hello from Jupyter!")
JupyterLab আধুনিক উত্তরসূরি — file browser, multiple tab, terminal একই window-এ। নতুন ব্যবহারকারীদের jupyter lab-ই recommend।

৪ · Google Colab — install ছাড়া cloud notebook

Google ColabGoogle ColabGoogle-এর hosted Jupyter — ২০১৭-তে চালু। ফ্রি tier-এ T4 GPU, 12GB RAM, 100GB disk। Pro/Pro+ paid tier-এ A100/L4। ML কোর্স, কর্মশালা, prototyping-এর সবচেয়ে accessible platform। = Google-এর hosted Jupyter। শুধু Gmail অ্যাকাউন্ট লাগে। কোনো install নেই, GPU/TPU ফ্রি (limited time), Drive-এ auto-save। বাংলাদেশের ছাত্র-গবেষকদের জন্য — সেরা শুরু।

  • লগইন: colab.research.google.com → "New Notebook"।
  • GPU on: Runtime → Change runtime type → Hardware accelerator → GPU।
  • Drive mount: from google.colab import drive; drive.mount('/content/drive')।
  • File upload: বাঁ-পাশের files icon → upload → drag-drop।
Python · Colab quick test
# Colab-এ আজই কাজ করে — কিছু install লাগে না
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

print("NumPy:", np.__version__)
print("Pandas:", pd.__version__)

# GPU check (Runtime → GPU on করার পর)
import subprocess
try:
    out = subprocess.check_output(["nvidia-smi", "--query-gpu=name", "--format=csv"]).decode()
    print("GPU:", out.strip())
except Exception:
    print("GPU active নেই — Runtime মেনু থেকে on করুন")

    
NumPy, Pandas, scikit-learn, TensorFlow, PyTorch — Colab-এ সব pre-installed। শুধু import দিলেই চলে। GPU on করলে — DL training-এ ১০-২০× speedup।

৫ · কীবোর্ড শর্টকাট — গতি বাড়ান

Notebook-এ দুই mode — Edit (cell-এ লিখছেন) ও Command (cell select)। Esc দিয়ে command, Enter দিয়ে edit।

  • Shift+Enter — cell run করে next-এ যান।
  • Ctrl+Enter — cell run, একই জায়গায় থাকুন।
  • A / B — উপরে / নিচে নতুন cell (command mode)।
  • D, D — cell delete (পরপর দু'বার)।
  • M / Y — Markdown / Code-এ convert।
  • Z — undo cell delete।
  • 00 — kernel restart।

৬ · Hidden state — সবচেয়ে বড় ফাঁদ

Notebook-এর সবচেয়ে কুখ্যাত সমস্যা — hidden stateHidden stateNotebook cell out-of-order run করলে kernel-এ এমন variable-state তৈরি হয় যা সরাসরি দেখা ফাইল থেকে বোঝা যায় না। ফাইল share করলে অন্যজন reproduce পারবে না — কারণ তার কাছে সেই hidden history নেই।। আপনি cell ১০ run, তারপর cell ৩ edit করে আবার run, তারপর cell ৭। Output সবগুলো সঠিক দেখাচ্ছে। কিন্তু অন্য কেউ ফাইল top-to-bottom run করলে — error। কারণ মাঝখানে কোনো ভেরিয়েবল order-এ define হয়নি।

সমাধান: কাজ শেষে অবশ্যই Kernel → Restart & Run All চালান। সব cell ক্রমে রান হলে — তবেই notebook reproducible। Share করার আগে এটাই litmus test।
Notebook architecture — browser ↔ kernel .ipynb file = JSON-এ cell + output Browser UI cell edit, render markdown + plot Jupyter Server .ipynb read/write localhost:8888 Python Kernel code execute variable state code render execute result কোন পরিবেশে কাজ করবেন? Local Jupyter নিজস্ব ডেটা ও env offline কাজ production reproduce setup overhead Google Colab শূন্য install free GPU/TPU teaching, demo session timeout .py script production code git diff-friendly unit testable no inline output EDA / prototype → notebook · production / library → .py script notebook থেকে stable code → refactor to module
উপরে — browser ↔ server ↔ kernel architecture। নিচে — কখন Jupyter, কখন Colab, কখন .py বেছে নেবেন।

৭ · Notebook → Script — কখন রূপান্তর করবেন

Notebook-এ exploration শেষ হলে — যে code stable, reusable, scheduled — সেটা .py ফাইলে নিয়ে যান। কারণ:

  • Version control: .ipynb = JSON, git diff পড়া কঠিন।
  • Testability: pytest notebook চালায় না সহজে।
  • Import: অন্য module থেকে notebook import করা যায় না সরাসরি।
  • Production deploy: Airflow, Docker, Lambda — .py চাইলো।

jupyter nbconvert --to script my.ipynb — এক command-এ .py। তারপর function-এ ভাগ, test লিখুন।

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।

প্র ০১ Joel Grus-এর বিখ্যাত talk "I Don't Like Notebooks" — কেন তিনি এত সমালোচনা করেন? Hidden state, version control, testing — তিন দিক থেকে notebook-এর দুর্বলতা বিশ্লেষণ করুন।

২০১৮-তে JupyterCon-এ Joel Grus (Data Science from Scratch-এর লেখক) দিলেন এক provocative talk — "I Don't Like Notebooks"। ৪০টি স্লাইডে notebook-এর সমস্যা গুনলেন। বিতর্ক উঠল, কিন্তু সমালোচনাগুলো বাস্তব।

(১) Hidden state — সবচেয়ে গভীর সমস্যা:

  • Cell run order ≠ cell display order। আপনি ৫ → ২ → ৭ run করেছেন, কিন্তু file-এ ১,২,৩,৪,৫,৬,৭ ক্রমে দেখাচ্ছে।
  • একটি ভেরিয়েবল আপনি ১০ মিনিট আগে define করেছেন, পরে cell মুছে ফেলেছেন — কিন্তু kernel এখনো ধরে রেখেছে।
  • Result: notebook "কাজ করছে" আপনার কাছে, কিন্তু colleague-এর কাছে error।
  • "Restart & Run All" — গণিতের প্রমাণের মতো, প্রতিবার করতে হবে।

(২) Version control নরক:

  • .ipynb = JSON ফাইল, যাতে cell metadata, execution_count, output cache, base64-encoded images সব আছে।
  • git diff-এ ১ লাইন code change দেখাবে ৩০০ লাইন diff (output bytes change হলে)।
  • Merge conflict অপ্রতিরোধ্য — output binary মার্জ অসম্ভব।
  • Tools: nbstripout (output strip on commit), nbdime (semantic diff/merge), jupytext (auto-pair with .py/.md) — সবই workaround।

(৩) Testing প্রায় অসম্ভব:

  • Function notebook-এর মাঝে define হলে — pytest-এ import করতে hack লাগে।
  • Cell-এ side-effect (file read, plot display) — unit test purity ভাঙে।
  • CI pipeline-এ notebook চালানো ব্যয়বহুল, slow।
  • papermill, nbval — testing framework আছে, কিন্তু pytest-এর সরলতার ধারে-কাছে নেই।

আরও সমালোচনা:

  • IDE বৈশিষ্ট্য দুর্বল: refactor, jump-to-definition, type-checking — VS Code, PyCharm-এর কাছাকাছি না।
  • Out-of-order encourages bad habit: নতুন developer-রা "kernel state" mental model build করে — যা production-এ harmful।
  • Reproducibility crisis: ICML/NeurIPS paper-এর notebook, একদম অন্যজন run করলে — ৬০%+ ক্ষেত্রে fail (২০২০ Pimentel et al.)।
  • Data leakage: exploration-এ test set দেখে fit; পরে production-এ কেউ ধরবে না।

তবু কেন থাকছে:

  • EDA-র জন্য বিকল্প নেই — narrative + plot + code একসাথে।
  • Teaching tool হিসেবে অনন্য — student step-by-step দেখে।
  • Demo, presentation — stakeholder-এর কাছে narrative storytelling।

আধুনিক উত্তর:

  • Marimo (২০২৪): reactive notebook — out-of-order সমস্যা নেই, dependency graph থেকে auto-rerun।
  • Quarto: RMarkdown-inspired, Jupyter ব্যবহার করে কিন্তু source .qmd — diff-friendly।
  • Jupytext: notebook-কে paired .py-এ auto-sync — git-এ .py commit।
  • Databricks/Hex/Deepnote: commercial — collaborative, version-controlled notebook।

মূল উপলব্ধি: Notebook এক অসাধারণ exploration tool, কিন্তু production code-এর substitute না। Joel Grus-এর সমালোচনা — "notebook ব্যবহার বন্ধ করো" না, বরং "এর সীমা চিনে ব্যবহার করো"। Mature data scientist দু'টোই use করেন — context-অনুযায়ী।

প্র ০২ Colab free tier-এর 12-hour session timeout, RAM limit, GPU queue — কেন? Pro/Pro+ কখন worth it? বাংলাদেশ-এর গবেষকের জন্য বিকল্প cloud GPU কী?

Google Colab-কে Google ক্ষতিতে চালায় — প্রতি GPU-hour-এর AWS-rate ~$0.5-3। ফ্রি tier-এ মাসে কোটি ব্যবহারকারীকে এত compute দিতে গিয়ে — কিছু কঠোর সীমা থাকতেই হবে।

Free tier-এর মূল সীমা:

  • Session timeout: Idle হলে ৯০ মিনিট, max ১২ ঘণ্টা connect থাকে।
  • RAM: ১২ GB (high-RAM rare)। বড় ডেটাসেটে out-of-memory।
  • Disk: ১০০ GB scratch — session শেষে মুছে যায়।
  • GPU: T4 — যখন available; usage বেশি হলে CPU-only নামিয়ে দেয়।
  • Daily quota: অস্বচ্ছ — heavy ব্যবহারে ১২-২৪ ঘণ্টা cooldown।

কেন এই সীমা:

  • Crypto mining আটকানো — GPU illegitimately use।
  • Deep learning model training-এ ১২+ hour লাগে — paid tier-এ যাওয়ার incentive।
  • Resource fairly বণ্টন — পৃথিবী-জুড়ে শিক্ষার্থীদের।

Pro ($10/month) — কখন worth:

  • প্রায়ই GPU দরকার (সপ্তাহে ৫+ ঘণ্টা)।
  • Background execution — বন্ধ ল্যাপটপেও training চলবে।
  • Faster GPU (V100/A100 মাঝে মাঝে)।
  • RAM ২৫ GB।
  • Longer runtime (২৪ hour)।

Pro+ ($50/month):

  • Priority GPU access — A100 প্রায়ই available।
  • Compute units ৫০০, terminal access।
  • সিরিয়াস research-এর জন্য।

বাংলাদেশের গবেষকের জন্য বিকল্প:

  • Kaggle Notebooks: ৩০ ঘণ্টা/সপ্তাহ free GPU (P100/T4)। Dataset hosting integrated।
  • Lightning AI Studios: ২২ free GPU hours/month।
  • Paperspace Gradient: ফ্রি tier আছে, paid hourly।
  • Modal/Replicate/RunPod: serverless GPU — pay per second।
  • Vast.ai: spot-priced consumer GPU (RTX 3090/4090) — অর্ধেক দামে।
  • SAIL Bangladesh / BRAC IT lab: on-prem GPU server — local institutional।
  • Hugging Face Spaces: demo hosting + zero-GPU shared।

Cost optimization tips:

  • Mixed precision (FP16) — অর্ধেক memory, ১.৫× speed।
  • Gradient checkpointing — বেশি batch, কম memory।
  • Pretrained model + fine-tune — scratch থেকে train না।
  • Subset দিয়ে dev, full data দিয়ে final।
  • WandB/MLflow দিয়ে track — failed run আবার চালাতে হবে না।

মূল উপলব্ধি: Colab free = "শিখতে অপ্রতিরোধ্য, production-এ অপর্যাপ্ত"। সিরিয়াস কাজে — Kaggle (data) + Colab Pro (compute) + Drive (storage) — মাসে ~$10-এ পূর্ণ stack। আরও বড় কাজে — institutional GPU বা commercial cloud।

প্র ০৩ Notebook-এ secrets — API key, password — accidentally commit হয়ে যায় বহু developer-এর। কেন এটা এত বিপজ্জনক? .env, secret manager, git history scrub — সম্পূর্ণ defence কী?

GitHub-এ প্রতিদিন হাজার-হাজার AWS key, OpenAI token leak হয়। অনেকেই notebook থেকে। কারণ — exploration-এ "একবার hardcode করি, পরে সরাব" → পরে ভুলে যায় → commit।

কেন secret leak এত বিপজ্জনক:

  • GitHub public repo-এ পুশ হলে — secret scanner bot ১ মিনিটে ধরে। Hacker সেকেন্ডে।
  • OpenAI API key leak — ১০০০-$ক্ষতি কয়েক ঘণ্টায়। আপনার অ্যাকাউন্টে bill।
  • AWS key — EC2 instance spin up, crypto mining → ১০-৫০ হাজার ডলারের bill ঘন্টায়।
  • DB credential — data exfiltration, GDPR violation।
  • Git history-এ লুকানো — শুধু latest commit মুছলেও পুরোনো commit-এ থাকে। git filter-branch বা BFG Repo-Cleaner লাগে।

সম্পূর্ণ defence — পাঁচ স্তর:

(১) Code-এ কখনো hardcode না:

  • ❌ API_KEY = "sk-abc123..."
  • ✅ API_KEY = os.environ["OPENAI_API_KEY"]

(২) Local-এ .env file:

  • .env file-এ OPENAI_API_KEY=sk-...
  • .gitignore-এ .env অবশ্যই add।
  • python-dotenv দিয়ে load: from dotenv import load_dotenv; load_dotenv()।

(৩) Colab-এ Secrets feature (২০২৩+):

  • বাঁ-পাশের 🔑 icon → Add secret।
  • from google.colab import userdata; key = userdata.get('OPENAI_API_KEY')
  • Notebook share করলেও secret share হয় না।

(৪) Cloud secret manager — production:

  • AWS Secrets Manager, GCP Secret Manager, Azure Key Vault।
  • HashiCorp Vault — multi-cloud।
  • Application IAM role দিয়ে fetch — কোনো credential code-এ না।

(৫) Pre-commit hook — accidental leak ধরে:

  • detect-secrets বা gitleaks — pre-commit hook হিসেবে।
  • Pattern match করে — AWS key format, OpenAI sk- prefix, JWT token ইত্যাদি।
  • Commit আটকায় leak হবার আগে।

যদি leak হয়ে যায় — emergency response:

  1. সাথে সাথে key revoke (provider console-এ)। নতুন key generate।
  2. সব deployment-এ নতুন key — আগে, তারপর git history clean।
  3. BFG Repo-Cleaner বা git filter-repo দিয়ে git history থেকে মুছুন।
  4. Force push (সব collaborator-কে জানিয়ে)।
  5. Provider-এর audit log দেখুন — abuse হয়েছে কি না।
  6. Public repo হলে — leak detected হয়েছে ধরে নিন। key changed না করলে চলবে না।

Notebook-specific extra precaution:

  • nbstripout — pre-commit-এ output strip। কারণ print(api_key) output-এও থাকতে পারে।
  • Output cell-এ token কখনোই print না।
  • Share-এর আগে — Restart, Run All, output check।

Bangladesh-এর developer-দের জন্য বিশেষ সতর্কতা:

  • Public repo-এ class assignment — supervisor-এর OpenAI key paste করে দিল ছাত্র — bill $5000।
  • BB-এর payment gateway test credentials git-এ — fraud risk।
  • Government API, NID API — leak হলে আইনগত পরিণতি।

মূল উপলব্ধি: Secret leak ১% mistake, ৯৯% ক্ষতি। এক leak-এ career, কোম্পানি, সম্পর্ক ক্ষতি। তাই — নীতি: hardcode নয়, কখনো নয়। প্রথম দিন থেকেই .env + secret manager habit। Tooling দিয়ে human error remove।

প্র ০৪ Reactive notebook (Marimo, Pluto, Observable) — traditional Jupyter-এর সমস্যাগুলোর কীভাবে সমাধান করে? কেন তবু Jupyter dominate করছে?

Hidden state — notebook-এর জন্মগত পাপ। ২০১৪-র Jupyter design-এ "cell run order = display order" এর কোনো guarantee নেই। ২০২০-র দশকে এই সমস্যা সমাধানে এক ঢেউ — reactive notebook।

Reactive notebook কী:

  • Cell-গুলোর মধ্যে dependency graph tracked।
  • একটি cell update হলে — সব dependent cell auto-rerun।
  • Cell order matter করে না — graph determine করে execution order।
  • "Out-of-order execution" সমস্যা গণিতিকভাবে নিষিদ্ধ।

প্রধান reactive notebooks:

  • Observable (২০১৯, Mike Bostock): JavaScript-based, web-first। D3.js-এর জনক-এর কাজ। Static visualization-এর জন্য চমৎকার, কিন্তু Python ecosystem নেই।
  • Pluto.jl (২০২০): Julia-র জন্য। প্রতিটি variable একবারই define — duplicate disallow। Reactivity built-in।
  • Marimo (২০২৩): Python reactive notebook। File .py (git-friendly!), AST-from-source dependency analysis। dataflow + UI element + deployable as web app।
  • Streamlit/Gradio: notebook না — কিন্তু reactive principle। Form-based ML demo-র জন্য।

Marimo-র innovation:

  • File .py — git diff পুরোপুরি স্বাভাবিক।
  • Variable shadowing forbidden — same name দু'বার define হলে error।
  • Slider, dropdown widget reactive — change-এ dependent cell auto-rerun।
  • marimo edit notebook UI; marimo run standalone web app।
  • Imports, functions, plots — সবই pure Python।

সুবিধাগুলো:

  • Hidden state সমস্যা ০।
  • Reproducibility default।
  • Git workflow চমৎকার।
  • Production deploy সহজ — same file।
  • Python — আগের knowledge transfer।

তবু Jupyter কেন dominate করছে:

  • Network effect: ১০ বছরের ecosystem — extensions, kernel (R, Julia, Scala), JupyterHub multi-user। নতুন এসে replace করা কঠিন।
  • Familiarity: সব tutorial, কোর্স, paper — Jupyter। Switch cost বিশাল।
  • Free-form flexibility: reactive constraint কখনো কখনো অস্বস্তিকর — exploratory, scratch কাজে।
  • Cell-by-cell debugging: Hidden state সুবিধাও — variable inspect, কোনো cell skip করা যায়।
  • Industry inertia: Databricks, SageMaker, Colab — সবই Jupyter-protocol-based।

Hybrid future:

  • Jupyter — exploration, teaching, EDA।
  • Marimo/Pluto — production-bound prototype, deploy-ready dashboard।
  • .py module — stable library code।
  • Streamlit — quick demo।

২০২৬-এর প্রবণতা:

  • Jupyter team নিজেই reactivity-র দিকে যাচ্ছে — JupyterLab Reactive extension।
  • Quarto + Jupytext — diff-friendly source format।
  • AI assistance (Copilot, Cursor) — notebook-এ integrate হচ্ছে।

মূল উপলব্ধি: Innovation আসে, technical superiority থাকে — কিন্তু adoption-এ ecosystem, habit, switch cost জিতে। Marimo/Pluto আজ দারুণ বিকল্প — কিন্তু "Jupyter is dead" বলা ভুল। আগামী ৫-১০ বছরে coexistence; সম্ভবত reactive principle Jupyter-এ merge। Tool বদলায়, principle থাকে — explicit dependency, reproducibility, version-friendly source।

অনুশীলন

  1. Setup: নিজের কম্পিউটারে JupyterLab install ও launch করুন। অথবা Colab-এ login করে নতুন notebook খুলুন।
    # Local
    pip install jupyterlab
    jupyter lab
    
    # Colab
    # colab.research.google.com → New Notebook

    প্রথম cell-এ লিখুন print("Hello") এবং Shift+Enter চাপুন।

  2. Hidden state demo: তিনটি cell বানান। Cell A-তে x = 5, Cell B-তে y = x * 2; print(y), Cell C-তে x = 100। B → A → C → B order-এ run করুন। প্রতিবার output কী আসছে, ব্যাখ্যা করুন।
    • B প্রথম → NameError (x define হয়নি)।
    • A → x=5 set।
    • C → x=100 set।
    • B আবার → y = 100*2 = 200।

    এখন Restart Kernel → Run All — সবগুলো top-down চলে: x=5, y=10, x=100 → তখন B-এর output ১০। কোন order "right"? এখানেই hidden state-এর বিভ্রান্তি।

  3. Markdown + math: একটি markdown cell বানান যেখানে heading, bullet list, এবং একটি গাণিতিক সূত্র (যেমন পাইথাগোরাস) থাকবে।
    # আমার প্রথম Notebook
    
    ## আজকের কাজ
    - Jupyter চালু করেছি
    - Markdown শিখেছি
    - পাইথাগোরাসের সূত্র লিখেছি
    
    ## পাইথাগোরাস
    $$ a^2 + b^2 = c^2 $$
    
    inline math: ভেক্টর $\mathbf{v} = (3, 4)$-এর দৈর্ঘ্য $\sqrt{25} = 5$।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

কোড রানার কাজ না করলে? ব্রাউজারে কাজ না করলে Google Colab ব্যবহার করুন — এই পাঠের সব Python code Colab-এ সরাসরি চলবে।
পূর্ববর্তী পাঠ
পাঠ ১৮ · Seaborn — সুন্দর ডেটা ভিজ্যুয়াল