Logo
تعلم الآلة (2026-2027) - عمليات Pandas المتقدمة وقراءة البيانات من مصادر متعددة

في نافذة الطباعة اختر «حفظ كملف PDF» كوجهة.

تعلم الآلة، الأسبوع 1

عمليات Pandas المتقدمة وقراءة البيانات من مصادر متعددة

تحميل البيانات من ملفات CSV والملفات النصية وExcel وHTML وJSON في DataFrame، ثم تصفيتها وتجميعها وتنظيفها وضمها وإعادة تشكيلها.

الأهداف

  • قراءة ملفات CSV والملفات النصية بالقيم الصحيحة لـsep وheader وnames وskiprows وskipfooter وnrows
  • قراءة أوراق (sheets) Excel وجداول HTML وملفات JSON في DataFrame
  • اختيار الصفوف باستخدام loc وقناع منطقي (boolean mask)، وتلخيص الأعمدة باستخدام describe
  • استخدام groupby وpivot_table للتجميع (aggregation)، وapply لإنشاء أعمدة جديدة
  • العثور على القيم المفقودة (missing values) ومعالجتها باستخدام isnull وfillna وdropna
  • ضم الجداول باستخدام concat وmerge وjoin

الأسبوع 1 من الخطة

موقع الدرس من المقرر

  • دفتران (notebooks): Advanced Pandas Operations وHow to read data from different text based (and non-text based) sources
  • البيانات: ملف متجر (superstore) فيه 9994 طلبا، وملفات صغيرة لأسعار المنازل بصيغ كثيرة
  • مرحلة المشروع (project milestone) هذا الأسبوع: كون فريقا عدد أعضائه 3 بفكرة مشروع، أو فريقا عدد أعضائه 2 بورقة بحثية

خطة الساعتين

الجزءما نفعلهالزمن
1قراءة البيانات من مصادر متعددة35 دقيقة
2الاختيار والتصفية والتجميع25 دقيقة
3القيم المفقودة وضم الجداول وإعادة التشكيل (reshaping)25 دقيقة
4الأخطاء الشائعة ومرحلة المشروع5 دقائق
5تمارين مع الإجابات، ثم الخلاصة30 دقيقة

الجزء 1

قراءة البيانات من مصادر متعددة

دالة واحدة لكل صيغة، وDataFrame واحد في النهاية

دالة واحدة لكل مصدر

المصدردالة pandasما تعيده
CSV، وCSV مضغوطpd.read_csvDataFrame واحد
نص آخر تفصل قيمه بفاصل (separator)pd.read_tableDataFrame واحد
مصنف (workbook) Excelpd.read_excelDataFrame واحد، أو قاموس (dict) من DataFrame
جداول في صفحة ويبpd.read_htmlقائمة من DataFrame
ملف JSONpd.read_jsonDataFrame واحد

اقرأ الملفات من المستودع

python
base = ("https://raw.githubusercontent.com/tirthajyoti/"
        "Machine-Learning-with-Python/master/Pandas%20and%20Numpy/"
        "Read_data_various_sources/")
df1 = pd.read_csv(base + "CSV_EX_1.csv")
df1.shape      # (5, 4)

ملف CSV سليم

CSV_EX_1.csv، خمسة منازل

text
Bedroom, Sq. foot, Locality, Price ($)
2, 1500, Good, 300000
3, 1300, Fair, 240000
3, 1900, Very good, 450000
3, 1850, Bad, 280000
2, 1640, Good, 310000
الملف الخام
python
df1 = pd.read_csv("CSV_EX_1.csv")
df1.shape      # (5, 4)
  • يصبح السطر 1 أسماء الأعمدة
  • ويصبح كل سطر آخر صفا واحدا
  • تصبح الأرقام من النوع int64، وتبقى الكلمات نصا

مثال محلول: ملف بلا سطر عناوين

يضم CSV_EX_2.csv المنازل الخمسة نفسها، دون سطر العناوين (header)

text
   2   1500        Good   300000
0  3   1300        Fair   240000
1  3   1900   Very good   450000
2  3   1850         Bad   280000
3  2   1640        Good   310000

