مكتبة Pandas (2): استكشاف هيكل البيانات وفهم DataFrame و Series
مكتبة Pandas (2): استكشاف هيكل البيانات وفهم DataFrame و Series
بعد إتقان قراءة البيانات كما شرحنا في مكتبة Pandas (1): قراءة واستدعاء البيانات من ملفات CSV و Excel برمجياً، تأتي المرحلة الأهم: فهم البنية الداخلية للكائنات التي نتعامل معها يومياً أثناء التحليل. كثير من الأخطاء في مشاريع التحليل لا تنتج من صعوبة الخوارزمية، بل من سوء فهم شكل البيانات، وأنواع الأعمدة، وطريقة الفهرسة داخل Pandas.
تمثل مكتبة Pandas العمود الفقري للتحليل الجدولي في بيئة Python، لأنها تمنح محلل البيانات بنية مرنة لتنظيم السجلات، فحصها، وتلخيصها بسرعة. كما أنها تتكامل بصورة طبيعية مع مكتبة NumPy: القوة الضاربة في معالجة المصفوفات والعمليات الرياضية المعقدة، وهو ما يجعلها مناسبة من التحليل الاستكشافي الأولي وصولاً إلى بناء خطوط ETL الإنتاجية.
ما الفرق بين Series و DataFrame؟
كائن Series هو بنية أحادية البعد، تشبه عموداً واحداً من البيانات مع فهرس مرافق لكل قيمة. يمكن اعتباره أبسط وحدة داخل النظام، ويستخدم كثيراً عند انتقاء عمود منفرد، إجراء تحويلات، أو تطبيق دوال إحصائية مباشرة على قائمة من القيم.
أما DataFrame فهو بنية ثنائية الأبعاد تتكون من صفوف وأعمدة، وكل عمود فيها هو فعلياً كائن Series. هذه البنية تجعل المكتبة مثالية للتعامل مع الجداول الواقعية مثل بيانات المبيعات، سجلات العملاء، أو بيانات التشغيل القادمة من أنظمة متعددة.
الفهم الصحيح للعلاقة بين الكائنين يختصر وقتاً كبيراً في التنظيف والتحليل. عندما تسحب عموداً واحداً من جدول، فأنت غالباً لا تتعامل مع جدول مصغر، بل مع Series لها خصائص مختلفة في الشكل، والفهرسة، وطريقة الإخراج.
إنشاء هياكل البيانات وفحصها عملياً
يمكن إنشاء الكائنات يدوياً لفهم البنية قبل الانتقال إلى الملفات الحقيقية. هذه الخطوة التعليمية مهمة جداً، لأنها تكشف كيف تتعامل المكتبة مع الفهرس، أسماء الأعمدة، وأنواع القيم المختلطة.
import pandas as pd
sales_series = pd.Series([1200, 1500, 980, 1750], index=["Q1", "Q2", "Q3", "Q4"], name="revenue")
df = pd.DataFrame({
"customer_id": [101, 102, 103, 104],
"city": ["Riyadh", "Jeddah", "Dammam", "Riyadh"],
"orders": [5, 3, 8, 2],
"revenue": [1200.5, 950.0, 2100.75, 670.25]
})
print(sales_series)
print(df)
print(type(sales_series))
print(type(df))
في المثال السابق نلاحظ أن sales_series يحتوي على فهرس نصي يصف الأرباع الزمنية، بينما يحتوي df على عدة أعمدة بأنواع مختلفة. هذه المرونة هي ما يجعل Pandas أداة مركزية في مشاريع Data Science الحديثة.
أهم أوامر الاستكشاف الأولي
قبل أي تنظيف أو نمذجة، يجب تنفيذ فحص سريع للبنية. هذا الفحص يجيب عن أسئلة حاسمة: كم عدد الصفوف؟ ما نوع كل عمود؟ هل توجد قيم مفقودة؟ وهل الأرقام مخزنة كأرقام فعلاً أم كنصوص؟
print(df.head())
print(df.tail(2))
print(df.shape)
print(df.columns)
print(df.index)
print(df.dtypes)
print(df.info())
print(df.describe())
أوامر مثل head() و info() ليست مجرد أدوات عرض، بل تمثل طبقة تشخيص مبكر تمنع انهيار المراحل اللاحقة. في البيئات الكبيرة، أي خطأ مبكر في نوع البيانات قد يسبب انحرافاً إحصائياً أو استهلاكاً غير ضروري للذاكرة.
في هندسة البيانات، لا تبدأ ببناء تحويلات معقدة قبل فحص البنية الخام للجدول. معرفة
schemaمبكراً تقلل أخطاء الدمج بين المصادر، وتسرّع تصميم مساراتPipelineالقابلة للتوسع.
الفهرسة والاختيار الذكي للبيانات
قوة Pandas لا تظهر في التخزين فقط، بل في آليات الوصول الانتقائي. استخدام الأقواس المربعة لاختيار عمود واحد يعيد كائناً من نوع Series، بينما اختيار قائمة من الأعمدة يعيد كائناً من نوع DataFrame.
print(df["revenue"])
print(df[["city", "revenue"]])
print(df.loc[0])
print(df.loc[0, "city"])
print(df.loc[df["revenue"] > 1000])
print(df.iloc[1:3])
print(df.iloc[0, 2])
الاختيار باستخدام loc يعتمد على أسماء الفهارس أو العناوين، بينما يعتمد iloc على المواقع الرقمية. هذا الفرق أساسي عند بناء مهام تنظيف قابلة للإعادة، لأن الاعتماد على الموقع فقط قد يصبح هشاً إذا تغيّر ترتيب الأعمدة أو الصفوف.
فهم أنواع البيانات وتأثيرها على التحليل
كل عمود داخل DataFrame يحمل نوعاً محدداً مثل أعداد صحيحة، أعداد عشرية، نصوص، أو تواريخ. هذا ليس تفصيلاً شكلياً، بل عامل حاسم في الأداء، واستهلاك الذاكرة، وصحة العمليات الحسابية والتجميعية.
df["customer_id"] = df["customer_id"].astype("int64")
df["city"] = df["city"].astype("category")
df["revenue"] = pd.to_numeric(df["revenue"], errors="coerce")
print(df.dtypes)
print(df.memory_usage(deep=True))
تحويل الأعمدة النصية المتكررة إلى نوع category قد يقلل استهلاك الذاكرة بشكل ملحوظ، خصوصاً في الجداول ذات الملايين من السجلات. كما أن استخدام to_numeric() يساعد في كشف القيم المشوهة التي تتسرب من أنظمة الإدخال اليدوي أو ملفات التصدير غير المنضبطة.
تحسين الأداء في الجداول الكبيرة لا يبدأ من الخوادم فقط، بل من اختيار النوع المناسب لكل عمود. الأعمدة المخزنة كنصوص رغم أنها رقمية تؤدي إلى بطء في التجميع والفرز، وتزيد تكلفة النقل إذا نُقلت لاحقاً إلى بيئات
Sparkأو قواعدSQL.
عمليات أساسية تبني فهماً أعمق للبنية
لفهم سلوك الجدول فعلياً، يجب ممارسة عمليات مثل إضافة عمود جديد، التصفية الشرطية، والتجميع. هذه الأوامر لا تنفذ المطلوب فقط، بل تكشف كيف تتفاعل الأعمدة مع بعضها داخل البنية الداخلية.
df["avg_order_value"] = df["revenue"] / df["orders"]
high_value = df[df["avg_order_value"] > 250]
city_summary = df.groupby("city").agg({
"orders": "sum",
"revenue": ["mean", "max"]
})
print(high_value)
print(city_summary)
في المثال السابق أنشأنا عموداً مشتقاً يعكس قيمة الطلب المتوسط، ثم استخدمنا التصفية لاستخراج العملاء الأعلى قيمة، وبعدها طبقنا تجميعاً على مستوى المدينة. هذا النمط يتكرر في أغلب حالات الاستخدام الواقعية، سواء في تقارير الأعمال أو في التحضير لمرحلة Machine Learning.
حالة استخدام واقعية في تحليل الأعمال
إذا كنت تعمل على بيانات متجر إلكتروني، فإن فهم DataFrame يسمح لك ببناء طبقة تحليلية سريعة قبل نقل البيانات إلى منصات أضخم. يمكنك اكتشاف المدن الأعلى مبيعاً، رصد العملاء الأقل نشاطاً، وملاحظة القيم الشاذة التي قد تشير إلى أخطاء في الفوترة أو الإدخال.
في المشاريع الكبيرة، يُستخدم
Pandasكثيراً كطبقة تحقق سريعة قبل رفع البيانات إلى أنظمة موزعة مثلHadoopأوSpark. هذا الأسلوب يقلل تكلفة المعالجة الموزعة، لأن كثيراً من مشكلات الجودة تُكتشف محلياً قبل استهلاك موارد عنقودية باهظة.
خاتمة
فهم الفرق بين Series و DataFrame ليس درساً تمهيدياً بسيطاً، بل قاعدة تشغيلية تؤثر في جودة كل خطوة لاحقة في التحليل. عندما تعرف كيف تُبنى الأعمدة، وكيف تُفهرس الصفوف، وكيف تُفحص الأنواع وتُستخرج الشرائح، تصبح أكثر قدرة على تصميم جداول نظيفة، وتحويلات دقيقة، وعمليات تحليل موثوقة.
وهذا الفهم ينسجم مباشرة مع منهجية مدخل إلى علوم البيانات: كيف تحول الأرقام العشوائية إلى قرارات استراتيجية؟، لأن القرار الجيد يبدأ من بنية بيانات مفهومة، لا من رسوم بيانية جميلة فقط. وإذا كنت قد أعددت بيئة عملك مسبقاً عبر إعداد مختبر البيانات: تثبيت بيئة Jupyter Notebook ومكتبات التحليل الأساسية، فأنت الآن جاهز للانتقال إلى مراحل أكثر تقدماً في التنظيف، الدمج، والتحليل الاستكشافي المتعمق.