تحليل ملفات CSV وتنظيفها باستخدام pandas

تحليل ملفات CSV وتنظيفها باستخدام pandas

تصل البيانات العملية غالباً في ملف CSV غير مثالي: أسماء أعمدة غير موحدة، خلايا فارغة، وأرقام مخزنة كنصوص. قبل بناء رسم أو نموذج، يجب معرفة ما قرأته المكتبة فعلاً. سنستخدم pandas لقراءة مبيعات بسيطة، ونوحّد أسماء الأعمدة، ونعالج القيم الناقصة، ثم نحسب إجمالي كل منتج. الفكرة ليست حفظ أوامر متفرقة، بل بناء مسار تنظيف يمكن تكراره عندما يصل ملف جديد من المصدر نفسه.

تحليل ملفات CSV وتنظيفها باستخدام pandas

الفكرة الأساسية

يمثل DataFrame جدولاً يمكن فحصه وتصفية صفوفه وتجميعها. تبدأ العملية بـ head وinfo وisna لفهم الحجم والأنواع. معالجة القيمة الناقصة تعتمد على معناها: قد نزيل صفاً، أو نستخدم قيمة افتراضية، أو نتركها لأن غيابها يحمل دلالة. لا تستبدل كل الفراغات بصفر تلقائياً، لأن الصفر يختلف عن عدم المعرفة. قبل التلخيص، حوّل السعر والكمية إلى أنواع رقمية وراجع الصفوف التي لم تتحول بنجاح.

مثال برمجي عملي

import pandas as pd

sales = pd.read_csv("sales.csv")
sales.columns = sales.columns.str.strip().str.lower()
sales["quantity"] = pd.to_numeric(sales["quantity"], errors="coerce")
sales["price"] = pd.to_numeric(sales["price"], errors="coerce")
sales = sales.dropna(subset=["product", "quantity", "price"])
sales["total"] = sales["quantity"] * sales["price"]

summary = (sales.groupby("product", as_index=False)["total"]
           .sum()
           .sort_values("total", ascending=False))
print(summary.head())

شرح المثال

ينظف الكود أسماء الأعمدة من المسافات والأحرف الكبيرة، ثم يحول القيم الرقمية مع تحويل غير القابل للقراءة إلى NaN. حذف الصفوف هنا قرار تعليمي مناسب إذا كانت الحقول أساسية، لكنه ليس قاعدة عامة. يحسب total لكل صف ثم يجمعه حسب المنتج. فرز النتيجة يجعل التقرير أسهل في القراءة، لكن يجب التأكد من أن السعر لا يحتوي ضريبة أو عملة مختلفة قبل مقارنة الأرقام.

أنشئ ملفاً صغيراً فيه صف صحيح وصف ناقص وقيمة سعر مكتوبة بطريقة خاطئة. استخدم info قبل وبعد التنظيف ولاحظ التغيير في الأنواع وعدد الصفوف. احفظ summary إلى CSV بعد مراجعته، وأضف عموداً يوضح عدد عمليات البيع حتى لا تعتمد على الإجمالي وحده. عند وصول ملفات شهرية، اجعل التنظيف دالة تستقبل DataFrame وتعيد نتيجة موثقة.

طريقة التفكير قبل التنفيذ

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

من المفيد أيضاً أن تكتب مثالاً يدوياً للنتيجة المتوقعة. عندما ترى البيانات أمامك، ستلاحظ حقولاً ناقصة أو حالات لم تكن في بالك. احتفظ بهذه الملاحظات بجانب المشروع، وحدّثها إذا تغير التصميم. التوثيق القصير في البداية يوفر وقتاً كبيراً عندما يعود الفريق إلى الكود بعد أسابيع.

اختبار الفكرة في حالات مختلفة

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

  • تحقق من البيانات قبل تمريرها إلى الجزء الذي يعالجها.
  • استخدم رسائل خطأ تشرح المشكلة من دون كشف أسرار النظام.
  • اختبر المسار الناجح والمسارات التي تعيد نتيجة فارغة.
  • سجّل القرار الذي اتخذته عندما توجد أكثر من طريقة للحل.

ملاحظات على جودة المشروع

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

متى يحتاج الحل إلى تطوير؟

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

أخطاء ينبغي تجنبها

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

خطوة تالية مناسبة

أضف اختباراً يثبت أن الكمية السالبة مرفوضة أو مصنفة كمرتجع، ثم أنشئ تقريراً يقارن المبيعات بين شهرين. احتفظ بنسخة من الملف الخام كي يمكن مراجعة أي نتيجة غير متوقعة.

تنظيف CSV قبل تحليله

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

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

خطة تطبيق عملية

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

انتقل بعد ذلك إلى الحالات التي تسبب الالتباس. ماذا يحدث عندما تكون القيمة فارغة؟ كيف يتصرف البرنامج عند وصول نوع غير متوقع؟ هل تعود رسالة مفيدة إذا توقفت الخدمة الخارجية أو لم يجد التطبيق السجل المطلوب؟ اكتب إجابة لكل سؤال في اختبار أو ملاحظة قصيرة. لا تحاول معالجة كل احتمال في سطر واحد؛ فصل المسارات يجعل التصحيح أسهل ويمنع إخفاء المشكلة خلف استثناء عام.

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

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

الخلاصة

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

ابدأ بتطبيق المثال على ملف صغير، ثم غيّر مدخلاً واحداً وراقب النتيجة. بعد ذلك أضف حالة فشل واكتب اختباراً لها، ثم انقل الفكرة إلى مشروعك الحقيقي بحذر. عندما تفهم سبب كل خطوة، ستستطيع تغيير الأدوات أو اللغة من دون فقدان المفهوم. البرمجة تتحسن بالمحاولات القصيرة والمراجعة المستمرة، لا بنسخ كود طويل من دون معرفة ما الذي يحميه أو ما الذي قد يكسره.