برنامه نویسی ۲۷۸ بازدید

Datatable یک کتابخانه پایتون برای پردازش چند نخی کارآمد داده‌ها با پشتیبانی از دیتاست‌های خارج از حافظه است.

از نخستین روز پیدایش تمدن تا سال 2003 کلاً 5 اگزابایت داده تولید شده بود، اما این حجم از اطلاعات اکنون هر دو روز یک بار تولید می‌شود.

- اریک اشمیت

اگر یک کاربر R باشید این احتمال وجود دارد که قبلاً از پکیج data.table استفاده کرده باشید. data.table اکستنشنی از پکیج data.frame در R است. همچنین یک پکیج آماده برای کاربران R است که به وسیله آن می‌توانند داده‌های بزرگی در حد 100 گیگابایت را در RAM تجمیع کنند.

پکیج data.frame در R بسیار متنوع است و به دلیل سهولت استفاده، راحتی و سرعت برنامه‌نویسی‌اش عملکرد بالایی دارد. این پکیج در جامعه R نسبتاً مشهور است و در ماه بیش از 400 هزار دانلود دارد. تقریباً 650 CRAN و پکیج Bioconductor از آن استفاده می‌کنند.

اینک سؤال این است که‌ این پکیج برای کاربران پایتون چه کاربردی دارد؟ خبر خوب این است که این پکیج یک همتای پایتون به نام datatable دارد که تمرکز اصلی آن روی پشتیبانی از داده‌های بزرگ و عملکرد بالا برای دیتاست‌های داخل حافظه و خارج از حافظه و الگوریتم‌های چند نخی است. بدین ترتیب می‌توان آن را هم‌نیای جوان‌تر data.table نامید.

Datatable

Datatable

اپلیکیشن‌های مدرن یادگیری ماشین باید مقادیر عظیمی از داده‌ها را تحلیل کرده و قابلیت‌های مختلفی ایجاد کنند. این وضعیت برای ساخت مدل‌هایی با دقت بالاتر ضروری است. ماژول datatable در پایتون برای رفع این مشکل ساخته شده است. این ماژول یک کیت ابزار برای اجرای عملیات مختلف روی کلان‌داده (تا 100 گیگابایت) در یک ماشین تک گرهی با بیشینه سرعت ممکن است. توسعه datatable از سوی H2O.ai پشتیبانی می‌شود و نخستین کاربر datatable نیز Driverless.ai بوده است.

این کیت ابزار بسیار شبیه به Pandas است، اما تمرکز آن بیشتر روی سرعت و پشتیبانی از کلان‌داده است. ماژول datatable در پایتون همچنین برای دستیابی به تجربه مناسب کاربری، پیام‌های خطای مفید و API قدرتمند طراحی شده است. در این مقاله خواهیم دید که چگونه می‌توانیم از datatable استفاده کنیم و این ماژول در زمان کار با دیتاست‌های بزرگ چگونه بر Pandas ارجحیت می‌یابد.

فیلم آموزشی مرتبط

نصب

datatable را می‌توان به سادگی با استفاده از pip روی macOS نصب کرد:

pip install datatable

نصب روی لینوکس با استفاده از توزیع باینری به صورت زیر اجرا می‌شود:

# If you have Python 3.5

pip install https://s3.amazonaws.com/h2o-release/datatable/stable/datatable-0.8.0/datatable-0.8.0-cp35-cp35m-linux_x86_64.whl

# If you have Python 3.6

pip install https://s3.amazonaws.com/h2o-release/datatable/stable/datatable-0.8.0/datatable-0.8.0-cp36-cp36m-linux_x86_64.whl

datatable در حال حاضر روی ویندوز کار نمی‌کند، اما به زودی پشتیبانی از ویندوز نیز به آن اضافه خواهد شد. برای کسب اطلاعات بیشتر به دستورالعمل‌های ساخت (+) مراجعه کنید. کدهای این مقاله را می‌توانید در این ریپازیتوری گیت‌هاب (+) ملاحظه کنید.

خواندن داده‌ها

دیتاست مورد استفاده در این مقاله از kaggle دریافت شده است و به دیتاست «Lending Club Loan Data» (+) تعلق دارد. این دیتاست شامل داده‌های وام برای همه تسهیلات از سال 2007 تا 2015 است که شامل وضعیت وام (جاری، سررسید گذشته، تسویه شده و غیره) می‌شود و اطلاعات آخرین پرداخت را نیز در خود دارد. این فایل شامل 2.26 میلیون ردیف و 145 ستون است. اندازه داده‌ها برای نمایش ظرفیت‌های کتابخانه datatable مناسب است.

# Importing necessary Libraries
import numpy as np
import pandas as pd
import datatable as dt

داده‌ها را در شیء Frame بارگذاری می‌کنیم. واحد بنیادی تحلیل در datatable یک Frame است. این همان نمادگذاری مربوط به Pandas در DataFrame یا جدول SQL است. یعنی داده‌ها در آرایه دوبعدی با ردیف‌ها و ستون‌ها چیدمان یافته‌اند.

فیلم آموزشی مرتبط

با استفاده از datatable

%%time
datatable_df = dt.fread("data.csv")
____________________________________________________________________
CPU times: user 30 s، sys: 3.39 s، total: 33.4 s
Wall time: 23.6 s

تابع ()fread فوق، قدرتمند و همچنین سریع است. این تابع می‌تواند به صورت خودکار پارامترها را برای اغلب فایل‌های متنی تشخیص داده و تحلیل کند، داده‌ها را از آرشیوهای zip یا URL-ها بارگذاری کند، فایل‌های اکسل را بخواند و مواردی از این دست را اجرا کند.

به علاوه تحلیل‌کننده دیتاست، کارهای زیر را انجام می‌دهد:

  • می‌تواند به صورت خودکار جداکننده‌ها، هدرها، انواع ستون، قواعد نقل قول و غیره را تشخیص دهد.
  • می‌تواند داده‌ها را از چندین منبع شامل فایل‌ها، URL، پوسته، متن خام، آرشیوها و glob بخواند.
  • امکان خواندن چند نخی فایل را برای بیشینه سرعت ارائه می‌کند.
  • شامل یک نشانگر پیشرفت است که در زمان خواندن فایل‌های بزرگ به کار می‌آید.
  • می‌تواند فایل‌های منطبق و غیر منطبق با RFC4180 را بخواند.

با استفاده از pandas

اکنون می‌توانیم زمان مورد نیاز از سوی pandas را برای خواندن همان فایل محاسبه کنیم:

%%time
pandas_df= pd.read_csv("data.csv")
___________________________________________________________
CPU times: user 47.5 s، sys: 12.1 s، total: 59.6 s
Wall time: 1min 4s

نتایج نشان می‌دهد که در زمان خواندن دیتاست های بزرگ‌تر، datatable به روشنی عملکرد بالاتری نسبت به pandas دارد. در حالی که pandas بیش از یک دقیقه طول می‌کشد، datatable تنها در طی چند ثانیه این کار را انجام می‌دهد.

فیلم آموزشی مرتبط

تبدیل فریم

فریم کنونی می‌تواند به یک دیتافریم numpy یا pandas نیز تبدیل شود:

numpy_df = datatable_df.to_numpy()
pandas_df = datatable_df.to_pandas()

در ادامه فریم کنونی خود را به شیء دیتافریم pandas نیز تبدیل می‌کنیم و زمان مورد نیاز را مورد مقایسه قرار می‌دهیم.

%%time
datatable_pandas = datatable_df.to_pandas()
___________________________________________________________________
CPU times: user 17.1 s، sys: 4 s، total: 21.1 s
Wall time: 21.4 s

به نظر می‌رسد که خواندن یک فایل به صورت یک فریم datatable و سپس تبدیل کردن آن به دیتافریم‌های pandas نسبت به خواندن از دیتافریم‌های pandas زمان کمتری طول می‌کشد. از این رو ایمپورت کردن فایل داده‌های بزرگ از طریق datatable و سپس تبدیل آن به دیتافریم pandas ایده بهتری به نظر می‌رسد.

type(datatable_pandas)
___________________________________________________________________
pandas.core.frame.DataFrame

مشخصه‌های پایه فریم

در ادامه برخی از مشخصه‌های پایه فریم datatable را که مشابه مشخصه‌های Pandas هستند بررسی می‌کنیم:

print(datatable_df.shape) # (nrows، ncols)
print(datatable_df.names[:5]) # top 5 column names
print(datatable_df.stypes[:5]) # column types(top 5)
______________________________________________________________
(2260668، 145)
('id'، 'member_id'، 'loan_amnt'، 'funded_amnt'، 'funded_amnt_inv')
(stype.bool8، stype.bool8، stype.int32، stype.int32، stype.float64)

همچنین می‌توانیم از دستور head برای ارائه خروجی در n ردیف فوقانی استفاده کنیم.

datatable_df.head(10)

datatable

رنگ در تصویر فوق نشان‌دهنده نوع داده است. رنگ قرمز نماینده نوع string، سبز نشان‌دهنده نوع int و آبی نشان‌دهنده float است.

فیلم آموزشی مرتبط

جمع‌بندی آماری

محاسبه جمع‌بندی آماری در pandas یک پردازشی است که حافظه زیادی مصرف می‌کند، اما datatable چنین حالتی ندارد. با استفاده از datatable می‌توان جمع‌بندی آماری مبتنی بر ستون را محاسبه کرد:

datatable_df.sum()      datatable_df.nunique()
datatable_df.sd()       datatable_df.max()
datatable_df.mode()     datatable_df.min()
datatable_df.nmodal()   datatable_df.mean()

در ادامه میانگین ستون را با استفاده از هر دو کتابخانه pandas و datatable محاسبه می‌کنیم تا اختلاف زمانی را به دست آوریم:

با استفاده از datatable

%%time
datatable_df.mean()
_______________________________________________________________
CPU times: user 5.11 s، sys: 51.8 ms، total: 5.16 s
Wall time: 1.43 s

با استفاده از pandas

pandas_df.mean()
__________________________________________________________________
Throws memory error.

دستور فوق نمی‌تواند در pandas تکمیل شود، زیرا خطای حافظه تولید می‌کند.