الحل: header=None وnames

python
df2 = pd.read_csv("CSV_EX_2.csv",
    header=None,
    names=['Bedroom', 'Sq.ft',
           'Locality', 'Price($)'])
text
   Bedroom  Sq.ft    Locality  Price($)
0        2   1500        Good    300000
1        3   1300        Fair    240000
2        3   1900   Very good    450000
3        3   1850         Bad    280000
4        2   1640        Good    310000

مثال محلول: فواصل منقوطة بدلا من الفواصل

CSV_EX_3.csv: Bedroom; Sq. foot; Locality; Price ($)

  • قيمة df3.shape هي (5, 1): لا توجد فاصلة، لذا يبقى كل سطر قيمة نصية واحدة
  • الحل هو pd.read_csv("CSV_EX_3.csv", sep=';')، الذي يعطي (5, 4)

مثال محلول: أسطر زائدة في الأعلى والأسفل

CSV_EX_skipfooter.csv

text
Filetype: CSV,,,
,Info about some houses,,
Bedroom, Sq. foot, Locality, Price ($)
2,1500, Good,300000
...
2,1640, Good,310000
, This is the end of file,,
  • (8, 4)، والأعمدة Filetype: CSV وUnnamed: 1 وUnnamed: 2 وUnnamed: 3
  • الحل: skiprows=2, skipfooter=1, engine='python' يعطي الجدول السليم (5, 4)

الملفات الكبيرة: nrows والقراءة على دفعات

python
rows_in_a_chunk = 10
num_chunks = 5
colnames = pd.read_csv("Boston_housing.csv", nrows=2).columns
list_of_dataframe = []
for i in range(0, num_chunks*rows_in_a_chunk, rows_in_a_chunk):
    df = pd.read_csv("Boston_housing.csv", header=0, skiprows=i,
                     nrows=rows_in_a_chunk, names=colnames)
    list_of_dataframe.append(df)
  • يقرأ nrows=2 أول 2 من الصفوف فقط
  • تتخطى كل دورة عددا من الأسطر قدره i، ثم تقرأ 10 أسطر تالية
  • 5 دفعات (chunks)، شكل (shape) كل منها (10, 14)
  • وعند تكديسها معا تساوي أول 50 صفا في الملف (من 506 صفوف إجمالا)

مثال محلول: الأسطر الفارغة

في CSV_EX_blankline.csv سطران فارغان بين المنازل

الخيارالشكلما تراه
الافتراضي (True)(5, 4)الأسطر الفارغة متخطاة
skip_blank_lines=False(7, 4)صفان من NaN، وتصبح القيمة 2 هي 2.0

جربه: مستكشف read_csv

ملفات CSV المضغوطة

  • يرى pd.read_csv("CSV_EX_1.zip") الامتداد .zip فيفك الضغط أثناء القراءة
  • لا حاجة إلى وسيط إضافي: القيمة الافتراضية للوسيط compression هي 'infer'
  • النتيجة تساوي قراءة ملف CSV_EX_1.csv العادي

Excel: ورقة واحدة أو كل الأوراق

python
pd.read_excel("Housing_data.xlsx", sheet_name='Data_Tab_1')
الورقةالشكل
Data_Tab_1(9, 14)
Data_Tab_2(4, 14)
Data_Tab_3(16, 14)

يتوقع read_table علامات الجدولة

python
pd.read_table("Table_tab_separated.txt")   # (5, 4)
pd.read_table("Table_EX_1.txt")             # (5, 1)
pd.read_table("Table_EX_1.txt", sep=',')    # (5, 4)
  • الدالة read_table هي read_csv مع علامة الجدولة (tab) قيمة افتراضية للوسيط sep
  • يستخدم Table_tab_separated.txt علامات الجدولة: جدول سليم (5, 4)
  • يستخدم Table_EX_1.txt الفواصل: عمود واحد، (5, 1)، إلى أن تمرر sep=','

جداول من صفحة ويب

يعيد pd.read_html(url, header=0) قائمة فيها DataFrame لكل جدول HTML

