ডেটা সাইন্সের পাইথন

Python is fast enough for our site and allows us to produce maintainable features in record times, with a minimum of developers.

-- Cuong Do, Software Architect, YouTube.com

পাইথন প্রোগ্রামিং ল্যাঙ্গুয়েজের নাম কে না জানে?

খুবই পপুলার একটা প্রোগ্রামিং এনভায়রনমেন্ট - প্রায় সবকিছুতে লাগে। পাইথনের মজা হচ্ছে এর 'রিডেবিলিটি'। মানে - এটা বাংলার মতো পড়া যায়। মাঝে মধ্যে মনে হয় আমি গদ্য পড়ছি কি না? যিনি পাইথন প্রোগ্রামিং এনভায়রনমেন্ট জানেন না - তবে পাইথনের কোড দেখলে সেখানে কী হচ্ছে সেটা বলতে পারবেন উনি।

মেশিন লার্নিং এ কতোটুকু পাইথন প্রয়োজন? ডিপেন্ডস অন হু ইউ আস্ক। তবে, এটা বলতে পারি বেশি না। কারণ, বিপদে পড়লে আছে 'স্ট্যাক-ওভার-ফ্লো' (সাইট)। বিপদের বন্ধু। সমস্যা জানিয়ে পোস্ট দিন। মুখিয়ে আছেন পৃথিবীর প্রতিভাধর সব প্রোগ্রামাররা। কেউ মনের টানে। কেউবা নাম কামাতে। যাদের পয়েন্ট বেশি, তাদেরকে 'হায়ার' করতে বসে থাকেন কোম্পানিগুলো। ইদানিং পোস্ট দেবার দরকার পড়ে না। আমার আজকের সমস্যা কেউ না কেউ পোস্ট করেছেন এতগুলো বছর ধরে। সেগুলোর সমাধান দেখে নিজের মাথা চুলকাই। এতো সোজা! এটাই কম্যুনিটির বিশাল প্রাপ্তি।

আচ্ছা, এই চ্যাপ্টারটা কিন্তু দেবার জন্য দেয়া। না বুঝলেও অসুবিধা নেই। কারণ, প্রজেক্ট করতে গেলে নিজের চোখে দেখবেন কী হচ্ছে ওখানে। একদম চাক্ষুস। তখনি বুঝে যাবেন আপনি।

১. আমরা প্রোগ্রামিং এর কাজ কমাতে গিয়ে তার কাজগুলোকে বিভিন্ন ফাংশনে ভাগ করি। একেকটা ফাংশন মানে একটা করে স্পেসিফিক কাজ। এই ফাংশন মানে এমন একটা রুল তৈরি করা যেটা যেকোন সংখ্যক ইনপুট থেকে তার করেসপন্ডিং আউটপুট বানিয়ে দেয়। ফাংশনকে 'ডিফাইন' করে সেটাকে কল করা, যাতে একই জিনিস বার বার নতুন করে তৈরি করতে না হয়। যেমন, শুরুতে ডিফাইন করলাম my_function()কে।

def my_function():
print("Hello from a function")

এখন ব্যবহার করার জন্য কল করছি my_function()কে। একটা জিনিস মনে রাখতে হবে - শেষে () ব্যবহার করতে হবে। এখানে কিছুটা পজিশনাল এবং কীওয়ার্ড (kwarg=value) দুটো প্যারামিটার লাগতে পারে যা এমুহুর্তে প্রয়োজন পড়ছে না।

my_function()

পাইথন ফাংশনগুলো ফার্স্ট ক্লাস, মানে একে অ্যাসাইন করতে পারি ভ্যারিয়েবলে আবার সেটাকে ফাংশনে বের করে দিতে পারি অন্য যেকোন আর্গুমেন্টের মতো।

# আরেকটা দ্বিগুন ফাংশন
def double(x):
return x * 2

২. ডিকশনারি, লিস্ট, সেট তৈরি। তারপর সেটাকে এক্সেস এবং 'আইটারেট' করতে পারা।

tel = {'rafiq': 4098, 'mim': 4139}
tel['karim'] = 4127

