My Profile Photo

Ratul Minhaz


I am a web developer based in Dhaka, Bangladesh. I use Python for data wrangling. I want to be an omniglot.


ডেটা সাইন্সে হাতে খড়ি - ২

আজকের যুগে শ্রেফ ইন্টার্নেটে কানেকশন থাকলেই অজস্ররকমের ডেটা হাতের নাগালে চলে আসে। ওয়েবসাইটগুলো প্রতিনিয়ত অন্যান্য ওয়েবসাইটের সাথে তথ্য নিয়ে কথা বলতে থাকে। হয়ত মানুষের ভাষায় হয় না সে কথাগুলো, হয় বিভিন্ন API বা Application Programming Interface এর মাধ্যমে। ফেসবুক, টুইটার, গুগল ইত্যাদির API ব্যবহার করে আমরা এখন হরেক রকমের তথ্য পেতে পারি।

এই টিউটোরিয়ালটি ডেটা সাইন্সে হাতে খড়ি সিরিজের দ্বিতীয় পর্ব। অন্যান্য পর্ব:
1. প্রস্তুতি
2. ডেটা সংগ্রহ (<– আপনি এখন এখানে)
3. বিশ্লেষণ এবং ভিজুয়ালাইজেশন
4. ভিজুয়ালাইজেশন

কোথায় পাব ডেটা?

আপনি কি জানেন যে আপনার স্মার্টফোনে জমা থাকা কয়েক মাসের তথ্য বিশ্লেষণ করে বলে দেয়া যাবে আপনি কাল সারাদিন কি করবেন? আসলে এতটা আত্মবিশ্বাসের সাথেও বলতে পারছি না যে একেবারে নিখুঁত হবে তা। কিন্তু ভেবে দেখুন, আপনার ফোন কিন্তু আপনার দৈনন্দিন জীবনের প্রতিটা ধাপই জানে। আপনি সকালবেলা ক’টার সময় প্রথম ফেসবুকে ঢুকছেন বা ইন্টার্নেটে কানেক্ট করছেন তা থেকে ধারণা করা যেতে পারে আপনি কখন ঘুম থেকে উঠেন প্রতিদিন। হাঁটতে কষ্ট লাগে অনেক? আপনি যে কত বড় অলস তা আপনার ফোনের জিপিএস তথ্য বিশ্লেষণ করলেই টের পাওয়া যাবে‌।

বুঝতেই পারছেন এক স্মার্টফোন থেকেই রাজ্যের যত ডেটা কালেকশন করা সম্ভব। কিন্তু এটাই একমাত্র উৎস নয়। হাজার রকমের ওয়েবসাইট এবং সার্ভিস ইন্টার্নেটে জাল বিছিয়ে রেখেছে তথ্য পারাপারের। খুবই সাধারণ একটা উদাহরণ হল ফেসবুক ব্যবহার করে কোন ওয়েবসাইটে লগিন করা, কোন রকমের রেজিস্ট্রেশন না করেই। এই ব্যাপারটা সম্ভব হয়েছে API নামে একটা প্রযুক্তির কারণে। API যে শুধু তথ্য শেয়ার করাই সহজ করে দেয় তা না, এর আরও অনেক কাজ আছে। আগ্রহী হলে গুগল করে জেনে নিতে পারেন। ফেসবুক, টুইটার, গুগল ইত্যাদি পরিচিত নাম ছাড়াও আর কি কি API আছে ব্যবহার করার মত তা জেনে নিতে পারেন Programmable Web সাইটটা থেকে। ওখানে মোটামুটি ১৩ হাজারেরও বেশি API এর বর্ণনা দেয়া আছে।

এই টিউটোরিয়ালের জন্য আমরা কোড শেয়ার করার সাইট GitHub এর API নিয়ে পরীক্ষা-নিরীক্ষা করব। GitHub আগে কখনও ব্যবহার না করে থাকলে এখনই একটা অ্যাকাউন্ট খুলে আপনার সব কোড push করে দিন। আপনার কোড যেমন সবসময় নিরাপদ থাকবে ওখানে, তেমনি যে কেউ আপনার হাতের কাজ দেখতে পারবে।

গিটহাবের API পরখ করা

যেসব সাইটের API থাকে তারা সাধারণত বিস্তারিত ডকুমেন্টেশন লিখে রাখে যাতে মানুষ সহজেই তাদের API দিয়ে কাজের এবং মজার জিনিশ-পাতি বানাতে পারে। গিটহাবের API documentation এ খুবই সহজে এবং সোজা-সাপ্টা ভাষায় বলে দেয়া আছে কিভাবে কোন ঠিকানায় গিয়ে কড়া নাড়লে কি তথ্য পাওয়া যাবে। ব্রাউজারে নতুন ট্যাবে এই ঠিকানায় যান: https://api.github.com/users/{username}, username এর যায়গায় আপনার ইউজারনেম দিতে পারেন। আমি পাইথনের আব্বাজান গুইদো ভ্যান রসামের ইউজারনেম ব্যবহার করলাম: https://api.github.com/users/gvanrossum