RankNOCGoldTotal
1United States46121
2Great Britain2767
3China2670
4Russia‡1956
5Germany1742

قراءة ملفات JSON

text
[
  {"Bedroom": 2, "Sq. foot": 1500,
   "Locality": "Good", "Price ($)": 300000},
  ...
]
houses.json: المنازل الخمسة بصيغة JSON
python
dj = pd.read_json('houses.json')
dj[dj['Locality'] == 'Good']   # rows 0 and 4
  • يحول read_json قائمة من السجلات (records) إلى صفوف: الجدول (5, 4) نفسه
  • تأتي أسماء الأعمدة دون مسافات زائدة
  • وتعمل التصفية كما في أي DataFrame: الصفان 0 و4 قيمتهما Good

ملفات Stata وPDF

  • يقرأ pd.read_stata("rscfp2016.dta") ملف بيانات Stata بالطريقة نفسها
  • تستخرج read_pdf من الحزمة المستقلة tabula-py الجداول من صفحات PDF
  • وتعيد قائمة من DataFrame، وتشغل Java في الخلفية
  • يصعب قراءة أسماء الأعمدة من PDF، لذا يمرر الدفتر names عبر pandas_options

الجزء 2

الاختيار والتصفية والتجميع

الدفتر Advanced Pandas Operations، على طلبات المتجر

افتح الدفتر في Colab

text
https://colab.research.google.com/github/
tirthajyoti/Machine-Learning-with-Python/blob/master/
Pandas%20and%20Numpy/Advanced%20Pandas%20Operations.ipynb
اجمع الأسطر الثلاثة في عنوان واحد، أو اضغط رابط Colab في صفحة الدرس.
  • يقرأ الدفتر Sample - Superstore.xls من مجلده الخاص، وهذا المجلد غير موجود في Colab
  • تقرأ الشريحة التالية الملف نفسه من المستودع بدلا من ذلك

حمل طلبات المتجر

python
url = ("https://raw.githubusercontent.com/tirthajyoti/"
       "Machine-Learning-with-Python/master/"
       "Pandas%20and%20Numpy/Sample%20-%20Superstore.xls")
df = pd.read_excel(url)
df.shape                          # (9994, 21)
df.drop('Row ID', axis=1, inplace=True)
df.shape                          # (9994, 20)
  • صف لكل بند طلب (order line): التواريخ، وطريقة الشحن، والعميل، والمكان، والمنتج، وSales وQuantity وDiscount وProfit
  • في المصنف 4 أوراق: Orders وReturns وPeople وMissing

اختيار الصفوف والأعمدة باستخدام loc

يأخذ loc قائمة من تسميات الفهرس (index labels) وقائمة من أسماء الأعمدة

python
df.loc[[i for i in range(5, 10)],
       ['Customer ID', 'City', 'Postal Code', 'Sales']]
الصفCustomer IDCitySales
5BH-11710Los Angeles48.860
6BH-11710Los Angeles7.280
7BH-11710Los Angeles907.152
8BH-11710Los Angeles18.504
9BH-11710Los Angeles114.900

مثال محلول: describe على السجلات 100 إلى 199

python
df_subset = df.loc[[i for i in
    range(100, 200)], ['Sales', 'Profit']]
df_subset.describe()
المقياسSalesProfit
mean262.9570.348
std858.984170.745
min1.788-1359.992
50% (الوسيط)66.9609.654
max8159.952585.552

المخطط الصندوقي (boxplot) للسجلات الـ100 نفسها

مخطط صندوقي للعمودين Sales وProfit للسجلات 100 إلى 199، والمحور y مقطوع عند 0 و500
  • يرسم df_subset.plot.box() صندوقا لكل عمود
  • يمتد الصندوق على النصف الأوسط: Sales من 21.3 إلى 177.1
  • يكبر plt.ylim(0, 500) الرسم، فتقع خارج المخطط 12 قيمة مبيعات و1 من قيم الربح فوق 500، و20 قيمة ربح سالبة
