পান্ডাস পরিচিতি ১

গত ২ দিন নামপাইম্যাটপ্লটলিব নিয়ে লিখার পর আজকে লিখব পান্ডাস নিয়ে। পাইথন ডাটা বিশ্লেষণের একটি গুরুত্বপূর্ণ টুল এটি। এর মাধ্যমে যে কোন ডাটাকে আপনি বিশেষ অবকাঠামো দিতে পারবেন যার ফলে সেই ডাটা থেকে আপনি আপনার মন মত তথ্য সহজে বের করে আন্তে পারবেন। যেখানে পান্ডাস ছাড়া বহু ফাংশনের সাহায্য নিতে হত আর অনেক প্রোগ্রামিং নিজেকেই করতে হত, পান্ডাস থেকে আপনি পাচ্ছেন ডাটা এক্সপ্লরেশনের জন্য যুদশই একগাদা ফাংশন ও কার্যপ্রণালী। যা মেনে চললে আপনার ডাটা নিয়ে খেলা করার মজা যেমন বাড়বে, তার সাথে বাড়বে ডাটা থেকে তথ্যে পরিণত করার দ্রুতি (প্রোগ্রামার ও প্রোগ্রামিং দ্রুতি দুটোই)।

পান্ডাস (pandas) নামটি এসেছে প্যানেল (PANel) ও ডেটা (DAta) এর সাথে প্লুরাল s যুক্ত করে। এটি মূলত যে কোন সোর্স থেকে ডাটা নেয় আর আপনার ফাংশন কল অনুযায়ী সেই ডাটাকে নিজের কিছু উপাত্ত কাঠামতে ফালিয়ে দেয়, যার উপর আপনি ডাটাবেসের মত অপারেশান চালাতে পারবেন। উদাহরণস্বরূপ, ধরুন আপনি কোন ওয়েবসাইট স্ক্রেপ করে কিছু ট্যাবুলার ডাটা পেয়েছেন যা দ্বিমাত্রিক এবং যেখানে বেশ কিছু মিসিং সেল রয়েছে, আবার টেব্ল সংখ্যাও একাধিক যাদের মধ্যে কমন সদস্য আছে। আপনি সেই ডাটা থেকে ইনফর্মেশন বের করতে চান, অর্থাৎ ডাটার "মর্ম" বের করতে চান। পান্ডাস কিভাবে সাহায্য করতে পারে আপনাকে এখানে?

  • প্রথমে আসি ডাটা কালেকশনে, আপনি কি কি ভাবে ডাটা পেতে পারেন? পাইথনের বেশ ভাল কিছু ওয়েবসাইট স্ক্রেপিং টুল রয়েছে, ওগুলো থেকে আপনি আপনার ডাটাকে csv, excel ইত্যাদি ফরম্যাটে ফেলতে পারেন। খেয়াল রাখতে হবে যে, ডাটাবেজে যেমন ডাটা গঠিত থাকে অথবা আপনি অন্তত পক্ষে ডাটার অবকাঠামো জানতে পারেন, এই দুনিয়াতে তা কিন্তু না, আপনি এক নজরে আপনার সোর্স (ওয়েবসাইট, কপি পেইস্ট করা ডাটা ইত্যাদি) দেখে জাই বুঝবেন না কেন, অই ডাটার মাঝখানে কোন গ্যাপ আছে কিনা, আর কোন ভ্যালিডেশন কাঠাম ফলো করতেছে কিনা তা কিন্তু কোন গ্যারান্টি দিয়ে বলা হয়নি। আর মাঝে মাঝে আপনি হয়ত লাকি হতে পারেন যখন API এর বদৌলতে JSON, YAML, XML, ইত্যাদি ডাটা পাচ্ছেন কিন্তু যখন মাল্টিপল সোর্স থেকে আসবে? এখানে আগে ডাটা পাবেন, এরপর কাঠাম বুঝবেন, কাজেই রিলেশনাল ডাটাবেজ দিয়ে তেমন ফায়দা হবে না, হলেও আপনাকে সেইরকম লেভেলে মাইগ্রেশনের প্রস্তুতি নিতে হবে যা অনেক বেদনাদায়ক। পান্ডাস আপনাকে দিয়েছে কিছু ফাংশন যা দিয়ে আপনি বিভিন্ন সোর্স থেকে ডাটা নিয়ে পান্ডাস রিডাব্ল করে মধ্যবর্তী কিছু ডাটা কাঠামোতে ফেলতে পারবেন।

  • পান্ডাসের নিজস্ব কিছু উপাত্ত কাঠাম রয়েছে, যা ডাটা বিশ্লেষণকে সহজতর করে, এরা হল মধ্যবর্তী অবস্থা, সোর্স থেকে ডাটা হজম করে আপনাকে দিবে খেলা করার সুযোগ, আর একই সাথে এরা খুব সহজে ম্যাটপ্লটলিব চিত্রে পরিণত হতে পারে, আর সর্বোপরি, কাজ শেষে পরিণত হতে পারে যে কোন ফরম্যাটে, তা ডাটাবেজ হোক, এক্সেল হোক, আর হোক এইচটিএমএল। ডাটা এক্সপ্লরেশনের জন্য অনেক গুরুত্বপূর্ণ এইসব ডাটা স্ট্রাকচার।

  • ডাটা স্ট্রাকচার মানেই গঠন, মিশ্রণ, সম্পর্ক। এইগুলো সব আপনি পাইথন প্রোগ্রামিং দিয়ে করতে পারছেন উপরিউক্ত কাঠামগুলোতে, আবার, এদের সারমর্ম অর্থাৎ পরিসংখ্যানগত তথ্য পেয়ে যাবেন এক কলমেই। দুইটি আলাদা আলাদা কাঠামতে আপনি গ্রুপিং করতে পারবেন আর জয়েন করতে পারবেন রিলেশনাল ডাটাবেজের মতই, তার উপর আবার পাইথন ফাংশনের মাধ্যমে ডাটা রূপান্তরও অনেক সহজ হয়ে যায়।

  • আমার আগের একটি পোস্টে ম্যাটপ্লটলিব নিয়ে অনেক কথা বলেছিলাম, ম্যাটপ্লটলিব অনেক সহজে পান্ডাস কাঠামগুলোকে আঁকতে পারে। পান্ডাসি অনেক ব্যবস্থা দিয়ে দেয় ম্যাটপ্লটলিবে আঁকার জন্য।

  • আমি আমার ডাটা সংক্রান্ত প্রথম পোস্টে লিখেছিলাম নামপাই এর কথা। অত্যন্ত দ্রুত ও শক্তিশালী এই লাইব্রেরিটি কিন্তু পান্ডাসের ভিত্তি, কাজেই বুঝা যাচ্ছে, পান্ডাস অত্যন্ত পারফরম্যান্ট।

  • এক কথায়, আপনার ডাটা কালেকশনের পর যে খেলাধুলার পর্ব থাকে, যার মাধ্যমে আপনি ডাটা থেকে কিছুটা মর্ম বের করে আনেন পরবর্তী এনালাইসিসের জন্যে, সেখানে পান্ডাস অদ্বিতীয় ভূমিকা রাখতে পারে। আর যদি আপনার মাঝারি ধরনের ডাটা থাকে এবং আপনি চান দ্রুতগতি সম্পন্ন রিপোর্ট দিতে, সেখানেও পান্ডাস আপনার খেলার সাথী।

আমার মেশিনে পান্ডাস pip install pandas করাতেই হয়ে গিয়েছে। যদি নামপাই আর ম্যাটপ্লটলিব থাকে আপনার কাছে, তাহলে পান্ডাস ইন্সটল করতে এর বেশি কিছু লাগার কথাও না।

এবার কিছু কোডিং দেখান যাক। (অর্থাৎ, ipython notebook --pylab=inline --no-browser এর আসল উপকারিতা ল্যাভ করা যাবে এখন ;) )

In [10]:
# pd, np, plt <----- এগুলো সব হল কনভেনশন। 
import numpy as np
from matplotlib import pyplot as plt
import pandas as pd

ইমপোর্ট করা হল আমাদের মুল নায়কদের, আর এইবার আমি ম্যাটপ্লটলিবে plt.xkcd() কার্টুন আনছি না। তাই চিত্রগুলো একটু সিরিয়াস কিসিমের হবে :/

পান্ডাসের সহজতম কাঠামো হল সিরিজ। এটি ndarray এর মতই, কিন্তু একটু বেশি ক্ষমতাবান।

In [8]:
ser = pd.Series(np.random.randn(10)) # নামপাই মনে আছে? এটি হল ১০ র‍্যান্ডম সদস্যের একটি অ্যারে।

তো আমাদের এই ১০ সদস্যের এই অ্যারেটির মধ্যে এমন কি আছে যা map(random.random(), range(10)) এর নেই? আপাতদৃষ্টিতে তেমন কিছু না, কিন্তু যদি আরেক্টু দেখি-

