آموزش

چطور داده‌های JSON و HTML رو وارد Pandas کنیم

برای تبدیل شدن به یک دانشمند داده ماهر، باید بدونی چطور با انواع مختلف داده‌ها کار کنی. در این‌جا یاد می‌گیری که چطور فرمت‌های مختلف داده مثل JSON و HTML رو با استفاده از Pandas بخونی.

تاریخ انتشار:
10 شهریور 1405
پایتون
13 دقیقه
کاربرهای فینکا در چه شرکت‌هایی مشغول به کار هستند؟

مقدمه

وارد کردن داده‌ها یکی از اولین و مهم‌ترین قدم‌ها در هر مسئلهٔ مرتبط با داده است. توانایی وارد کردن درست داده‌ها یک مهارت ضروری برای هر دانشمند دادهٔ آینده‌داره.

داده‌ها به شکل‌های مختلفی وجود دارن؛ بنابراین نه‌تنها باید بدونی چطور فرمت‌های مختلف داده رو وارد کنی، بلکه باید نحوهٔ تحلیل و دستکاری اونا رو هم برای رسیدن به نتایج و بینش‌های مفید بلد باشی.

pandas یک کتابخونهٔ متن‌باز در پایتونه که استفاده ازش آسونه، عملکرد بالایی داره و ابزاری عالی برای تحلیل داده‌ها در فرمت‌های متنوع به حساب میاد.

این کتابخونه بهت امکان خوندن انواع فرمت‌های داده مثل CSV، JSON، Excel، Pickle و غیره رو می‌ده. همچنین اجازه می‌ده تا داده‌هات رو به شکل جدولی با سطرها و ستون‌ها نمایش بدی تا خوندن و ارائه‌شون راحت‌تر بشه.

pandas داده‌ها رو در قالب یک DataFrame نشون می‌ده و امکانات گسترده‌ای برای تحلیل و دستکاری داده‌ها در اختیارت می‌ذاره. وقتی با استفاده از قابلیت‌های مختلف Pandas معنای داده‌ها رو متوجه شدی، می‌تونی از اونا برای تحلیل، پیش‌بینی، دسته‌بندی و خیلی کارهای دیگه استفاده کنی!

pandas یک رابط برنامه‌نویسی (API) ورودی و خروجی داره که شامل مجموعه‌ای از توابع سطح بالای reader و writer می‌شه. تابع خوندن با pandas.read_json() در دسترسه که یک شیء Pandas برمی‌گردونه، و تابع نوشتن هم از طریق متد pandas.to_json() روی همون شیء فراخوانی می‌شه.

DataFrame یک تابع Reader و یک تابع Writer داره. تابع Reader بهت اجازه می‌ده فرمت‌های مختلف داده رو بخونی، در حالی که تابع Writer این امکان رو بهت می‌ده تا داده‌ها رو در یک فرمت خاص ذخیره کنی.

در ادامه فرمت‌های داده‌ای که DataFrame ازشون پشتیبانی می‌کنه رو می‌بینی؛ این یعنی اگه داده‌های تو به هر کدوم از شکل‌های زیر باشن، می‌تونی از pandas برای بارگذاری یا نوشتن اون فرمت استفاده کنی.

در آموزش امروز، با چند تا از فرمت‌های بالا مثل JSON، HTML و Pickle کار می‌کنی.

نکته: برای یادگیری نحوهٔ خوندن فایل‌های CSV با استفاده از Pandas، به این آموزش مراجعه کن.

بارگذاری داده‌های JSON

JSON (نشانه‌گذاری شیء جاوااسکریپت) یک فرمت متنی برای تبادل داده است. خوندن و نوشتن JSON آسونه. این فرمت بر اساس بخشی از زبان برنامه‌نویسی جاوااسکریپت ساخته شده، اما از قراردادهای زبان پایتون و خیلی از زبان‌های دیگه هم استفاده می‌کنه.

