المحتوى
مقدمة
إن وفرة البيانات اليوم تمثل تحديًا جديدًا لمهندسي البيانات، حيث أنه أصبح من اللازم صنع أنظمة قواعد بيانات مختصة لحفظ البيانات تسهل عملية إدارتها والوصول إليها. وكما أشرنا سابقا، إن إدارة البيانات هي أساس النجاح في مشاريع علم البيانات والذكاء الاصطناعي، وذلك لأننا نحتاج إلى البيانات من أجل تدريب نماذج تعلم الآلة، فإن لم يكن لدينا بالأساس قاعدة بيانات تحتفظ بالبيانات، لن يكون عندنا حينها بيانات لكي نستخدمها في عمل نماذج تعلم الآلة أو تحليلها للوصول إلى استنتاجات مفيدة. ولذلك يجب حفظ البيانات وتسهيل عملية الوصول إليها قدر الإمكان, وإن من أهم الأدوات في إدارة وحفظ البيانات هي قواعد البيانات، لأن الهدف الأساسي لقواعد البيانات هو حفظ البيانات وتسهيل عملية الوصول إليها أو تعديلها. و في الحقيقة نحن نستخدم قواعد البيانات منذ أكثر من خمسون عامًا، ومع مرور الزمن تطورت قواعد البيانات وأصبح هناك العديد من الأنواع. وفي هذا الدرس، سنتطرق إلى أحد أهم الأنواع والمعروف بـ SQLite.
أهداف الدرس
- التعرف على أنواع البيانات الأساسية (Structured, Semi-Structured, Unstructured)
- صنع قاعدة بيانات وتخزين جداول البيانات فيها
- استخدام أشهر لغة لاستخراج البيانات من قواعد البيانات وهي (Structured Query Language - SQL)
أنواع البيانات
إن مصطلح البيانات هو مصطلح شامل يحتوي على مئات الأصناف من الملفات، حيث أن تغريدتك في تويتر تعتبر بيانات، وجدول الإكسل المستخدم في متجر الحلوى يعتبر بيانات، بل أن صورتك في انستغرام هي أيضا تعتبر بيانات. ولذلك سوف نلاحظ أن كل ما يتم رفعه على الإنترنت بإمكاننا اعتباره نوع من أنواع البيانات، ومهمتنا نحن كعلماء بيانات هو استخدامها من أجل الوصول إلى قرارات مفيدة ومربحة.
على سبيل المثال، يقوم فريق من علماء البيانات بجمع البيانات الاستهلاكية في المتاجر الغذائية لمعرفة ماهي السلع الأكثر مبيعا؟ وماهي أكثر أيام الأسبوع التي يأتي فيها الزبائن؟ وما هي الأرباح المتوقعة في الشهر القادم؟ وهناك فريق ثاني من علماء البيانات آخرون يقومون بجمع تغريدات المستخدمين في تويتر من أجل تحليل تفاعلهم تجاه أمر معين كالأسهم أو مباريات كرة القدم. وحين النظر في الفريقين، نجد أن كل فريق يستخدم قاعدة بيانات مختلفة عن الأخرى، وذلك لأن نوع البيانات مختلف. إذًا ماهي الأنواع التي نتحدث عنها وكيف نعرف ماهي قاعدة البيانات المناسبة؟ لاحظ في الصورة المرفقة في الأسفل، أن هناك ثلاثة أنواع أساسية من البيانات. أولا البيانات المنظمة، ثم شبه المنظمة، وأخيرا البيانات الغير منظمة وتفصيلها كالتالي:
- البيانات المنظمة هي البيانات التي تكون على هيئة جداول مثل ملفات الإكسل والسي إس في
- البيانات الشبه منظمة هي البيانات التي لا تكون على هيئة جداول، ولكن يمكن تحويل البيانات المخزنة فيها إلى جداول بسهولة مثل ملفات الجيسون JSON
- البيانات الغير منظمة هي البيانات التي لا تكون على هيئة جداول، وتحتاج إلى العديد من الخطوات لتحويلها إلى جداول، مثل الصور والتغريدات

