تُعد معالجة البيانات واستخلاص الأنماط الدقيقة منها الركيزة الأساسية التي يقوم عليها علم البيانات الحديث وهندسة النظم التحليلية. وفي هذا السياق، تتبوأ مكتبة Pandas في بيئة لغة بايثون مكانة القلب النابض لأغلب خطوط أنابيب البيانات (Data Pipelines)، بفضل بنيتها المرنة وقدرتها الفائقة على تمثيل الجداول المعقدة عبر كائنات “إطار البيانات” (DataFrame). غير أن القيمة الحقيقية للبيانات لا تكمن في تخزينها الخام المجرد، بل في القدرة على استجوابها وتفكيكها وعزل أجزائها ذات الدلالة الإحصائية العالية، وهو ما يجعل مسألة الفهرسة الشرطية المتعددة (Multi-conditional Filtering) إحدى أهم المهارات الجوهرية والعمليات المفصلية في هذا المجال.
تتجاوز عملية تصفية البيانات وفقاً لشروط متعددة مجرد استدعاء دوال برمجية بسيطة، لتصبح نظاماً منهجياً متكاملاً يدمج بين مبادئ الجبر البولياني (Boolean Algebra)، ونظرية المجموعات الرياضية، والمعمارية الحاسوبية المعتمدة على العمليات المتجهية (Vectorized Operations) المدعومة بواسطة مكتبة NumPy. يواجه المطورون والمحللون تحديات مستمرة عند محاولة صياغة استعلامات مركبة تدمج بين المتغيرات الفئوية والكمية، والتعامل مع القيم المفقودة، والحفاظ على كفاءة الذاكرة وسرعة التنفيذ، لاسيما عند التوسع لمعالجة مجموعات بيانات ضخمة تتجاوز ملايين السجلات.
يهدف هذا الدليل الأكاديمي الشامل إلى تفكيك بنية التصفية متعددة الشروط في مكتبة Pandas من الصفر وحتى المستويات المتقدمة لهندسة النظم. سنستعرض عبر هذا المقال الأسس النظرية للفهرسة المنطقية، ونحلل المعاملات الثنائية وتطبيقاتها الرياضية، ونكشف الآليات الدقيقة لتجنب الأخطاء البرمجية الصامتة، مع تقديم مقارنات معمارية بين الأساليب المختلفة مثل التصفية المتجهية، والمحددات المرجعية، واستعلامات النصوص الديناميكية، مما يُمكّن الباحث والمهندس من بناء برمجيات تحليلية تتسم بالمتانة، والقابلية للتوسع، والدقة الرياضية المطلقة.
- 1. الأسس النظرية والمفاهيمية لتصفية البيانات في مكتبة Pandas
- 2. استخدام معامل العطف المنطقي (&) لتحقيق الشروط المتزامنة
- 3. استخدام معامل الفصل المنطقي (|) لتقييم الشروط التبادلية
- 4. قواعد الأسبقية الحسابية ودور الأقواس في بناء التعبيرات الشرطية
- 5. تطبيق معامل النفي المنطقي (~) للاستبعاد الشرطي
- 6. استخدام التابع isin() للتصفية وفق قوائم ومجموعات متعددة
- 7. تصفية السلاسل النصية والشروط الشرطية المتزامنة باستخدام str Accessor
- 8. التصفية المتقدمة عبر دالة DataFrame.query() وأسلوب التعبير النصي
- 9. استخدام الدوال المرجعية المخصصة (loc و iloc) في التصفية متعددة الشروط
- 10. معالجة القيم المفقودة (Missing Values) والتعامل مع الاستثناءات المنطقية
- 11. اعتبارات الكفاءة الحاسوبية وإدارة الذاكرة عند معالجة البيانات الضخمة
- 12. أفضل الممارسات البرمجية ودليل الصيانة لاستعلامات Pandas المعقدة
- خاتمة
- References
1. الأسس النظرية والمفاهيمية لتصفية البيانات في مكتبة Pandas
1.1 تعريف الفهرسة المنطقية (Boolean Indexing) ومبادئ عملها
تُمثل الفهرسة المنطقية، أو ما يُعرف في الأدبيات البرمجية باسم الأقنعة الثنائية (Boolean Masking)، الآلية المركزية التي تعتمد عليها مكتبة Pandas لاستخراج مجموعات فرعية من البيانات بناءً على قيمها الداخلية وليس على مواقعها الفيزيائية. تبدأ هذه العملية من خلال تقييم تعبير نسبي أو شرط منطقي على مستوى كل عنصر داخل عمود محدد (Series)، مما يؤدي إلى توليد متجه منطقي متطابق في الطول يحتوي حصرياً على قيم ثنائية (True أو False). يعكس هذا المتجه بدقة حالة استيفاء الشرط لكل صف من صفوف إطار البيانات.
عند تمرير هذا المتجه الثنائي كمعامل وصول داخل أقواس الفهرسة الخاصة بإطار البيانات، يقوم المحرك الداخلي للمكتبة بمقارنة فهارس السلسلة المنطقية مع فهارس المحور الرأسي لإطار البيانات. تتم مطابقة الصفوف التي تقابل القيمة True واسترجاعها، بينما يتم حجب واستبعاد الصفوف المقابلة للقيمة False تماماً من النتيجة النهائية دون تدمير البيانات الأصلية. تعمل هذه العملية بمحاذاة تامة للفهارس، مما يضمن دقة الربط الرياضي حتى في حال كانت الفهارس غير متسلسلة أو ذات تسميات مخصصة.
يرجع التفوق الكاسح لهذه الآلية إلى تطبيق مفهوم البث (Broadcasting) المستمد من مكتبة NumPy Broadcasting. يتيح البث تقييم العمليات الحسابية والمنطقية بين مصفوفة أحادية البعد وقيمة عددية مفردة (Scalar) أو مصفوفة أخرى بسرعة تقارب سرعة التنفيذ المباشر على مستوى لغة C. يُلغي هذا الأسلوب الحاجة إلى استخدام التكرار الحلقي التقليدي، حيث يتم تطبيق المقارنات الشرطية بالتوازي على كتل الذاكرة المتصلة، مما يقلل من العبء الحسابي ويزيد من كفاءة استغلال خيوط المعالجة المركزية.
1.2 الأهمية المنهجية لتصفية البيانات في مسار المعالجة المسبقة للبيانات
تتبوأ خطوة تنقية وتصفية البيانات موقعاً استراتيجياً في مسار المعالجة المسبقة للبيانات (Data Preprocessing Pipeline) لأي مشروع ذكاء اصطناعي أو تحليل إحصائي. تتسم البيانات الواقعية الخام بتشويشها واحتوائها على عينات لا تخدم الفرضية البحثية أو تقع خارج النطاق الزمني والمكاني المستهدف. تتيح التصفية المنهجية عزل المتغيرات ومجموعات الملاحظات بدقة متناهية بناءً على معايير محددة سلفاً، مما يضمن أن التحليلات اللاحقة تُبنى حصرياً على مجتمع إحصائي صالح للاستدلال.
من منظور البنية التحتية وإدارة الموارد الحاسوبية، تسهم التصفية المبكرة في تقليص أبعاد البيانات وحجم المساحة المحجوزة في ذاكرة الوصول العشوائي (RAM) بشكل جذري. إن التخلص من ملايين السجلات غير الضرورية قبل البدء بعمليات التحويل المعقدة، مثل التجميع (Aggregation) أو الدمج المتقاطع (Joins)، يخفض التعقيد الزمني والمساحي للعمليات الحسابية من رتب عالية إلى مستويات يمكن للمعالجات التعامل معها بيسر، مما يمنع حدوث أخطاء نفاد الذاكرة (Out-Of-Memory Errors).
علاوة على ذلك، تؤثر التصفية الشرطية بشكل مباشر على الموثوقية الإحصائية لنماذج التعلم الآلي (Machine Learning Models). فاستبعاد الملاحظات الشاذة، والبيانات المتولدة عن أخطاء القياس، أو السجلات التي لا تستوفي حدود الثقة الإحصائية، يحد من ظاهرة التوزيع المنحرف للبيانات (Data Skewness) ويمنع تضليل خوارزميات التدريب. إن تطبيق قيود شرطية متعددة وصارمة يضمن تجانس عينات التدريب والاختبار، مما يرفع من دقة التعميم (Generalization) ويقلل من خطأ الانحياز والتباين في التنبؤات النهائية.
1.3 هيكلية البيانات المرجعية المستخدمة في التطبيقات التوضيحية
لضمان التماسك الأكاديمي والوضوح التطبيقي في كافة الأقسام اللاحقة من هذا المقال، سنعتمد هيكلية موحدة لإطار بيانات تجريبي تم تصميمه بدقة ليعكس تحديات المعالجة الواقعية. يمثل هذا الإطار إحصائيات أداء مجموعة من الفرق الرياضية واللاعبين عبر مواسم مختلفة، ويحتوي على مزيج متوازن من المتغيرات الفئوية (Categorical) والمتغيرات الكمية المستمرة والمنفصلة (Numerical Variables)، مما يتيح اختبار كافة المعاملات المنطقية بموثوقية كاملة.
يتكون إطار البيانات المرجعي من الأعمدة الأساسية التالية: عمود ‘team’ ويمثل أسماء الفرق كبيانات نصية فئوية (مثل ‘A’ و ‘B’ و ‘C’)، وعمود ‘position’ لتحديد مواقع اللاعبين، وعمود ‘points’ الذي يمثل النقاط المسجلة كقيم عددية صحيحة، وعمود ‘assists’ للتمريرات الحاسمة، وعمود ‘rebounds’ للمتابعات، بالإضافة إلى عمود اختياري ‘rating’ يمثل التقييم العام كقيم عشرية قد تحوي بعض القيم المفقودة (NaN). يتميز هذا الهيكل بتنوع توزيعاته وتفاوت مقاييس النزعة المركزية لمتغيراته، مما يجعله نموذجاً مثالياً لمحاكاة التصفية المركبة.
إن توحيد هذه البيئة المرجعية يتيح لنا قياس ومقارنة السلوك الدقيق لمختلف آليات الفهرسة الشرطية في الحالات الحدية، مثل تعارض الشروط، أو محاولة استعلام قيم مفقودة، أو دمج شروط نصية وعددية متزامنة. سيوفر هذا الإطار فهماً متعمقاً لطريقة تفسير Pandas للبيانات عبر محاوره المختلفة، ويُسهل على القارئ استيعاب الفروق الدقيقة في المخرجات وسرعة الأداء بين التقنيات المتنوعة التي سيتم تفصيلها في المحاور القادمة.
2. استخدام معامل العطف المنطقي (&) لتحقيق الشروط المتزامنة
2.1 الآلية التقنية لمعامل العطف الثنائي (Bitwise AND) في بيثون
تعتمد مكتبة Pandas على معامل العطف الثنائي الممثل بالرمز (&) لتنفيذ عمليات التحقق الشرطي المتزامن، وهي نقطة تثير في كثير من الأحيان التباساً لدى المطورين القادمين من خلفيات لغات البرمجة العامة. في لغة بايثون القياسية، يُستخدم المعامل اللغوي ‘and’ لتقييم الحقيقة المنطقية للقيم المفردة بناءً على تقنية التقييم الكسول ذي الدائرة القصيرة (Short-circuit Evaluation)، حيث يتوقف التقييم بمجرد العثور على أول قيمة غير صحيحة. ولكن هذا السلوك يتعارض جذرياً مع الطبيعة المتجهية لمصفوفات البيانات في Pandas.
عند تطبيق المعامل الثنائي (&) على مستويين من السلاسل المنطقية (Series of Booleans)، فإن المحرك الحسابي لا ينظر إلى السلسلة ككتلة واحدة، بل يقوم بإجراء عملية تقاطع رياضي دقيق (Element-wise Logical Intersection) بين كل زوج متناظر من الخانات الثنائية عبر المتجهين. فإذا كان لدينا شرطان كميان، مثل الرغبة في استخراج اللاعبين الذين سجلوا نقاطاً تتجاوز 13 نقطة وفي نفس الوقت يمتلكون تمريرات حاسمة تتجاوز 7 تمريرات، فإن المعامل (&) يقارن قيمة الموقع الأول في مصفوفة النقاط مع قيمة الموقع الأول في مصفوفة التمريرات، ولا يعيد القيمة True إلا إذا كان كلا الطرفين يحملان القيمة True بشكل متزامن ومطلق.
تتم هذه المقارنة على مستوى البتات (Bitwise) داخل الذاكرة الفيزيائية بأقصى كفاءة ممكنة، مستفيدة من تسريع وحدات المعالجة الرياضية المدمجة في C و C++. ينتج عن هذه العملية متجه منطقي نهائي يمثل بالضبط مجموعة التقاطع (A ∩ B) للمجموعتين الجزئيتين، وهو ما يضمن استبعاد أي سجل يخفق في استيفاء أدنى متطلب من الشروط المحددة، مما يوفر دقة متناهية في التحديد الرياضي للعينات المستهدفة دون أي مساومة على مستوى الأداء.
2.2 الدمج بين الشروط الفئوية والكمية المتزامنة
في معظم التطبيقات العملية، لا تقتصر التصفية على المتغيرات الرياضية البحتة، بل تتطلب بناء استعلامات تربط بين تصنيفات نوعية وحدود عددية صارمة. يُعد الجمع بين مساواة السلاسل النصية الفئوية والعتبات الرقمية أحد أكثر الأنماط شيوعاً في المعالجة المسبقة للبيانات. على سبيل المثال، قد يتطلب التحليل استخراج السجلات التي تنتمي حصرياً إلى الفريق ‘A’ على أن تكون النقاط المسجلة أكبر من أو تساوي 15 نقطة في ذات الوقت.
لتحقيق هذا الترابط الإجرائي، يقوم المحرك أولاً بتقييم مصفوفة المساواة النصية عبر فحص كل عنصر في عمود الفريق، محولاً السجلات المطابقة للمحرف ‘A’ إلى True وما عداها إلى False. وبالتوازي، يتم توليد المصفوفة العددية للشرط الكمي. بعد ذلك، يتدخل معامل العطف (&) ليقوم بدمج المصفوفة النصية مع المصفوفة العددية. لا تستمر في إطار البيانات النهائي سوى الصفوف التي تجمع بين الهوية الفئوية الصحيحة والجدارة الإحصائية المطلوبة، مما يُلغي تماماً أي تداخل غير مقصود من فرق أخرى أو مستويات أداء أدنى.
تستلزم هذه العملية الانتباه الشديد لمسألة حساسية حالة الأحرف (Case Sensitivity) والفراغات المخفية في المتغيرات الفئوية. فإذا كانت السلاسل النصية تحتوي على مسافات زائدة أو تباين في التهجئة، فإن شرط المساواة سيفشل في توليد القيمة True، وبالتالي سيؤدي معامل العطف (&) إلى حجب الصف بالكامل حتى لو كان الشرط العددي محققاً بامتياز. لذلك، يجب دوماً مواءمة تنظيف النصوص مع بناء الجمل المنطقية لضمان عدم فقدان عينات بحثية حيوية أثناء التصفية المتزامنة.
2.3 توسيع العطف المنطقي لأكثر من شرطين
تتطلب السيناريوهات التحليلية المعقدة في كثير من الأحيان التوسع في تطبيق العطف المنطقي ليشمل ثلاثة شروط أو أربعة أو أكثر تجري على أعمدة متفرقة في آن واحد. يمكن لمحلل البيانات صياغة استعلام يستهدف: الانتماء للفريق ‘A’، والحصول على نقاط تتجاوز 15، وتحقيق متابعات (rebounds) تفوق 5، وتسجيل معدل أخطاء يقل عن 2. في هذه الحالة، يتم تمديد السلسلة المنطقية بربط كل قيد بالمعامل (&) بالتتابع التراكمي الرياضي.
من الناحية المعمارية، يخضع هذا التوسيع لقانون التجميع المنطقي (Associative Property)، حيث يتم تقييم أول شرطين لتوليد قناع مؤقت، ثم يُدمج هذا القناع مع الشرط الثالث، وهكذا دواليك حتى الوصول إلى القناع النهائي. ومع ذلك، فإن تراكم الشروط داخل سطر برمجي واحد قد يؤدي إلى تدهور مقروئية الشيفرة (Code Readability)، ويجعل من الصعب تتبع مكمن الخلل في حال أعاد الاستعلام إطار بيانات فارغاً نتيجة شروط بالغة التشدد الإحصائي.
لتفادي هذا التعقيد الحسابي والبصري، تبرز أفضل الممارسات البرمجية المتمثلة في تقسيم القيود المتعددة إلى متغيرات وسيطة تحمل أسماء ذات دلالة وظيفية واضحة. على سبيل المثال، يمكن تعريف القناع الأول بشكل منفصل ليمثل قيد الفريق، والقناع الثاني ليمثل قيد الأداء الهجومي، والقناع الثالث ليمثل قيد الأداء الدفاعي، ثم جمع هذه الأقنعة الوسيطة في تعبير نهائي موحد. هذا الأسلوب لا يكتفي برفع وضوح الكود وتسهيل صيانته، بل يتيح أيضاً إعادة استخدام هذه الأقنعة الفرعية في تحليلات إحصائية استكشافية موازية دون الحاجة لإعادة كتابتها.
3. استخدام معامل الفصل المنطقي (|) لتقييم الشروط التبادلية
3.1 الأساس المنطقي لمعامل الفصل الثنائي (Bitwise OR)
يمثل معامل الفصل المنطقي الثنائي (|) الركيزة الأساسية للتعامل مع الشروط التبادلية والتخييرية داخل مكتبة Pandas. في علم المنطق الرياضي ونظرية المجموعات، يقابل هذا المعامل مفهوم الاتحاد (Union)، حيث يُعنى باستبقاء أي عنصر يحقق شرطاً واحداً على الأقل من بين مجموعة من الشروط المستقلة أو المتداخلة. وعلى غرار معامل العطف، يتم تطبيق معامل الفصل (|) على مستوى البتات الفردية لكل عنصر متناظر في المتجهات المنطقية المقارنة.
عند صياغة استعلام يفحص ما إذا كان اللاعب يمتلك نقاطاً تقل عن 15 أو يمتلك تمريرات حاسمة تتجاوز 8، يقوم المعامل (|) بتقييم الشرطين بشكل مستقل تماماً. إذا تحقق الشرط الأول ونتج عنه True، يُعتمد الصف فوراً ضمن النتيجة النهائية بغض النظر عن قيمة التمريرات الحاسمة. وإذا أخفق الشرط الأول ولكنه استوفى الشرط الثاني، يُستبقى الصف أيضاً. الحالة الوحيدة التي تؤدي إلى استبعاد السجل هي الإخفاق المتزامن في كلا الشرطين، مما ينتج عنه القيمة False في مصفوفة الاتحاد المنطقي.
يتميز هذا الأسلوب بقدرته على تجميع فئات مختلفة من الملاحظات تحت مظلة استعلامية واحدة دون الحاجة إلى تشغيل استعلامات منفصلة ثم دمج النتائج يدوياً. ينتج عن عملية الفصل الرياضي إطار بيانات موسع يشمل كافة الأطياف المتباينة التي تلبي الحد الأدنى من المعايير المطلوبة، وهو ما يعد ركناً أساسياً في دراسات استكشاف البيانات (Exploratory Data Analysis) حينما يسعى المحلل للتعرف على الحالات الشاذة أو الأنماط غير النمطية عبر محاور قياس متعددة.
3.2 التصفية التبادلية عبر متغيرات مستقلة ومتداخلة
تتخذ التصفية التبادلية مستويين رئيسيين من التطبيق: المستوى الأول يركز على الجمع بين بدائل متعددة تقع ضمن نطاق نفس المتغير، مثل البحث عن صفوف ينتمي فيها اللاعب إما للفريق ‘A’ أو الفريق ‘B’. أما المستوى الثاني، وهو الأكثر تعقيداً، فيتعامل مع بدائل تتوزع عبر متغيرات متباينة هيكلياً، كأن يتم استهداف السجلات التي تسجل نقاطاً مرتفعة استثنائياً أو تقييمات دفاعية خارقة بغض النظر عن موقع اللاعب أو فريقه.
يؤدي تطبيق الفصل المنطقي عبر متغيرات مستقلة إلى تضخيم حجم إطار البيانات المسترجع، بعكس العطف المنطقي الذي يؤدي دائماً إلى تقليصه. تتطلب هذه الطبيعة التوسعية عناية فائقة في التحليل الإحصائي، حيث إن دمج شروط متباينة للغاية قد يُدخل عناصر غير متجانسة في مجموعة البيانات التحليلية النهائية. علاوة على ذلك، يجب مراعاة أن التصفية التبادلية قد تدمج صفوفاً تحقق كلا الشرطين مع صفوف تحقق شرطاً واحداً فقط، مما يستوجب الحذر عند حساب المتوسطات والانحرافات المعيارية اللاحقة.
من زاوية الأداء الحسابي، يتفوق الفصل المنطقي المتجهي باستخدام المعامل (|) بشكل ساحق على تشغيل عمليات تصفية تسلسلية متبوعة بعمليات دمج وتكرار وإزالة التكرار (Concat followed by drop_duplicates). فالمعامل الثنائي يعمل مباشرة على مصفوفات الذاكرة الأولية في مسار معالجة واحد، مما يوفر دورات المعالج ويقلل الضغط على مساحة التخزين المؤقت للبيانات، وهو ما يجعله الخيار الأمثل للتعامل مع السيناريوهات التبادلية الضخمة.
3.3 الجمع الهجين بين العطف المنطقي والفصل المنطقي
تصل قوة الفهرسة الشرطية في Pandas إلى ذروتها عند بناء استعلامات هجينة تجمع بين معاملي العطف المنطقي (&) والفصل المنطقي (|) داخل تعبير رياضي واحد متكامل. يُستخدم هذا النمط الهجين لمحاكاة القواعد المعقدة لاتخاذ القرار، حيث يتطلب التحليل استيفاء قيود تأسيسية إلزامية جنباً إلى جنب مع مجموعة من البدائل التبادلية المرنة.
لنأخذ مثالاً تطبيقياً عملياً: قد ترغب في استخراج اللاعبين التابعين للفريق ‘A’ حصرياً، ولكن بشرط أن يكون اللاعب إما صاحب رصيد نقاط يتجاوز 20 نقطة، أو يمتلك رصيد متابعات يتجاوز 10 متابعات. في هذه المعادلة، يمثل الانتماء للفريق ‘A’ الشرط الأساسي الحاكم، بينما يمثل الأداء التهديفي أو الدفاعي بدائل مسموحة. إن صياغة هذه المسألة تتطلب دمج العطف مع الفصل المنطقي في سياق يضمن تطبيق الاتحاد أولاً ثم إخضاعه للتقاطع الإلزامي.
يكمن التحدي الأكبر في المعادلات الهجينة في تجنب الالتباس المنطقي الذي قد يغير المعنى الرياضي للاستعلام بالكامل. إن أدنى خطأ في ترتيب المعاملات قد يحول الاستعلام من “لاعبي الفريق A ذوي الأداء العالي” إلى “أي لاعب من الفريق A لديه نقاط عالية، بالإضافة إلى جميع لاعبي الفرق الأخرى الذين لديهم متابعات عالية”. هذا الفارق الدقيق يؤكد الأهمية القصوى لفهم قواعد الأسبقية الحسابية وهيكلة الأقواس التي سنفرد لها المحور التالي بالتفصيل والتحليل.
4. قواعد الأسبقية الحسابية ودور الأقواس في بناء التعبيرات الشرطية
4.1 أسبقية المعاملات المنطقية والحسابية في لغة بيثون
تخضع لغة بايثون، كغيرها من لغات البرمجة العريقة، لجدول صارم يحدد أسبقية تنفيذ المعاملات (Operator Precedence). ووفقاً لقواعد المعيار القياسي للغة، تمتلك المعاملات الثنائية (Bitwise Operators) مثل (&) و (|) و (~) درجات أسبقية تفوق بكثير درجات أسبقية معاملات المقارنة المنطقية المعتادة، مثل أصغر من (<)، وأكبر من (>)، ومساوٍ لـ (==)، وغير مساوٍ لـ (!=).
هذا الترتيب الرياضي يمثل المصدر الرئيسي للخطأ البرمجي الأكثر شهرة عند كتابة استعلامات Pandas التصفوية. فعند كتابة تعبير غير محمي بالأقواس، ستقوم لغة بايثون بمحاولة تنفيذ عملية العطف الثنائي بين المتغيرات العددية المحيطة بالمعامل أولاً قبل تقييم مقارنات المجموعات. سيؤدي ذلك إلى محاولة إجراء مقارنة بتية بين رقمين أو بين عمود وقيمة، مما يفجر فوراً الخطأ الشائع TypeError أو يُنتج استثناءات تفيد بأن العملية غير مدعومة بين كائنات السلاسل والمتغيرات العددية.
توضح دراسة البنية الداخلية لمفسر بايثون أن الأسبقية التلقائية لا تراعي المنطق السياقي لمكتبة Pandas، بل تنفذ القواعد العامة للغة بدقة عمياء. ومن هنا تنبع الضرورة الحتمية لفرض الأولوية الرياضية يدوياً عبر تقنيات برمجية محددة تضمن تقييم مقارنات الأعمدة وعزل المتجهات المنطقية أولاً، قبل تمرير مخرجاتها الثنائية إلى معاملات العطف والفصل المنطقي، وهو ما يحقق الانسجام التام بين قواعد اللغة ومحرك البيانات.
4.2 الهندسة الصحيحة لصياغة الأقواس في الشروط المركبة
الحل الجذري والقاعدة الذهبية الأولى لتجاوز مشكلات الأسبقية الحسابية في مكتبة Pandas يتمثل في التغليف الإلزامي لكل شرط فردي مستقل داخل زوج من الأقواس الدائرية (). تعمل الأقواس الدائرية كأعلى سلطة تنفيذية في لغة بايثون، مما يجبر المفسر على تقييم ما بداخلها بالكامل وتوليد مصفوفة النتائج الثنائية قبل السماح لمعاملات الربط الثنائية بالتدخل للدمج.
تتجلى الهندسة الصحيحة للتعبيرات المركبة في وضع كل مقارنة داخل نطاقها الخاص؛ فالمقارنة النصية تُغلف بأقواسها، والمقارنة العددية تُغلف بأقواسها المستقلة، ثم يُوضع معامل الربط المنطقي بين هذين القوسين. وعند الانتقال إلى الشروط الهجينة المعقدة التي تجمع العطف والفصل، يجب استخدام مستويات متعددة ومتداخلة من الأقواس لتحديد التكتلات المنطقية بدقة، مما يحدد بوضوح ما إذا كان الفصل يسبق العطف أو العكس.
إلى جانب حل المشكلات الإجرائية، تُسهم الهندسة الدقيقة للأقواس في رفع قابلية صيانة الشيفرة البرمجية إلى أعلى المستويات. إن الكود المنسق بعناية، والذي تبرز فيه حدود كل شرط منطقي بصورة بصرية واضحة، يقلل من الجهد الذهني المطلوب للمراجعة والتنقيح من قبل فرق العمل، ويمنع الانزلاق نحو كتابة تعبيرات غامضة يصعب تفسيرها مستقبلاً عند تعديل قواعد العمل أو تحديث إصدارات المكتبات البرمجية.
4.3 التحليل الاستكشافي للأخطاء الناتجة عن سوء استخدام الأقواس
يترتب على الإخفاق في هندسة الأقواس نوعان رئيسيان من الأخطاء البرمجية في بيئة تحليل البيانات: أخطاء واضحة تؤدي إلى توقف التنفيذ الفوري، وأخطاء صامتة (Silent Bugs) وهي الأخطر على الإطلاق لأنها لا توقف البرنامج ولكنها تُفسد التحليلات الإحصائية وتنتج مخرجات مضللة تماماً دون أن يدرك المطور حدوث ذلك.
تتمثل الأخطاء الصامتة في السيناريوهات التي يتم فيها توزيع الأقواس بطريقة صحيحة نحوياً (Syntactically Valid) ولكنها خاطئة منطقياً (Logically Flawed). في مثل هذه الحالات، يقبل المفسر التعبير وينفذه بسلاسة، ولكن محاذاة البيانات وعمليات الاتحاد والتقاطع تتم بترتيب مخالف تماماً للفرضية التحليلية الأصلية. قد ينتج عن ذلك استرجاع مجموعات بيانات فرعية تتضمن ملاحظات كان يجب استبعادها، أو استبعاد عينات محورية كان ينبغي الاحتفاظ بها، مما يشوه جودة العينة المجهزة للتدريب أو التحليل.
لتشخيص هذه المشكلات وتفاديها، يُنصح باتباع استراتيجيات التحقق والتأكيد التفاعلي داخل بيئات التطوير مثل Jupyter Notebooks. تتضمن هذه المنهجية طباعة الأشكال وأبعاد المصفوفات (Shapes) لكل شرط وسيط على حدة، ومراجعة عينات عشوائية من الفئات المسترجعة، واستخدام دوال التأكيد البرمجي (Assertions) للتأكد من أن الصفوف الناتجة تتطابق مع الحدود الرياضية الصارمة المفترضة مسبقاً، مما يحصن خط أنابيب البيانات ضد الأخطاء الخفية.
5. تطبيق معامل النفي المنطقي (~) للاستبعاد الشرطي
5.1 مفهوم المتمم المنطقي (Logical NOT) في الفهرسة المتجهية
يُعد معامل النفي المنطقي الثنائي الممثل برمز التلدة (~) الأداة الرسمية والوحيدة في مكتبة Pandas لإجراء عمليات العكس المنطقي على مستوى المتجهات والسلاسل الثنائية. في نظرية المجموعات، يقابل النفي مفهوم المتمم المنطقي (Set Complement)، حيث يقوم بقلب كل قيمة True داخل السلسلة المنطقية إلى False، وكل قيمة False إلى True بصورة فورية ومتزامنة لكافة عناصر المصفوفة.
تكمن القوة الهائلة لمعامل النفي في قدرته على تبسيط الاستعلامات المعقدة؛ فبدلاً من محاولة صياغة شروط إيجابية متعددة وشاقة للإبقاء على فئات معينة، يمكن للمطور صياغة شرط مرجعي واحد يصف بدقة البيانات المراد التخلص منها، ثم تطبيق معامل النفي (~) على هذا التعبير لعزل واستبقاء كل ما عداه. يتميز هذا النهج بالدقة الرياضية العالية، خاصة عند التعامل مع متغيرات ذات نطاقات مفتوحة أو غير محددة مسبقاً.
يخضع معامل النفي لقواعد الأسبقية ذاتها التي تحكم بقية المعاملات الثنائية؛ ولذلك يجب دائماً تغليف التعبير أو الشرط المراد نفيه داخل أقواس دائرية مستقلة قبل وضع رمز التلدة في مقدمته. إن إغفال هذه الأقواس سيؤدي إلى محاولة نفي أول عنصر يليه مباشرة، مما يسبب أخطاء في التفسير النوعي لمصفوفة البيانات ويحول دون تحقيق الانعكاس المنطقي المطلوب للمتجه ككل.
5.2 دمج النفي المنطقي مع الشروط المتعددة المعقدة
عندما تلتقي عمليات النفي المنطقي مع الشروط المركبة التي تحتوي على معاملات عطف وفصل متعددة، يبرز التطبيق العملي المباشر لأحد أهم المبادئ في المنطق الرياضي: قوانين دي مورغان (De Morgan’s Laws). تنص هذه القوانين على أن نفي التقاطع المنطقي لمجموعتين يكافئ اتحاد متمماتهما، ونفي الاتحاد المنطقي يكافئ تقاطع متمماتهما، وهو ما ينعكس بدقة على هندسة الشيفرات البرمجية في Pandas.
إذا رغب المحلل في استبعاد الصفوف التي تحقق شرطين معاً بالتزامن (مثل استبعاد لاعبي الفريق ‘A’ الذين تتجاوز نقاطهم 20 حصرياً)، فإن الصياغة الأكثر كفاءة ومقروئية تتم عبر كتابة شرط التزامن كاملاً ثم إحاطته بالنفي الإجمالي: ~((df['team'] == 'A') & (df['points'] > 20)). وبالمقابل، يمكن صياغة نفس الاستعلام بتطبيق قوانين دي مورغان عبر البحث عن كل من لا ينتمي للفريق ‘A’ مفصولاً بعلامة (|) مع كل من تقل نقاطه عن أو تساوي 20.
إن المقارنة المعمارية بين النفي الشامل والشروط الإيجابية المفككة توضح أن استخدام النفي مع الأقواس المجمعة يقلل من احتمالية ارتكاب أخطاء منطقية عند تعديل الاستعلامات مستقبلاً. يتيح النفي الحفاظ على المعنى الدلالي الأصلي للاستبعاد، ويمنع الحاجة إلى إعادة اشتقاق العلاقات الرياضية المعاكسة لكل حد من حدود المعادلة، مما يوفر جهداً كبيراً ويضمن تطابق النتائج الحسابية في مختلف الظروف التحليلية.
5.3 حالات الاستخدام المتقدمة للنفي في تنظيف البيانات
يمثل النفي المنطقي سلاحاً محورياً في المراحل المتقدمة من تنظيف البيانات وهندسة الميزات (Feature Engineering). من أبرز هذه التطبيقات عزل القيم الشاذة والمتطرفة (Outliers) وتصفيتها خارج نطاق التحليل الإحصائي. فبدلاً من كتابة تعبيرات معقدة لحصر النطاق الطبيعي المقبول، يمكن للمحلل بناء مصفوفة منطقية تعبر عن معايير الشذوذ (مثل انحراف القيمة بمقدار ثلاثة انحرافات معيارية عن المتوسط) ثم تطبيق (~) لاستبعاد تلك الحالات واستبقاء التوزيع السليم للبيانات.
يمتد استخدام النفي ليشمل تصفية المجموعات التجريبية أو استبعاد الأنماط النصية المرفوضة والبيانات غير المستوفية لمعايير الجودة النوعية. كما يلعب دوراً حاسماً في استبعاد الفترات الزمنية غير المرغوبة أو المعاملات المالية المشبوهة في الأنظمة الاحتيالية، حيث يُبنى القناع بناءً على بصمات الخطر، ثم تُنفى تلك البصمات لتمرير المعاملات السليمة فقط إلى النماذج التحليلية.
من الجوانب الجوهرية التي يجب مراعاتها بعد تنفيذ عمليات الاستبعاد القائمة على النفي هي سلامة الفهارس (Indexes) لإطار البيانات الناتج. إن استبعاد الصفوف يترك فجوات في تسلسل الفهرس الأصلي، مما قد يتسبب في مشاكل لاحقة عند محاولة الدمج الموضعي أو التدريب المعتمد على التسلسل. لذلك، يُعد استدعاء دالة إعادة ضبط الفهرس مثل reset_index(drop=True) ممارسة قياسية مكملة لعمليات النفي لضمان اتساق هيكل البيانات الداخلي.
6. استخدام التابع isin() للتصفية وفق قوائم ومجموعات متعددة
6.1 الآلية الوظيفية والمزايا البرمجية لدالة isin()
تُعد الدالة isin() إحدى أقوى وأرقى الأدوات المدمجة في مكتبة Pandas للتعامل مع متطلبات التصفية القائمة على الانتماء لمجموعات أو قوائم محددة مسبقاً. من الناحية الإجرائية، تقوم هذه الدالة بفحص كل عنصر في العمود المستهدف ومقارنته بمجموعة من القيم المرجعية الممررة إليها، ثم تُرجع سلسلة منطقية تحتوي على True لكل عنصر يتطابق مع أي قيمة من قيم تلك القائمة، وFalse لما دون ذلك.
تتجلى الميزة البرمجية الفائقة لدالة isin() عند مقارنتها بالأسلوب التقليدي المعتمد على تكرار معاملات الفصل المنطقي (|). فبدلاً من كتابة سلسلة طويلة وشاقة من المقارنات مثل (df['team'] == 'A') | (df['team'] == 'B') | (df['team'] == 'C')، يتيح التابع isin() اختزال هذا التعبير بالكامل في صيغة موجزة وأنيقة: df['team'].isin(['A', 'B', 'C'])، مما يرفع مقروئية الكود بصورة دراماتيكية.
على الصعيد الداخلي، تستخدم الدالة خوارزميات بحث وتجزئة متطورة (Hash-based Lookups) مدعومة من مكتبة C الأساسية، مما يجعل تعقيد البحث الحسابي يقترب من الزمن الخطي بالنسبة لحجم البيانات، بعكس التكرار اليدوي لمعاملات الفصل الذي قد يستهلك وقتاً أطول كلما زادت عناصر القائمة. هذا التفوق المعماري يجعل isin() الخيار الأمثل والوحيد للتعامل مع التصفية الفئوية متعددة العناصر في المشاريع الاحترافية.
6.2 الدمج بين isin() والمعاملات المنطقية الكمية
تكتسب دالة isin() أبعاداً وظيفية أعمق عندما يتم دمجها مع المعاملات المنطقية الكمية لإنشاء استعلامات شرطية مركبة ومتقدمة. تتيح هذه التوليفة للمطور تحديد أطر عمل دقيقة، كأن يتم استهداف لاعبين ينتمون إلى مجموعة من الفرق المحددة مع فرض عتبات أداء رقمية صارمة، مثل اشتراط تجاوز النقاط أو التمريرات لمستويات قياسية.
تُصاغ هذه الاستعلامات بسلاسة تامة عبر معامل العطف الثنائي، حيث يتم التعامل مع ناتج isin() كسلسلة منطقية قياسية تُدمج مع الشروط العددية الأخرى: df[df['team'].isin(['A', 'B']) & (df['points'] > 15)]. بالإضافة إلى ذلك، يتكامل هذا التابع بتناغم استثنائي مع معامل النفي المنطقي (~)؛ فبمجرد وضع رمز التلدة أمام الاستدعاء ~df['team'].isin(['C', 'D'])، يتم استبعاد كافة الفرق المذكورة فوراً والإبقاء على بقية السجلات دون الحاجة لحصر أسماء الفرق المتبقية.
يبرز هذا النمط من التصفية كفاءة زمنية ومساحية فائقة عند التعامل مع القوائم المرجعية الكبيرة، كالقوائم التي تضم مئات الرموز البريدية، أو معرفات المنتجات، أو فئات العملاء. إن تمرير القوائم إلى isin() بالتوازي مع الشروط الكمية يضمن تقييم الاستعلامات في مسار معالجة موحد وسريع، مما يمنع حدوث أي اختناقات في تدفقات البيانات الضخمة (Big Data Pipelines).
6.3 التصفية متعددة الأعمدة باستخدام قواميس دالة isin()
من المزايا المتقدمة وغير الشائعة لدالة isin() هي قدرتها على قبول قواميس بايثون (Dictionaries) كمعامل دخل لتنفيذ تصفية شرطية متزامنة عبر أعمدة متعددة في إطار البيانات دفعة واحدة. في هذا النمط، يمثل كل مفتاح في القاموس اسم عمود معين، بينما تمثل قيمته قائمة العناصر المقبولة والمستهدفة داخل ذلك العمود بالتحديد.
عند تمرير قاموس إلى df.isin({'team': ['A', 'B'], 'position': ['Guard', 'Forward']})، لا تُرجع الدالة سلسلة أحادية البعد، بل تُرجع إطار بيانات منطقياً كاملاً (Boolean DataFrame) يحمل نفس أبعاد الإطار الأصلي. يحتوي هذا الإطار الجديد على True في التقاطعات التي استوفت شروط القاموس لكل عمود على حدة. ولتحويل هذه المصفوفة ثنائية الأبعاد إلى قناع تصفية للصفوف، يتم تطبيق التابع all(axis=1) لضمان استيفاء الصف لكافة شروط الأعمدة المذكورة في القاموس بالتوازي.
يوفر هذا الأسلوب المرن حلاً معمارياً مثالياً للتصفية المستندة إلى ملفات التكوين (Configuration Files) في الأنظمة المؤتمتة. يمكن لقنوات البيانات استيراد معايير التصفية مباشرة كملفات JSON أو YAML وتمريرها فوراً كقاموس إلى دالة isin()، مما يلغي الحاجة إلى كتابة أو تعديل الشيفرات البرمجية يدوياً عند تغير معايير التصفية، ويعزز من مرونة واستقلالية النظم البرمجية التحليلية.
7. تصفية السلاسل النصية والشروط الشرطية المتزامنة باستخدام str Accessor
7.1 استثمار التوابع النصية المتجهية (Vectorized String Methods)
تحتوي مجموعات البيانات الواقعية في الغالب على أعمدة نصية تتطلب معالجات تصفوية متخصصة تعتمد على مطابقة الأنماط وليس مجرد المساواة التامة. توفر مكتبة Pandas عبر الموصّل النصي str حزمة متكاملة من الدوال المتجهية المصممة للتعامل مع النصوص بكفاءة عالية، مثل str.contains() للبحث عن وجود نصوص فرعية، و str.startswith() للتحقق من البدايات، و str.endswith() لرصد النهايات المحددة.
تتميز هذه التوابع بقدرتها على العمل المتجهي المباشر على طول العمود، حيث تُقيم كل سلسلة نصية وتُرجع قناعاً منطقياً ثنائياً متوافقاً مع معايير الفهرسة. على سبيل المثال، يتيح استخدام df['team'].str.contains('East') استرجاع كافة الفرق التي تحتوي أسماؤها على كلمة ‘East’ دون الحاجة لكتابة تعابير تفكيكية معقدة لكل اسم على حدة.
علاوة على ذلك، تعالج هذه التوابع إشكالية حساسية حالة الأحرف بكفاءة مطلقة عبر تمرير المعامل case=False داخل الدالة. يضمن هذا الخيار مطابقة الأنماط النصية سواء كانت مكتوبة بأحرف كبيرة أو صغيرة، مما يحمي خطوط المعالجة من إخفاقات التصفية الناتجة عن تباين أساليب إدخال النصوص البشرية، ويوفر بيئة استعلام مرنة وموثوقة لتحليل البيانات الفئوية والنصية غير المهيكلة.
7.2 دمج الشروط النصية مع الشروط العددية
تصل قوة المعالجة النصية إلى مداها الكامل عند دمج التوابع المشتقة من str مع الشروط العددية والإحصائية لبناء استعلامات مركبة هجينة. يتيح هذا الدمج الإجابة عن أسئلة تحليلية دقيقة، مثل: البحث عن المنتجات التي يحتوي وصفها على كلمة معينة بشرط أن يتجاوز سعرها حداً معيناً ومعدل تقييمها حداً آخر، أو البحث عن أسماء لاعبين تبدأ بحرف محدد ولديهم معدلات أداء تفوق المتوسط العام.
يواجه المطورون في هذا السياق عقبة تقنية كبرى تتمثل في وجود القيم المفقودة (NaN / None) داخل الأعمدة النصية. إذا واجه التابع str.contains() خلية مفقودة، فإنه يُرجع القيمة NaN بدلاً من False، مما يتسبب في إفساد مصفوفة العطف المنطقي وحدوث أخطاء فادحة أثناء دمجها مع الشروط العددية. للتغلب على هذه المشكلة بشكل قاطع، توفر دالة contains المعامل الوقائي na=False، والذي يجبر المحرك على معاملة القيم المفقودة كقيم False منطقية، مما يحمي مصفوفة الفهرسة ويضمن سلاسة دمجها مع بقية الشروط عبر معامل (&).
بالإضافة إلى ذلك، تدعم هذه الدوال المتجهية استخدام التعابير النمطية (Regular Expressions – Regex) بشكل أصيل. يتيح هذا الدعم بناء استعلامات تصفية بالغة التعقيد والذكاء عبر صياغة أنماط تطابق صيغ البريد الإلكتروني، أو أرقام الهواتف، أو التنسيقات المشفرة للمنتجات، ودمجها بانسجام تام مع القيود الحسابية عبر المعاملات المنطقية المتجهية، مما يمنح المحلل مرونة استعلامية استثنائية.
7.3 تقييم الأداء الحسابي لعمليات تصفية النصوص المتعددة
على الرغم من القوة والسهولة التي يوفرها الموصّل النصي str، إلا أن العمليات النصية تُعد من بين العمليات الأكثر استهلاكاً للموارد الحاسوبية والذاكرة في مكتبة Pandas. يرجع ذلك إلى أن السلاسل النصية في بيثون تُخزن ككائنات مستقلة (Objects) في الذاكرة مع مؤشرات فردية، مما يُضعف من كفاءة المعالجة المتجهية المباشرة المتاحة للبيانات الرقمية النقية.
لتحسين أداء الاستعلامات النصية المتعددة وتجنب الاختناقات في تدفق المعالجة، يُنصح بشدة بتحويل الأعمدة النصية ذات القيم المتكررة إلى النوع الفئوي Categorical عبر التابع astype('category'). يؤدي هذا التحويل إلى تقليص استهلاك الذاكرة بشكل هائل، حيث يتم تخزين النصوص كأرقام صحيحة مشفرة داخلياً مع جدول مرجعي، مما يسرع عمليات المقارنة والفهرسة الشرطية بدرجات ملحوظة.
كما يُوصى بتبني استراتيجية “التصفية المبكرة”، والتي تقتضي تطبيق الشروط العددية السريعة أولاً لتقليص حجم إطار البيانات إلى أدنى حد ممكن، قبل تمرير الصفوف المتبقية إلى التوابع النصية أو التعابير النمطية الأكثر كلفة حسابياً. هذا الترتيب الاستراتيجي في تقييم الشروط يقلل من عدد العمليات النصية المنفذة، مما يحافظ على استجابة النظام وسرعة معالجة مجموعات البيانات الكبيرة.
8. التصفية المتقدمة عبر دالة DataFrame.query() وأسلوب التعبير النصي
8.1 بنية وقواعد صياغة الاستعلامات النصية باستخدام query()
تقدم مكتبة Pandas أسلوباً برمجياً بديلاً وأنيقاً للفهرسة المنطقية التقليدية يتمثل في التابع DataFrame.query(). يتيح هذا التابع كتابة التعبيرات الشرطية المتعددة والمعقدة في هيئة سلاسل نصية مجردة عالية المقروئية، تشبه إلى حد كبير لغة الاستعلامات البنيوية (SQL)، مما يفصل منطق الاستعلام عن التعقيدات الصياغية لأقواس بايثون ومعاملاتها الثنائية.
في بيئة query()، يتم استبدال المعاملات الثنائية المعقدة بالكلمات المفتاحية اللغوية الطبيعية؛ حيث يُستخدم المعامل اللغوي and للتعبير عن العطف المنطقي المتزامن، والمعامل or للتعبير عن الفصل المنطقي، والمعامل not لإجراء عمليات النفي والاستبعاد. كما يتم الإشارة إلى أسماء الأعمدة مباشرة داخل النص دون الحاجة لتكرار اسم إطار البيانات أو استخدام علامات الاقتباس حول كل عمود، مثل: df.query("team == 'A' and points > 15").
يتميز هذا الأسلوب بالوضوح البصري الفائق وتقليل احتمالية الوقوع في أخطاء الأقواس المفقودة أو أسبقية المعاملات التي تواجه المبتدئين والمحترفين في الفهرسة التقليدية. يوفر التابع query() واجهة موحدة ونظيفة تجعل الشيفرات البرمجية أسهل في القراءة والمراجعة والتوثيق، لاسيما في البيئات التشاركية ومشاريع تحليل البيانات واسعة النطاق التي تتطلب معايير صارمة لجودة الكود.
8.2 استدعاء المتغيرات الخارجية والبيئات الديناميكية داخل query()
تتجاوز قدرات الدالة query() مجرد تقييم الثوابت لتصل إلى التفاعل الحي مع المتغيرات المعرفة في نطاق بيئة بايثون المحلية أو العامة. تتيح هذه الميزة بناء استعلامات شرطية ديناميكية تتغير قيمها تلقائياً بناءً على مدخلات المستخدم، أو نتائج التحليلات الإحصائية السابقة، أو معايير النماذج المحدثة.
لتحقيق هذا الربط الديناميكي، تستخدم Pandas الرمز المرجعي @ الذي يُوضع مباشرة قبل اسم المتغير المحلي داخل السلسلة النصية للاستعلام. على سبيل المثال، إذا كان لدينا متغير خارجي يمثل الحد الأدنى للنقاط min_points = 18، يمكن صياغة الاستعلام كالتالي: df.query("points >= @min_points and team == 'A'"). يقوم المحرك الداخلي برصد الرمز @ والوصول إلى القيمة المخزنة في المتغير واستبدالها بسلاسة داخل شجرة التعبير المنطقي قبل التنفيذ.
علاوة على ذلك، تتعامل دالة query() باقتدار مع أسماء الأعمدة غير القياسية التي تحتوي على مسافات بيضاء أو رموز خاصة، والتي تفشل عادة في الاستدعاء المباشر. يتم تغليف هذه الأسماء بين أقواس مائلة عكسية (Backticks) مثل: `Player Name` == 'John'، مما يضمن معالجة كافة أنواع الأعمدة بمرونة مطلقة ودون الحاجة لتغيير تسميات الجداول الأصلية.
8.3 التقييم الحسابي ومحرك NumExpr في دالة query()
لا تقتصر مزايا التابع query() على الجوانب الجمالية والمقروئية، بل تمتد لتشمل مكاسب معمارية وأدائية جوهرية بفضل اعتماده الداخلي على محرك التقييم الرياضي المتطور NumExpr. يقوم هذا المحرك بترجمة السلسلة النصية للاستعلام وتجزئتها إلى كود آلي فائق السرعة يُنفذ مباشرة على مستوى الذاكرة المؤقتة لوحدة المعالجة المركزية (CPU L1/L2 Cache).
تتمثل الفائدة الكبرى لمحرك NumExpr في قدرته على تقييم الشروط المركبة دفعة واحدة دون الحاجة لتوليد مصفوفات منطقية وسيطة في ذاكرة الوصول العشوائي (RAM)، وهو الأمر الذي تعاني منه الفهرسة التقليدية عند التعامل مع شروط متعددة على إطارات بيانات ضخمة. يؤدي ذلك إلى توفير هائل في استهلاك الذاكرة وتسريع ملحوظ في زمن الاستجابة، خاصة عندما تتجاوز مجموعات البيانات مئات الآلاف من الصفوف.
ومع ذلك، توجد بعض القيود البرمجية التي يجب مراعاتها؛ فاستخدام query() مع مجموعات البيانات شديدة الصغر قد ينطوي على عبء إضافي (Overhead) ناتج عن مرحلة تحليل وترجمة النص، مما يجعل الفهرسة التقليدية أسرع نسبياً في تلك الحالات المحدودة. كما أن الدالة لا تدعم بعض العمليات المخصصة والدوال المعقدة التي لم يتم دمجها مسبقاً في قواعد لغة الاستعلام، مما يتطلب تقييم طبيعة المهمة لاختيار الأداة الأنسب لكل سيناريو.
9. استخدام الدوال المرجعية المخصصة (loc و iloc) في التصفية متعددة الشروط
9.1 التصفية الموجهة للمحاور باستخدام المحدد .loc[]
يُمثل المحدد المرجعي الموجه بالتسمية .loc[] الطريقة الأكثر احترافية ومعيارية لتنفيذ عمليات التصفية الشرطية في مكتبة Pandas. تكمن القوة الهيكلية للمحدد .loc في قدرته على قبول مدخلين منفصلين ومحددين عبر الفاصلة: المدخل الأول يمثل تصفية المحور الرأسي (الصفوف عبر الأقنعة المنطقية)، بينما يمثل المدخل الثاني تحديد المحور الأفقي (الأعمدة المراد استرجاعها أو تعديلها)، كل ذلك في خطوة معالجة ذرية موحدة.
يتيح هذا التحديد المتزامن الجمع بين التصفية الشرطية المركبة وتقليص الأبعاد، كأن يتم استخراج أعمدة ‘points’ و ‘assists’ حصرياً للصفوف التي تحقق شرط: df.loc[(df['team'] == 'A') & (df['points'] > 15), ['points', 'assists']]. هذا الأسلوب يلغي الحاجة إلى استرجاع إطار البيانات بالكامل ثم تصفية أعمدته في خطوة تالية، مما يرفع من كفاءة العمليات الحسابية ويحافظ على نظافة تدفق المعالجة.
بالإضافة إلى ذلك، يلعب المحدد .loc دوراً حاسماً في تجنب التحذير البرمجي الشهير والمربك SettingWithCopyWarning. فعند محاولة تعديل أو تحديث قيم خلايا معينة تستوفي شروطاً متعددة، يضمن استخدام .loc تعديل البيانات الأصلية في موضعها مباشرة (In-place Modification) دون الوقوع في فخ التعديل على نسخ مؤقتة في الذاكرة، وهو ما يجعله المعيار الصارم لكتابة كود إنتاجي آمن وخالٍ من العيوب الهيكلية.
9.2 توظيف الدوال المجهولة (Lambda Functions) داخل .loc
من الأنماط المعمارية المتقدمة في هندسة البيانات استخدام الدوال المجهولة (Lambda Functions) كمعاملات تصفية داخل المحدد .loc[]. يكتسب هذا النمط أهمية استثنائية عند بناء تدفقات معالجة معتمدة على أسلوب “تسلسل التوابع” (Method Chaining)، حيث تمر البيانات بسلسلة متصلة من التحويلات والتجميعات دون تخزين النتائج الوسيطة في متغيرات مستقلة.
عند تمرير دالة Lambda مثل df.loc[lambda x: (x['team'] == 'A') & (x['points'] > x['points'].mean())]، تشير المعاملة x تلقائياً إلى الحالة اللحظية والحالية لإطار البيانات في تلك النقطة الزمنية بالتحديد من خط الأنابيب. يتيح ذلك حساب إحصائيات ديناميكية—مثل المتوسط الحسابي للنقاط بعد تطبيق تحويلات سابقة—واستخدامها فوراً كعتبة تصفية شرطية داخل نفس العبارة البرمجية.
يوفر هذا النهج التجريدي مرونة تشغيلية فائقة، حيث يمنع تضارب المتغيرات ويضمن أن الشروط المنطقية تُقيم دائماً على أحدث نسخة من البيانات المعالجة. يُعد دمج دوال Lambda مع المحدد .loc الركيزة الأساسية لتصميم خطوط أنابيب بيانات (Data Pipelines) تتسم بالأناقة، والقوة، وقابلية التكيف مع التغيرات الديناميكية في بنية المدخلات.
9.3 المقارنة المنهجية بين الفهرسة المكانية والفهرسة التسموية في التصفية
تعتمد مكتبة Pandas على محددين رئيسيين للوصول إلى البيانات: المحدد التسموي .loc[] والمحدد الموضعي العددي .iloc[]. لفهم التصفية متعددة الشروط بصورة منهجية، يجب التمييز بوضوح بين هذين المدخلين وحدود استخدام كل منهما في السياقات المنطقية والشرطية.
صُمم المحدد .loc للتعامل المباشر مع الأقنعة المنطقية والسلاسل الثنائية المبنية على تسميات الفهارس، وهو المحدد الموصى به لكافة عمليات الفهرسة الشرطية. في المقابل، يعتمد المحدد .iloc حصرياً على المواقع والترتيب الرقمي الصحيح للمصفوفات (Integer-based Positions)، مما يجعله يرفض استقبال السلاسل المنطقية غير المتوافقة عددياً ويفجر أخطاء تشغيلية عند محاولة تمرير أقنعة بوليانية تقليدية إليه مباشرة.
إذا اقتضت الضرورة استخدام الفهرسة المكانية بناءً على شروط متعددة، يجب أولاً تحويل المتجه المنطقي إلى مصفوفة مواقع عددية باستخدام دوال متخصصة مثل numpy.where() أو np.flatnonzero(). يُفضل تجنب هذا الالتفاف إلا في الحالات الخوارزمية الخاصة التي تتطلب معالجة مواقع مادية محددة، مع الاعتماد الكامل على .loc في كافة سيناريوهات التصفية التحليلية اليومية لضمان البساطة والسرعة والدقة المنهجية.
10. معالجة القيم المفقودة (Missing Values) والتعامل مع الاستثناءات المنطقية
10.1 سلوك القيم المفقودة (NaN / None) في التقييمات الشرطية
تمثل القيم المفقودة، المعبر عنها برمز NaN (Not a Number) أو None، أحد أكثر المصادر الخفية للتشوهات الإحصائية والأخطاء التحليلية عند تصفية إطارات البيانات. يعود ذلك إلى الطبيعة الرياضية الصارمة للمعيار القياسي للحوسبة العشرية IEEE 754، والذي يقر بأن القيمة NaN لا تساوي أي شيء على الإطلاق، بما في ذلك نفسها (أي أن التعبير NaN == NaN يُرجع False دائماً).
يترتب على هذه الخاصية الرياضية أن أي مقارنة نسبية أو شرطية تجري على خلية تحتوي على NaN (مثل: أكبر من، أصغر من، أو يساوي) ستؤول نتيجتها تلقائياً إلى False. ونتيجة لذلك، يتم استبعاد كافة الصفوف التي تحتوي على قيم مفقودة في الأعمدة المستهدفة بالتصفية بصورة صامتة وتلقائية، حتى لو كانت تلك الصفوف مؤهلة للدخول في التحليل وفق بقية المعايير، مما قد يؤدي إلى انكماش غير مقصود في حجم العينة الإحصائية وتشوه النتائج المستخلصة.
علاوة على ذلك، في بعض العمليات المنطقية الخاصة بالسلاسل النصية والدوال المركبة، قد تنتج مقارنة القيم المفقودة قيماً ثلاثية الحالة (True, False, NaN) بدلاً من المخرجات الثنائية النقية. إن وجود القيمة NaN داخل قناع التصفية يفجر أخطاء استثنائية عند محاولة دمجه مع معاملات العطف والفصل، مما يستوجب فهماً عميقاً لآليات المعالجة المسبقة للقيم المفقودة قبل الشروع في بناء الشروط المركبة.
10.2 الدمج الصريح لشروط القيم المفقودة عبر isna() و notna()
لتحصين عمليات التصفية ضد سلوكيات القيم المفقودة غير المتوقعة، توفر مكتبة Pandas الدالتين المرجعيتين isna() (أو isnull()) للكشف عن الخلايا الفارغة، و notna() (أو notnull()) للتأكد من وجود بيانات صالحة. يتيح الدمج الصريح لهاتين الدالتين التحكم الكامل في مصير البيانات المفقودة ضمن الاستعلامات متعددة الشروط.
في السيناريوهات التحليلية التي تشترط توفر البيانات كمتطلب أولي قبل تقييم الأداء، يُستخدم التابع notna() كقيد مسبق بالتزامن مع معامل العطف (&)، مثل: (df['rating'].notna()) & (df['rating'] > 4.0). يضمن هذا التعبير تقييم الجدارة العددية فقط للخلايا الممتلئة، مما يمنع حدوث أي التباسات حسابية أثناء التنفيذ.
وبالمقابل، تبرز الحاجة في سياقات أخرى لاعتبار القيمة المفقودة حالة مقبولة ضمنياً عبر التصفية التبادلية؛ كأن يُطلب استرجاع العملاء الذين ينتمون لمنطقة جغرافية معينة أو أولئك الذين لم يتم تسجيل منطقتهم بعد (أي أن القيمة مفقودة). في هذه الحالة، يتم دمج الشرط الفئوي مع التابع isna() باستخدام معامل الفصل المنطقي (|): (df['region'] == 'North') | (df['region'].isna())، مما يحافظ على شمولية العينة ويمنع الإقصاء الجائر للبيانات غير المكتملة.
10.3 استراتيجيات الحماية ومعالجة الأخطاء في تدفقات التصفية المؤتمتة
في بيئات الإنتاج والأنظمة المؤتمتة التي تعالج تدفقات بيانات مستمرة وغير متجانسة المصادر، لا يمكن الاكتفاء بكتابة شروط التصفية المفترضة دون تطبيق طبقات حماية برمجية متقدمة (Defensive Programming). تتضمن هذه الاستراتيجيات التحقق الصارم من صحة وتطابق الأنواع البيانية (Data Types) للأعمدة قبل تمريرها إلى المقارنات الشرطية.
تتمثل إحدى أهم ممارسات الحماية في فحص توافق الأنواع لتفادي استثناءات TypeError التي تحدث عند محاولة مقارنة أعمدة تم استيرادها كنصوص (Object) مع قيم عددية، أو العكس. يتم ذلك عبر إدراج خطوات تحقق تضمن تحويل الأعمدة إلى أنواعها الصحيحة مثل pd.to_numeric() مع تمرير المعامل errors='coerce' لتحويل المدخلات المشوهة تلقائياً إلى NaN ثم معالجتها بوضوح.
كما يُنصح ببناء كتل معالجة الاستثناءات المتقدمة باستخدام try-except حول العمليات الاستعلامية المعقدة، والتحقق المستمر من أن أبعاد إطار البيانات الناتج بعد التصفية لا تساوي صفراً (Empty DataFrame). إن استباق الأخطاء وتضمين سجلات توثيق تفصيلية (Logging) لعدد الصفوف المستبعدة في كل مرحلة شرطية يضمن استقرار النظم البرمجية، ويسهل اكتشاف وتصحيح انحرافات البيانات (Data Drifts) قبل تأثيرها على المخرجات النهائية.
11. اعتبارات الكفاءة الحاسوبية وإدارة الذاكرة عند معالجة البيانات الضخمة
11.1 المقارنة بين العمليات المتجهية (Vectorization) والتكرار الحلقي (Iteration)
تُعد الكفاءة الحاسوبية المعيار الفاصل بين الحلول البرمجية الهواة وتلك المصممة للأنظمة المتقدمة. عند تصفية مجموعات البيانات الكبيرة، يرتكب بعض المطورين خطأ فادحاً بالاعتماد على الحلقات التكرارية التقليدية في بايثون، مثل استخدام for loop مع التوابع iterrows() أو itertuples() لتقييم الشروط صفاً تلو الآخر وبناء النتائج يدوياً.
تترتب على التكرار الحلقي تكلفة حسابية باهظة؛ حيث يتطلب كل انتقال بين الصفوف استدعاءات متكررة لمفسر بايثون وتغليفاً مستمراً لكائنات السلاسل (Overhead of Python Object Boxing/Unboxing). يؤدي هذا السلوك إلى هبوط سرعة التنفيذ برتب أسية مقارنة بالعمليات المتجهية (Vectorized Operations) التي تُنفذ المقارنات المنطقية المتعددة دفعة واحدة عبر تجميعات كود C المحسن، والمستفيد من تعليمات المعالجة الشعاعية المتقدمة في المعالجات الحديثة (SIMD Instructions).
تثبت القياسات المعيارية للأداء باستخدام أدوات القياس الزمني مثل %timeit في بيئات بايثون التفاعلية أن الفهرسة المنطقية المتجهية تتفوق على الحلقات التكرارية بفارق يصل إلى مئات أو آلاف الأضعاف في السرعة، خاصة مع تجاوز أحجام الجداول لملايين السجلات. يبرهن هذا الفارق القاطع على أن التمسك بالصياغات المتجهية ليس مجرد تفضيل أسلوبي، بل ضرورة حاسوبية حتمية لمعالجة البيانات الضخمة بكفاءة وموثوقية.
11.2 إدارة استهلاك الذاكرة وإنشاء النسخ السطحية والعميقة
ترتبط تصفية البيانات ارتباطاً وثيقاً بإدارة مساحة الذاكرة، لاسيما عند تكرار استخراج مجموعات فرعية متعددة. من الناحية المعمارية في Pandas، قد تُرجع عمليات التصفية أحياناً “منظراً” (View) يشير إلى نفس الكتلة في الذاكرة الأصلية، أو تُنشئ “نسخة مستقلة” (Copy). يؤدي عدم إدراك هذا التمييز إلى مشاكل غير متوقعة في استهلاك الذاكرة أو حدوث أخطاء تعديل غير مقصودة.
لتفادي الغموض البرمجي وضمان الاستقرار المطلق، يُنصح عند تصفية البيانات واستخراج مجموعة فرعية ستخضع لتعديلات وتحويلات لاحقة باستدعاء دالة النسخ العميق الصريح: df_filtered = df[(df['points'] > 15)].copy(). يضمن هذا الإجراء فصل إطار البيانات المسترجع تماماً في الذاكرة الفيزيائية، مما يمنع تحذيرات SettingWithCopyWarning ويجعل السجلات الجديدة معزولة بالكامل عن أي تعديل يطرأ على الإطار الأصلي.
بالتوازي مع ذلك، تلعب تقنية تحسين الأنواع البيانية وتخفيض دقتها (Downcasting) دوراً محورياً في تقليص البصمة التخزينية للبيانات قبل التصفية. يمكن تحويل الأعمدة العددية الصحيحة من int64 إلى int32 أو int16، وتحويل القيم العشرية إلى float32، وتحويل النصوص ذات الفئات المتكررة إلى category. يؤدي هذا التحسين إلى خفض حجم الذاكرة بنسبة قد تتجاوز 70%، مما يتيح للمعالج فحص ومقارنة الشروط المتعددة بسرعة فائقة وداخل حدود الذاكرة المتاحة.
11.3 تقنيات التصفية على مجموعات البيانات ذات الحجم الضخم (Out-of-Core)
عندما تتجاوز أحجام البيانات سعة ذاكرة الوصول العشوائي (RAM) المتاحة للجهاز، تصبح الفهرسة التقليدية عاجزة عن العمل بسبب انهيار النظام تحت وطأة الذاكرة. لمواجهة هذا التحدي الحسابي، توفر مكتبة Pandas تقنية “التجزئة الحجمية” (Chunking)، والتي تتيح تصفية البيانات الضخمة بنظام التدفق الخارجي (Out-of-Core Processing) مباشرة أثناء القراءة من الأقراص الصلبة.
تعتمد هذه التقنية على تمرير المعامل chunksize إلى دالة استيراد البيانات مثل pd.read_csv(). يقوم المحرك بقراءة الملف في هيئة كتل متتابعة ذات حجم محدد (مثلاً 100,000 صف لكل كتلة)، ويتم تطبيق الشروط المنطقية المتعددة على كل كتلة بشكل مستقل ومتجهي، ثم تجميع الصفوف المستوفية للشروط فقط في قائمة نهائية تُدمج لاحقاً عبر pd.concat(). يضمن هذا النهج عدم استهلاك الذاكرة إلا بالقدر المخصص للكتلة الواحدة، مما يمكن المحلل من تصفية ملفات بحجم مئات الجيجابايت على حواسيب شخصية محدودة الموارد.
وعند الانتقال إلى النظم الموزعة والحوسبة المتوازية، تتكامل مبادئ التصفية الشرطية لـ Pandas بسلاسة تامة مع مكتبات الحوسبة المتقدمة مثل Dask و Modin. تستخدم هذه المكتبات نفس الواجهة البرمجية لـ Pandas ولكنها توزع تقييم الشروط المتعددة على كافة أنوية المعالج أو عبر مجموعات حاسوبية موزعة (Clusters)، مما يفتح آفاقاً لا نهائية لتوسيع استعلامات التصفية لتشمل مليارات السجلات في البيئات السحابية الكبرى.
12. أفضل الممارسات البرمجية ودليل الصيانة لاستعلامات Pandas المعقدة
12.1 هندسة الكود ومبادئ قابلية القراءة والصيانة (Clean Code)
تتطلب كتابة استعلامات التصفية الاحترافية الالتزام بأرقى معايير هندسة البرمجيات ومبادئ الكود النظيف (Clean Code). إن حشر شروط منطقية متعددة ومتداخلة داخل سطر برمجي واحد طويل يُعد ممارسة برمجية سيئة تؤدي إلى كود غامض ومستعصٍ على الصيانة والاختبار، ويزيد من احتمالية وقوع أخطاء منطقية غير مكتشفة.
تتمثل الممارسة القياسية الأولى في تفكيك الشروط المعقدة إلى متغيرات منطقية وسيطة ذات تسميات دلالية واضحة تعكس الغرض التحليلي من كل شرط. على سبيل المثال، بدلاً من كتابة تعبير معقد يدمج السن والخبرة والموقع الجغرافي دفعة واحدة، يتم إنشاء أقنعة مستقلة بأسماء مثل is_senior_expert و is_target_region، ثم دمج هذه الأقنعة في الاستعلام النهائي، مما يجعل الكود يقرأ نفسه ذاتياً ويفصح عن منطقه التحليلي بوضوح تام.
علاوة على ذلك، يجب الالتزام بدليل تنسيق كود بايثون القياسي PEP 8 عند كتابة التعبيرات المنطقية الممتدة. يتضمن ذلك توزيع الشروط على أسطر متعددة ومنسقة مع وضع المعاملات المنطقية في بدايات الأسطر أو استخدام الأقواس المجمعة للفصل، بالإضافة إلى إدراج التعليقات التوضيحية (Docstrings and Comments) التي تشرح المبررات الإحصائية والمنطق التجاري الكامن وراء اختيار عتبات التصفية المحددة، مما يضمن سهولة الصيانة والتطوير المشترك بين فرق العمل.
12.2 بناء اختبارات الوحدة (Unit Testing) للتحقق من صحة نتائج التصفية
في بيئات العمل المؤسسية ومشاريع هندسة البيانات الحرجة، لا يمكن الاعتماد على الفحص البصري العابر للتحقق من سلامة نتائج التصفية الشرطية. تبرز هنا الأهمية الحتمية لبناء اختبارات الوحدة (Unit Tests) المؤتمتة التي تتحقق رياضياً ومنطقياً من دقة مخرجات الاستعلامات تحت مختلف الظروف التشغيلية والحالات الحدية (Boundary Conditions).
توفر مكتبة Pandas وحدة اختبار متخصصة تحتوي على أدوات فحص دقيقة مثل pandas.testing.assert_frame_equal و assert_series_equal. تتيح هذه الأدوات مقارنة نتائج التصفية مع مجموعات بيانات مرجعية معروفة بدقة متناهية، والتحقق من تطابق القيم، وأنواع البيانات، وحالة الفهارس، مع ضبط حدود التسامح مع الفروق العشرية الطفيفة.
يجب أن تُصمم حالات الاختبار لتغطي السيناريوهات الحدية الحساسة، مثل: تمرير إطار بيانات فارغ تماماً، أو إطار بيانات تكون فيه كافة القيم مفقودة (All NaNs)، أو حالات تتطابق فيها قيم البيانات بدقة متناهية مع عتبات التصفية المحددة (مثل القيمة 15 تماماً في شرط >= 15). إن التحقق من ثبات النتائج عبر أجنحة الاختبار المؤتمتة يحمي خطوط المعالجة من الانهيار عند تحديث إصدارات المكتبات أو تعديل مصادر البيانات الأولية، ويضمن استمرارية الثقة في النواتج التحليلية.
12.3 خلاصة إرشادية لاختيار الأداة والأسلوب الأنسب للتصفية الشرطية
لتتويج هذا الدليل الشامل، نلخص في هذا القسم مصفوفة القرار المنهجية التي تُرشد مهندس ومحلل البيانات لاختيار الأداة والتقنية المثلى للتصفية الشرطية المتعددة في مكتبة Pandas، بناءً على طبيعة المهمة، وحجم البيانات، ومتطلبات الأداء والقراءة البرمجية:
- الفهرسة المنطقية بالأقواس والمعاملات الثنائية
df[(c1) & (c2)]: تمثل الخيار المعياري والأكثر سرعة وشيوعاً للمهام التحليلية اليومية السريعة، والشروط الحسابية المباشرة التي لا تتجاوز شرطين أو ثلاثة. - المحدد المرجعي الموجه بالتسمية
df.loc[mask, columns]: الخيار الإلزامي والوحيد عند الرغبة في تصفية الصفوف واسترجاع أعمدة محددة بالتزامن في خطوة واحدة، أو عند الرغبة في تعديل وتحديث قيم البيانات في موضعها الأصلي وتجنب تحذيرات النسخ المؤقتة. - التابع التعبيري عالي المقروئية
df.query(): الخيار الأمثل للاستعلامات المعقدة ذات المتغيرات الديناميكية المتعددة، وفي المشاريع التي تتطلب معايير عالية لمقروئية الكود، ومع مجموعات البيانات الضخمة التي تستفيد من تسريع محرك NumExpr وتوفير الذاكرة الوسيطة. - دالة الانتماء الفئوي
df['col'].isin(values): الخيار الحصري والأكثر كفاءة لمقارنة الأعمدة بقوائم ومجموعات متعددة من القيم، متفوقاً تماماً على سلاسل الفصل المنطقي المتكررة، لاسيما عند استيراد معايير التصفية من قواميس أو ملفات تكوين خارجية.
إن إتقان الموازنة الواعية بين هذه الأدوات المتنوعة، وفهم الآليات التحتية لكيفية إدارة الذاكرة وتوزيع العمليات المتجهية، يُمكّن المتخصص من بناء خطوط معالجة بيانات تتسم بالرشاقة، والصلابة، والقدرة الفائقة على التوسع، مما يحول البيانات الخام إلى أصول معرفية دقيقة وقابلة للاستثمار في أعلى مستويات اتخاذ القرار والنمذجة الذكية.
خاتمة
لقد استعرضنا في هذا الدليل الأكاديمي الموسع كافة الأبعاد النظرية والتطبيقية لتصفية إطارات البيانات في مكتبة Pandas وفقاً لشروط متعددة. انطلاقاً من الأسس الجبرية للفهرسة المنطقية وتوليد الأقنعة الثنائية، مروراً بالتطبيقات الدقيقة لمعاملات العطف المنطقي (&)، والفصل المنطقي (|)، والنفي التكميلي (~)، وصولاً إلى التقنيات المتقدمة مثل الدوال المرجعية .loc، والاستعلامات النصية الديناميكية عبر query()، والمعالجات المتجهية للنصوص والقوائم.
إن جوهر الاحتراف في التعامل مع مكتبة Pandas لا يتوقف عند مجرد حفظ الصيغ التعبيرية للدوال، بل ينبع من الفهم المعماري العميق لطريقة تفاعل محرك البيانات مع الذاكرة الفيزيائية، وتطبيق قواعد الأسبقية الحسابية، والإدارة الصارمة للقيم المفقودة والحالات الاستثنائية. إن اتباع الممارسات الهندسية النظيفة وبناء اختبارات التحقق المؤتمتة يمثل الضمانة الوحيدة لسلامة الاستدلالات الإحصائية وجودة نماذج التعلم الآلي في المشاريع الواقعية.
References
- 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: Indexing and selecting data. PyData. https://pandas.pydata.org/docs/user_guide/indexing.html
- 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 Computer Society. (2019). IEEE Standard for Floating-Point Arithmetic (IEEE Std 754-2019). IEEE. https://doi.org/10.1109/IEEESTD.2019.8766229
- NumExpr Development Team. (2023). NumExpr: Fast numerical expression evaluator for NumPy. PyData. https://numexpr.readthedocs.io/
- Van Rossum, G., Warsaw, B., & Coghlan, N. (2001). PEP 8 – Style Guide for Python Code. Python Software Foundation. https://peps.python.org/pep-0008/
- Rocklin, M. (2015). Dask: Parallel Computation with Blocked algorithms and Task Scheduling. In Proceedings of the 14th Python in Science Conference (pp. 126-132). https://doi.org/10.25080/Majora-7b98e3ed-013