فرمت JSON بیشتر برای ذخیرهٔ داده‌های بدون ساختار استفاده می‌شه؛ همون داده‌هایی که دیتابیس‌های SQL در ذخیره‌سازی‌شون مشکل دارن. JSON داده‌ها رو برای ماشین‌ها قابل خوندن و در دسترس می‌کنه.

فرمت JSON عمدتاً بر پایهٔ دو ساختار بنا شده:

  • مجموعه‌ای از جفت‌های کلید/مقدار. در پایتون، به یک جفت کلید/مقدار Dictionary گفته می‌شه. هر key یک ویژگی یکتاست، در حالی که مقادیر ممکنه این‌طور نباشن.

  • یک لیست مرتب از مقادیر. این لیست مرتب گاهی می‌تونه لیستی از لیست‌ها باشه. در پایتون، لیست‌ها مجموعه‌ای از مقادیر هستن که می‌تونن رشته، عدد صحیح و غیره باشن.

حالا بیا ببینیم چطور می‌تونی داده‌های JSON رو به روش‌های مختلفی بارگذاری کنی.

اولین دیتاست JSON از طریق این لینک در دسترسه. این داده‌ها به شکل دیکشنری کلید-مقداری هستن. در کل سه کلید وجود داره:
integer، datetime و category.

  • در ابتدا، باید کتابخونهٔ pandas رو فراخوانی کنی و بعد URL رو به تابع pd.read_json() پاس بدی تا یک دیتافریم برگردونه. ستون‌های این دیتافریم همون کلیدها هستن و سطرها مقادیر JSON رو تشکیل می‌دن.

بیا خیلی سریع با استفاده از تابع .tail()، چند سطر آخر فایل JSON که خوندیم رو چاپ کنیم.

خروجی
    integer             datetime  category
94        5  2015-01-01 00:01:34         0
95        9  2015-01-01 00:01:35         0
96        8  2015-01-01 00:01:36         0
97        6  2015-01-01 00:01:37         0
98        8  2015-01-01 00:01:38         0
99        1  2015-01-01 00:01:39         0
خروجی
(100, 3)

از خروجی بالا می‌تونی ببینی که مجموعاً سه ستون وجود داره: integer، datetime و category. همچنین ۱۰۰ نمونه در این دیتاست هست که با متد .shape تایید می‌شه، چون این متد خروجی 100 x 3 رو برگردونده.

  • نوشتن یک JSON

نوشتن داده‌های JSON به اندازهٔ خوندنشون راحته و فقط با یک خط کد انجام می‌شه. به جای read_json()، قراره از to_json() به همراه یک اسم فایل استفاده کنی و تمام!

  • تجزیه (parse کردن) JSON تودرتو به شکل رشته

در ادامه، با یک دیتاست JSON دیگه کار می‌کنی که به این سادگی‌ها نیست. این فایل ساختار تودرتو (nested JSON) داره. ساختار JSON تودرتو یعنی هر key می‌تونه در دل خودش keys بیشتری داشته باشه.

بیا مثال دیتاست رو ببینیم تا بهتر متوجه بشیم.

در دیتاست بالا، می‌بینی که article و blog دو کلید اصلی هستن که values مرتبط در زیر اونا قرار داره. این مقادیر خودشون ترکیب key-value جداگانه‌ای دارن.

دقت کن که دیتاست بالا با دابل‌کوتیشن (double-quotes) محصور شده و در قالب یک رشته است.

خوندن یک JSON تودرتو از روش‌های مختلفی امکان‌پذیره.

اول باید رشتهٔ JSON رو با پاس دادن متغیر داده به عنوان پارامتر به تابع json.loads بخونی. بعدش با استفاده از تابع json_normalize، داده‌های JSON تودرتو رو هموار می‌کنی و به شکل یک جدول درمیاری.

باید تابع json_normalize رو از کتابخونهٔ pandas.io.json وارد کنی.

خروجی
{'article': [{'id': '01',
   'language': 'JSON',
   'edition': 'first',
   'author': 'Allen'},
  {'id': '02',
   'language': 'Python',
   'edition': 'second',
   'author': 'Aditya Sharma'}],
 'blog': [{'name': 'Datacamp', 'URL': 'datacamp.com'}]}

در گام بعد، باید فایل JSON رو با استفاده از تابع normalize مسطح کنی. فعلاً اطلاعات کامل رو به عنوان ورودی پاس می‌دی تا ببینی شکلش چطوریه.

خروجی
                                             article                                           blog
0  [{'id': '01', 'language': 'JSON', 'edition': '...  [{'name': 'Datacamp', 'URL': 'datacamp.com'}]

عالیه! همون‌طور که از خروجی بالا می‌بینی، کلیدهای اصلی به ستون‌های دیتافریم تبدیل شدن و کلیدهای داخلی سطرها رو تشکیل می‌دن.

با این حال، خروجی کمی نامنظم به نظر می‌رسه، نه؟ بیا ببینیم چطور می‌تونی اونو به دیتافریم‌های بیشتری تقسیم کنی.

باید دوباره خروجی به‌دست‌اومده از json.loads رو به json_normalize پاس بدی، اما این بار باید یک پارامتر اضافه به نام record_path رو هم مشخص کنی.

خروجی
            URL      name
0  datacamp.com  Datacamp
خروجی
          author edition  id language
0          Allen   first  01     JSON
1  Aditya Sharma  second  02   Python

از خروجی‌های بالا می‌بینی که حالا کلیدهای اصلی به دو دیتافریم جداگانه تقسیم شدن؛ به طوری که اسامی ستون‌ها دقیقاً همون کلیدهایی هستن که به شکل کلید-مقدار داخل کلیدهای اصلی تودرتو شده بودن. جالب نیست؟

در نهایت، برای جمع‌بندی بارگذاری داده‌های JSON، بیا خیلی سریع ببینیم چطور می‌تونی فایل JSON رو به جای یک رشته، دقیقاً مثل یک فایل بخونی.

  • خوندن یک فایل JSON

اگه به سلول بالا دقت کنی، می‌بینی که در ابتدا و انتهای داده‌ها دابل‌کوتیشن قرار نگرفته؛ این یعنی با این داده‌ها مثل یک فایل رفتار می‌کنی و اونا رو می‌خونی.

می‌تونی این کار رو فقط با یک خط کد انجام بدی. بیا ببینیم چطوری!

خروجی
                                           article                                           blog
0  [{'id': '01', 'language': 'JSON', 'edition': '...  [{'name': 'Datacamp', 'URL': 'datacamp.com'}]

از خروجی بالا می‌بینی که این حالت دقیقاً مشابه زمانیه که یک فایل JSON رو به عنوان یک رشته خوندی. تنها تفاوت اینجاست که برای تجزیه و مسطح‌سازی JSON از pandas استفاده می‌کنی. از اونجایی که ساختار JSON در واقع یک دیکشنریه، باید از تابع .from_dict() استفاده کنی.

بارگذاری داده‌های HTML

زبان HTML یک زبان نشانه‌گذاری ابرمتنه که معمولاً برای ایجاد صفحات و برنامه‌های تحت وب استفاده می‌شه. این زبان تلاش می‌کنه ساختار صفحهٔ وب رو به صورت معنایی تفسیر کنه. مرورگر وب یک سند HTML رو از وب‌سرور دریافت کرده و اونو به شکل یک صفحهٔ وب چندرسانه‌ای رندر می‌کنه.

در برنامه‌های تحت وب، HTML در کنار CSS استفاده می‌شه، در حالی که در سمت سرور با فریم‌ورک‌های وب‌سرور مختلفی مثل Flask و Django در ارتباطه.

HTML از تگ‌ها (tags) برای مشخص کردن هر بلوک کد استفاده می‌کنه؛ مثل تگ <p></p> برای شروع و پایان یک پاراگراف، تگ <image></image> برای اضافه کردن تصویر به صفحهٔ وب، و به همین ترتیب تگ‌های زیاد دیگه‌ای که با هم ترکیب می‌شن تا یک صفحهٔ وب HTML رو بسازن.

برای خوندن یک سند HTML، دیتافریم pandas دنبال یک تگ خاص می‌گرده. اون تگ، <td></td> نام داره که برای تعریف جدول در HTML استفاده می‌شه.

کتابخونهٔ pandas از تابع read_html() برای خوندن اسناد HTML استفاده می‌کنه.

بنابراین، هر وقت یک سند HTML رو به pandas پاس دادی و انتظار داشتی یک دیتافریم منظم در خروجی تحویل بگیری، باید مطمئن بشی که اون صفحهٔ HTML حتماً جدول داشته باشه!

  • دربارهٔ دیتاست: قراره از یک وب‌سایت ارز دیجیتال (Cryptocurrency) به عنوان یک دیتاست HTML استفاده کنی که ارزهای دیجیتال متفاوتی در اون وجود داره و شامل جزئیات مختلفی دربارهٔ هر سکه می‌شه، نظیر:
    • آخرین قیمت سکه (Last price)
    • اینکه آیا قیمت این سکه افزایش داشته یا کاهش (بر حسب درصد %)
    • حجم معاملات ۲۴ ساعته (چه تعداد سکه خرید و فروش شده 24 volume)
    • تعداد کل سکه‌ها (# Coins)

پس بیا شروع کنیم!

اول باید کتابخونهٔ requests رو فراخوانی کنی تا بتونی درخواستت رو به همون URL که قراره محتوای HTML ازش استخراج بشه، بفرستی.

خب، تا اینجای کار، URL مورد نظرت رو تعریف کردی و با استفاده از تابع requests.get() یک درخواست به اون آدرس فرستادی و یک پیام تایید به‌صورت acknowledgement [200] OK دریافت کردی که یعنی با موفقیت تونستی با اون web server ارتباط برقرار کنی.

حالا برای خوندن محتوای این صفحهٔ وب HTML، فقط کافیه دستور crypto_url.text رو فراخوانی کنی تا کد HTML این صفحهٔ cryptocurrency رو در اختیارت بذاره.

برای مشاهدهٔ خروجی، می‌تونی دستور crypto_url.text رو اجرا کنی.

در آخر باید crypto_url.text رو به عنوان ورودی به تابع pd.read_html() پاس بدی که در نهایت یک لیست از دیتافریم‌ها برمی‌گردونه که هر عضو اون لیست، برابر با یک جدول در صفحهٔ cryptocurrency است.

بیا خروجی تابع length و type دیتافریم رو چاپ کنیم. type باید یک لیست باشه.

خروجی
(1, list)

از خروجی بالا، مشخصه که فقط ۱ جدول با نوع داده لیست وجود داره.

بیا ستون اول و دوم رو حذف کنیم چون اطلاعات کاربردی در اون‌ها وجود نداره و فقط سطرها رو نگه‌داریم.

در نهایت، وقتشه دیتافریم cryptocurrency رو چاپ کنی!

خروجی
          Name  Ticker    Last price  %24 high        24 low     Price Charts 7d  24 volume  # Coins  Market cap
0      bitcoin     BTC   $ 8,008.027     +1.83%   $ 8,056.630   $ 7,812.784              NaN   $ 12.04B   17.71M  $ 141.89B
1     ethereum     ETH   $ 251.72335     +2.68%   $ 253.84721   $ 242.95687              NaN    $ 6.93B  106.20M   $ 26.73B
2     litecoin     LTC   $ 98.633851    +11.08%   $ 99.946324   $ 88.618815              NaN    $ 3.46B   61.91M    $ 6.10B
3  bitcoincash     BCH   $ 411.94075     +2.31%   $ 418.60850   $ 394.18927              NaN    $ 2.10B   17.79M    $ 7.33B
4          eos     EOS   $ 6.4230717     +6.05%   $ 6.4765695   $ 6.0264079              NaN    $ 2.06B    1.01B    $ 6.50B

از جدول بالا می‌تونی مشاهده کنی که سکه Bitcoin ارزش Market Cap. بالاتری داره.

حذف مقادیر NaN

در این دیتافریم با مقادیری روبه‌رو هستیم که اعداد واقعی نیستن، پس بیا خیلی سریع اونا رو از جدول حذف کنیم.

اما قبل از اون بیا کل ستون Price Charts 7d رو پاک کنیم چون کاملاً از مقادیر NaN پر شده و هیچ داده‌ای در اون وجود نداره.

خروجی
          Name Ticker   Last price %24 high       24 low   24 volume # Coins Market cap
0      bitcoin    BTC  $ 8,008.027   +1.83%  $ 8,056.630  $ 7,812.784  $ 12.04B  17.71M  $ 141.89B
1     ethereum    ETH  $ 251.72335   +2.68%  $ 253.84721  $ 242.95687   $ 6.93B 106.20M   $ 26.73B
2     litecoin    LTC  $ 98.633851  +11.08%  $ 99.946324  $ 88.618815   $ 3.46B  61.91M    $ 6.10B
3  bitcoincash    BCH  $ 411.94075   +2.31%  $ 418.60850  $ 394.18927   $ 2.10B  17.79M    $ 7.33B
4          eos    EOS  $ 6.4230717   +6.05%  $ 6.4765695  $ 6.0264079   $ 2.06B   1.01B    $ 6.50B

حالا بیا NaN's. رو حذف کنیم.

مصورسازی سکه‌های دیجیتال (Ticker) در مقابل درصد افزایش/کاهش قیمت (%)

اول بیا کتابخونه matplotlib رو برای رسم نمودار فراخوانی کنیم.

ستون % از نوع string هست، در حالی که باید از جنس float باشه. اول باید علامت % رو از این ستون حذف کنی و سپس نوع متغیر اون ستون رو به float تغییر بدی.

حالا بیا داده‌ها رو رسم کنیم.

در نمودار بالا می‌بینی که سکه‌های Litecoin (LTC) و Huobitoken (HT) بیشترین رقم افزایش قیمت رو داشتن و در مقابل، Maticnetwork (MATIC) و Waves دارای بیشترین کاهش قیمت در بین بقیهٔ ارزهای دیجیتال بودن.

بارگذاری داده‌های Pickle

فرمت Pickle یک فرمت باینری مخصوص پایتون برای سریال‌سازی داده‌هاست که برخلاف JSON، برای انسان‌ها قابل خوندن نیست. این فرمت برای سریال‌سازی (serialization) و از-سریال‌خارج‌کردن‌ ساختارهای شیء در پایتون کاربرد داره. در روند پردازش، این کتابخونه شیء مورد نظر رو سریال‌سازی کرده و در قالب Pickle در فایل ذخیره می‌کنه و در واقع یک گروه داده مثل یک DataFrame، لیست، دیکشنری و غیره رو به جریانی از کاراکترها تبدیل می‌کنه.

بهترین ویژگی استفاده از Pickle اینه که می‌تونه فرمت‌های مختلفی از انواع داده‌ها در پایتون رو ذخیره کنه.

فایل‌های Pickle استفادهٔ گسترده‌ای در ذخیرهٔ الگوریتم‌های آموزش‌دیدهٔ ماشین لرنینگ دارن. این ماژول هم مثل JSON از توابع کاربردی‌ای نظیر pickle.load() برای بارگذاری یک فایل در فرمت Pickle، و pickle.dump() برای ذخیرهٔ فایل در این فرمت بهره می‌بره.

یک مزیت مهم دیگهٔ استفاده از Pickle اینه که ذخیرهٔ دیتافریم به صورت یک فایل Pickle فضای کمتری رو در دیسک اشغال می‌کنه و در حین بارگذاری مجدد فایل، نوع داده‌های اون تغییری نمی‌کنه..

پس بیا به سرعت دیتافریم فایل cryptocurrency که قبلاً ساختی رو با pickle کردن ذخیره کنی و بلافاصله این شیء pickled رو با کتابخونهٔ pandas بخونی.

باید از دستور pickle.dump استفاده کنی تا دیتافریم رو تحت عنوان یک فایل Pickle ذخیره کنی و protocol رو همون HIGHEST_PROTOCOL در نظر بگیری که برای سازگاری با نسخه‌های قبلی پایتون مثل نسخهٔ ۲ هم کاربردیه.

در نهایت، برای تبدیل شیء pickle به دیتافریم باید از تابع read_pickle از کتابخونهٔ pandas استفاده کنی.

خروجی
          Name Ticker   Last price %24 high       24 low   24 volume # Coins Market cap
0      bitcoin    BTC  $ 7,776.567   +1.81%  $ 7,870.205  $ 7,506.518  $ 12.70B  17.71M  $ 137.78B
1     ethereum    ETH  $ 241.81372   -0.97%  $ 245.57293  $ 232.62523   $ 7.47B 106.18M   $ 25.67B
2     litecoin    LTC  $ 88.062811   +0.33%  $ 88.946501  $ 85.248641   $ 2.59B  61.90M    $ 5.45B
3  bitcoincash    BCH  $ 388.76089   +0.06%  $ 398.27697  $ 370.29831   $ 2.33B  17.79M    $ 6.91B
4          eos    EOS  $ 5.9327948   -0.41%  $ 6.0163442  $ 5.7789154   $ 1.99B   1.01B    $ 6.00B

واو! هیجان‌انگیز نیست؟ چقدر سرراست بود. علاوه بر این، با استفاده از Pickle دیگه نباید نگران خطاهای تبدیل اطلاعات باشی، چون فرآیند سریال‌سازی pickle این کار رو برات انجام می‌ده!

بیشتر یاد بگیر

بابت به پایان رسوندن این آموزش بهت تبریک می‌گم.

این آموزش نقطهٔ شروع خوبی بود تا یاد بگیری چطور با کمک کتابخونهٔ Pandas فرمت‌های مختلفی از داده رو در پایتون بارگذاری کنی.

هنوز فرمت‌های خیلی بیشتری مثل Excel، SQL، HDF5 و غیره وجود دارن که در دستهٔ وارد کردن داده به وسیلهٔ Pandas قرار می‌گیرن. بهتره دست‌به‌کار بشی و با پیدا کردن دیتاست‌های عمومی و جذاب در این فرمت‌ها، کار باهاشون رو تمرین کنی.

اگه دوست داری بیشتر دربارهٔ دیتافریم‌ها در Pandas یاد بگیری، می‌تونی در دورهٔ تعاملی فینکا با نام دستکاری داده‌ها با Pandas شرکت کنی. فینکا همین‌طور چندین آموزش کاربردی دیگه از Pandas رو ارائه می‌ده که شامل اتصال دیتافریم‌ها، پیاده‌سازی میانگین متحرک و استفاده از متد apply هستن.

منابع:

اشتراک‌گذاری
فهرست مطالب
  • مقدمه
  • بارگذاری داده‌های HTML
  • بارگذاری داده‌های Pickle

دریافت اپلیکیشن فینکا

با اپلیکیشن فینکا، به بیشتر دوره‌ها و مسیرها روی موبایل دسترسی دارید، تمرین می‌کنید و یادگیری رو هم‌زمان روی موبایل و دسکتاپ ادامه می‌دید.