حسنًا، ربما استنتجت من الصورة أن معظم البيانات الموجودة على الإنترنت هي البيانات الغير منظمة! وهذا الاستنتاج صحيح تماما. حيث أن تفاعلاتنا على الإنترنت و زيارتنا في الأسواق وغيرها من الأنشطة تصنع كميات ضخمة من البيانات الغير منظمة. ولأننا نعلم أن البيانات المنظمة هي ذات الفائدة الأكبر في تدريب نماذج تعلم الآلة أو استنتاج قرارات مفيدة، يقوم مهندسو البيانات بتحويل البيانات الغير منظمة إلى بيانات منظمة (ستركتشرد - Structured) لكي تصبح ذات نفع عالي نستطيع من خلالها تدريب نماذج تعلم الآلة والذكاء الاصطناعي واستنباط استنتاجات منطقية
ماذا نريد أن نفعل؟
إن هدفنا اليوم هو التطرق إلى إدارة البيانات ذات الفائدة الأكبر وهي البيانات المنظمة. ويتم بالعادة إدارتها عن طريق أنظمة قواعد البيانات العلائقية Relational Database Management Systems (RDMS). حيث أنها تعتبر أشهر أنواع قواعد البيانات وهي متخصصة في البيانات المنظمة (أي جداول البيانات) والبيانات المخزنة فيها إما أنها منظمة بالأصل أو تم تحويلها من غير منظمة إلى منظمة لكي يتم حفظها في قاعدة البيانات العلائقية. واليوم سوف يكون تركيزنا على كيفية تخزين واستدعاء البيانات المنظمة منها.
ما هو نظام قاعدة البيانات العلائقية المستخدمة في هذا الدرس؟
إن هنالك العديد من أنظمة قواعد البيانات العلائقية ومن أشهرها SQLite ،MySQL ،PostgreSQL، وبغض النظر عن نوع قاعدة البيانات المستخدمة، هناك شيء مشترك بينهم وهو أن معظم قواعد البيانات العلائقية نستطيع إدارة البيانات فيها من خلال لغة الــ SQL.
إذا ماهي SQL؟
لغة (الإس كيو إل) هي لغة برمجية نستطيع من خلالها إدارة قاعدة البيانات العلائقية. فمثلا، تتيح لنا هذه الغة صناعة جداول جديدة أو استيراد جداول وتخزينها في قاعدة البيانات. وأيضا تتيح لنا تعديل البيانات مثل حذف أعمدة معينة أو تحديث بيانات صف معين. وأيضا تستخدم اللغة لعمل استخراج وربط البيانات من قاعدة البيانات. ولذلك تعتبر هذه اللغة من أهم اللغات لعلماء ومهندسي البيانات.
ماهي البيانات المستخدمة؟
تم أخذ جدولَيْ بيانات من موقع البيانات السعودية المفتوحة (قسم الزراعة والأسماك)
وقد قمنا بإجراء بعض التعديلات الطفيفة عليهم، ولذلك إن أردت تحميل البيانات، ننصح بتحميل الجدولين من هنا
الخطوة الأولى: استدعاء المكتبات اللازمة
Step One: Import Necessary Librariesلأننا سوف نقوم باستخدام كلا من البايثون والإس كيو إل، سنقوم بتنزيل المكتبتين التاليتين والتي تتيح لنا استخدام الـ SQL
# To download these two libraries, uncomment the codes below
# لتنزيل المكتبتين في الأسفل كم بإزالة الكومنت من الأكواد التالية
#!pip install sqlite3 # To manage SQLite db - لإدارة قاعدة البيانات
#!pip install ipython-sql # To write sql commands in this notebook - من أجل كتابة أوامر إس كيو إل
import pandas as pd # To read csv file from GitHub - لقراءة البيانات من جيت هوب
import sqlite3 # To manage SQLite db - لإدارة قاعدة البيانات
# When writing sql scripts, we will use the magic command '%'.
# سوف نقوم باستخدام علامة خاصة % عند كتابة أكواد السيكول من أجل التفرقة بينها وبين البايثون
# to load the ipython-sql extension, we will use the following code
# من أجل استخدام الإضافة التي تتيح لنا استخدام الإس كيو إل سوف نقوم باستخدام الكود التالي
%load_ext sql
الخطوة الثانية: استخدام مكتبة البانداس لقراءة إطاري البيانات
Step Two: Use Pandas to Read Dataframes from GitHubسوف نقوم الآن بقراءة الجدولين عن طريق استخدام مكتبة Pandas
Afforestation_KSA = pd.read_csv('https://github.com/KAFSALAH/Fihm_Lessons/raw/master/Data_Management_SQLite/Afforestation_KSA.csv')
Forests_KSA = pd.read_csv('https://github.com/KAFSALAH/Fihm_Lessons/raw/master/Data_Management_SQLite/Forests_KSA.csv')
الخطوة الثالثة: إنشاء قاعدة البيانات
Step Three: Create SQLite Database
con = sqlite3.connect("My_Forest_DB.db") # Creating the db - إنشاء قاعدة البيانات
عند تشغيل الكود الذي بالأعلى، سوف تلاحظ ظهور ملف جديد، هذا الملف هو قاعدة البيانات ونلاحظ أن حجم الملف هو صفر بايت لأننا لم نقم بتخزين جداول فيه للآن

