الأعمدة المحسوبة والتحويلات
البيانات لا تعطيك كل المقاييس؛ اشتقّ ما تحتاجه بعمودٍ جديد. ⏱ نحو 40 دقيقة.
- تنشئ أعمدة محسوبة بعمليات متجهية.
- تصنّف الأرقام إلى فئات بـ
np.whereوpd.cut. - تطبّق دوال النصّ والدوال المخصّصة على الأعمدة.
- تتجنّب الحلقات حيث يكفي سطر متجهي.
١عمود جديد من أعمدة قائمة
التحليل لا يكتفي بما في البيانات؛ يشتقّ منها مقاييس جديدة. في Pandas تنشئ عمودًا بإسناده مباشرة، والعملية تُطبَّق على كل صفّ دفعةً واحدة:
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))
لا حلقة ولا عدّاد: df["orders"] / df["visits"] تقسم كل صفّ على نظيره تلقائيًّا (الحساب المتجهي من الدرس 2).
٢التصنيف بشرط: عمود فئوي
كثيرًا ما نحوّل رقمًا إلى فئة لتسهيل القراءة. أداتان: np.where لشرطٍ ثنائي، وpd.cut لشرائح:
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"]])
٣تطبيق دالة على عمود
حين لا يكفي التعبير المباشر، نطبّق دالة على كل قيمة بـ map (للـ Series) أو تعبيرٍ نصّي بـ .str:
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"]])
توقّع وتحقّق
لإنشاء عمود نسبة من عمودين:
لتصنيف ثنائي بشرط:
لتقسيم قيم رقمية إلى شرائح مسمّاة:
لتطبيق دالة نصّية على عمود:
الخلاصة
- أنشئ عمودًا بإسناد تعبيرٍ متجهيّ؛ يُطبَّق على كل الصفوف دفعةً.
np.whereللتصنيف الثنائي، وpd.cutلشرائح مسمّاة من قيم رقمية.df["c"].str.* لدوال النصّ، وmapلمنطقٍ مخصّص لكل عنصر.- الاشتقاق يحوّل البيانات الخام إلى مقاييس قابلة للقرار (تحويل، تفاعل…).
تحدٍّ برمجي: اشتقّ مقياسًا
متوسطأنشئ عمود معدّل التحويل (الطلبات÷الزيارات)، ثم اطبع عدد الصفحات التي تجاوز تحويلها 0.1، واسم أعلاها تحويلًا.
- أنشئ عمود
conversion. - اطبع عدد الصفحات بتحويل > 0.1، ثم اسم أعلاها.
ابدأ من هذا الكود، واضغط ▶ شغّل هنا لتكتب حلّك وتجرّبه مباشرة:
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) واسم الأعلى
💡 تلميح 1
df["conversion"] = df["orders"] / df["visits"].💡 تلميح 2
(df["conversion"] > 0.1).sum()؛ والأعلى بـ idxmax().حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.
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"])