اذهب إلى المحتوى

السؤال

نشر

عندما أقوم بإستدعاء ملف csv كالتالي:

df = pd.read_csv('data.csv')

يظهر لي هذا الخطأ:

/Users/Fahmy/anaconda/envs/py27/lib/python2.7/site-packages/pandas/io/parsers.py:1130: DtypeWarning: Columns (4,5,7,16) have mixed types. Specify dtype option on import or set low_memory=False.

ما علاقة dtype بـ low_memory أليست dtype نوع في مكتبة numpy؟ ولماذا يخبرني بجعل low_memory تساوي false؟ لم أفهم كيف يساعد هذا الأمر في حل المشكلة؟

Recommended Posts

  • 0
نشر

لديك ملف csv يحوي على أعمدة بنمط بيانات متعدد (غير محدد) هذا يؤدي أنه لكي تعمل مكتبة panda على الملف، عليها تحيليل هذه البيانات لتتوقع نمط البيانات لكل عمود غير محدد وهذا يأخذ الكثير من الذاكرة، ذلك يظهر لك الخطأ.

الحل هو تمرير: low_memory=False

df = pd.read_csv('data.csv', low_memory=False)

أو وضع نمطافتراضي  'dtype='unicode

df = pd.read_csv('data.csv', dtype='unicode')

ويمكن تمرير :

error_bad_lines=False, index_col=False,

لتسريع الأداء

  • 0
نشر

هذه التحذيرات تظهر بسبب وجود أعمدة  بأنماط متعددة مما يستهلك الكثير من الموارد لنحديد الأنماط وكما وضح وائل أنه يمكنك تفادي هذه التحذيرات من خلال  low_memory=False أو تحديد نمط إفتراضي ولكن ذلك لا يحسن استهلاك الموارد 

لذلك الأفضل هو تفادي هذه التحذيرات والعمل بدون مشاكل ويمكنك عمل ذلك من خلال 

#Dtype تجاهل الأخطاء الخاصة بال                                                                                                                                                                                             
warnings.filterwarnings('ignore', message="^Columns.*")

ويمكنك أيضاً ال converters لتحويل نمط الأعمدة ولكن هذا الحل ربما يبطئ البرنامج في حالة الملفات الكبيرة 

  • 1
نشر (معدل)

الإجابة التالية حسب توثيق باندا. عندما نضع low_memory=False فهذا يعني أن باندا ستقرأ الأعمدة بأكملها أولاً، ثم يتم تحديد الأنواع المناسبة لكل عمود. على سبيل المثال، سيتم الاحتفاظ بالعمود ككائنات (سلاسل) حسب الحاجة للحفاظ على المعلومات. (وهذا سيئ للذاكرة).
إذا كان low_memory = True (الافتراضي)، فإن الباندا تقوم بمعالجة الملف داخلياً ضمن "chunks" (طريقة منهجية للتقسيم إلى أجزاء بحيث يسهل تجميعها لاحقأ)، ثم لاحقاً يقوم بدمجها معاً. مما يؤدي إلى استخدام أقل للذاكرة أثناء عملية ال parsing (التحويل من نمط بيانات إلى نمط آخر)، بعد ذلك، قد تكون بعض الأعمدة مثلاً "chunks of integers and strings"  أي مزيج من السلاسل والأعداد الصحيحة، وهنا قد تحدث مشكلة مثلاً عنصر لم يستطع باندا تحويله من نمط إلى آخر وبالتلي قد ينتج عمود كل قيمه أعداد صحيحة ماعدا عنصر واحد لم يستطع باندا تحويله إلى عدد صحيح، لذا في حال حدوث ذلك  ولو لمرة واحدة، فستظهر رسالة تحذرك من ذلك لأن هذا قد يسبب مشاكل لاحقاً ولذلك فمن الآمن أكثر أن نحدد نوع البيانات لكل عمود من خلال الوسيطة dtype وبالتالي سيفهم باندا مباشرة عند قراءة العمود نوع بيانات كل عمود وبالتالي تجنب حدوث أي مشاكل وهذا ماعليك القيام به دائماً دائماً:

# هنا نحدد ال dtype
df = pd.read_csv(csv_file,sep=';', encoding = 'ISO-8859-1',names=['c1','c2'], dtype={'c1':str,'c2':int})

أو نضع low_memory=False لنضمن أنه لن تكون هناك أنواع مختلطة (أي لتضمن عدم وجود عمود به قيم من أنماط مختلفة) أي أيضاً سيتم حل الأمر، لكن هذا الأمر سيكون على حساب الكفاءة كما أشرنا.

df = pd.read_csv('data.csv', low_memory=False)

وفي حال أردت فلترة التحذير:

import warnings
warnings.filterwarnings('ignore', message="^Columns.*")

 

تم التعديل في بواسطة Ali Haidar Ahmad

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...