الوحدة 1 · أساسيات Python للمحللين
القيم والأنواع والمتغيّرات
16 دقراءة 4 دتمرين Python
الدرس في لمحة
خزّن القيم في متغيّرات، وميّز بين الأعداد الصحيحة والعشرية والنصوص والقيم المنطقية و None، وحوّل نصًا مثل " $129.00" إلى رقم تستطيع الحساب به.
لا فيديو هنا، بل الشيء الحقيقي: درس مكتوب وأمثلة قابلة للتشغيل واختبار وتدريب.
يصلك بند طلب من ملف مُصدَّر فوضوي: سعر الوحدة فيه $129.00، والكمية 2، وطُبّق عليه كوبون خصم 15%. الإنسان يقرأ ذلك ويحسب إيراد هذا البند في ذهنه. أما Python فلا تستطيع ذلك بعد: بالنسبة إليها، "$129.00" قطعة من النص، ليست رقمًا أكثر من كلمة "skillet". أن تعرف نوع القيمة التي بين يديك هو أول مهارة في العمل على البيانات.
القيم والمتغيّرات
القيمة قطعة من البيانات: 2 أو 129.0 أو "Cast Iron Skillet" أو True. والمتغيّر اسم تربطه بقيمة باستخدام = لتستعملها لاحقًا.
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() تكشفه:
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" عند الترتيب ويرفض الجمع.
العمليات الحسابية
تدعم الأرقام العوامل التي تتوقّعها، إضافة إلى ثلاثة عوامل مهمة في التحليل:
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: دوال مرتبطة بالقيمة تستدعيها بنقطة. هذه هي التي ستستخدمها باستمرار:
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() تحوّل القيم، لكن فقط حين يكون للتحويل معنى:
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 من اليسار إلى اليمين، فتعمل كل واحدة على نتيجة التي قبلها:
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، وبها تجيب عن أسئلة نعم/لا حول بياناتك:
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()فقط بعد إزالة الرموز مثل$والمسافات.