طَبِّقْهاتعلّم المبدأ، وطبّقه بيدكمقرر 244 · علم البيانات للويب
الدرس 6 · الوحدة 3: تحليل البيانات وتقنيات التنبؤ على الويب

الأعمدة المحسوبة والتحويلات

البيانات لا تعطيك كل المقاييس؛ اشتقّ ما تحتاجه بعمودٍ جديد. ⏱ نحو 40 دقيقة.

بعد هذا الدرس ستستطيع أن:
  • تنشئ أعمدة محسوبة بعمليات متجهية.
  • تصنّف الأرقام إلى فئات بـ np.where و pd.cut.
  • تطبّق دوال النصّ والدوال المخصّصة على الأعمدة.
  • تتجنّب الحلقات حيث يكفي سطر متجهي.

١عمود جديد من أعمدة قائمة

التحليل لا يكتفي بما في البيانات؛ يشتقّ منها مقاييس جديدة. في Pandas تنشئ عمودًا بإسناده مباشرة، والعملية تُطبَّق على كل صفّ دفعةً واحدة:

main.py
import pandas as pddf = pd.DataFrame({    "page": ["home", "products", "cart", "checkout"],    "visits": [1200, 860, 430, 210],    "orders": [40, 95, 60, 150],    "seconds": [12, 45, 30, 90],})# معدّل التحويل = الطلبات ÷ الزياراتdf["conversion"] = df["orders"] / df["visits"]# الزمن بالدقائقdf["minutes"] = df["seconds"] / 60print(df[["page", "conversion", "minutes"]].round(3))
Shell×
>>> %Run main.py
page conversion minutes
0 home 0.033 0.20
1 products 0.110 0.75
2 cart 0.140 0.50
3 checkout 0.714 1.50
>>>

لا حلقة ولا عدّاد: df["orders"] / df["visits"] تقسم كل صفّ على نظيره تلقائيًّا (الحساب المتجهي من الدرس 2).

٢التصنيف بشرط: عمود فئوي

كثيرًا ما نحوّل رقمًا إلى فئة لتسهيل القراءة. أداتان: np.where لشرطٍ ثنائي، وpd.cut لشرائح:

main.py
import pandas as pddf = pd.DataFrame({    "page": ["home", "products", "cart", "checkout"],    "visits": [1200, 860, 430, 210],    "orders": [40, 95, 60, 150],    "seconds": [12, 45, 30, 90],})import numpy as npdf["conversion"] = df["orders"] / df["visits"] # تصنيف ثنائي: جيد أم ضعيفdf["grade"] = np.where(df["conversion"] >= 0.1, "جيد", "ضعيف") # شرائح لزمن البقاءdf["engagement"] = pd.cut(df["seconds"], bins=[0, 20, 60, 999],                          labels=["منخفض", "متوسط", "عالٍ"])print(df[["page", "grade", "engagement"]])
Shell×
>>> %Run main.py
page grade engagement
0 home ضعيف منخفض
1 products جيد متوسط
2 cart جيد متوسط
3 checkout جيد عالٍ
>>>

٣تطبيق دالة على عمود

حين لا يكفي التعبير المباشر، نطبّق دالة على كل قيمة بـ map (للـ Series) أو تعبيرٍ نصّي بـ .str:

main.py
import pandas as pddf = pd.DataFrame({    "page": ["home", "products", "cart", "checkout"],    "visits": [1200, 860, 430, 210],    "orders": [40, 95, 60, 150],    "seconds": [12, 45, 30, 90],})# توحيد النصّ: أحرف كبيرة لأسماء الصفحاتdf["label"] = df["page"].str.upper() # دالة مخصّصة: وسم الصفحات عالية الزياراتdf["tag"] = df["visits"].map(lambda v: "⭐" if v > 800 else "")print(df[["page", "label", "visits", "tag"]])
Shell×
>>> %Run main.py
page label visits tag
0 home HOME 1200 ⭐
1 products PRODUCTS 860 ⭐
2 cart CART 430
3 checkout CHECKOUT 210
>>>

توقّع وتحقّق

لإنشاء عمود نسبة من عمودين:

لتصنيف ثنائي بشرط:

لتقسيم قيم رقمية إلى شرائح مسمّاة:

لتطبيق دالة نصّية على عمود:

الخلاصة

تحدٍّ برمجي: اشتقّ مقياسًا

متوسط

أنشئ عمود معدّل التحويل (الطلبات÷الزيارات)، ثم اطبع عدد الصفحات التي تجاوز تحويلها 0.1، واسم أعلاها تحويلًا.

المطلوب:
  • أنشئ عمود conversion.
  • اطبع عدد الصفحات بتحويل > 0.1، ثم اسم أعلاها.

ابدأ من هذا الكود، واضغط ▶ شغّل هنا لتكتب حلّك وتجرّبه مباشرة:

main.py
import pandas as pddf = pd.DataFrame({    "page": ["home", "products", "cart", "checkout"],    "visits": [1200, 860, 430, 210],    "orders": [40, 95, 60, 150],    "seconds": [12, 45, 30, 90],})# أنشئ conversion ثم اطبع العدد (>0.1) واسم الأعلى
المطلوب×
3
checkout
💡 تلميح 1
العمود: df["conversion"] = df["orders"] / df["visits"].
💡 تلميح 2
العدّ: (df["conversion"] > 0.1).sum()؛ والأعلى بـ idxmax().

حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.

main.py
import pandas as pddf = pd.DataFrame({    "page": ["home", "products", "cart", "checkout"],    "visits": [1200, 860, 430, 210],    "orders": [40, 95, 60, 150],    "seconds": [12, 45, 30, 90],})df["conversion"] = df["orders"] / df["visits"]print(int((df["conversion"] > 0.1).sum()))print(df.loc[df["conversion"].idxmax(), "page"])
انتقل إلى تقييم الدرساختيار من متعدد، وصح وخطأ، وأكمل الفراغ، وتتبّع الناتج.ابدأ التقييم ←

📝 معلم؟ أرسل ملاحظة للمؤلف عن هذا الدرس