python
df_subset.plot.box()
plt.ylim(0, 500)
plt.grid(True)

مثال محلول: قناع منطقي

df_subset = df.loc[[i for i in range(10)], ['Ship Mode', 'State', 'Sales']]

text
        Ship Mode       State     Sales
0    Second Class    Kentucky  261.9600
1    Second Class    Kentucky  731.9400
2    Second Class  California   14.6200
3  Standard Class     Florida  957.5775
4  Standard Class     Florida   22.3680
5  Standard Class  California   48.8600
6  Standard Class  California    7.2800
7  Standard Class  California  907.1520
8  Standard Class  California   18.5040
9  Standard Class  California  114.9000

اجمع الشروط باستخدام & و|

python
df_subset[(df_subset['State'] != 'California') & (df_subset['Sales'] > 100)]
  • الصفوف 0 و1 و3: فالصفان 7 و9 في California
  • يعني & الشرطين معا، ويعني | أحدهما على الأقل، ويحتاج كل شرط إلى قوسيه الخاصين

groupby: التقسيم والتطبيق والدمج

مخطط تدفق: التقسيم ثم التطبيق ثم الدمج.

التقسيم

الصفوف حسب State

التطبيق

متوسط كل مجموعة

الدمج

صف لكل State

python
byState = df_subset.groupby('State')
byState.mean(numeric_only=True)

مثال محلول: متوسط المبيعات لكل ولاية

mF = 957.5775 + 22.3682 = 489.97275
mK = 261.96 + 731.942 = 496.95

groupby في الإصدارات الحالية من pandas

كود الدفتراليوماكتب بدلا منه
byState.mean()TypeError: لا يمكن حساب متوسط الأعمدة النصيةbyState.mean(numeric_only=True)
byState.sum()يلصق نصوص Ship Mode بعضها ببعضbyState.sum(numeric_only=True)
byState['Sales'].mean()يعملالشيء نفسه، في صورة Series

جربها: عمليات DataFrame خطوة بخطوة

الجزء 3

القيم المفقودة وضم الجداول وإعادة التشكيل

الورقة Missing ومقتطفات صغيرة من الطلبات

اعثر على القيم المفقودة

python
df_missing = pd.read_excel(url, sheet_name='Missing')
for c in df_missing.columns:
    miss = df_missing[c].isnull().sum()
    if miss > 0:
        print('{} has {} missing value(s)'.format(c, miss))
    else:
        print('{} has NO missing value!'.format(c))
text
Customer has 1 missing value(s)
Product has 2 missing value(s)
Sales has 1 missing value(s)
Quantity has 1 missing value(s)
Discount has NO missing value!
Profit has 1 missing value(s)
11 صفا، 6 أعمدة

مثال محلول: ملء قيمة البيع المفقودة

قيم Sales في الصفوف 2 إلى 4 هي 8.560 وNaN و22.720، ومجموع القيم الـ10 الأخرى 3015.52

  • ينسخ ffill() القيمة التي فوقها: 8.56
  • ينسخ bfill() القيمة التي تحتها: 22.72
μ = 3015.5210 = 301.552

مثال محلول: dropna

الاستدعاءما يبقى
dropna(axis=0)؟
dropna(axis=1)؟
dropna(axis=1, thresh=10)؟
  • axis=0: 6 صفوف بلا قيم مفقودة (1، 2، 4، 6، 9، 10)
  • axis=1: Discount وحده، العمود الكامل الوحيد
  • thresh=10: الأعمدة التي فيها 10 قيم على الأقل، لذا لا يحذف إلا Product

كشف القيم الشاذة (outliers) باستخدام مخطط صندوقي

مخطط صندوقي للعمودين Sales وProfit لـ50 طلبا مختارة عشوائيا، وفيه قيمتا مبيعات سالبتان مزروعتان عند -1000 و-500
  • 50 طلبا عشوائيا، زرعت فيها قيمتا مبيعات خاطئتان: -1000 و-500
  • لا يمكن أن تكون المبيعات سالبة أبدا: النقطتان البعيدتان أسفل الصندوق هما الخطآن

مثال محلول: concat

ثلاثة جداول في كل منها 2 من الطلبات، بالأعمدة Customer ID وState وSales وProfit، والصفوف 0 إلى 5

  • يكدس axis=0 الصفوف: (6, 4)
  • يضع axis=1 الجداول جنبا إلى جنب، مطابقة حسب الفهرس: (6, 12)
  • لا توجد تسمية فهرس مشتركة، لذا يترك axis=1 48 من الخلايا الـ72 بقيمة NaN

مثال محلول: merge على مفتاح

df_1 وdf_2: الصفوف 0 إلى 3، والمفاتيح (keys) CG-12520 مرتين، وDV-13045، وSO-20335

python
pd.merge(df_1, df_2, on='Customer ID', how='inner')
2 × 2 + 1 + 1 = 6

inner وleft وright وouter

df_1 مع df_3 (الصفوف 2 إلى 5: DV-13045، وSO-20335 مرتين، وBH-11710)

howما يبقيهالصفوف
innerالمفاتيح الموجودة في الجدولين3
leftكل صفوف df_15
rightكل صفوف df_34
outerكل المفاتيح، مرتبة6

pivot_table: المتوسطات لكل منطقة

python
df.pivot_table(values=['Sales', 'Quantity', 'Profit'], index=['Region'], aggfunc='mean')
RegionProfitQuantitySales
Central17.093.78215.77
East32.143.73238.34
South28.863.83241.80
West33.853.83226.49

value_counts: العد السريع

python
df['Ship Mode'].value_counts()
Ship Modeالطلبات
Standard Class5968
Second Class1945
First Class1538
Same Day543

sort_values: ترتيب الصفوف

python
df_subset.sort_values(by='Sales')
df_subset.sort_values(by=['State', 'Sales'])
  • حسب Sales: يأتي الصف 6 (7.28) أولا والصف 3 (957.5775) أخيرا
  • ويحتفظ كل صف بتسمية فهرسه
  • حسب ['State', 'Sales']: الترتيب حسب State أولا، ثم يفصل Sales بين الصفوف المتساوية
  • لذا تأتي صفوف California الستة أولا، من 7.28 إلى 907.152

مثال محلول: تطبيق دالة باستخدام apply

categorize_sales: القيمة Low لما هو أقل من 50، وMedium لما هو أقل من 200، وHigh لما سوى ذلك

python
def categorize_sales(price):
    if price < 50:
        return "Low"
    elif price < 200:
        return "Medium"
    else:
        return "High"

df['Sales'].apply(categorize_sales)
  • High وLow وMedium
  • على الطلبات الـ9994 كلها: Low 4849، وHigh 2579، وMedium 2566

الجزء 4

الأخطاء الشائعة ومرحلة المشروع

خمس دقائق قبل التمارين

قبل التمارين

الأخطاء الشائعة

  • عمود واحد بعد القراءة: قيمة sep لا تطابق الملف
  • فقدان الصف الأول: الملف بلا سطر عناوين، لذا استخدم header=None
  • قراءة اسم ملف محلي في Colab: استخدم عنوان المستودع
  • نسيان القوسين حول كل شرط مربوط بـ& أو |
  • استدعاءات الدفتر القديمة: fillna(method=)، وmean() على الأعمدة النصية، والإسناد المتسلسل (chained assignment)
  • الضم على مفتاح يتكرر دون التحقق من عدد الصفوف

مشروع فريقك

مرحلة المشروع: فريقك

  1. كون فريقا عدد أعضائه 3 بفكرة مشروع، أو فريقا عدد أعضائه 2 بورقة بحثية
  2. اكتب السؤال الذي يجيب عنه مشروعك، أو الورقة التي ستدرسها
  3. ابحث عن مجموعة البيانات (dataset) وحملها بدالة القراءة التي تناسب صيغتها
  4. افحص shape وأسماء الأعمدة وisnull().sum() قبل أي شيء آخر

الجزء 5

التمارين: دورك

نحو 30 دقيقة، وتأتي الإجابة بعد كل مهمة

