JupySQL هي مكتبة Python تتيح لك تشغيل SQL في دفاتر Jupyter وواجهة IPython.
في هذا الدليل، سنتعلّم كيفية الاستعلام عن البيانات باستخدام chDB وJupySQL.
لنبدأ أولًا بإنشاء بيئة افتراضية:
ثم سنقوم بتثبيت JupySQL وIPython وJupyter Lab:
يمكننا استخدام JupySQL في IPython، ويمكننا تشغيله بتنفيذ:
أو في Jupyter Lab، عبر تشغيل:
إذا كنت تستخدم Jupyter Lab، فستحتاج إلى إنشاء دفتر قبل متابعة بقية الدليل.
سنستخدم مجموعة بيانات سيارات الأجرة في مدينة نيويورك، التي تتضمن نحو 3 ملايين رحلة، إلى جانب أجرة كل رحلة وإكراميتها وحيّ الانطلاق منها.
تتوزع الرحلات على عدة ملفات TSV، لذا لنبدأ بتنزيلها:
بعد ذلك، لنستورد الوحدة dbapi الخاصة بـ chDB:
وسننشىء اتصالًا بـ chDB.
ستُحفَظ أي بيانات نُخزّنها بشكل دائم في المجلد taxi.chdb:
لنحمّل الآن الأمر السحري sql وننشئ اتصالًا بـ chDB:
بعد ذلك، سنعرض حدّ العرض كي لا تُقتطع نتائج الاستعلامات:
الاستعلام عن البيانات في ملفات TSV
نزّلنا مجموعة من الملفات التي تبدأ بالبادئة trips_.
لنستخدم عبارة DESCRIBE لفهم المخطط:
يمكننا أيضًا كتابة استعلام SELECT مباشرةً على هذه الملفات لمعرفة شكل البيانات:
إذا ألقينا نظرة على المخطط مرة أخرى، فسنرى أن بعض الأعمدة المتعلقة بالمبالغ المالية — trip_distance وfare_amount وtip_amount — استُنتجت كنوع String بدلًا من نوع رقمي.
وسنصحّح ذلك عند استيراد البيانات إلى جدول.
استيراد ملفات TSV إلى chDB
سنخزّن الآن بيانات ملفات TSV هذه في جدول.
لا تحتفظ قاعدة البيانات الافتراضية بالبيانات على القرص، لذا نحتاج أولًا إلى إنشاء قاعدة بيانات أخرى:
والآن سننشئ جدولًا باسم trips، يُستمد مخططه من بنية البيانات في ملفات TSV.
سنستخدم عبارة REPLACE لتحويل الأعمدة المتعلقة بالمبالغ المالية إلى Float64، ودالة transform لتحويل العمود الرقمي pickup_borocode إلى اسم المنطقة الإدارية المقابل:
لنتحقق سريعًا من البيانات في جدولنا:
ما يزيد قليلًا على 3 ملايين رحلة — لنُضِف أيضًا جدولًا ثانيًا.
تقسّم لجنة سيارات الأجرة والليموزين في مدينة نيويورك المدينة إلى مناطق لسيارات الأجرة، ويربط ملف lookup كل منطقة بمنطقتها الإدارية.
لننزّل هذا الملف:
ثم أنشئ جدولًا باسم zones باستخدام محتوى ملف CSV:
بعد اكتمال التشغيل، يمكننا إلقاء نظرة على البيانات التي استوردناها:
اكتمل إدخال البيانات، والآن حان وقت الجزء الممتع: الاستعلام عنها!
ينقسم كل منطقة إدارية إلى عدد مختلف من مناطق سيارات الأجرة.
سنكتب استعلامًا يربط بين الجدولين لمعرفة عدد الرحلات التي بدأت في كل منطقة إدارية، ومتوسط عدد الرحلات لكل منطقة سيارات أجرة:
تضم مانهاتن وكوينز العدد نفسه من مناطق سيارات الأجرة، لكن مانهاتن تسجّل أكثر من 14 ضعفًا من عمليات الركوب.
يمكننا حفظ الاستعلامات باستخدام المعلمة --save في السطر نفسه لأمر %%sql السحري.
تعني المعلمة --no-execute تخطي تنفيذ الاستعلام.
عند تشغيل استعلام محفوظ، يُحوَّل إلى تعبير جدول شائع (CTE) قبل تنفيذه.
في الاستعلام التالي، نحسب الأحياء ذات أعلى متوسط للإكرامية:
تتصدّر القائمة أحياء لم تُسجَّل فيها سوى بضع رحلات، لذا قد تؤدي رحلة واحدة مرتفعة التكلفة إلى انحراف المتوسط.
لنستبعدها باستخدام عامل تصفية.
الاستعلام باستخدام المعلمات
يمكننا أيضًا استخدام المعلمات في استعلاماتنا.
المعلمات هي مجرد متغيرات عادية:
بعد ذلك، يمكننا استخدام صيغة {{variable}} في استعلامنا.
يعرض الاستعلام التالي الأحياء التي لديها أعلى متوسط للإكرامية بين الأحياء التي تضم أكثر من 10,000 رحلة:
تحظى رحلات الاستقبال من المطار بأعلى الإكراميات بفارق كبير، إذ إن الرحلات الطويلة إلى المدينة تتراكم تكلفتها.
يوفّر JupySQL أيضًا إمكانات محدودة لرسم المخططات.
يمكننا إنشاء مخططات صندوقية أو مدرجات تكرارية.
سننشئ مدرجًا تكراريًا، ولكن دعونا أولًا نكتب (ونحفظ) استعلامًا يعرض مسافة كل رحلة تقل عن 20 ميلًا.
وسيكون بإمكاننا استخدامه لإنشاء مدرج تكراري يحصي عدد الرحلات التي تقع ضمن كل نطاق مسافة:
يمكننا بعد ذلك إنشاء مدرج تكراري بتنفيذ ما يلي:
معظم الرحلات قصيرة، وتتراوح بين ميل واحد وثلاثة أميال، مع امتداد طويل للرحلات المتجهة إلى المطار.