এখন tel কী দেখাবে?

tel
{'rafiq': 4098, 'mim': 4139, 'karim': 4127}
অথবা
tel['rafiq']
4098

৩. ডিকশনারি লুপিং করলে কেমন হয়? items() মেথড ব্যবহার করে?

mlbooks = {'data science from scratch': 'joel grus', 'python data science hadnbook': 'jake vanderplas'}
for k, v in mlbooks.items():
print(k, v)
আউটপুট
data science from scratch joel grus
python data science hadnbook jake vanderplas

for loops অথবা if/else কন্ডিশনাল এক্সপ্রেশন এবং কন্ডিশনাল ব্লক

কতো ক্যারেক্টার?
words = ['cat', 'window', 'defenestrate']
for w in words:
print(w, len(w))
আউটপুট
cat 3
window 6
defenestrate 12

৪. লিস্ট আরো সহজ। কিছু ভ্যালুকে একসাথে গ্রূপ করা। এটা মেশিন লার্নিং ডেটা ম্যানিপুলেশনে বেশ লাগে। আমাদের আইরিস ডেটাসেটে এক্সেস করতে লাগবে।

squares = [1, 4, 9, 16, 25]
>>> squares
আউটপুট
[1, 4, 9, 16, 25]
এখন যদি আলাদা করে ভ্যালুগুলোকে এক্সেস করি, ইনডেক্স করে ভ্যালু রিটার্ন করা
squares[0]
আউটপুট
1
squares[-1]
আউটপুট
25
স্লাইস অপারেশন নতুন লিস্ট তৈরি করবে আগের আইটেম দিয়ে। কপি করে।
squares[:]
আউটপুট
[1, 4, 9, 16, 25]
squares[:2]
আউটপুট
[1, 4]

৫. স্ট্রিং ফরম্যাটিং (যেমন, '%.2f' % 3.14)

৬. ভ্যারিয়েবল, অ্যাসাইনমেন্ট, বেসিক ডেটা টাইপ (int, float, bool, str), বিভিন্ন অপারেটর +, -, * এবং /

width = 20
height = 5 * 9
width * height
আউটপুট
900

নিচের এই ধারণাটা আরো পরিষ্কার হবে বিভিন্ন অপারেটর নিয়ে, মনে আছে তো লাস্ট প্রিন্টেড অপারেটর? ক্যালকুলেটরের মতো?

tax = 12.5 / 100
price = 100.50
price * tax
আউটপুট
12.5625
price + _
আউটপুট
113.0625
round(_, 2)
আউটপুট
113.06

৭. 'পাস' স্টেটমেন্ট, যদিও কিছুই করে না তবে দরকার। পাইথনে এটা একটা null স্টেটমেন্ট তবে 'কমেন্ট' আর 'পাস' এর মধ্যে পার্থক্য হচ্ছে পাইথন ইন্টারপ্রেটার কমেন্টকে পুরোপুরি না দেখার ভান করলেও পাসকে 'প্লেসহোল্ডার' হিসেবে ব্যবহার করে। ধরা যাক, আমরা একটা লুপ অথবা ফাংশনকে এখনই ইমপ্লিমেন্ট না করে সেটাকে ইমপ্লিমেন্ট করতে চাচ্ছি ভবিষ্যতে। সমস্যা হচ্ছে সেটাকে তো আর ফাঁকা রাখা যাবে না। রাখলেই ইন্টারপ্রেটার সমস্যা করবে। সেকারণে আমরা পাস স্টেটমেন্ট ব্যবহার করবো একটা ডামি টাইপ জিনিস বানানোর জন্য যেটার কোন কাজ নেই।

# pass is just a placeholder for functionality to be added later
sequence = {'p', 'a', 's', 's'}
for val in sequence:
pass

এখন কাজ করবো, সেটা ফাংশন অথবা ক্লাস হতে পারে

def function(args):
pass
অথবা
class example:
pass