نحو 5 دقائق

التمرين 1: ملف تصدير غير مرتب

text
Exported by the lab system
Section 3
ID;Name;Quiz;Lab
101;A1;7;9
102;B2;5;8
103;C3;9;10
104;D4;6;7
End of export
p1_scores.txt
python
pd.read_csv('p1_scores.txt', sep=';', skiprows=2,
            skipfooter=1, engine='python')

نحو 8 دقائق

التمرين 2: القناع وgroupby وapply

text
  Region       Ship Mode  Sales
0   East     First Class  120.0
1   West  Standard Class   45.5
2   East  Standard Class  310.0
3  South    Second Class   80.0
4   West     First Class  220.0
5  South  Standard Class   15.0
6   East    Second Class   95.0
7   West  Standard Class   60.5
  1. الصفوف التي تحقق الشرطين معا: Sales أكبر من 100 وRegion ليست West
  2. مجموع Sales ومتوسطه لكل Region
  3. أعداد فئات categorize_sales
  • الصفان 0 و2
  • المجاميع: East 525.0، وSouth 95.0، وWest 326.0
  • المتوسطات: East 175.0، وSouth 47.5، وWest 108.666667
  • Medium 4، وLow 2، وHigh 2

نحو 5 دقائق

التمرين 3: القيم المفقودة

Qty = 4, NaN, 6, NaN, 10 وPrice = 2.5, 3.0, NaN, 4.0, 5.5 وItem = pen, ink, None, pad, tape

  1. ffill() وbfill() للعمود Qty
  2. Qty بعد ملئه بمتوسطه
  3. ما الصفوف التي تبقى بعد dropna(axis=0)؟ وما الأعمدة التي تبقى بعد dropna(axis=1, thresh=4)؟
  • ffill: 4, 4, 6, 6, 10؛ وbfill: 4, 6, 6, 10, 10
  • المتوسط 6.666667، لذا يصبح Qty: 4, 6.666667, 6, 6.666667, 10
  • الصفان 0 و4، والعمودان Price وItem (في Qty 3 قيم فقط)

نحو 5 دقائق

التمرين 4: عد صفوف الضم

left: Key = K1, K2, K2, K3 مع A = 1, 2, 3, 4. وright: Key = K2, K3, K3, K4 مع B = 10, 20, 30, 40

howالصفوفالسبب
inner4K2: 2 × 1، وK3: 1 × 2
left5صفوف inner الـ4 + K1 مع NaN
right5صفوف inner الـ4 + K4 مع NaN
outer6صفوف inner الـ4 + K1 + K4

نحو 7 دقائق

التمرين 5: في Colab، على بيانات المتجر

  1. كم طلبا من Texas؟
  2. مجموع Sales وProfit لكل Category باستخدام groupby
  3. كم طلبا خسر مالا (Profit أقل من 0)؟
  4. مجموع Profit لكل Region باستخدام pivot_table: ما المنطقة الأدنى؟

الإجابات

التمرين 5: الإجابات

السؤالالإجابة
طلبات Texas985
Sales لكل CategoryFurniture 741999.80، وOffice Supplies 719047.03، وTechnology 836154.03
Profit لكل CategoryFurniture 18451.27، وOffice Supplies 122490.80، وTechnology 145454.95
الطلبات الخاسرة1871
المنطقة الأدنى في ProfitCentral، 39706.36

الخلاصة

  1. دالة قراءة لكل صيغة: read_csv وread_table وread_excel وread_html وread_json
  2. افحص الشكل وأسماء الأعمدة بعد القراءة مباشرة، فهي تكشف قيمة خاطئة لـsep أو header
  3. استخدم القناع المنطقي للتصفية، وgroupby وpivot_table للتلخيص
  4. اعثر على القيم المفقودة باستخدام isnull، ثم قرر: الملء أم الحذف
  5. استخدم concat أو merge أو join لضم الجداول، ثم عد الصفوف بعدها

افتح هذا الدرس

Mahmoud Abasعمليات Pandas المتقدمة وقراءة البيانات من مصادر متعددة