الآن سوف نقوم بالاتصال بقاعدة البيانات عن طريق الكود التالي
%sql sqlite:///My_Forest_DB.db
يلي ذلك حفظ الإطارين في قاعدة البيانات المنشأة
## Loading dataframes into the db
## حفظ الجدولين في قاعدة البيانات التي تم إنشاؤها
Afforestation_KSA.to_sql("Afforestation_KSA", con, if_exists='replace', index=False,method="multi")
Forests_KSA.to_sql("Forests_KSA", con, if_exists='replace', index=False,method="multi")
يتم التحقق إذا ما تم تخزين الجدولين في قاعدة البيانات عن طريق الكود التالي
# Checking the current tables in the db - التحقق من الجداول الموجودة حاليا في قاعدة البيانات
%sql SELECT name FROM sqlite_master WHERE type='table';
* sqlite:///My_Forest_DB.db Done.

لاحظ تغير حجم قاعدة البيانات بعد تخزين الجدولين فيها

الخطوة الرابعة: استكشاف الجدول الأول في قاعدة البيانات
Step Four: Explore the First Table in the Databaseالآن سنقوم بالتعرف على أهم أكواد الـ SQL التي سوف نستخدمها لاستكشاف الجدولين. وأولا، سنقوم باستكشاف الجدول الأول وهو بيانات التشجير في المملكة العربية السعودية والمسمى بـ Afforestation_KSA.
%%sql
-- We use '*' to select the complete table
-- نحن نستخدم النجمة في حالة إردنا استعداء الجدول بالكامل
SELECT * FROM Afforestation_KSA;
* sqlite:///My_Forest_DB.db Done.

لاحظ كيف أن النجمة تقوم باستعداء جميع الصفوف والأعمدة، ولكن ماذا لو أردنا استدعاء أعمدة محددة فقط؟ في الحقيقية نستطيع فعل هذا الأمر بسهولة. سوف نقوم باستبدال النجمة بأسماء الأعمدة التي نريد إظهارها.
%%sql
-- We will call 'State', 'Total_afforestation' columns only
-- سنقوم باستعداء عمودي المنطقة ومجموع أعداد التشجير فقط
SELECT State, Total_afforestation FROM Afforestation_KSA;
* sqlite:///My_Forest_DB.db Done.