আমরা যখন পাইথন ইন্টারপ্রেটার থেকে বের হয়ে যাই, তখন সব ডেফিনেশন (আর তার ভেতরের সব ফাংশন এবং ভ্যারিয়েবল) হারিয়ে যায়। আর সেকারণে আমরা যখন বড় কিছু তৈরি করি, তখন বড় বড় ফাংশনকে মডিউলে ভাগ করে স্টোর করে রাখি আমাদের সুবিধার্থে। এখন এই মডিউলে এক্সেস করার উপায় কী?

৮. মেশিন লার্নিং থার্ড পার্টি লাইব্রেরিতে ব্যবহার করা বিভিন্ন মডিউল

৮.১. পাইথনের জন্য ব্যবহার করা মেশিন লার্নিং এর সব ফিচার কিন্তু শুরুতেই লোড হয় না ডিফল্ট হিসেবে। আর সেটা আমাদের এই ল্যাঙ্গুয়েজের জন্য হোক - অথবা ডাউনলোড করা থার্ড পার্টি হোক। সেই মডিউলের ওই ফিচারটা ব্যবহার করতে হলে সেই মডিউলটাকে ইমপোর্ট করে নিতে হবে আগে। আগেই বলেছি, এখানে pandas হচ্ছে একটা পাওয়ারফুল ডাটা এনালাইসিস পাইথন লাইব্রেরি যেটা তৈরি করা হয়েছে numpy এর ওপর। numpy হচ্ছে আরেকটা পাইথন লাইব্রেরি যা আমাদেরকে ডাটার 'অ্যারে' ব্যবহার করতে সাহায্য করে।

import pandas

একটা মডিউলের সবকিছু ইমপোর্ট করতে চাইলে

from sklearn.datasets import *

৮.২. আবার যেই মডিউল আমরা ইমপোর্ট করি না কেন, সেটাকে ছোট করে নেয়া যায় 'এলিয়াস' মানে ছোট নাম দিয়ে। এখানে আমরা pandas ডাটাফ্রেমকে ইমপোর্ট করছি, সেটাকে নতুন করে অ্যাসাইন করছি pd নেমস্পেস দিয়ে। সংক্ষিপ্ত করতে। সংক্ষিপ্ত না করেও কাজ করা যায়।

import pandas as pd
import matplotlib.pyplot as plt

৮.৩. এখানে আপনি pandas কে ইমপোর্ট করে সেখানে তার ছোট্ট নাম দিয়ে কাজ করতে পারবেন পুরো ডকুমেন্ট ধরে। মডিউলের ইমপোর্ট এর পর আপনি তার ফাংশনগুলোকে এক্সেস করতে চাইলে মডিউলের পর (.) ডট দিয়ে মেথডগুলো ব্যবহার করবো। এরপর আমরা pandas লাইব্রেরি থেকে read_csv মেথড ব্যবহার করবো আমাদের কম্পিউটারে রাখা একটা csv ফাইল পড়তে। সেটাকে তারপর আমরা পাঠাবো ডাটাফ্রেমে। এখানে read_csv মেথডটা পুরো টেবিলটাকে পাঠাবে প্রথম সারিটাকে ডাটাফ্রেমের হেডার হিসেবে। প্রথম সারি মানে সেখানে ফিল্ডের নাম থাকে।

pd.read_csv

৮.৪. আমরা যদি কোন মডিউলের কি কি নাম ডিফাইন করা আছে সেটা দেখতে চাইলে dir() ফাংশন ব্যবহার করতে পারি। কোন চিন্তা করবেন না। উদাহরনটা বোঝা যাবে আরেকটু ভেতরে গেলে।

from sklearn import datasets
iris = datasets.load_iris()
dir(iris)
আউটপুট
['DESCR', 'data', 'feature_names', 'target', 'target_names']

অনুগ্রহ করে আর জিজ্ঞাসা করবেন না, "পাইথন জানা লাগবে কি মেশিন লার্নিং শুরু করতে?" উত্তর হচ্ছে "না"। মেশিন লার্নিং এর শুরুতে পাইথন জানার প্রয়োজন নেই। প্রজেক্টের কাজ করতে করতে শিখে যাবো আমরা।