عندما يمكن طرح ذاكرة العربات و / أو مجموعة بيانات صغيرة بأمان في حيوانات الباندا دون أي تحسين. ومع ذلك ، إذا كانت البيانات كبيرة ، فإن السؤال الذي يطرح نفسه هو كيفية معالجتها أو على الأقل حسابها.
يُقترح النظر في التحسين في صورة مصغرة حتى لا يتم سحب مجموعات البيانات العملاقة من الشبكة.
بصفتنا مجموعة بيانات ، سوف نستخدم habrastatistics مع تعليقات المستخدمين لعام 2019 ، وهو متاح للجمهور بفضل مستخدم مجتهد واحد:
بياناتكقاعدة معلومات ، سيتم استخدام
المقال المترجم مسبقًا من هبر ، حيث يتم خلط الكثير من الأشياء المثيرة للاهتمام.
بدلا من الانضمام
تعتبر مجموعة بيانات habrastatistics صغيرة ، على الرغم من أنها تحتل 288 ميجابايت وتتألف من 448،533 سطرًا.
بالطبع ، يمكنك العثور على مزيد من البيانات ، ولكن حتى لا نعلق السيارة ، فلنتحدث عنها.
لتوفير الراحة للعمليات ، سنضيف (فقط اكتب السطر الأول إلى الملف) أسماء الأعمدة:
a,b,c,d
الآن ، إذا قمت بتحميل مجموعة البيانات مباشرة في الباندا وتحقق من مقدار الذاكرة التي تستخدمها
import os import time import pandas as pd import numpy as np gl = pd.read_csv('habr_2019_comments.csv',encoding='UTF') def mem_usage(pandas_obj): if isinstance(pandas_obj,pd.DataFrame): usage_b = pandas_obj.memory_usage(deep=True).sum() else:
نرى أنه "يأكل" 436.1 ميغابايت:
RangeIndex: 448533 entries, 0 to 448532 Data columns (total 4 columns): a 448533 non-null object b 448533 non-null object c 448533 non-null object d 448528 non-null object dtypes: object(4) memory usage: 436.1 MB
كما يوضح أننا نتعامل مع الأعمدة التي تحتوي على بيانات كائن الكتابة.
لذلك ، وفقًا
للمقال ، بالنسبة للأعمدة ، من الضروري التركيز على التحسين المحسوب للكائن. لجميع الأعمدة باستثناء واحد.
يحتوي العمود (ب) على تواريخ ، ومن أجل توفير مزيد من العمليات الحسابية والوضوح ، من الأفضل إرسالها إلى فهرس مجموعة البيانات. للقيام بذلك ، قم بتغيير الكود المستخدم عند قراءة مجموعة البيانات:
gl = pd.read_csv('habr_2019_comments.csv', parse_dates=['b'], encoding='UTF')
تتم الآن قراءة التواريخ كمؤشر لمجموعة البيانات ويتم تقليل استهلاك الذاكرة قليلاً:
memory usage: 407.0 MB
نحن الآن نحسن البيانات في مجموعة البيانات نفسها خارج الأعمدة والفهرس
يُطلق على التحسين: "تحسين تخزين بيانات أنواع الكائنات باستخدام المتغيرات الفئوية".
إذا تمت ترجمتها إلى الروسية ، فنحن بحاجة إلى دمج البيانات في الأعمدة حسب الفئة ، حيث تكون فعالة.
لتحديد الفعالية ، تحتاج إلى معرفة عدد القيم الفريدة في الأعمدة وإذا كان أقل من 50٪ من إجمالي عدد القيم في العمود ، فسيكون دمج القيم في الفئة فعالاً.
لنلقِ نظرة على مجموعة البيانات:
gl_obj=gl.select_dtypes(include=['object']).copy() gl_obj.describe()
:
acd count 448533 448533 448528 unique 25100 185 447059 top VolCh 0 ! freq 3377 260438 184
* العمود مع التواريخ في الفهرس وليس عرضها
كما ترون ، من الصف الفريد ، في العمودين
a و
c ، الاتحاد في الفئة فعال. بالنسبة للعمود "أ" ، يبلغ عدد المستخدمين 25100 (أقل من 448533 بشكل واضح) ، لقيم ج - 185 للقياس "+" و "-" (أيضًا أقل بكثير من 448533).
نحن تحسين الأعمدة:
for col in gl_obj.columns: num_unique_values = len(gl_obj[col].unique()) num_total_values = len(gl_obj[col]) if num_unique_values / num_total_values < 0.5: converted_obj.loc[:,col] = gl_obj[col].astype('category') else: converted_obj.loc[:,col] = gl_obj[col]
لفهم مقدار الذاكرة المستخدمة للراحة ، نقدم وظيفة:
def mem_usage(pandas_obj): if isinstance(pandas_obj,pd.DataFrame): usage_b = pandas_obj.memory_usage(deep=True).sum() else:
وتحقق مما إذا كان التحسين فعالًا:
>>> print(' : '+mem_usage(gl_obj)) : 407.14 MB >>> print(' : '+mem_usage(converted_obj)) : 356.40 MB >>>
كما ترون ، تم استلام مكاسب قدرها 50 ميغابايت أخرى.
الآن ، بعد أن أدركنا أن التحسين قد استفاد (يحدث والعكس صحيح) ، سنقوم بتعيين معلمات مجموعة البيانات عند القراءة من أجل مراعاة البيانات التي نتعامل معها على الفور:
gl = pd.read_csv('habr_2019_comments.csv', parse_dates=['b'],index_col='b',dtype ={'c':'category','a':'category','d':'object'}, encoding='UTF')
نتمنى لك العمل بسرعة مع مجموعات البيانات!
رمز التنزيل
هنا .