حسنًا! ماذا لو أننا نريد أعداد التشجير في منطقة عسير فقط؟
%%sql
-- We use 'WHERE' to add a condition
-- نقوم باستخدام وير من إجل إضافة شرط معين
SELECT * FROM Afforestation_KSA
WHERE State = 'عسير';
* sqlite:///My_Forest_DB.db Done.

%%sql
-- We can also use 'LIKE' command as follows
-- نستطيع أيضا استخدام لايك كالتالي
SELECT * FROM Afforestation_KSA
WHERE State LIKE '%منطقة المدينة المنورة%';
* sqlite:///My_Forest_DB.db Done.

سوف نقوم بتصفية الجدول عن طريق استدعاء بيانات المناطق التي كان موجوع أعداد التشجير فيها ما بين 300,000 و 500,000
%%sql
SELECT * FROM Afforestation_KSA
WHERE Total_afforestation BETWEEN 300000 AND 500000
* sqlite:///My_Forest_DB.db Done.

نستطيع كذلك ترتيب الجدول من الأكبر للأصغر أو العكس. والآن سنقوم بترتيب المناطق حسب مجموع التشجير من الأكبر للأصغر
%%sql
-- We use 'ORDER BY' to order table, and 'DESC' to make a descending order
-- نقوم باستخدام كود أوردر باي من أجل ترتيب الجدول، وكود ديس من أجل جعل الجدول يترتب من الأكبر للأصغر
SELECT * FROM Afforestation_KSA
ORDER BY Total_afforestation DESC;
* sqlite:///My_Forest_DB.db Done.

الخطوة الخامسة: استكشاف الجدول الثاني في قاعدة البيانات
Step Five: Explore the Second Table in the Databaseوالآن فلستكشف الجدول الثاني، وهو جدول يحتوي على بيانات الغابات في المملكة العربية السعودية. ولأننا نتوقع أن الجدول سوف يكون كبيرا نظرا لعدد الغابات الكثيرة. دعونا نحدد أننا نريد رؤية السبعة الصفوف الأولى فقط
%%sql
-- we use LIMIT to specify number of rows
-- نستعمل كود ليميت لتحديد عدد الصفوف التي سوف تظهر
SELECT * FROM Forests_KSA
LIMIT 7;
* sqlite:///My_Forest_DB.db Done.

حسنا، ماذا لو كنا مهتمين في معرفة عدد الصفوف؟ أي بمعنى آخر: ماذا لو أردنا معرفة عدد الغابات في المملكة العربية السعودية؟
%%sql
-- We count number of rows using 'COUNT'
-- نقوم بعد عدد الصفوف عن طريق كود كاونت
SELECT COUNT(*) from Forests_KSA;
* sqlite:///My_Forest_DB.db Done.

في الكود الذي في الأعلى، قمنا بعد عدد الغابات في المملكة العربية السعودية وكانت النتيجة ٢٨٠ غابة. نستطيع أيضا تسمية النتيجة بالطريقة التالية
%%sql
-- We use 'AS' to give the result a name
-- نقوم باستخدام آس لإعطاء اسم للنتيجة
SELECT COUNT(*) AS number_of_forests_KSA from Forests_KSA;
* sqlite:///My_Forest_DB.db Done.

فلنقم الآن باستكشاف عدد الغابات الموجودة في منطقة نجران كالتالي
%%sql
-- We use WHERE to add a condition
-- نقوم باستخدام وير من أجل إضافة شرط
SELECT COUNT(*) as forests_in_Najran FROM Forests_KSA
WHERE State = 'نجران'
* sqlite:///My_Forest_DB.db Done.

لقد اكتشفنا أنه يوجد ١٠ غابات في منطقة نجران. والآن، فلنبحث عن ماهي أسماء الغابات العشرة في نجران عن طريق استخدام الكود التالي
%%sql
SELECT Forest_Name, plants_type from Forests_KSA
WHERE State = 'نجران'
* sqlite:///My_Forest_DB.db Done.

أيضا: إذا أردنا معرفة أسماء الأعمدة، ونوعها في جدول الغابات، نستطيع استخدام الكود التالي
%%sql
SELECT name,type,length(type) FROM PRAGMA_TABLE_INFO('Forests_KSA');
* sqlite:///My_Forest_DB.db Done.

الخطوة السادسة: إضافة جدول ثالث إلى قاعدة البيانات
Step Six: Add a Third Table to the Databaseقمنا في السابق بإضافة جداول بانداز إلى قاعدة البيانات. ولكن هذه الجداول أخذت جاهزة وتمت إضافتها بشكل مباشر. والآن سوف نقوم بصناعة جدول البيانات بأنفسنا عن طريق أكواد الـ SQL. الجدول الافتراضي سوف يكون الغابات التي زرتها
%%sql
-- We will use 'CREATE TABLE', then we will assign names of the columns and their types
-- سنقوم بصناعة الجدول وتحديد أسماء الأعمدة وأنواعهم
CREATE TABLE Forests_I_Visited (
Forest_index VARCHAR(4) ,
My_rating INT,
Visit_date DATE);
* sqlite:///My_Forest_DB.db Done.
[]
# Checking the current tables in the db - التحقق من الجداول الموجودة حاليا في قاعدة البيانات
%sql SELECT name FROM sqlite_master WHERE type='table'
* sqlite:///My_Forest_DB.db Done.

%%sql
SELECT * FROM Forests_I_Visited
* sqlite:///My_Forest_DB.db Done.
Forest_index My_rating Visit_date
نلاحظ أن تم إضافة الجدول إلى قاعدة البيانات، ولكن ما زال الجدول فارغ ولا يوجد فيه أية معلومات. فلنقم الآن بإضافة بعض الصفوف
%%sql
INSERT INTO Forests_I_Visited (Forest_index, My_rating, Visit_date)
VALUES
('F_3' ,10, '2020-10-23'),
('F_7' ,8, '2021-01-11'),
('F_11' ,9, '2022-06-26')
* sqlite:///My_Forest_DB.db 3 rows affected.
[]
للتحقق من شكل الجدول الآن
%%sql
SELECT * FROM Forests_I_Visited
* sqlite:///My_Forest_DB.db Done.

خطوة إضافية: ربط بين الجدول الثاني والثالث
Bonus Step: Relate Between the 2nd and 3rd Tableنلاحظ من الجدول الثالث الذي تمت صناعته أن هناك ثلاثة أعمدة. رقم الغابة، والتقييم لتجربة زيارة الغابة، وما هو تاريخ زيارة الغابة. ولكن ماذا لو أردنا معرفة ماهي أسماء تلك الغابات؟ هنا تكمن أهمية لغة الإس كيو إل وأنظمة قواعد البيانات في تمكينها لمهندسي وعلماء البيانات من ربط الجداول عن طريق علاقات منطقية. فنستطيع أخذ أرقام الغابات من الجدول الثالث (الغابات التي زرتها) Forests_I_Visited، واستخدامها في الجدول الثاني (غابات المملكة العربية السعودية) أو Forests_KSA لمعرفة ماهي أسماء تلك الغابات
%%sql
Select A.Forest_Name, B.My_rating FROM Forests_KSA AS A, Forests_I_Visited AS B
WHERE A.Forest_index = B.Forest_index
* sqlite:///My_Forest_DB.db Done.

إن أردنا التخلص من جدول معين. نستطيع استخدام الكود التالي
%%sql
DROP TABLE Forests_I_Visited;
* sqlite:///My_Forest_DB.db Done.
[]
# Checking the current tables in the db - التحقق من الجداول الموجودة حاليا في قاعدة البيانات
%sql SELECT name FROM sqlite_master WHERE type='table'
* sqlite:///My_Forest_DB.db Done.

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