EduFlow
Python لتحليل البيانات
⁦0%⁩

الوحدة 1 · أساسيات Python للمحللين

القيم والأنواع والمتغيّرات

16 دقراءة 4 دتمرين Python

الدرس في لمحة

خزّن القيم في متغيّرات، وميّز بين الأعداد الصحيحة والعشرية والنصوص والقيم المنطقية و None، وحوّل نصًا مثل " $129.00" إلى رقم تستطيع الحساب به.

  1. 1القيم والمتغيّرات
  2. 2لكل قيمة نوع
  3. 3النص سلسلة من الحروف
  4. 4التحويل بين الأنواع
  5. 5القيم المنطقية والمقارنات

لا فيديو هنا، بل الشيء الحقيقي: درس مكتوب وأمثلة قابلة للتشغيل واختبار وتدريب.

يصلك بند طلب من ملف مُصدَّر فوضوي: سعر الوحدة فيه $129.00، والكمية 2، وطُبّق عليه كوبون خصم 15%. الإنسان يقرأ ذلك ويحسب إيراد هذا البند في ذهنه. أما Python فلا تستطيع ذلك بعد: بالنسبة إليها، "$129.00" قطعة من النص، ليست رقمًا أكثر من كلمة "skillet". أن تعرف نوع القيمة التي بين يديك هو أول مهارة في العمل على البيانات.

القيم والمتغيّرات

القيمة قطعة من البيانات: 2 أو 129.0 أو "Cast Iron Skillet" أو True. والمتغيّر اسم تربطه بقيمة باستخدام = لتستعملها لاحقًا.

Python
product = "Cast Iron Skillet 26cm"
unit_price = 39
quantity = 2
line_total = unit_price * quantity
print(product, line_total)

اقرأ line_total = unit_price * quantity من اليمين إلى اليسار: تحسب Python الطرف الأيمن أولًا، ثم تجعل الاسم الذي على اليسار يشير إلى النتيجة. أسماء المتغيّرات كلمات بأحرف صغيرة تربط بينها شرطة سفلية (unit_price، لا UnitPrice ولا unitprice)؛ يُسمّى هذا العُرف snake_case، وكل كود Python ستقرؤه يلتزم به.

لكل قيمة نوع

النوع يحدّد ما يمكنك فعله بالقيمة، والدالة type() تكشفه:

Python
print(type(2))            # int: whole numbers
print(type(129.0))        # float: numbers with a decimal point
print(type("129.00"))     # str: text, in single or double quotes
print(type(True))         # bool: True or False
print(type(None))         # NoneType: "no value here"

لاحظ أن "129.00" من النوع str. علامات التنصيص تصنع نصًا، حتى لو بدت الحروف التي بداخلها أرقامًا. هذه الحقيقة وحدها تفسّر عائلة كاملة من أخطاء البيانات: عمود يبدو رقميًا لكنه قُرئ نصًا، فيضع "100" قبل "20" عند الترتيب ويرفض الجمع.

العمليات الحسابية

تدعم الأرقام العوامل التي تتوقّعها، إضافة إلى ثلاثة عوامل مهمة في التحليل:

Python
print(10 / 4)    # 2.5  true division, always a float
print(10 // 4)   # 2    floor division: whole boxes of 4
print(10 % 4)    # 2    remainder: items left over
print(2 ** 3)    # 8    power
print(0.1 + 0.2) # 0.30000000000000004

السطر الأخير ليس خطأ في Python. الحواسيب تخزّن الأعداد العشرية بالنظام الثنائي، لذلك تُخزَّن معظم الكسور العشرية كتقريب صغير جدًا. مع المبالغ المالية تقرّب في النهاية باستخدام round(value, 2)، ولا تقارن أبدًا بين عددين عشريين بـ == بعد عملية حسابية إلا إذا قرّبت الاثنين. سيعود القسم 4 إلى هذه النقطة حين لا تتطابق المجاميع تمامًا.

وهناك مفاجأة أخرى مختبئة في round() نفسها. تقرّب Python الأنصاف التامة إلى أقرب رقم زوجي، فتكون round(0.5) مساوية لـ 0 وround(2.5) مساوية لـ 2، كما أن قيمة مثل 2.675 تُخزَّن أقل قليلًا مما تبدو، فتعطي round(2.675, 2) النتيجة 2.67. في التحليل وإعداد التقارير لا يهم هذا أبدًا. أما في الفواتير، حيث يجب أن يتبع كل سنت قاعدة محاسبية، فتوجد الوحدة decimal في Python؛ لن تحتاجها في هذه الدورة، لكنك الآن تعرف أين تبحث حين يسألك زميل من قسم المالية.

النص سلسلة من الحروف

تأتي النصوص (strings) مع methods: دوال مرتبطة بالقيمة تستدعيها بنقطة. هذه هي التي ستستخدمها باستمرار:

Python
raw = "  united KINGDOM "
print(raw.strip())                 # remove spaces at both ends
print(raw.strip().title())         # "United Kingdom"
print(raw.upper())                 # all capitals
print("$129.00".replace("$", ""))  # swap one substring for another
print(len("Cartwheel"))            # number of characters: 9

كل واحدة من هذه تعيد نصًا جديدًا. النصوص غير قابلة للتعديل (immutable): raw.strip() لا تغيّر raw. إذا أردت الاحتفاظ بالنسخة المنظّفة، فأسندها إلى متغيّر: country = raw.strip().title().

التحويل بين الأنواع

الدوال int() وfloat() وstr() تحوّل القيم، لكن فقط حين يكون للتحويل معنى:

Python
quantity = int("2")
price = float("129.00")
label = "Qty: " + str(quantity)
print(quantity * price, label)

تفشل float("$129.00") برسالة ValueError: could not convert string to float: '$129.00'. الحل أن تنظّف أولًا ثم تحوّل. تستطيع تسلسل الـ methods من اليسار إلى اليمين، فتعمل كل واحدة على نتيجة التي قبلها:

Python
price_text = " $129.00"
price = float(price_text.strip().replace("$", ""))
discount = 0.15
line_revenue = round(2 * price * (1 - discount), 2)
print(price, line_revenue)

هذه هي معادلة الإيراد التي تستخدمها Cartwheel لكل بند في الطلب: الكمية مضروبة في سعر الوحدة مضروبًا في واحد ناقص الخصم. ستطبّقها على آلاف الصفوف دفعة واحدة في القسم 2؛ وهنا تراها على صف واحد.

القيم المنطقية والمقارنات

تنتج المقارنات True أو False، وبها تجيب عن أسئلة نعم/لا حول بياناتك:

Python
line_revenue = 219.3
print(line_revenue >= 200)       # True
print(line_revenue == 219.3)     # True: equal values
print("web" != "mobile_app")     # True: not equal

علامة = واحدة للإسناد؛ وعلامتان == للمقارنة. الخلط بينهما أشهر خطأ كتابي عند المبرمجين الجدد، وتساعدك Python برفض if x = 3: كخطأ في الصياغة (syntax error).

أما None فقيمة مستقلة تعني “لا شيء هنا”. كود كوبون مفقود أو درجة رضا غير معروفة تكون None في Python العادية. ولـ pandas علاماتها الخاصة للبيانات المفقودة، والقسم 3 مخصّص للتعامل معها بعناية.

التمرين التالي يحوّل صفًا واحدًا من الملف الفوضوي إلى أرقام حقيقية. وفي الدرس القادم تخزّن قيمًا كثيرة دفعة واحدة في القوائم والقواميس.

أهم النقاط

  • المتغيّر اسم يشير إلى قيمة؛ = تُسند القيمة، و== تقارن.
  • لكل قيمة نوع، والدالة type() تخبرك به؛ ومعظم الأخطاء في العمل على البيانات سببها قيمة نوعها غير الذي توقّعته.
  • العامل / يعيد دائمًا عددًا عشريًا (float)، و// يُسقط الباقي، و% يعطيك الباقي.
  • الـ methods الخاصة بالنصوص مثل strip() وreplace() تعيد نصًا جديدًا، ولا تغيّر النص الأصلي أبدًا.
  • حوّل النص إلى رقم باستخدام int() وfloat() فقط بعد إزالة الرموز مثل $ والمسافات.

قراءات إضافية

تحقّق من فهمك

4 أسئلة

السؤال 1 من 4

ماذا يطبع هذا الكود؟

Python
price = "39"
print(price * 2)
السؤال 2 من 4

أيّ سطر يحوّل "$1,250.00" إلى العدد العشري 1250.0؟

السؤال 3 من 4

ما قيمة 10 / 4 وقيمة 10 // 4؟

السؤال 4 من 4

كود الكوبون الخاص بأحد العملاء غير معروف. أيّ قيمة تمثّل ذلك بأفضل شكل في Python؟

تدريب

تمرين Python

حوّل صفًا فوضويًا إلى أرقام

يعطيك صف من الملف المُصدَّر الفوضوي القيم price_text = " $129.00" وquantity_text = "2" وdiscount = 0.15. أنشئ price (عددًا عشريًا float)، وquantity (عددًا صحيحًا int)، وline_revenue (الكمية × السعر × (1 − الخصم)، مقرّبًا إلى منزلتين عشريتين)، وis_large (قيمة منطقية تساوي True حين يكون line_revenue مساويًا لـ 200 أو أكثر). احسب من المتغيّرات، ولا تكتب الإجابات بيدك.

# One row from Cartwheel's messy export, exactly as it arrived
price_text = " $129.00"
quantity_text = "2"
discount = 0.15

# 1. Turn price_text into a float
price = None

# 2. Turn quantity_text into an int
quantity = None

# 3. Line revenue = quantity * price * (1 - discount), rounded to 2 decimals
line_revenue = None

# 4. True when line_revenue is 200 or more
is_large = None
جارٍ تحميل المحرّر…

Ctrl/⌘ + Enter للتشغيل · يعمل في بيئة معزولة داخل متصفّحك. لا شيء يغادر جهازك.

(لا مخرجات)

الفحوص

  • price هو العدد العشري 129.0
  • quantity هو العدد الصحيح 2
  • line_revenue يساوي 219.3
  • is_large يساوي True