كيف تساعد الباندا في معالجة كميات كبيرة من البيانات؟

مكتبة الباندا هي واحدة من أفضل الأدوات لتحليل البيانات الاستكشافية . لكن هذا لا يعني أن الباندا أداة عالمية مناسبة لحل أي مشاكل. على وجه الخصوص ، نحن نتحدث عن معالجة كميات كبيرة من البيانات. تصادف أنني قضيت وقتًا طويلاً جدًا في انتظار الباندا لقراءة الكثير من الملفات ، أو معالجتها ، على أساس المعلومات الواردة فيها بعض المؤشرات التي تهمني. والحقيقة هي أن الباندا لا تدعم آليات معالجة البيانات الموازية. ونتيجة لذلك ، فشلت هذه الحزمة في الاستفادة الكاملة من قدرات المعالجات الحديثة متعددة النواة. تتم معالجة مجموعات البيانات الكبيرة في الباندا ببطء.



في الآونة الأخيرة ، شرعت في العثور على شيء من شأنه أن يساعدني في معالجة البيانات الضخمة. تمكنت من العثور على ما كنت أبحث عنه ، وقمت بتضمين الأداة التي تم العثور عليها في مسار معالجة البيانات الخاص بي. أستخدمه للعمل مع كميات كبيرة من البيانات. على سبيل المثال ، لقراءة الملفات التي تحتوي على 10 غيغابايت من البيانات ، لتصفية وتجميعها. عندما أتمكن من حل مثل هذه المشاكل ، أحفظ ما حصلت عليه في ملف CSV أصغر مناسب للباندا ، ثم أبدأ العمل مع البيانات باستخدام الباندا.

إليك دفتر ملاحظات جوبيتر يحتوي على أمثلة لهذه المواد التي يمكنك تجربتها.

داسك


الأداة التي أستخدمها لمعالجة كميات كبيرة من البيانات هي مكتبة Dask . يدعم معالجة البيانات المتوازية ، مما يتيح لك تسريع عمل الأدوات الموجودة. وهذا يشمل numpy ، الباندا و sklearn. داسك هو مشروع مجاني مفتوح المصدر. يستخدم Python APIs وهياكل البيانات ، مما يجعل من السهل دمج Dask في المشاريع القائمة. إذا وصفنا باختصار داسك ، فيمكننا القول أن هذه المكتبة تبسط حل المشاكل العادية وتجعل من الممكن حل مشكلات التعقيد الهائل.

مقارنة الباندا والداسك


يمكنني وصف إمكانيات داسك هنا ، حيث أن هذه المكتبة لديها الكثير من الأشياء المثيرة للاهتمام ، ولكن بدلاً من ذلك ، أنا أعتبر مثالاً عمليًا واحدًا. أثناء العمل ، عادة ما أواجه مجموعات من الملفات الكبيرة ، البيانات المخزنة التي تحتاج إلى تحليل. لنلعب إحدى مهماتي النموذجية وننشئ 10 ملفات ، يحتوي كل منها على 100000 سجل. يبلغ حجم كل ملف 196 ميغابايت.

from sklearn.datasets import make_classification
import pandas as pd
for i in range(1, 11):
    print('Generating trainset %d' % i)
    x, y = make_classification(n_samples=100_000, n_features=100)
    df = pd.DataFrame(data=x)
    df['y'] = y
    df.to_csv('trainset_%d.csv' % i, index=False)

الآن اقرأ هذه الملفات باستخدام الباندا وقياس الوقت المطلوب لقراءتها. لا يوجد دعم مدمج في الباندا glob، لذلك يجب علينا قراءة الملفات في حلقة:

%%time
import glob
df_list = []
for filename in glob.glob('trainset_*.csv'):
    df_ = pd.read_csv(filename)
    df_list.append(df_)
df = pd.concat(df_list)
df.shape

استغرق الأمر 16 ثانية حتى تتمكن الباندا من قراءة هذه الملفات:

CPU times: user 14.6 s, sys: 1.29 s, total: 15.9 s
Wall time: 16 s

إذا تحدثنا عن Dask ، يمكن ملاحظة أن هذه المكتبة تسمح لك بمعالجة الملفات التي لا تتناسب مع الذاكرة. يتم ذلك عن طريق تقسيمها إلى كتل وتجميع سلاسل المهام. دعونا نقيس الوقت الذي يحتاجه Dask لقراءة هذه الملفات:

import dask.dataframe as dd
%%time
df = dd.read_csv('trainset_*.csv')
CPU times: user 154 ms, sys: 58.6 ms, total: 212 ms
Wall time: 212 ms

استغرق داسك 154 مللي ثانية! كيف يكون هذا ممكن حتى؟ في الواقع ، هذا غير ممكن. تطبق Dask نموذج مهمة مؤجل. يتم إجراء الحسابات فقط عند الحاجة إلى نتائجها. نحن نصف الرسم البياني للتنفيذ ، الذي يمنح داسك القدرة على تحسين تنفيذ المهام. كرر التجربة. لاحظ أن الوظيفة read_csvمن Dask لها دعم مدمج للعمل مع glob:

%%time
df = dd.read_csv('trainset_*.csv').compute()
CPU times: user 39.5 s, sys: 5.3 s, total: 44.8 s
Wall time: 8.21 s

يؤدي استخدام الوظيفة إلى computeإجبار Dask على إرجاع النتيجة ، والتي تحتاج إلى قراءة الملفات لها حقًا. والنتيجة أن داسك يقرأ الملفات مرتين بسرعة الباندا.

يمكن القول أن Dask تسمح لك بتجهيز مشاريع Python بأدوات القياس.

مقارنة استخدام وحدة المعالجة المركزية في Pandas و Dask


هل يستخدم داسك جميع نوى المعالج على النظام؟ قارن استخدام موارد المعالج في الباندا وفي Dask عند قراءة الملفات. نفس الرمز الذي قمنا بمراجعته أعلاه ينطبق هنا.


استخدام موارد المعالج عند قراءة الملفات باستخدام الباندا


استخدام موارد المعالج عند قراءة الملفات باستخدام Dask

يسمح لك زوجان من الصور المتحركة المذكورة أعلاه برؤية واضحة لكيفية استخدام الباندا و Dask لموارد المعالج عند قراءة الملفات.

ماذا يحدث في أحشاء داسك؟


يتكون Dataframe Dask من عدة dataframes ، مفصولة بفهارس. عندما نقوم بتنفيذ دالة read_csvمن Dask ، فإنه يقرأ نفس الملف من خلال عدة عمليات.

يمكننا حتى تصور رسم بياني لهذه المهمة.

exec_graph = dd.read_csv('trainset_*.csv')
exec_graph.visualize()


الرسم البياني لوقت تشغيل Dask عند قراءة ملفات متعددة

عيوب داس


ربما لديك الآن الفكرة التالية: "إذا كانت مكتبة Dask جيدة جدًا ، فلماذا لا تستخدمها فقط بدلاً من الباندا؟" ولكن ليس بهذه البساطة. يتم نقل بعض وظائف الباندا فقط إلى Dask. والحقيقة هي أن بعض المهام يصعب موازنتها. على سبيل المثال ، فرز البيانات وتعيين الفهارس للأعمدة غير المصنفة. Dask ليست أداة تعمل على حل جميع مهام تحليل البيانات ومعالجتها. يوصى باستخدام هذه المكتبة فقط للعمل مع مجموعات البيانات التي لا تتناسب تمامًا مع الذاكرة. نظرًا لأن مكتبة Dask تعتمد على الباندا ، فإن كل شيء يعمل ببطء في الباندا سيظل بطيئًا في Dask. كما قلت من قبل ، Dask هي أداة مفيدة يمكنك تضمينها في مسار معالجة البيانات ، ولكن هذه الأداة لا تحل محل مكتبات أخرى.

تثبيت Dask


لتثبيت Dask ، يمكنك استخدام الأمر التالي:

python -m pip install "dask[complete]"

ملخص


في هذه المقالة ، لمست سطحيًا فقط قدرات داسك. إذا كنت مهتمًا بهذه المكتبة - ألق نظرة على هذه الدروس الرائعة حول Dask ، وتوثيق datafreymam Dask. وإذا كنت تريد معرفة الوظائف التي تدعم Dataframes Dask ، اقرأ وصف API DataFrame.

هل تستخدم مكتبة داسك؟

نذكرك بأننا نواصل مسابقة التنبؤ التي يمكنك من خلالها الفوز بجهاز iPhone جديد تمامًا. لا يزال هناك وقت لاقتحامها ، وإجراء توقعات أكثر دقة حول القيم الموضعية.


All Articles