{
    "login": "gvanrossum",
    "id": 2894642,
    "avatar_url": "https://avatars.githubusercontent.com/u/2894642?v=3",
    "gravatar_id": "",
    "url": "https://api.github.com/users/gvanrossum",
    "html_url": "https://github.com/gvanrossum",
    "type": "User",
    "site_admin": false,
    "name": "Guido van Rossum",
    "company": "Dropbox",
    "blog": "http://python.org/~guido/",
    "location": "San Francisco Bay Area",
    "email": "guido@python.org",
    "hireable": null,
    "bio": null,
    "public_repos": 4,
    "public_gists": 5,
    "followers": 911,
    "following": 0,
    "created_at": "2012-11-26T18:46:40Z",
    "updated_at": "2015-12-23T18:35:37Z"
}

আপনার ব্রাইজারে কাঁটায় কাঁটায় একই তথ্য আসতে হবে এমন না। তবে যা দেখতে পাবেন ওই ঠিকানায় গেলে তার গঠন এমনই। কয়েকটা লাইন পড়লেই বুঝতে পারবেন যে গুইদো’র গিটহাব অ্যাকাউন্টের অনেক তথ্য পেয়ে গেছেন আপনি। তার অ্যাকাউন্টটি কবে তৈরী করা হয়েছিল, গিটহাবে কয়টি রেপোজিটরি বা পাবলিক প্রোজেক্ট আছে তার, এমন কি কতজন মানুষকে তিনি ফলো করছেন তাও এখন আমরা জেনে গেছি। খালি একটা লিংকে গিয়েই কিভাবে এত কিছু পেয়ে গেলেন তাহলে? এখানে যা হয়েছে তা হল- - আপনার ব্রাউজার api.github.com ঠিকানাটায় গিয়ে কড়া নেড়েছে - কড়া নাড়ার সময় বলে দিয়েছে, users যারা আছে তাদের মধ্যে gvanrossum ইউজারনেমের বান্দার তথ্য আমার চাই জবাবে গিটহাবের API সার্ভার গুইদোর অ্যাকাউন্টের যত তথ্য জনসাধারণের জন্য উন্মুক্ত, সব আপনাকে পাঠিয়ে দিয়েছে। পাঠানোর সময় তথ্যগুলো গৎ বাঁধা লেখা হিসাবে না পাঠিয়ে JSON(JavaScript Object Notation) ফরমেটে পাঠিয়েছে যাতে একটা নিদ্রিষ্ট কাঠামো বজায় রাখা যায়। এখানে প্রতিটা তথ্য key-value জোড়া হিসাবে আছে, তাই জিনিশটা পাইথনের dictionary ডেটা টাইপের মতন বলা যায়।

তথ্য সংগ্রহ করা

কার তথ্য নিব?
ব্রাইজার থেকে যেমন API দিয়ে তথ্য দেখলাম, এখন আমরা পাইথন দিয়ে এই কাজ করব প্রোগ্রামেটিক ভাবে। তাছাড়া বিশ্লেষণ করতে গেলে শুধু একজনের তথ্য হলেও চলবে না, কয়েকটা গিটহাব অ্যাকাউন্টের বিভিন্ন রকমের তথ্য লাগবে। আমরা ক’জন বড় মাপের পাইথন ডেভেলপারের অ্যাকাউন্ট নিয়ে করব অ্যানালাইসিস, আমি এদের বানানো মডিউল, টুল এবং রিসোর্সগুলো প্রায় প্রতিদিনই আমার কাজে আসে।

এই তিনজন পাইথনিয়ারের গিটহাব অ্যাকাউন্টে রেপোজিটরি এবং ফলোয়ারের সংখ্যা, অ্যাকাউন্ট তৈরীর তারিখ বের করে জমা রাখব। কোডের শুরুতেই এদের ইউজারনেমগুলো একটা লিস্টে রেখে দেই।

users = ['kennethreitz', 'mitsuhiko', 'jkbrzt', 'nvbn', 'donnemartin']

ব্রাউজারে আমরা যেমন গিটহাবের API এর ঠিকানা api.github.com/users এ গিয়ে গুইদোর তথ্য পেয়েছিলাম, আমাদের কোড থেকেও তেমনি এইখানে তথ্য চাইতে হবে। এই ঠিকানাটাও রেখে দেয়া দরকার:

    baseurl = "https://api.github.com/users/"