دستکاری داده‌ها

جداول داده مانند دیتافریم ساختارهای داده ستونی محسوب می‌شوند. در کتابخانه datatable ابزار اولیه برای همه این عملیات «نمادگذاری براکت» (square-bracket notation) است که از ماتریس سنتی اندیس‌گذاری شده الهام گرفته است، اما کارکردهای بیشتری دارد.

نمادگذاری مشابهی در ریاضیات در زمان اندیس‌گذاری ماتریس‌ها در زبان‌های C/C++ ،R و در pandas ،numpy و غیره استفاده می‌شود. در ادامه شیوه اجرای فعالیت‌های رایج دستکاری داده با استفاده از datatable را مرور می‌کنیم.

انتخاب زیرمجموعه‌ای از ردیف‌ها/ستون‌ها

کد زیر همه ردیف‌ها و ستون funded_amnt را از دیتاست انتخاب می‌کند.

datatable_df[:،'funded_amnt']

در این بخش با شیوه انتخاب 5 ردیف و 3 ستون نخست آشنا می‌شوید:

datatable_df[:5،:3]

Datatable

مرتب‌سازی فریم

در این بخش با روش‌های مختلف مرتب‌سازی داده‌ها آشنا خواهید شد.

با استفاده از datatable

مرتب‌سازی فریم بر مبنای یک ستون خاص با استفاده از datatable به صورت زیر اجرا می‌شود:

%%time
datatable_df.sort('funded_amnt_inv')
_________________________________________________________________
CPU times: user 534 ms، sys: 67.9 ms، total: 602 ms
Wall time: 179 ms

با استفاده از pandas

%%time
pandas_df.sort_values(by = 'funded_amnt_inv')
___________________________________________________________________
CPU times: user 8.76 s، sys: 2.87 s، total: 11.6 s
Wall time: 12.4 s

توجه کنید که اختلاف زمان زیادی بین datatable و pandas وجود دارد.

حذف ردیف‌ها / ستون‌ها

روش حذف ستونی با عنوان member_id به صورت زیر است:

del datatable_df[:، 'member_id']

گروه‌بندی

datatable نیز همانند pandas کارکرد گروه‌بندی بر مبنای یک مشخصه خاص را دارد. در ادامه با شیوه محاسبه میانگین ستون funded_amount که بر مبنای ستون grade گروه‌بندی شده است آشنا می‌شویم.

با استفاده از datatable

%%time
for i in range(100):
datatable_df[:، dt.sum(dt.f.funded_amnt)، dt.by(dt.f.grade)]
____________________________________________________________________
CPU times: user 6.41 s، sys: 1.34 s، total: 7.76 s
Wall time: 2.42 s

با استفاده از pandas

%%time
for i in range(100):
pandas_df.groupby("grade")["funded_amnt"].sum()
____________________________________________________________________
CPU times: user 12.9 s، sys: 859 ms، total: 13.7 s
Wall time: 13.9 s
فیلم آموزشی مرتبط

f. اختصاری برای چیست؟

f اختصاری برای عبارت frame proxy است و روش ساده‌ای برای ارجاع به فریمی که در حال کار روی آن هستیم ارائه می‌کند. در مثال مورد بررسی ft.f به سادگی به معنی dt_df است.

فیلتر کردن ردیف‌ها

ساختار فیلترینگ ردیف‌ها مشابه ساختار GroupBy است. در ادامه ردیف‌های loan_amntfor را برای مشاهده ردیف‌هایی که مقدار loan_amnt بزرگ‌تر از funded_amnt باشد فیلتر می‌کنیم.

datatable_df[dt.f.loan_amnt>dt.f.funded_amnt،"loan_amnt"]

ذخیره‌سازی فریم

امکان نوشتن ثابت فریم در یک فایل CSV به طوری که می‌توان در آینده استفاده کرد، نیز وجود دارد.

datatable_df.to_csv('output.csv')

برای مشاهده کارکردهای دیگر دستکاری داده‌ها به صفحه مستندات (+) مراجعه کنید.

سخن پایانی

ماژول datatable قطعاً امکان اجرای عملیات مختلف را در مقایسه با ماژول پیش‌فرض pandas افزایش می‌دهد و این افزایش در زمانی که با دیتاست‌های بزرگ کار می‌کنید مشهودتر است. اما از آنجا که datatable بر حسب کارکردهای مختلف عقب‌تر از pandas است ممکن است در آینده شاهد افزودن برخی کارکردها به این کتابخانه باشیم.

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

بر اساس رای ۰ نفر
آیا این مطلب برای شما مفید بود؟
شما قبلا رای داده‌اید!
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.

«میثم لطفی» در رشته‌های ریاضیات کاربردی و مهندسی کامپیوتر به تحصیل پرداخته و شیفته فناوری است. وی در حال حاضر علاوه بر پیگیری علاقه‌مندی‌هایش در رشته‌های برنامه‌نویسی، کپی‌رایتینگ و محتوای چندرسانه‌ای، در زمینه نگارش مقالاتی با محوریت نرم‌افزار با مجله فرادرس همکاری دارد.