In [46]:
ser_0 = pd.Series(range(10))
ser_1 = pd.Series(np.random.randn(10), index=list("abcdefghij"))
ser_2 = pd.Series({"Dhaka": 42.0, "Chittagong": 36.0, "Sylhet": 29.0})
অর্থাৎ আপনি সিরিজকে বিভিন্নভাবে শুরু করতে পারবেন। আর লিস্ট বলেন, ndarray বলেন আর ডিকশনারি বলেন, যে কোনভাবেই ইনিসিয়েট করা যাবে। আর এর সাথে ইনডেক্স রয়েছে যা আপনার লুকআপে সহায়ক হবে। সিরিজ নামপাই অ্যারে হিসেবেও কাজ করবে। যেমন
In [22]:
ser_1[ser_1 < 0] # সমস্ত ঋণাত্মক নাম্বার। 
Out[22]:
a   -0.871457
b   -0.222189
d   -0.758087
h   -1.208023
dtype: float64
In [24]:
ser_2[["Dhaka", "Sylhet"]] # শুধু ঢাকা ও সিলেট। 
Out[24]:
Dhaka     42
Sylhet    29
dtype: float64

অনেকটা জাভাস্ক্রিপ্টের মত, ser_2.Dhaka আর ser_2["Dhaka"] একই কথা।

In [26]:
assert ser_2.Dhaka == ser_2["Dhaka"]
print ser_1.a
-0.87145665176

এসাইন্মেন্ট করা কমন সেন্সের ব্যাপার

In [29]:
ser_2.Sylhet = 30.0 # সিলেটের তাপমাত্রা ১ ডিগ্রী বাড়ল!
print ser_2
Chittagong    36
Dhaka         42
Sylhet        30
dtype: float64

প্লট করতে চান? যেভাবে আপনি চিন্তা করছিলেন সেভাবেই হয়!

In [32]:
ser_1.plot()
Out[32]:
<matplotlib.axes.AxesSubplot at 0xa6077cc>

ডিফল্ট প্লটে খুশি না? আপনি ম্যাটপল্টলিবের মত প্যারামিটার পাস করতে পারবেন সহজেই!

In [43]:
ser_2.plot(kind="barh", color="orange", alpha=0.6, legend=True, rot=30)
Out[43]:
<matplotlib.axes.AxesSubplot at 0xb4c57ac>

একটা স্টাইল মনে আছে? নামপাইতে যে আপনি একটি অপারেশান করতেন আর অই অ্যারে এর সমস্ত সদস্যরা সে অপারেশান পেত? একে বলা হয় ব্রডকাস্টিং। যেমন আপনি যদি বলেন arr = np.array([1,2,3]); arr = arr + 10 তাহলে arr হবে np.array([11, 12, 13])। এই অভ্যাসটা পান্ডাসের ডাটাগুলিতেও আছে। ধরুন সবার তাপমাত্রা ৩ ডিগ্রী কমে গেল।

In [51]:
ser_2 = ser_2 - 3.0 # সবাই পেয়েছে মাইনাসের মেসেজ, তাই হয়ত একে ব্রডকাস্ট বলে। 
print ser_2
Chittagong    30
Dhaka         36
Sylhet        23
dtype: float64

কে কতবার আছে জানতে চান? ব্যবহার করুন value_counts কিন্তু যেহেতু আমাদের আগের সিরিজগুলোতে কোন রিপিটেশন নেই তাই নতুন সিরিজ তৈরি করি। ওয়ার্ল্ড কাপ গোল সংখ্যা পারফেক্ট হবে এখানে।

In [22]:
data = dict(Klose=16,
                Ronaldo=15,
                Muller=14,
                Fontaine=13,
                Pele=12,
                Klinsmann=11,
                Kocsis=11,
                Batistuta=10,
                Cubillas=10,
                Lato=10,
                Lineker=10,
                TMuller=10,
                Rahn=10)
ser = pd.Series(data)

দেখা যাক আগে এদের প্রিন্টে কেমন লাগে আর অতঃপর গ্রাফে কেমন লাগে।

In [29]:
print ser
Batistuta    10
Cubillas     10
Fontaine     13
Klinsmann    11
Klose        16
Kocsis       11
Lato         10
Lineker      10
Muller       14
Pele         12
Rahn         10
Ronaldo      15
TMuller      10
dtype: int64
In [30]:
print ser.value_counts()
10    6
11    2
15    1
14    1
13    1
12    1
16    1
dtype: int64
In [34]:
figure = plt.figure()

ax_1 = figure.add_subplot(2, 1, 1)
ax_2 = figure.add_subplot(2, 1, 2)

ser.plot(ax=ax_1, linestyle="--", marker="o", color="black")
ser.value_counts().plot(ax=ax_2, kind="bar", color="green", alpha=0.7)
Out[34]:
<matplotlib.axes.AxesSubplot at 0xc7f06ac>

পান্ডাসের প্রথম এবং সহজতম উপাত্ত কাঠামো সিরিজ নিয়ে এই ছোট আলোচনা সমাপ্ত করে পরবর্তী কাঠামো ডাটাফ্রেম নিয়ে কথা বলব এর পরের পোস্টে। স্টে টুন্ড!!!