API url এ গুইদোর অ্যাকাউন্টের অনেক রকমের তথ্য পেয়েছিলাম আমরা, এই মুহূর্তে এত কিছু দরকার নেই। আমাদের লক্ষ অ্যাকাউন্ট তৈরীর পর থেকে আজ পর্যন্ত কতগুলো পাবলিক রেপোজিটোরি বা প্রোজেক্ট তৈরী করেছে মোট ইউজাররা তা বিশ্লেষণ করা। তাই আপাতত শুধু public_repos এবং created_at এই দুই তথ্য দরকার আমাদের। এছাড়া login, id, html_url এগুলো-ও জমা রাখব বাড়তি তথ্য হিসাবে। এই প্রোপার্টিগুলো আরেকটা লিস্টে রাখি:

properties = ['login', 'id', 'html_url', 'public_repos', 'created_at']

পরীক্ষা-নিরীক্ষা
এখন পরীক্ষা করে দেখি পাইথন থেকে কিভাবে গিটহাবের API এর সাথে কথা বলা যায়। কথা বলা- এই কথাটার মানে ওয়েব অ্যাপের ভাষায় request করা। এর জন্য যুতসই নামের একটা মডিউল-ও আছে পাইথনে: requests। মডিউলটা ইন্সটল pip install requests কমান্ড দিয়ে ইন্সটল করে ফেলেন।

আমাদের প্রথম ইউজার হল facebook, তাই ফেসবুকের জন্য পুরা API ঠিকানা হবে baseurl + users[0], বা “https://api.github.com/users/facebook”. requests দিয়ে এই ঠিকানায় এক্সেস করতে আপনার কোডে এই লাইনগুলা যোগ করুন:

current_page = baseurl + users[0]
response = requests.get(current_page)
page_info = response.json()
print(page_info)

এই কোড রান করার আগে সবার আগে ‍import requests যোগ করে নিন। রান করলে এক গাদা লেখা দেখা যাবে টার্মিনালে, ভয় পাওয়ার কোন কারণ নেই, এটাই স্বাভাবিক। খেয়াল করলে দেখবেন গুইদো’র ইউজার পেজে গিয়ে আমরা যা দেখেছিলাম, এগুলো সেরকমই। এখন লাইন বাই লাইন দেখি কি কাজ হচ্ছে।

page_info = response.json()
print

প্রথমে request.get() ব্যবহার করে GitHub এর সার্ভারে আমরা একটা HTTP GET request করছি। রিকোয়েস্টে দিচ্ছি ফেসবুকের ইউজারনেম। এই রিকোয়েস্টের বিপরীতে গিটহাব যা দিচ্ছে আমাদের সেটা রাখছি ‍response এ।

page_info = response.json()
print(page_info)

response এর ভেতর এখন JSON ফরমেটে ফেসবুকের তথ্য আছে, এছাড়া HTTP GET request এর জবাবে কিছু বিশেষ তথ্য-ও আছে। JSON data টা আলাদা করে page_info-এ রাখছি এবং প্রিন্ত করছি।

যা-ই হোক, এভাবে একসাথে সব তথ্য আমাদের কোন কাজেই আসবে না। তাই আমরা “name”, “id”, “html_url” এগুলো আলাদা ভাবে প্রিন্ট করে দেখতে চাই। আর সবগুলো ইউজারনেমের তথ্য দেখতে হলে রিকোয়েস্ট-টা একটা ফর লুপের ভেতর রাখতে হবে। লুপটা হবে এমন:

for username in users:
    current_page = baseurl + username
    response = requests.get(current_page)
    page_info = response.json()
    for property in properties:
        print("{} : {}".format(property, page_info[property]))
        print('')

এই কোড রান করলে টার্মিনালে সুন্দরমত ফরমেটেড-ভাবে এরকম তথ্য দেখতে পাব:

print(page_info["name"])
print(page_info["id"])
print(page_info["html_url"])

এইবার রান করলে ‘kennethreitz’, ‘mitsuhiko’, ‘jkbrzt’ তিনটা ইউজারনেমের জন্যই সবগুলো প্রোপার্টি প্রিন্ট করে দেখাবে।

API দিয়ে তথ্য সংগ্রহ করতে হয় কীভাবে তার সম্বন্ধে আপনার একটা মোটামুটি ধারণা হয়ে যাবার কথা এতটুক পর্যন্ত কোড করলে। ডেটা বিশ্লেষণ (পর্ব ৩)-এ এই তথ্য অ্যানালাইসিস করে বের করব কোন অ্যাকাউন্ট থেকে সবচেয়ে বেশি রেপোজিটরি তৈরী করা হয়েছে অ্যাকাউন্টের বয়সের তুলনায়। এ পর্বের সম্পূর্ণ কোড এখানে: