كيفية جمع صفوف محددة في بانداس (مع أمثلة)
تُعدّ مكتبة Pandas الركيزة الأساسية والعمود الفقري لمنظومة علوم البيانات والتحليل الإحصائي في لغة بايثون (Python). توفر هذه المكتبة هياكل بيانات مرنة وعالية الأداء تُتيح للمطورين والباحثين إجراء العمليات الحسابية والتحويلات الهيكلية المعقدة على مجموعات البيانات الضخمة بأقل قدر ممكن من التعقيد البرمجي والزمني. ومن بين العمليات الأساسية التي لا غنى عنها في المعالجة اليومية للبيانات، تبرز العمليات التجميعية الحسابية، وعلى رأسها حساب مجاميع صفوف محددة، كأداة جوهرية لاشتقاق المؤشرات الرقمية، وتوليد التقارير الإحصائية المرحلية، وعزل الفئات المستهدفة من البيانات لدراستها بعمق واستقلالية.
يتطلب التعامل الاحترافي مع عمليات جمع الصفوف في بيئة Pandas إدراكاً عميقاً للآليات الهيكلية التي تُبنى عليها هياكل البيانات مثل DataFrame وSeries. لا تقتصر المسألة على مجرد تطبيق دالة رياضية مثل sum() بشكل عشوائي، بل تمتد لتشمل فهم تداعيات اختيار أنماط الفهرسة المختلفة، سواء كانت فهرسة موضعية رقمية تعتمد على مواقع الذاكرة عبر iloc، أو فهرسة اسمية تعتمد على التسميات الفريدة عبر loc، وصولاً إلى الفلترة الشرطية المتقدمة والفهارس الهرمية متعددة المستويات. إن هذا التمييز الهندسي الدقيق ينعكس مباشرة على استهلاك الموارد الحاسوبية وسرعة معالجة البيانات، لاسيما عند التعامل مع مجموعات بيانات تتجاوز ملايين السجلات.
يسعى هذا الدليل الشامل والمفصل إلى تقديم مرجع علمي وتطبيقي متكامل حول آليات وخوارزميات جمع صفوف محددة داخل مكتبة Pandas. سنستعرض من خلاله المبادئ النظرية المفسرة لكيفية تدفق البيانات داخل مصفوفات NumPy التحتية، مع تقديم أمثلة برمجية واقعية، واستعراض استراتيجيات تحسين الأداء الحسابي وإدارة الذاكرة، والتصدي للأخطاء البرمجية الشائعة التي تواجه مهندسي البيانات أثناء عمليات المعالجة الرياضية والتجميعية.
- 1. مقدمة شاملة حول معالجة البيانات وتجميع الصفوف في مكتبة بانداس (Pandas)
- 2. البنية الهيكلية لـ DataFrame ومفاهيم الفهرسة (Indexing) في Pandas
- 3. جمع صفوف محددة باستخدام الفهرس الموضعي: الدالة iloc
- 4. جمع صفوف محددة باستخدام الفهرس المعتمد على التسميات: الدالة loc
- 5. التحكم في محاور التجميع: الجمع العمودي مقابل الجمع الأفقي
- 6. الجمع الشرطي للصفوف المحددة بناءً على الأقنعة المنطقية (Boolean Masking)
- 7. معالجة القيم المفقودة (NaNs) وتأثيرها على نتائج جمع الصفوف
- 8. تقنيات متقدمة: التعامل مع الفهارس المتعددة (MultiIndex)
- 9. تحسين الأداء وكفاءة الذاكرة عند جمع صفوف من مجموعات بيانات ضخمة
- 10. أمثلة وسيناريوهات تطبيقية شاملة من الواقع العملي
- 11. الأخطاء الشائعة واستكشاف المشكلات البرمجية وإصلاحها (Troubleshooting)
- 12. المقارنة المنهجية وأفضل الممارسات البرمجية لجمع الصفوف
- الخاتمة
- References
1. مقدمة شاملة حول معالجة البيانات وتجميع الصفوف في مكتبة بانداس (Pandas)
1.1 أهمية العمليات التجميعية في تحليل البيانات الاستكشافي
تمثل العمليات التجميعية (Aggregation Operations) حجر الزاوية في مرحلة تحليل البيانات الاستكشافي (Exploratory Data Analysis – EDA)، حيث تُمكّن الباحث من تلخيص ملايين المشاهدات الرقمية المعقدة في قيم إحصائية مكثفة تعكس الاتجاهات المركزية والتباينات الرياضية لمجتمع الدراسة. إن القدرة على حساب مجاميع جزئية لصفوف بعينها تمنح محلل البيانات مرونة استثنائية في عزل عينات معيارية، مثل حساب إجمالي مبيعات فروع محددة جغرافياً، أو تجميع نتائج اختبارات مجموعة تجريبية دون المساس بالمجموعة الضابطة، مما يمهد الطريق لاتخاذ قرارات استراتيجية مبنية على بيانات دقيقة وموثوقة.
تختلف عمليات الجمع الجزئي الموجه عن التجميع الشامل للبيانات في كونها تتطلب دقة متناهية في تحديد نطاق الحساب وتجنب تشويه البيانات بتضمين مشاهدات شاذة أو غير ذات صلة. يتيح التجميع الانتقائي مقارنة الفئات المتماثلة، واختبار الفرضيات الإحصائية على قطاعات محددة، واشتقاق السمات التنبؤية (Feature Engineering) التي تُغذى بها خوارزميات التعلم الآلي. ومن هنا تبرز الحاجة إلى فهم الأبعاد الرياضية والبرمجية لعمليات الجمع المتخصصة لضمان سلامة الاستدلال الإحصائي وكفاءة خطوط المعالجة.
في مختلف فروع الأبحاث الكمية، من النمذجة المالية والاقتصاد القياسي إلى الأبحاث الجينومية والتحليلات الحيوية، يُشكل استخراج مجاميع متجهات فرعية وسيلة لفهم الظواهر المركبة. إن حساب مجموع صفوف تمثل فترات زمنية متفرقة أو استجابات مجموعات ديموغرافية معينة يساعد على رصد الأنماط الدورية والموسمية، مما يجعل إتقان هذه التقنيات متطلباً رئيسياً لكل متخصص يتعامل مع البيانات الجدولية الاحترافية.
1.2 نظرة عامة على هياكل البيانات الأساسية في Pandas
تعتمد مكتبة Pandas على هيكلين رئيسيين لتنظيم وتخزين البيانات في الذاكرة العشوائية: كائن السلسلة (Series) وكائن جدول البيانات (DataFrame). يمثل كائن Series مصفوفة أحادية البعد قادرة على حمل أي نوع من أنواع البيانات، وتتكون من متجه قيم متجانس مدعوم بفهرس وصفي (Index). في المقابل، يمثل كائن DataFrame جدولاً ثنائي الأبعاد يحتوي على أعمدة وصفوف منظمة، حيث يمكن تصور كل عمود داخل الجدول على أنه كائن Series مستقل، وتشترك جميع هذه الأعمدة في فهرس صفوف موحد، مما يسمح بإجراء العمليات المتقاطعة والمتعامدة بكفاءة فائقة.
يتم تخزين هذه الهياكل في الذاكرة بالاعتماد على مصفوفات متجاورة تديرها مكتبة NumPy، حيث يتم تخصيص مساحات تخزين متصلة للبيانات الرقمية، مما يتيح استغلال قدرات المعالجات الحديثة في تنفيذ العمليات الموجهة (Vectorized Operations). تعتمد هذه العمليات على تطبيق التعليمات الحسابية على متجهات بأكملها دفعة واحدة (SIMD – Single Instruction, Multiple Data)، متجاوزة بذلك البطء المتأصل في الحلقات التكرارية التقليدية (Loops) في لغة بايثون، وهو ما يمنح Pandas تفوقها الحسابي الكاسح في جمع الصفوف والأعمدة.
يؤثر الفهم الدقيق للبنية الهندسية الداخلية لكائن DataFrame، وكيفية توزيع مؤشرات الفهرس في الذاكرة، تأثيراً مباشراً على كيفية صياغة استعلامات جمع الصفوف. إن اختيار الطريقة المناسبة للوصول إلى الصفوف وتجميعها يحدد ما إذا كانت العملية ستتم عبر توجيه مباشر لمؤشرات الذاكرة أو عبر عمليات بحث متكررة في جداول التجزئة (Hash Tables)، مما يصنع فارقاً شاسعاً في زمن التنفيذ واستهلاك الذاكرة عند معالجة مجموعات البيانات الكبيرة.
1.3 أهداف الدليل والمنهجية البرمجية المتبعة
يهدف هذا الدليل المتقدم إلى تفكيك كافة الجوانب البرمجية والهندسية المرتبطة بجمع صفوف محددة في جداول Pandas، بدءاً من المبادئ التأسيسية للفهرسة وصولاً إلى تقنيات التحسين المعقدة. سنقوم بتوضيح الفروق التقنية الدقيقة بين أساليب الفهرسة الموضعية (Positional Indexing) القائمة على الإزاحات العددية الصفرية، وأساليب الفهرسة الاسمية (Label-based Indexing) القائمة على مطابقة الرموز والنصوص، وتبيان تأثير كل أسلوب على دقة وسرعة العمليات الحسابية التجميعية داخل بيئات الإنتاج الفعلية.
تعتمد المنهجية المتبعة في هذا المقال على الجمع بين التأسيس النظري الرصين والتطبيق البرمجي المباشر عالي الكفاءة، مع الالتزام التام بالمعايير القياسية لكتابة أكواد بايثون النظيفة والمتوافقة مع إرشادات PEP 8. سيتم تفكيك كل أسلوب برمجي إلى خطواته الأولية، وشرح كيفية تفاعل المعاملات البرمجية المختلفة مع محركات التجميع الحسابي، وتقديم سيناريوهات واقعية قابلة لإعادة الإنتاج تضمن للقارئ الانتقال السلس من مرحلة الاستيعاب المفاهيمي إلى مرحلة التطبيق الاحترافي المتقدم.
علاوة على ذلك، سنولي اهتماماً خاصاً بدراسة سلوك دوال التجميع في ظل التحديات الحقيقية للبيانات، مثل وجود القيم المفقودة والبيانات غير المتجانسة، وكيفية التعامل مع الهياكل المعقدة مثل الفهارس متعددة الطبقات. سيخرج القارئ من هذا الدليل برؤية هندسية واضحة تمكنه من كتابة أكواد تجميعية متينة، آمنة ضد الأخطاء البرمجية، وقادرة على التوسع لمعالجة أضخم مجموعات البيانات بأعلى كفاءة ممكنة.
2. البنية الهيكلية لـ DataFrame ومفاهيم الفهرسة (Indexing) في Pandas
2.1 فهم نظام الفهرس (Index) في هياكل بيانات Pandas
يُمثل نظام الفهرس (Index) في مكتبة Pandas المحور الأساسي الذي تدور حوله كافة عمليات الوصول والتلاعب بالبيانات. عند إنشاء كائن DataFrame دون تحديد فهرس مخصص، تُنشئ المكتبة تلقائياً فهرساً افتراضياً من نوع RangeIndex، وهو عبارة عن تسلسل رقمي يبدأ من الصفر ويمتد حتى عدد الصفوف ناقص واحد. يعمل هذا الفهرس بمثابة خريطة عنونة داخلية تربط كل صف بموقعه الترتيبي، مما يتيح للمكتبة الوصول اللحظي إلى البيانات عبر العمليات الحسابية البسيطة لمواقع الذاكرة ذات التعقيد الزمني الثابت O(1).
بالإضافة إلى الفهرس الافتراضي، تتيح Pandas إمكانية تعيين فهارس مخصصة (Custom Indexes) باستخدام السلاسل النصية، أو التواريخ الزمنية، أو حتى المعرفات الفريدة للمشاهدات. يتحول الفهرس في هذه الحالة إلى كائن من نوع Index أو أحد مشتقاته المتخصصة (مثل DatetimeIndex)، حيث يتم بناء جدول تجزئة داخلي يربط كل تسمية نصية بموقع الصف المقابل لها في الذاكرة. يلعب هذا النظام دوراً حاسماً في تتبع الصفوف بدقة متناهية وضمان الحفاظ على سلامة العلاقات الرياضية بين السجلات أثناء عمليات الفرز والدمج والتجميع الحسابي.
إن إدراك الطبيعة المزدوجة للفهرس—باعتباره معرفاً دلالياً من جهة ومؤشراً لمواقع الذاكرة من جهة أخرى—هو المفتاح لفهم كيفية تحديد وتجميع الصفوف بكفاءة. لا يقتصر دور الفهرس على تسهيل القراءة البشرية للجداول، بل يمتد ليكون موجهاً أساسياً لمحركات الحساب التجميعي لتحديد ما إذا كان الجمع سيتم بناءً على ترتيب الإدخال الفيزيائي أو بناءً على الدلالة المنطقية للتسميات.
2.2 الفرق الجوهري بين التموضع الرقمي (Positional) والتسميات (Label-based)
يكمن الفرق الجوهري بين التموضع الرقمي والتسميات الاسمية في كيفية تفسير مفسر بايثون لطلبات الوصول إلى عناصر DataFrame. يعتمد التموضع الرقمي (Positional Indexing) على الموقع الفيزيائي الترتيبي للصف داخل المصفوفة الثنائية، متجاهلاً التسميات أو المعرفات المرئية للفهرس. يتم التعامل مع الصفوف هنا عبر أرقام صحيحة تبدأ دائماً من الصفر للإشارة إلى الصف الأول، وتتبع القواعد القياسية للفهرسة في مصفوفات لغة C ومكتبة NumPy، مما يجعلها مثالية للعمليات الخوارزمية التي تتطلب الوصول عبر الإزاحات التتابعية.
في المقابل، تعتمد الفهرسة الاسمية (Label-based Indexing) على مطابقة المفاتيح المعطاة مع قيم كائن الفهرس بغض النظر عن موقعها الفيزيائي داخل الذاكرة. عندما يطلب المبرمج الوصول إلى صف يحمل التسمية ‘Row_A’، تقوم Pandas بالبحث داخل جدول التجزئة الخاص بالفهرس للعثور على المؤشر الحقيقي المرتبط بهذا المفتاح. هذا النمط يوفر درجة عالية من الأمان الدلالي، حيث تظل العمليات الحسابية مرتبطة بالكيانات المنطقية حتى لو تغير ترتيب الصفوف الفيزيائي نتيجة لعمليات فرز سابقة أو تصفية للبيانات.
تترتب على هذا التمايز تداعيات تقنية حاسمة فيما يتعلق بسرعة التنفيذ واستهلاك موارد المعالجة. فالوصول الموضعي الرقمي يتفوق عموماً في السرعة نظراً لغياب عبء البحث في جداول التجزئة ومطابقة النصوص، بينما توفر الفهرسة الاسمية استقراراً وموثوقية أعلى ضد التغيرات الهيكلية في مجموعات البيانات الديناميكية. لذا فإن الاختيار بين هذين النمطين عند جمع صفوف محددة يجب أن يخضع لدراسة موازنة دقيقة بين متطلبات الكفاءة الحسابية ودقة المتطلبات الوظيفية للبرمجية.
2.3 إعداد بيئة العمل وإنشاء DataFrame نموذجي للتطبيق
لبناء فهم تطبيقي متين لكافة تقنيات جمع الصفوف، يتعين علينا إعداد بيئة برمجية متكاملة تتضمن استيراد المكتبات الأساسية وضبط خيارات العرض القياسية. يتم استيراد مكتبة Pandas بالاسم المستعار المتعارف عليه عالمياً pd، إلى جانب استيراد مكتبة NumPy بالاسم np لتوليد البيانات الرقمية والتعامل مع المصفوفات الحسابية. يُنصح دائماً بتهيئة بذور التوليد العشوائي لضمان قابلية إعادة إنتاج النتائج الحسابية ومطابقتها بدقة عبر مختلف بيئات التشغيل.
سنقوم بإنشاء جدول بيانات اختباري متوازن هندسياً يمثل درجات تقييم متعددة لمجموعة من الكيانات، بحيث يحتوي على أربعة أعمدة رقمية متجانسة تمثل متغيرات إحصائية مختلفة (مثل: المتغير_1، المتغير_2، المتغير_3، المتغير_4)، مع تعيين فهرس مخصص يتألف من تسميات نصية واضحة ومتباينة (مثل: ‘A’, ‘B’, ‘C’, ‘D’, ‘E’). يتيح لنا هذا النموذج التطبيقي اختبار سلوك كافة دوال الفهرسة والتجميع على نفس مجموعة البيانات، ومقارنة المخرجات الرياضية مباشرة بين الطرق الموضعية والطرق الاسمية.
يتطلب الفحص الأولي للجدول المنشأ استخدام السمات الهيكلية الأساسية مثل df.shape للتحقق من أبعاد المصفوفة، وdf.dtypes للتأكد من سلامة الأنواع الرقمية المخزنة وتجنب وجود كائنات نصية غير مقصودة، بالإضافة إلى فحص df.index للتأكد من بنية الفهرس وخصائصه. يشكل هذا الفحص الوقائي الخطوة الصفرية الإلزامية في أي خط معالجة احترافي للبيانات قبل الشروع في تطبيق خوارزميات التجميع والجمع الموجه.
3. جمع صفوف محددة باستخدام الفهرس الموضعي: الدالة iloc
3.1 المبادئ النظرية للوصول الموضعي عبر iloc
تُعد الدالة المساعدة iloc (اختصاراً لـ Integer Location) الأداة البرمجية المخصصة للاقتطاع والفهرسة المعتمدة حصرياً على المواقع الترتيبية الرقمية ذات الأساس الصفري (Zero-based Indexing). تعمل هذه الدالة كواجهة برمجية مباشرة للوصول إلى عناصر مصفوفة الذاكرة التحتية دون النظر إلى التسميات النصية أو الفهارس المخصصة لـ DataFrame. تقبل iloc مدخلات بصيغ متعددة، تشمل الأرقام الصحيحة المفردة، وقوائم الأرقام الصحيحة، ونطاقات الشرائح الرقمية، مما يمنح المطور تحكماً مطلقاً في استخراج متجهات البيانات بدقة متناهية.
عند استخدام iloc لتحديد مجموعة من الصفوف، فإنها تُرجع كائناً فرعياً مؤقتاً يحتفظ بنفس البنية الهيكلية لـ DataFrame الأصلي، مع اقتصاره فقط على الصفوف المختارة ومؤشراتها الرقمية المحددة. وعند إلحاق التابع الحسابي sum() بنهاية تعبير iloc، يقوم محرك الحساب الداخلي بتوجيه العملية الرياضية عبر المصفوفة الفرعية المستخلصة، ممرراً مؤشرات الإزاحة مباشرة إلى دوال C المُحسّنة في خلفية المكتبة لإجراء الجمع التراكمي السريع.
تتميز هذه الآلية بالحصانة الكاملة ضد التغيرات التي قد تطرأ على أسماء وتسميات الفهارس، إذ تظل مرتبطة بمواقع الصفوف الترتيبية فقط. كما أنها تضمن استهلاكاً مثالياً لدورات المعالج بفضل غياب عمليات المقارنة النصية، مما يجعلها الخيار الهندسي المفضل في السيناريوهات التي تُعالج فيها البيانات عبر خوارزميات تكرارية تعتمد على الترقيم العددي الصارم للصفوف.
3.2 تطبيق عملي: جمع صفوف محددة بأرقام الفهارس [0, 1, 4]
لتطبيق الجمع الموضعي على صفوف متباعدة جغرافياً داخل جدول البيانات، يتم تمرير قائمة تحتوي على الأرقام الترتيبية للصفوف المستهدفة داخل القوسين المعقوفين للدالة iloc. على سبيل المثال، لتجميع الصفوف الأول والثاني والخامس، نستخدم التعبير البرمجي df.iloc[[0, 1, 4]].sum(). يقوم هذا التعبير أولاً باقتطاع مصفوفة فرعية تتكون فقط من الصفوف ذات المواقع 0 و1 و4، ثم يطبق عليها دالة الجمع التراكمي بصورة موجهة وشاملة لكافة المتغيرات الرقمية المتاحة.
تكون النتيجة المستخرجة من هذه العملية عبارة عن كائن Series يحمل كفهرس له أسماء الأعمدة الأصلية للجدول، بينما تمثل قيمه المجموع الرياضي الدقيق لحاصل جمع القيم المتناظرة في الصفوف الثلاثة المختارة لكل عمود على حدة. يعكس هذا السلوك الرياضي الافتراضي لعملية الجمع، حيث يتم تطبيق التجميع عمودياً على طول المحور الصفري، مما ينتج عنه ملخص إحصائي فوري لأداء الصفوف المختارة عبر كافة الأبعاد الإحصائية للجدول.
يوضح هذا التطبيق العملي السلاسة البرمجية العالية التي توفرها Pandas في دمج عمليات الاقتطاع الموضعي مع التوابع الرياضية المباشرة في سطر برمجي واحد يتميز بأعلى درجات المقروئية والكفاءة. كما يتيح التحليل الفوري للمخرجات التأكد من صحة الجمع ومطابقته للقيم الفردية الأصلية، وهو ما يشكل الأساس النظري والتطبيقي لمعظم خوارزميات الاستخلاص الجزئي في مكتبات علوم البيانات الحديثة.
3.3 استخدام الشرائح الرقمية (Slicing) داخل iloc للجمع المتتالي
عندما تكون الصفوف المراد جمعها متتالية ومنتظمة التوزيع، توفر تقنية الشرائح الرقمية (Slicing) حلاً برمجياً فائق الأناقة والسرعة. تتبع الشرائح في iloc الصيغة القياسية للغة بايثون [start:stop:step]، حيث تشير start إلى موقع صف البداية، وstop إلى نقطة التوقف، وstep إلى مقدار القفز بين الصفوف. ومن الأهمية بمكان التأكيد على أن نقطة النهاية stop في iloc تكون دائماً مستبعدة (Exclusive)، أي أن الشريحة df.iloc[1:4] ستقتطع الصفوف ذات المواقع 1 و2 و3 فقط دون الصف رقم 4.
يتيح دمج الشرائح الرقمية مع دالة الجمع تنفيذ عمليات تجميعية دورية غاية في التعقيد بأبسط صياغة برمجية ممكنة. فعلى سبيل المثال، لحساب مجموع الصفوف الزوجية داخل الجدول، يمكن تمرير الشريحة df.iloc[0::2].sum()، والتي توجه مفسر البيانات للبدء من الصف الأول والقفز بمقدار صفين في كل خطوة حتى نهاية الجدول، ثم إجراء الجمع التراكمي لكافة الصفوف المختارة دفعة واحدة وبأعلى سرعة ممكنة لمعالجة المتجهات.
علاوة على ذلك، يمكن دمج تقنيات الشرائح مع المصفوفات المركبة للتعامل مع متطلبات التجميع المعقدة التي تشمل نطاقات متصلة وأخرى منفصلة. إن استخدام الشرائح داخل iloc لا يوفر فقط اختصاراً كبيراً في كتابة الأكواد، بل يُحسن أيضاً إدارة الذاكرة بفضل قدرة مصفوفات NumPy التحتية على إنشاء مناظير (Views) للشريحة دون الحاجة إلى نسخ كامل البيانات في الذاكرة، مما يقلل بشكل ملموس من البصمة المكانية للعملية الحسابية.
4. جمع صفوف محددة باستخدام الفهرس المعتمد على التسميات: الدالة loc
4.1 المبادئ النظرية للوصول القائم على الأسماء عبر loc
تمثل الدالة loc (اختصاراً لـ Label Location) الأداة البرمجية المخصصة للاقتطاع والفهرسة بناءً على التسميات والرموز النصية المعرفة في فهرس DataFrame. على النقيض من الفهرسة الموضعية، تتعامل loc مع الفهرس كبنية دلالية ذات معنى، حيث تتطابق المدخلات مع القيم الفعلية المخزنة داخل كائن الفهرس، سواء كانت هذه القيم نصوصاً، أو أرقاماً تعريفية غير متسلسلة، أو طوابع زمنية معقدة. يضمن هذا النهج بقاء العمليات الحسابية مرتبطة منطقياً بالكيانات المستهدفة بغض النظر عن أي تغيير يطرأ على مواقعها الفيزيائية داخل الجدول.
تختلف القواعد الرياضية والبرمجية للشرائح في loc اختلافاً جذرياً عن نظيرتها في iloc؛ حيث تكون نقطة النهاية (Stop Index) في شرائح loc متضمنة بالكامل (Inclusive). وهذا يعني أن التعبير البرمجي df.loc['A':'C'] سيقوم باقتطاع وجمع كافة الصفوف ابتداءً من التسمية ‘A’ مروراً بالتسمية ‘B’ ووصولاً إلى التسمية ‘C’ متضمنة إياها بالكامل. ينبع هذا التصميم الهندسي من الرغبة في جعل الاستعلامات الاسمية متطابقة مع المنطق البشري الذي يفترض شمولية الحدود المذكورة في الاستعلام.
تعتمد loc في بنيتها التحتية على مطابقة المفاتيح عبر جداول التجزئة السريعة، مما يجعلها قادرة على استرجاع وتجميع مجموعات جزئية من البيانات بكفاءة عالية مع توفير أعلى درجات الأمان الدلالي. تبرز أهمية هذا الأسلوب بشكل خاص في بيئات العمل المشتركة ومشاريع البيانات الإنتاجية التي تتطلب كتابة أكواد ذاتية التوثيق (Self-documenting Code) تكون فيها تسميات الصفوف معبرة عن طبيعة البيانات الإحصائية المحللة.
4.2 تطبيق عملي: جمع صفوف محددة بالتسميات [‘A’, ‘B’, ‘E’]
لتطبيق التجميع الاسمي على مجموعة محددة من الصفوف، يتم تمرير قائمة التسميات المستهدفة إلى الدالة loc متبوعة باستدعاء دالة الجمع الرياضي: df.loc[['A', 'B', 'E']].sum(). يقوم هذا الأمر بتوجيه Pandas للبحث عن الصفوف التي تتطابق تسميات فهارسها تماماً مع العناصر ‘A’ و’B’ و’E’، واستخلاص جدول فرعي يحتوي على هذه الصفوف فقط، ثم تطبيق عملية الجمع الموجه على طول الأعمدة الرقمية لإنتاج السلسلة التجميعية النهائية.
تُظهر مقارنة النتائج المستخلصة عبر df.loc[['A', 'B', 'E']].sum() مع النتائج المستخلصة سابقاً عبر df.iloc[[0, 1, 4]].sum() تطابقاً حسابياً تاماً، شريطة أن تكون المواقع 0 و1 و4 مطابقة هيكلياً لنفس الصفوف الحاملة للتسميات ‘A’ و’B’ و’E’. يثبت هذا التطابق تكامل وتناغم منظومة الفهرسة المزدوجة في Pandas، ويمنح مهندس البيانات الحرية الكاملة في اختيار الواجهة البرمجية الأنسب وفقاً لطبيعة المعطيات المتوفرة وسياق التحليل الإحصائي المطلوب.
يتميز استخدام التسميات الاسمية في تجميع الصفوف بقدرته على عزل الأخطاء المنطقية الناتجة عن التعديلات الهيكلية غير المقصودة في الجدول. فإذا تم حذف أحد الصفوف الوسيطة أو إعادة ترتيب الجدول أبجدياً، فإن استعلام loc سيظل متمسكاً بجمع الصفوف المحددة بأسمائها الصريحة بدقة متناهية، في حين قد يؤدي استعلام iloc في هذه الحالة إلى جمع صفوف مختلفة تماماً نتيجة تغير مواقعها الترتيبية في الذاكرة.
4.3 التعامل مع الفهارس المكررة أو غير الفريدة عبر loc
على الرغم من أن الممارسات القياسية في هندسة البيانات توصي بتفرد قيم الفهرس (Unique Indexes)، إلا أن جداول Pandas تسمح تقنياً بوجود تسميات مكررة داخل الفهرس الواحد. عند استدعاء loc مع تسمية مكررة، مثل تمرير المفتاح ‘A’ وكان هذا المفتاح مخصصاً لثلاثة صفوف مختلفة في الجدول، فإن df.loc['A'] ستسترجع كائن DataFrame كاملاً يحتوي على كافة الصفوف الثلاثة التي تحمل هذه التسمية، وليس مجرد صف فردي واحد.
يترتب على هذا السلوك تداعيات رياضية بالغة الأهمية عند تطبيق دالة الجمع sum(). فعند تنفيذ الأمر df.loc[['A', 'B']].sum() في وجود تكرار للتسمية ‘A’، سيقوم محرك التجميع بجمع كافة الصفوف المكررة المرتبطة بالمفتاح ‘A’ مضافاً إليها الصفوف المرتبطة بالمفتاح ‘B’. قد يؤدي هذا في بعض الأحيان إلى مضاعفة غير مقصودة في الأوزان الحسابية لبعض الفئات إذا لم يكن المطور منتبهاً للبنية الداخلية لفهرس الجدول.
لتجنب هذا الانحراف الحسابي وضمان دقة النتائج، يتعين التحقق الوقائي من تفرد قيم الفهرس قبل الشروع في عمليات الجمع عبر الخاصية المنطقية df.index.is_unique. وفي حال وجود تكرارات غير مرغوب فيها، يمكن إما معالجتها وإزالة التكرارات عبر df.reset_index() متبوعة بـ drop_duplicates()، أو استخدام الفهارس الهرمية لتخصيص مستويات فريدة تضمن عزل وتجميع الصفوف المستهدفة بأعلى درجات الدقة الإحصائية.
5. التحكم في محاور التجميع: الجمع العمودي مقابل الجمع الأفقي
5.1 فهم معامل المحور (axis parameter) في Pandas
يُعد معامل المحور axis أحد أهم وأعمق المعاملات التشغيلية في مكتبة Pandas، حيث يحدد الاتجاه الهندسي الذي تتدفق عبره العمليات الحسابية داخل المصفوفة ثنائية الأبعاد. يأخذ هذا المعامل إما قيماً عددية أو قيماً نصية وصفية: القيمة الافتراضية axis=0 (أو axis='index') توجه الدالة لإجراء العملية الحسابية عمودياً إلى أسفل، أي عبر الصفوف لكل عمود، في حين أن القيمة axis=1 (أو axis='columns') توجه الدالة لإجراء العملية الحسابية أفقياً، أي عبر الأعمدة لكل صف على حدة.
يحدث في كثير من الأحيان خلط مفاهيمي لدى بعض المطورين حول دلالة axis=0 وaxis=1. لتصور الآلية الرياضية بشكل صحيح، يجب إدراك أن تحديد axis=0 يعني “طي” أو “ضغط” بعد الصفوف (المحور 0) لتوليد قيمة تجميعية واحدة لكل عمود، بينما تحديد axis=1 يعني “طي” بعد الأعمدة (المحور 1) لتوليد قيمة تجميعية واحدة لكل صف. يحدد هذا الاختيار البنيوي شكل ونوعية المخرجات الناتجة من دوال التجميع بصورة جذرية.
إن إتقان التحكم في معامل المحور يمنح مهندس البيانات مرونة فائقة في إجراء التحليلات المزدوجة على الصفوف المختارة. فبينما يتيح الجمع على المحور 0 حساب المجاميع الإجمالية للمتغيرات عبر العينة المحددة، يتيح الجمع على المحور 1 حساب الدرجة الكلية المركبة أو المؤشر الإجمالي التراكمي لكل عينة فردية داخل المجموعة المختارة، مما يلبي كافة المتطلبات التحليلية في خطوة برمجية واحدة.
5.2 حساب المجموع الأفقي لكل صف محدد على حدة
عند الرغبة في حساب المجموع الأفقي لكافة المتغيرات الرقمية الخاصة بصفوف معينة دون غيرها، يتم دمج أدوات الفهرسة الموضعية أو الاسمية مع معامل المحور الأفقي axis=1. فعلى سبيل المثال، يؤدي تنفيذ الأمر البرمجي df.iloc[[0, 1, 4]].sum(axis=1) أو الأمر df.loc[['A', 'B', 'E']].sum(axis=1) إلى حساب المجموع التراكمي للقيم الرقمية الممتدة عبر كافة أعمدة كل صف من الصفوف الثلاثة المختارة بصورة مستقلة.
تكون النتيجة المسترجعة في هذه الحالة عبارة عن كائن Series يحتوي على ثلاثة عناصر فقط، حيث يمثل فهرس هذه السلسلة معرفات الصفوف المختارة (‘A’, ‘B’, ‘E’)، بينما تمثل قيمها الإجمالي الحسابي الأفقي للمتغيرات الخاصة بكل صف على حدة. تُعد هذه التقنية أساسية في التطبيقات التي تتطلب حساب درجات التقييم التراكمية للمشاركين، أو إجمالي الإنفاق الفردي للعملاء المختارين، أو مجاميع المؤشرات الحيوية لكل عينة معملية في التجارب الطبية.
تتميز هذه العملية بكفاءتها العالية بفضل قدرة محرك Pandas على تطبيق عمليات الجمع الأفقي الموجه عبر الذاكرة المتصلة للمصفوفات الرقمية. كما تتيح للمحلل إجراء المقارنات المعيارية المباشرة بين الأداء الإجمالي للكيانات المختارة، ورصد الفروق الفردية في المجاميع الكلية دون الحاجة إلى تشويه بنية الجدول الأصلي أو كتابة حلقات تكرارية معقدة وغير فعالة.
5.3 إضافة صفوف أو أعمدة المجاميع المحسوبة إلى DataFrame الأصلي
تتطلب سيناريوهات العمل الفعلية في كثير من الأحيان دمج نتائج الجمع المحسوبة مباشرة داخل جدول البيانات الأصلي لتوثيق التحليلات وتسهيل تصدير التقارير النهائية. لإضافة عمود جديد يحتوي على المجموع الأفقي لصفوف محددة فقط مع ترك باقي الصفوف فارغة أو بقيم محايدة، يمكن استخدام التعيين المباشر عبر loc: حيث يتم كتابة df.loc[['A', 'B', 'E'], 'Selected_Row_Sum'] = df.loc[['A', 'B', 'E']].sum(axis=1). يؤدي هذا السطر إلى إنشاء العمود وتعبئة قيم الصفوف المحددة فقط بمجاميعها الأفقية بدقة متناهية.
من جهة أخرى، إذا كان المطلوب هو إضافة صف إجمالي جديد في أسفل الجدول يحتوي على المجموع العمودي للصفوف المختارة، يمكن تحقيق ذلك عبر إسناد السلسلة التجميعية إلى تسمية صف جديدة باستخدام الدالة loc: df.loc['Subtotal_Selected'] = df.loc[['A', 'B', 'E']].sum(axis=0). يقوم هذا الإجراء بإلحاق صف جديد في نهاية DataFrame يحمل التسمية ‘Subtotal_Selected’ وتتوزع فيه المجاميع المحسوبة لكل عمود من الأعمدة الرقمية، مما يوفر ملخصاً إحصائياً مدمجاً داخل نفس الهيكل البياني.
تُعد هذه الأساليب في الدمج الهيكلي من الممارسات البرمجية المتقدمة التي تضمن الحفاظ على تكامل البيانات وسهولة قراءتها من قبل الأنظمة والتطبيقات اللاحقة. كما تبرز القوة التعبيرية لـ Pandas في التعامل مع الأبعاد غير المتناظرة ومحاذاة البيانات تلقائياً بناءً على الفهارس، مما يمنع حدوث الإزاحات غير المقصودة في البيانات ويضمن دقة التقارير الإحصائية المستخرجة.
6. الجمع الشرطي للصفوف المحددة بناءً على الأقنعة المنطقية (Boolean Masking)
6.1 بناء الشروط المنطقية واختيار الصفوف ديناميكياً
تُعد الأقنعة المنطقية (Boolean Masks) إحدى أقوى وأرقى التقنيات التعبيرية في مكتبة Pandas، حيث تتيح للمطورين تصفية وتحديد الصفوف المستهدفة ديناميكياً بناءً على الشروط الرياضية والمنطقية المطبقة على قيم البيانات نفسها بدلاً من الاعتماد على الفهارس الثابتة. يتم إنشاء القناع المنطقي عبر تطبيق معاملات المقارنة (مثل >, <, ==, !=) على عمود أو أكثر، مما ينتج عنه كائن Series من القيم المنطقية (True أو False) المتناظرة مع كل صف في الجدول.
يمكن دمج شروط منطقية متعددة ومعقدة باستخدام العوامل البوليانية الموجهة، مثل عامل العطف المنطقي (&) وعامل الفصل المنطقي (|) وعامل النفي (~)، مع ضرورة إحاطة كل شرط فردي بأقواس دائرية لضمان الأسبقية الحسابية الصحيحة. فعلى سبيل المثال، يتيح التعبير mask = (df['المتغير_1'] > 50) & (df['المتغير_2'] < 80) إنشاء قناع دقيق يحدد فقط الصفوف التي تحقق كلا المعيارين في آن واحد.
عند تمرير هذا القناع المنطقي إلى دالة الوصول الاسمي مع استدعاء دالة الجمع، مثل df.loc[mask].sum()، تقوم Pandas بعزل وتجميع كافة الصفوف التي تقابل القيمة True في القناع المنطقي بسرعة فائقة. يمنح هذا الأسلوب مرونة استثنائية في إجراء التحليلات الإحصائية المشروطة، ويتيح للبرمجيات التكيف التلقائي مع مجموعات البيانات المتغيرة والمتدفقة دون الحاجة إلى تعديل كود الفهرسة يدوياً.
6.2 تطبيق الدالة query() لتصفية وجمع الصفوف بكفاءة
توفر الدالة query() في Pandas واجهة استعلام نصية متقدمة تزيد من وضوح ومقروئية الكود البرمجي عند تصفية الصفوف وتجميعها. تعتمد هذه الدالة على محرك التقييم الرياضي السريع Numexpr في الخلفية، مما يسمح بتنفيذ العمليات الشرطية المعقدة دون الحاجة إلى إنشاء نسخ وسيطة ومؤقتة من الأقنعة المنطقية في الذاكرة العشوائية، وهو ما ينعكس بشكل إيجابي ملحوظ على سرعة المعالجة واستهلاك الذاكرة عند التعامل مع ملايين الصفوف.
يمكن صياغة استعلام تجميعي مباشر ومقروء باستخدام الدالة عبر السلسلة البرمجية: df.query('المتغير_1 > 50 and المتغير_2 < 80').sum(). يتميز هذا التعبير بأناقته الشديدة وقربه من لغة الاستعلام الهيكلية القياسية (SQL)، مما يسهل صيانة الأكواد ومراجعتها من قبل فرق العمل المشتركة. كما تدعم query() استخدام المتغيرات البرمجية المحلية داخل نص الاستعلام عبر استخدام الرمز @ قبل اسم المتغير (مثل: df.query('المتغير_1 > @threshold').sum()).
تُظهر المقارنات المعيارية أن استخدام query() يحقق أداءً فائقاً يتفوق أحياناً على الأقنعة المنطقية التقليدية عندما تكون جداول البيانات ضخمة جداً والشروط معقدة ومتعددة المتغيرات. إن دمج هذه الدالة مع توابع التجميع الحسابي يوفر أداة تحليلية جبارة تدمج بين كفاءة التنفيذ وجماليات التنسيق البرمجي الحديث.
6.3 استخدام التابع isin() لاختيار صفوف تنتمي لمجموعات محددة
يُعد التابع isin() الأداة المثالية لتصفية وجمع الصفوف بناءً على مطابقة قيم أحد الأعمدة أو الفهارس مع قائمة محددة من القيم المعيارية. يُغني هذا التابع عن كتابة شروط فصل منطقي طويلة ومتكررة باستخدام العامل |، حيث يقبل قائمة أو مجموعة أو كائن Series ويقوم بفحص انتماء كل صف لتلك المجموعة بكفاءة برمجية عالية تعتمد على خوارزميات البحث السريع في مجموعات التجزئة (Hash Sets).
لحساب مجموع الصفوف التي تنتمي لمدن أو فئات معينة، يمكن صياغة الكود بالشكل التالي: df[df['الفئة'].isin(['فئة_أ', 'فئة_ج', 'فئة_هـ'])].sum(). يقوم التعبير الداخلي بتوليد قناع منطقي فوري يحدد الصفوف المستهدفة بدقة، ثم يتولى التابع sum() إجراء التجميع الحسابي للأعمدة الرقمية المتوافقة مع تلك الفئات المحددة فقط، مما يوفر تقريراً إحصائياً سريعاً ومكثفاً.
كما يمكن تطبيق isin() مباشرة على كائن الفهرس نفسه لاختيار صفوف بناءً على قائمة فهارس ديناميكية مستخرجة من مصادر خارجية: df[df.index.isin(target_list)].sum(). يضمن هذا الأسلوب حماية الكود من الانهيار البرمجي في حال احتوت قائمة البحث على تسميات غير موجودة في الجدول، حيث يتجاهل التابع تلقائياً المفاتيح المفقودة دون إطلاق أخطاء برمجية، مما يجعله آمناً ومثالياً للبيئات الإنتاجية المتغيرة.
7. معالجة القيم المفقودة (NaNs) وتأثيرها على نتائج جمع الصفوف
7.1 سلوك المعامل skipna الافتراضي في دالة sum()
تتعامل مكتبة Pandas مع القيم المفقودة والبيانات غير المعرفة (Represented as NaN – Not a Number) وفقاً للمعايير الصارمة لحسابات الفاصلة العائمة في معيار IEEE 754. تتضمن دالة sum() في Pandas معاملاً جوهرياً يُدعى skipna، والذي يأخذ القيمة المنطقية True افتراضياً. يعني هذا الإعداد الافتراضي أن الدالة تتجاهل تلقائياً كافة القيم المفقودة أثناء عملية التجميع الحسابي، وتعاملها برمجياً وكأنها غير موجودة (أو كأنها أصفار حيادية في عملية الجمع).
عند تعديل هذا المعامل إلى skipna=False، يتغير السلوك الرياضي للدالة تماماً؛ حيث تصبح العملية الحسابية صارمة للغاية، فإذا احتوى أي عمود في الصفوف المحددة على قيمة مفقودة واحدة فقط، فإن ناتج عملية الجمع لذلك العمود سيتحول بأكمله إلى NaN. ينبع هذا السلوك من المنطق الرياضي الصارم الذي يفيد بأن إضافة أي قيمة معلومة إلى قيمة غير معرفة ينتج عنه قيمة غير معرفة، وهو ما يُعد ضرورياً في بعض التحليلات العلمية التي تتطلب اكتمالاً مطلقاً للبيانات لتجنب الانحياز التقديري.
من الأهمية بمكان إدراك الفارق بين تجاهل القيم المفقودة واعتبارها أصفاراً فعلية. فتجاهل القيم المفقودة قد يؤدي إلى تشويه التحليلات اللاحقة المرتبطة بالمجموع، مثل حساب المتوسطات الإحصائية (حيث يختلف المتوسط عند القسمة على عدد القيم الصالحة فقط مقارنة بالقسمة على إجمالي عدد الصفوف الأصلية). لذا يجب على المحلل ضبط معامل skipna بوعي كامل بالتداعيات الإحصائية المترتبة على قراره.
7.2 استراتيجيات معالجة البيانات قبل عملية الجمع
لضمان التحكم الكامل في دقة نتائج التجميع وتفادي المفاجآت الإحصائية الناتجة عن القيم المفقودة، يُنصح دائماً بتطبيق استراتيجيات معالجة استباقية قبل استدعاء دالة الجمع على الصفوف المحددة. تتصدر هذه الاستراتيجيات دالة fillna()، والتي تتيح استبدال القيم المفقودة بقيم بديلة مدروسة، مثل استبدالها بالصفر الحسابي df.loc[rows].fillna(0).sum()، أو تعويضها بمتوسطات الأعمدة أو وسائطها الإحصائية (Imputation Techniques) لضمان عدم تأثر المجاميع بالفراغات الهيكلية في البيانات.
بالإضافة إلى ذلك، توفر دالة الجمع المعامل المتقدم min_count، والذي يحدد الحد الأدنى من القيم الصالحة (غير المفقودة) الواجب توفرها في المتجه لإرجاع مجموع رقمي صالح. فإذا تم تعيين min_count=3 وكان الصف المقتطع لا يحتوي إلا على قيمتين صالحتين وقيمة مفقودة واحدة، فإن ناتج الجمع سيكون تلقائياً NaN. تُعد هذه الميزة حيوية لمنع إصدار مجاميع مضللة مستندة إلى عينات شديدة النقص والتشوه.
يتضمن الفحص الوقائي المتقدم فحص نسبة اكتمال البيانات داخل الصفوف المختارة عبر السلسلة البرمجية df.loc[rows].isna().mean() قبل إجراء الحسابات. يُمكّن هذا الفحص مهندس البيانات من اتخاذ قرار مؤتمت: إما بالمضي قدماً في حساب المجموع، أو تطبيق تقنيات التعويض الإحصائي المتقدم، أو استبعاد الصفوف ذات النواقص الحرجة وتوثيق ذلك في سجلات جودة البيانات لضمان أعلى مستويات النزاهة العلمية للتحليلات.
7.3 حساب المؤشرات الإحصائية المرافقة للمجموع في وجود النواقص
لا ينبغي في التحليلات الإحصائية المتقدمة الاكتفاء بحساب المجموع المجرد للصفوف المختارة بمعزل عن المؤشرات الوصفية المرافقة، لاسيما في البيئات التي تعاني من تكرار البيانات المفقودة. يوفر حساب مقاييس النزعة المركزية والتشتت، مثل المتوسط الحسابي (mean)، والوسيط (median)، والانحراف المعياري (std)، وعدد القيم الصالحة الفعلية (count)، سياقاً تفسيرياً ضرورياً لفهم القيمة الحقيقية للمجموع المحسوب ومدى دقته وتمثيله للواقع.
يمكن استخراج حزمة المؤشرات الإحصائية للصفوف المختارة دفعة واحدة وبصورة متوازية باستخدام الدالة التجميعية الشاملة agg(): على سبيل المثال df.loc[rows].agg(['sum', 'mean', 'std', 'count']). تُنتج هذه العملية جدولاً إحصائياً مصغراً يُلخص كافة الأبعاد الرياضية للصفوف المحددة، مما يتيح للمحلل رصد أي انحرافات ناتجة عن غياب بعض البيانات ومقارنة المجموع الكلي بالمتوسط الفعلي للعينة.
يسهم هذا التوثيق الإحصائي المقارن في تقييم موثوقية القرارات المستندة إلى المجاميع الجزئية؛ فإذا أظهرت النتائج أن المجموع التراكمي لصف معين يستند إلى عدد قليل جداً من المشاهدات الصالحة مع انحراف معياري مرتفع، يتم تصنيف هذه النتيجة كقيمة ذات درجة يقين منخفضة تتطلب مزيداً من التدقيق والتحقق المخبري أو الميداني قبل اعتمادها في خطط العمل النهائية.
8. تقنيات متقدمة: التعامل مع الفهارس المتعددة (MultiIndex)
8.1 بنية الفهارس الهرمية والمتعددة المستويات
تمثل الفهارس المتعددة (MultiIndex) أو الفهارس الهرمية (Hierarchical Indexing) إحدى أكثر ميزات مكتبة Pandas تطوراً وقوة، حيث تمكن المطورين من تمثيل البيانات ذات الأبعاد المتعددة (N-dimensional data) داخل هياكل الجداول ثنائية الأبعاد المألوفة (DataFrame). يتكون الفهرس متعدد المستويات من مصفوفة من الأزواج المرتبة أو المجموعات (Tuples)، حيث ينقسم الفهرس إلى مستويات متعددة (Levels) متدرجة من العام إلى الخاص (مثل: الدولة، المدينة، الفرع).
تتيح هذه البنية الهندسية تنظيم البيانات المعقدة بكفاءة عالية، ولكنها في الوقت ذاته تفرض تحديات برمجية فريدة عند محاولة عزل وجمع صفوف معينة تنتمي لمستويات متفرقة أو فئات فرعية دقيقة. يتطلب التعامل مع هذه الهياكل فهماً دقيقاً لكيفية تخزين المستويات وترتيبها في الذاكرة لتفادي العمليات الحسابية البطيئة وتجنب أخطاء عدم تطابق أبعاد الفهرسة الهرمية.
توفر Pandas أدوات متخصصة للتعامل مع هذه التحديات، تتيح استهداف صفوف محددة داخل أي مستوى من مستويات الفهرس وتطبيق التجميع الرياضي عليها بشكل مستقل تماماً عن باقي المستويات، مما يفتح آفاقاً واسعة للتحليلات المتقدمة في البيانات المالية والبيانات الطولية (Panel Data) وسلاسل الإمداد المعقدة.
8.2 جمع صفوف محددة عبر مستويات الفهرس (Index Levels)
للوصول الدقيق وتجميع صفوف محددة داخل كائن MultiIndex، توفر Pandas أداة الاقتطاع المتقدمة pd.IndexSlice. تتيح هذه الأداة صياغة تعابير اقتطاع واضحة ومتعددة الأبعاد تمرر مباشرة إلى الدالة loc، مما يُمكّن المطور من اختيار قيم محددة في المستوى الأول من الفهرس بالتزامن مع شرائح أو قيم معينة في المستويات الثانوية بكل سلاسة، مثل: df.loc[pd.IndexSlice['المستوى_الأول', ['عنصر_1', 'عنصر_2']], :].sum().
بالإضافة إلى ذلك، توفر دالة الجمع sum() إمكانية التجميع المباشر عبر مستويات محددة من الفهرس باستخدام المعامل level عند العمل على مستويات مجمعة (أو عبر دمجها مع groupby(level=...)). يؤدي تحديد المستوى المستهدف إلى قيام المحرك الحسابي بدمج وجمع كافة الصفوف الفرعية التي تشترك في نفس المفتاح الهرمي لذلك المستوى، مما يحول الجدول الهرمي المعقد إلى ملخص إحصائي مبسط وواضح.
كما تبرز الدالة xs() (اختصاراً لـ Cross-Section) كأداة فائقة الكفاءة لاقتطاع مستوى محدد من الفهرس وتجميع بياناته دون الحاجة إلى كتابة شرائح معقدة. فعلى سبيل المثال، يتيح الأمر df.xs('فرع_محدد', level='الفرع').sum() عزل كافة السجلات المرتبطة بذلك الفرع عبر مختلف المناطق الجغرافية وجمعها دفعة واحدة، مما يبرز المرونة المطلقة لمكتبة Pandas في ترويض أعقد هياكل البيانات الهرمية.
8.3 أمثلة تطبيقية على جمع مجموعات جزئية في بيانات هرمية
لتجسيد هذا المفهوم في سياق تطبيقي واقعي، فلنفترض وجود جدول بيانات متعدد الفهارس يمثل قياسات بيئية مجمعة عبر ثلاثة مستويات هرمية: ‘المنطقة’ (شمال، جنوب)، و’المحطة’ (محطة_1، محطة_2)، و’الشهر’ (يناير، فبراير، مارس)، ويحتوي الجدول على قراءات لعدة ملوثات كيميائية. إذا كان الهدف التحليلي هو حساب مجموع انبعاثات ‘محطة_1’ حصراً في كلا المنطقتين الشمالية والجنوبية لشهري يناير وفبراير فقط، فإن أدوات الفهرسة المتقدمة توفر الحل بأعلى درجات الدقة.
يتم تحقيق هذا الاستعلام المتقدم عبر استخدام pd.IndexSlice بالصيغة التالية: idx = pd.IndexSlice متبوعة بـ df.loc[idx[:, 'محطة_1', ['يناير', 'فبراير']], :].sum(). يقوم هذا السطر البرمجي باختراق كافة طبقات الفهرس الهرمي، متجاوزاً قيود الترتيب العام، ليعزل بدقة متناهية الصفوف الأربعة المطلوبة، ويطبق عليها الجمع الموجه عبر كافة الأعمدة الكيميائية للجدول.
تثبت هذه الأمثلة التطبيقية أن الفهارس الهرمية، عند إدارتها بالتقنيات البرمجية الصحيحة، لا تشكل عائقاً أمام عمليات التجميع الحسابي، بل توفر إطاراً بيانياً شديد القوة والتنظيم يتيح تنفيذ الاستعلامات الحسابية المعقدة بأكواد موجزة ومحصنة ضد الأخطاء، مما يجعلها أداة لا غنى عنها لعلماء البيانات المحترفين.
9. تحسين الأداء وكفاءة الذاكرة عند جمع صفوف من مجموعات بيانات ضخمة
9.1 تحليل التعقيد الحسابي لعمليات الفهرسة والتجميع
يخضع تحليل الأداء البرمجي في معالجة البيانات لنظرية التعقيد الحسابي (Computational Complexity)، والتي تقيس كفاءة الخوارزميات من حيث الزمن والمساحة. في مكتبة Pandas، يتطلب الوصول الموضعي عبر iloc تعقيداً زمنياً مقداره O(k) حيث تمثل k عدد الصفوف المطلوب استخراجها، نظراً لاعتماده المباشر على إزاحات الذاكرة الفيزيائية. في المقابل، يتطلب الوصول الاسمي عبر loc تعقيداً إضافياً يرتبط بالبحث في جداول التجزئة لمطابقة التسميات، مما يجعله أبطأ نسبياً في الحلقات الزمنية الحرجة.
تُعد إدارة الذاكرة المؤقتة عاملاً حاسماً في سرعة التنفيذ؛ فعند اقتطاع صفوف محددة، يجب الحذر من الوقوع في فخ العمليات المتسلسلة (Chained Indexing) مثل df[rows]['col'].sum()، حيث تؤدي هذه الصياغة إلى إنشاء كائنات وسيطة غير ضرورية في الذاكرة العشوائية وتزيد من أعباء جامع المهملات (Garbage Collector) في بايثون، فضلاً عن احتمالية إطلاق تحذيرات برمجية خطيرة.
لتحقيق أقصى كفاءة حسابية، ينبغي دائماً دمج الاقتطاع والتجميع في خطوة برمجية واحدة صريحة (مثل df.iloc[rows, cols].sum())، والاعتماد على مناظير البيانات (Views) بدلاً من النسخ العميق (Deep Copies) كلما أمكن ذلك. يضمن هذا النهج تدفق البيانات مباشرة من مساحات الذاكرة المتجاورة إلى المسجلات الحسابية في المعالج، محققاً أعلى معدلات نقل للبيانات وأدنى زمن معالجة ممكن.
9.2 الاستفادة من مصفوفات NumPy لتسريع العمليات الرياضية
عندما تكون السرعة الحسابية هي المعيار الأهم في تطبيقات الزمن الحقيقي أو معالجة البيانات فائقة الضخامة، يُنصح بتجاوز بعض الطبقات التجريدية لمكتبة Pandas والنزول مباشرة إلى مصفوفات NumPy التحتية. يتم ذلك عبر استخراج مصفوفة القيم الخام باستخدام التابع .to_numpy() أو الخاصية .values على الصفوف المحددة، ثم تطبيق دالة الجمع فائقة السرعة np.sum() مباشرة على المصفوفة الخطية الناتجة.
يوضح التعبير البرمجي np.sum(df.iloc[[0, 1, 4]].to_numpy(), axis=0) كيفية تجاوز الفهارس وبيانات الميتا الوصفية الخاصة بـ Pandas، وتوجيه المعالجة مباشرة عبر خوارزميات C وFortran المترجمة داخل NumPy. تتيح هذه الطريقة للمعالج استغلال تقنيات الحوسبة المتوازية وتوجيه التعليمات البرمجية للعتاد (Hardware Vectorization)، مما يحقق قفزات نوعية في السرعة تصل إلى عدة أضعاف مقارنة بالطرق التقليدية.
تُظهر الاختبارات المعيارية (Benchmarking) أن التحويل المؤقت إلى NumPy يقلل من العبء التشغيلي الإضافي (Overhead) المرتبط بإنشاء وتدمير كائنات Series الناتجة عن عمليات التجميع. ومع ذلك، يجب استخدام هذه التقنية بحذر مع ضمان تجانس الأنواع الرقمية للبيانات، لضمان عدم حدوث تحويلات قسرية في الأنواع قد تلتهم المكاسب الزمنية المحققة.
9.3 إدارة الذاكرة مع أنواع البيانات المحسنة (Data Types Optimization)
تعتمد الكفاءة القصوى لعمليات جمع الصفوف اعتماداً وثيقاً على تحسين أنواع البيانات (Data Types) المخزنة في أعمدة DataFrame. تخصص Pandas افتراضياً نوع البيانات float64 أو int64 للمتغيرات الرقمية، وهو ما يستهلك 8 بايت لكل عنصر. في العديد من التطبيقات العملية، لا تتطلب البيانات هذه المساحة الهائلة من الدقة، ويمكن تقليصها بأمان إلى float32 أو int32 أو حتى int16 دون أي فقدان في دقة النتائج الحسابية.
يؤدي تقليص حجم البيانات إلى مضاعفة عدد العناصر التي يمكن استيعابها داخل ذاكرة التخزين المؤقت للمعالج (CPU Cache L1/L2/L3) في الوقت ذاته، مما يقلل من اختناقات نقل البيانات بين الذاكرة العشوائية والمعالج ويسرع عمليات الجمع التراكمي للصفوف المحددة بشكل جذري. يمكن تحويل الأنواع بسهولة عبر التابع df.astype({'المتغير_1': 'float32'}) قبل الشروع في بناء خطوط المعالجة والتجميع.
وفي سيناريوهات البيانات فائقة الضخامة التي تتجاوز سعة الذاكرة العشوائية المتاحة (Out-of-Core Data)، يمكن تطبيق تقنية المعالجة بالدفعات (Chunking) عبر قراءة وتجميع الصفوف المستهدفة على هيئة كتل متتابعة باستخدام المعامل chunksize في دوال القراءة. يتم في هذه الحالة حساب المجاميع الجزئية لكل دفعة ومراكمتها تدريجياً، مما يتيح تجميع صفوف محددة من ملفات تتجاوز عشرات الجيجابايت على حواسيب ذات موارد متواضعة وبأعلى درجات الاستقرار البرمجي.
10. أمثلة وسيناريوهات تطبيقية شاملة من الواقع العملي
10.1 السيناريو الأول: جمع درجات مشاركين محددين في دراسة استقصائية
في بيئات الأبحاث الأكاديمية والاستقصائية، يتكرر سيناريو استخراج وتجميع درجات استجابات عينات محددة من المشاركين لدراسة سلوك فئات ديموغرافية معينة. لنفترض أن لدينا جدول بيانات يحتوي على نتائج اختبارات واستبيانات لمئات المشاركين، حيث يمثل كل صف مشاركاً مستقلاً، وتتوزع الأعمدة على مقاييس الرضا، والأداء، والكفاءة. يتطلب التحليل عزل مجموعة عشوائية معيارية محددة مسبقاً بناءً على مواقعها الترتيبية في العينة الضابطة (مثلاً الصفوف ذات المواقع 10 و25 و50) وحساب مجاميع درجاتها التراكمية.
يتم تنفيذ هذا السيناريو عبر كتابة الكود البرمجي التالي: sample_indices = [10, 25, 50] يليه sample_totals = df.iloc[sample_indices].sum(axis=0) لحساب المجموع الإجمالي لكل مقياس عبر العينة، متبوعاً بـ individual_totals = df.iloc[sample_indices].sum(axis=1) لحساب الدرجة المركبة لكل مشارك على حدة. يتيح هذا النهج المزدوج الحصول على رؤية إحصائية شاملة ومكثفة حول تباين الاستجابات ومقارنة مجاميع العينة المختارة بالمتوسط العام لكامل مجتمع الدراسة.
يُظهر تحليل النتائج المستخرجة كيف تُمكّن Pandas الباحث من الانتقال الفوري من البيانات الخام غير المنظمة إلى تقارير إحصائية جاهزة للنشر والتفسير العلمي، مع الحفاظ على شفافية الخطوات البرمجية وإمكانية إعادة تطبيقها آلياً على أي عينات استقصائية جديدة في المستقبل.
10.2 السيناريو الثاني: حساب إجمالي أداء فترات زمنية متباعدة
في مجالات التحليل المالي وسلاسل الإمداد، تتطلب خطط التقييم المقارن حساب إجمالي الإيرادات أو استهلاك الموارد خلال فترات زمنية محددة وغير منتظمة، مثل مقارنة مجاميع أيام العطلات الرسمية أو نهايات الربع المالي. يتم تهيئة جدول البيانات في هذه الحالة بفهرس زمني من نوع DatetimeIndex، حيث تمثل التسميات تواريخ دقيقة بصيغة YYYY-MM-DD.
لحساب إجمالي المبيعات والتدفقات النقدية لأيام محددة متباعدة، نستخدم الفهرسة الاسمية الموجهة للتواريخ: target_dates = ['2023-01-01', '2023-06-30', '2023-12-31'] متبوعة بالاستدعاء التجميعي df.loc[target_dates].sum(). يقوم محرك Pandas بمطابقة التواريخ المحددة بدقة متناهية عبر الفهرس الزمني، واستخلاص وتجميع المؤشرات المالية المقابلة لها دون التأثر بآلاف الأيام والصفوف الوسيطة الموجودة في الجدول.
تتميز هذه الطريقة بمرونتها الفائقة في التعامل مع السلاسل الزمنية، حيث تتيح أيضاً استخدام الاقتطاع الجزئي للتواريخ (Partial String Indexing) لجمع صفوف تمثل أشهراً بأكملها متباعدة، مثل جمع شهري يناير وأغسطس فقط عبر الجمع بين استعلامات loc المتعددة، مما يوفر أدوات نمذجة اقتصادية متطورة تلبي أدق متطلبات التقارير المحاسبية والتخطيط المالي الاستراتيجي.
10.3 السيناريو الثالث: جمع صفوف ديناميكية مستخرجة من مدخلات مستخدم خارجية
في التطبيقات البرمجية التفاعلية ولوحات التحكم الرقمية (Dashboards)، تأتي متطلبات جمع الصفوف غالباً من مدخلات مستخدمين غير متوقعة عبر واجهات الويب أو واجهات برمجة التطبيقات (APIs). يتطلب هذا السيناريو بناء دالة برمجية مرنة ومحصنة أمنياً تستقبل قائمة المعرفات المدخلة كمعامل خارجي، وتقوم بالتحقق من صحتها ومطابقتها لفهرس الجدول، ثم توليد التقرير التجميعي المطلوب بأمان تام.
تعتمد بنية الدالة المقترحة على استقبال قائمة المعرفات user_keys، ثم تطبيق تقنية التصفية الآمنة: valid_keys = df.index.intersection(user_keys) للتحقق من وجود المفاتيح فعلياً وتجاهل أي مدخلات خاطئة أو مضللة قد تتسبب في انهيار النظام. بعد ذلك، تقوم الدالة بتنفيذ الجمع التراكمي وحساب المقاييس الإحصائية: summary_report = df.loc[valid_keys].agg(['sum', 'mean', 'count']) وإرجاع النتائج في هيكل بياني منظم.
يمثل هذا النموذج التطبيقي قمة الممارسات الهندسية في بناء النظم البرمجية المتينة القابلة للإنتاج (Production-ready Code)؛ حيث يدمج بين التحقق الوقائي من صحة البيانات، والمرونة في التعامل مع المتغيرات الديناميكية، والكفاءة في إجراء العمليات التجميعية الموجهة، مما يضمن استقرار التطبيقات البرمجية ورضا المستخدمين النهائيين.
11. الأخطاء الشائعة واستكشاف المشكلات البرمجية وإصلاحها (Troubleshooting)
11.1 معالجة خطأ الفهرس غير الموجود (KeyError & IndexError)
يُعد خطأ المفتاح KeyError أحد أكثر الأخطاء شيوعاً عند استخدام الفهرسة الاسمية loc، ويحدث عندما يمرر المطور قائمة تحتوي على تسمية نصية أو معرف غير موجود إطلاقاً داخل كائن الفهرس الخاص بـ DataFrame. في الإصدارات الحديثة من Pandas، يؤدي تمرير أي مفتاح مفقود داخل قائمة إلى إطلاق استثناء فوري وتوقف تنفيذ البرنامج، وذلك لفرض صرامة برمجية تمنع الأخطاء الإحصائية الصامتة.
لتفادي هذا الخطأ، يجب تطبيق تقنيات البرمجة الوقائية (Defensive Programming) عبر تقاطع قائمة المفاتيح المستهدفة مع فهرس الجدول باستخدام df.index.intersection(target_list) قبل تمريرها إلى loc، أو استخدام التابع reindex() مع تحديد استراتيجية ملء الفراغات. من جهة أخرى، يظهر خطأ الفهرس الترتيبي IndexError عند استخدام iloc مع رقم ترتيبي يتجاوز الحدود الفيزيائية لعدد صفوف الجدول (مثل طلب الصف رقم 100 في جدول يحتوي على 50 صفاً فقط).
تتم معالجة أخطاء IndexError عبر فحص أبعاد الجدول مسبقاً باستخدام len(df) أو df.shape[0]، واستبعاد أي مؤشرات تتجاوز النطاق الصالح، أو استخدام التصفية الشرطية الرقمية. إن تطبيق هذه الفحوصات الاستباقية يضمن مناعة خطوط المعالجة ضد الانهيارات البرمجية غير المتوقعة ويوفر تجربة تطوير مستقرة وموثوقة.
11.2 مشكلة تحذير النسخ والشريحة (SettingWithCopyWarning)
يُمثل تحذير النسخ والشريحة (SettingWithCopyWarning) أحد أكثر الجوانب إثارة للجدل والارتباك لدى مطوري ومحللي البيانات في بايثون. يظهر هذا التحذير عندما يحاول المبرمج تعديل قيم أو إضافة نتائج جمع على جزء مقتطع من DataFrame تم الحصول عليه عبر الفهرسة المتسلسلة (Chained Indexing)، حيث يعجز محرك Pandas الداخلي عن تحديد ما إذا كان التعديل سيتم على الشريحة الأصلية في الذاكرة (View) أو على نسخة مؤقتة مستقلة (Copy).
على الرغم من أن عمليات الجمع الصرفة للقراءة فقط لا تطلق هذا التحذير مباشرة، إلا أن محاولة إسناد ناتج الجمع إلى شريحة مقتطعة فرعية (مثل: sub_df['Total'] = sub_df.sum(axis=1)) يؤدي فوراً إلى إطلاق هذا التحذير المزعج وربما يؤدي إلى فشل حفظ التعديلات داخل البيانات الأصلية. يكمن الحل الهندسي الجذري لهذه المشكلة في إنشاء نسخة صريحة ومستقلة تماماً في الذاكرة باستخدام التابع .copy() عند اقتطاع الصفوف المحددة: sub_df = df.loc[rows].copy().
يضمن استخدام .copy() فصل مساحات الذاكرة بشكل قاطع، مما يتيح للمطور إجراء كافة العمليات الحسابية والتجميعية وتعديل الأعمدة بحرية تامة ودون التسبب في أي آثار جانبية غير مرغوبة على كائن DataFrame الأصلي، مع التخلص التام من أي تحذيرات برمجية مزعجة أثناء تنفيذ الأكواد.
11.3 التعامل مع الأنواع غير الرقمية (Data Type Mismatch)
تحدث أخطاء عدم تطابق أنواع البيانات (TypeError) عندما يشتمل كائن DataFrame على أعمدة تحتوي على نصوص، أو كائنات مركبة، أو تواريخ مختلطة مع أرقام، ويحاول المطور تطبيق دالة الجمع الحسابي على صفوف محددة دون استبعاد هذه الأعمدة غير القابلة للجمع. في بعض الحالات، قد يؤدي وجود نصوص إلى سلوك غير مقصود يتمثل في دمج النصوص المتتالية (String Concatenation) بدلاً من الجمع الحسابي للقيم الرقمية، مما يشوه المخرجات التجميعية بشكل كارثي.
لتجنب هذا الخلل وضمان اقتصار عمليات الجمع على البيانات الرقمية فقط، توفر Pandas المعامل المساعد numeric_only=True داخل دالة الجمع: df.loc[rows].sum(numeric_only=True). يقوم هذا المعامل تلقائياً بفحص كافة الأعمدة واستبعاد أي عمود غير رقمي من العملية الحسابية، مما يضمن سلامة النتائج وسرعة التنفيذ.
كما يمكن تطبيق التصفية الهيكلية المسبقة للأعمدة باستخدام الدالة المتخصصة df.select_dtypes(include=[np.number]) قبل تطبيق الجمع على الصفوف المحددة، أو استخدام pd.to_numeric() مع المعامل errors='coerce' لتحويل الأعمدة المشبوهة قسرياً إلى قيم رقمية واستبدال النصوص غير الصالحة بقيم NaN لمعالجتها لاحقاً، مما يوفر خط معالجة بالغ الدقة والحصانة ضد تشوهات البيانات المدخلة.
12. المقارنة المنهجية وأفضل الممارسات البرمجية لجمع الصفوف
12.1 مصفوفة مقارنة شاملة بين مختلف طرق جمع الصفوف
يتطلب اتخاذ القرار البرمجي الأمثل لاختيار طريقة جمع الصفوف المحددة موازنة شاملة بين ثلاثة معايير رئيسية: السرعة الحسابية (Execution Speed)، ومقروئية الكود وصيانته (Readability & Maintainability)، والمرونة الوظيفية (Flexibility). يقدم الجدول المفاهيمي التالي تحليلاً مقارناً لكافة الأساليب التي تم تناولها في هذا الدليل التأسيسي لمساعدة المهندسين على اختيار الأداة الأنسب لكل سيناريو تطبيقي.
تتميز الفهرسة الموضعية عبر iloc بأعلى سرعة تنفيذ عند التعامل مع إزاحات الذاكرة المباشرة، مما يجعلها مثالية للخوارزميات المغلقة والمعالجات الدورية الرياضية. في المقابل، تتربع الفهرسة الاسمية عبر loc على قمة معايير الأمان الدلالي وسهولة القراءة، وهي الخيار الأفضل لكافة التطبيقات والتقارير التي تعتمد على معرّفات فريدة وثابتة للصفوف.
أما الأقنعة المنطقية ودالة query()، فهما الخيار الوحيد الذي يوفر مرونة مطلقة في التجميع الشرطي الديناميكي بناءً على متغيرات اللحظة الحالية. وتظل مصفوفات NumPy الملاذ الهندسي الأخير عند الرغبة في اعتصار أقصى أداء عتادي ممكن من المعالجات في العمليات فائقة الضخامة وتطبيقات الحوسبة عالية الأداء (HPC).
12.2 قائمة أفضل الممارسات لكتابة أكواد تجميع متينة وقابلة للصيانة
لكتابة أكواد تجميعية احترافية تلتزم بأعلى المعايير الهندسية المعترف بها في مجتمعات البرمجة العالمية، يُوصى باتباع مجموعة من الإرشادات الصارمة التي تضمن متانة البرمجيات وسهولة صيانتها واختبارها عبر الزمن:
- الالتزام بتوثيق افتراضات الفهرس: تأكد دائماً من توثيق طبيعة الفهرس المستخدم (هل هو فريد، هل هو مرتب) في التوثيق الداخلي للدوال البرمجية (Docstrings)، وافحص هذه الفرضيات برمجياً باستخدام
assert df.index.is_uniqueلتجنب المفاجآت الحسابية الناتجة عن تكرار الفهارس. - تجنب استخدام الفهرسة المتسلسلة: احرص دائماً على تنفيذ عمليات الاقتطاع والتجميع في تعبير برمجي واحد ومباشر، واستخدم
.loc[rows, cols]بدلاً من التعبيرات المتسلسلةdf[rows][cols]لحماية سلامة الذاكرة وتجنب التحذيرات البرمجية. - التصريح الواضح بنوع البيانات الرقمية: استخدم دائماً المعامل
numeric_only=Trueعند استدعاء دالة الجمع على جداول تحتوي على بيانات مختلطة لتفادي الدمج النصي غير المقصود وضمان سرعة التجميع الموجه. - كتابة اختبارات الوحدة الصارمة (Unit Tests): قم ببناء اختبارات آلية باستخدام مكتبات مثل Pytest للتحقق المستمر من دقة نتائج التجميع الحسابي، ومقارنة المخرجات مع قيم مرجعية معلومة مسبقاً لضمان عدم حدوث أي انحدار في جودة الكود أثناء التحديثات البرمجية.
- تغليف خوارزميات التجميع في دوال معيارية: قم بتجريد عمليات جمع الصفوف المتكررة داخل دوال برمجية واضحة ومستقلة تستقبل DataFrame وقوائم المحددات كمعاملات، وتقوم بالتحقق الوقائي من المدخلات وإرجاع النتائج في هيئة هياكل بيانية موحدة وقابلة لإعادة الاستخدام عبر كامل مراحل المشروع.
الخاتمة
استعرضنا في هذا الدليل الموسع والشامل كافة الأبعاد النظرية والبرمجية والهندسية المرتبطة بعمليات جمع صفوف محددة في مكتبة Pandas. لقد تبين لنا بوضوح أن اختيار الأسلوب البرمجي المناسب—سواء كان يعتمد على التموضع الرقمي عبر iloc، أو التسميات الدلالية عبر loc، أو الاستعلامات الشرطية عبر query() والأقنعة المنطقية، أو التحويل المباشر إلى مصفوفات NumPy—ليس مجرد تفضيل شخصي في التنسيق البرمجي، بل هو قرار هندسي دقيق يؤثر بشكل مباشر على دقة النتائج الإحصائية، وكفاءة استهلاك الذاكرة، والسرعة الزمنية لتنفيذ خطوط معالجة البيانات.
إن الإلمام العميق بكيفية إدارة مكتبة Pandas للفهارس ومحاور التجميع، وتفاعلها مع القيم المفقودة، وتمكنها من ترويض الفهارس الهرمية المعقدة، يمنح مهندس البيانات ومحلل النظم القدرة على كتابة أكواد برمجية متينة، آمنة ضد الانهيارات، وقابلة للتوسع والصيانة بسهولة داخل بيئات الإنتاج الفعلية. نتمنى أن يشكل هذا المرجع دليلاً علمياً وتطبيقياً دائماً لكافة المتخصصين والباحثين الساعين لتحقيق أقصى درجات الاحترافية في معالجة وتحليل البيانات الجدولية باستخدام لغة بايثون ومنظومتها العلمية المتطورة.
References
- Harris, C. R., Millman, K. J., van der Walt, S. J., Gommers, R., Virtanen, P., Cournapeau, D., … & Oliphant, T. E. (2020). Array programming with NumPy. Nature, 585(7825), 357–362. https://doi.org/10.1038/s41586-020-2649-2
- IEEE. (2019). IEEE Standard for Floating-Point Arithmetic (IEEE Std 754-2019). IEEE Computer Society. https://standards.ieee.org/ieee/754/6027/
- McKinney, W. (2010). Data structures for statistical computing in Python. In Proceedings of the 9th Python in Science Conference (Vol. 445, pp. 56–61). https://doi.org/10.25080/Majora-92bf1924-009
- McKinney, W. (2022). Python for data analysis: Data wrangling with pandas, NumPy, and Jupyter (3rd ed.). O’Reilly Media. https://wesmckinney.com/book/
- Pandas Development Team. (2024). pandas documentation: Essential basic functionality & Indexing and selecting data. PyData. https://pandas.pydata.org/docs/
- Python Software Foundation. (2024). Python language reference and style guide for Python code (PEP 8). Python.org. https://peps.python.org/pep-0008/
- VanderPlas, J. (2016). Python data science handbook: Essential tools for working with data. O’Reilly Media. https://jakevdp.github.io/PythonDataScienceHandbook/