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

السلاسل الزمنية واتجاهات الزيارات

الزيارات عبر الزمن: كيف نرى الاتجاه، ونعرف ساعات الذروة وأيامها؟ ⏱ نحو 45 دقيقة.

بعد هذا الدرس ستستطيع أن:
  • تحوّل التواريخ النصّية إلى نوع زمنيّ.
  • تستخرج مكوّنات الوقت بـ .dt.
  • تجمّع البيانات زمنيًّا بـ resample.
  • ترى الاتجاه بالرسم والمتوسط المتحرّك.

١الوقت بُعدٌ لا نصّ

بيانات الويب مؤرّخة: متى وقعت الزيارة؟ ما دام التاريخ نصًّا، لا يمكنك حساب «لكل يوم» أو «حسب الساعة». الخطوة الأولى دائمًا: تحويله إلى نوع زمنيّ بـ pd.to_datetime:

main.py
import pandas as pddf = pd.DataFrame({    "ts": ["2025-03-01 09:12", "2025-03-01 14:40", "2025-03-02 10:05",           "2025-03-02 22:30", "2025-03-03 08:00", "2025-03-03 19:45",           "2025-03-03 23:10", "2025-03-04 11:20"],    "visits": [120, 90, 200, 60, 150, 170, 40, 210],})df["ts"] = pd.to_datetime(df["ts"])print(df.dtypes)       # ts صار datetime64print("اليوم:", df["ts"].dt.date.iloc[0])print("الساعة:", df["ts"].dt.hour.iloc[0])print("اسم اليوم:", df["ts"].dt.day_name().iloc[0])
Shell×
>>> %Run main.py
ts datetime64[us]
visits int64
dtype: object
اليوم: 2025-03-01
الساعة: 9
اسم اليوم: Saturday
>>>

بعد التحويل يفتح .dt بابًا لكل مكوّنات الوقت: اليوم، الساعة، اسم اليوم، الأسبوع… تستخرجها كأعمدةٍ للتحليل.

٢التجميع الزمني: resample

لتلخيص البيانات بفترات (يومي، أسبوعي)، نجعل الوقت فهرسًا ثم نستخدم resample — مثل groupby لكن على الزمن:

main.py
import pandas as pddf = pd.DataFrame({    "ts": ["2025-03-01 09:12", "2025-03-01 14:40", "2025-03-02 10:05",           "2025-03-02 22:30", "2025-03-03 08:00", "2025-03-03 19:45",           "2025-03-03 23:10", "2025-03-04 11:20"],    "visits": [120, 90, 200, 60, 150, 170, 40, 210],})df["ts"] = pd.to_datetime(df["ts"])daily = df.set_index("ts").resample("D")["visits"].sum()print(daily)print("---")print("أعلى يوم:", daily.idxmax().date(), "بـ", daily.max(), "زيارة")
Shell×
>>> %Run main.py
ts
2025-03-01 210
2025-03-02 260
2025-03-03 360
2025-03-04 210
Freq: D, Name: visits, dtype: int64
---
أعلى يوم: 2025-03-03 بـ 360 زيارة
>>>

resample("D") يجمّع يوميًّا، و"W" أسبوعيًّا، و"h" بالساعة. هكذا ترى الاتجاه عبر الزمن لا مجرد مجموعٍ أعمى.

٣رؤية الاتجاه بالرسم

السلاسل الزمنية تُفهَم بالعين. ارسم الزيارات اليومية ثم شغّل:

main.py
import pandas as pddf = pd.DataFrame({    "ts": ["2025-03-01 09:12", "2025-03-01 14:40", "2025-03-02 10:05",           "2025-03-02 22:30", "2025-03-03 08:00", "2025-03-03 19:45",           "2025-03-03 23:10", "2025-03-04 11:20"],    "visits": [120, 90, 200, 60, 150, 170, 40, 210],})df["ts"] = pd.to_datetime(df["ts"])import matplotlib.pyplot as pltdaily = df.set_index("ts").resample("D")["visits"].sum() plt.figure(figsize=(5, 3))plt.plot(daily.index, daily.values, marker="o", color="#0F766E")plt.title("Daily visits")plt.ylabel("visits")plt.xticks(rotation=45)plt.tight_layout()
Shell×
>>> %Run main.py
>>>

توقّع وتحقّق

لتحويل عمود تاريخ نصّي:

لاستخراج الساعة من عمود زمنيّ:

للتجميع الزمني (يومي/أسبوعي):

resample("D") يجمّع:

الخلاصة

تحدٍّ برمجي: اتجاه يوميّ

متقدم

جمّع الزيارات يوميًّا، واطبع عدد الأيام، واليوم الأعلى زيارةً (التاريخ).

المطلوب:
  • حوّل الوقت، واجمع الزيارات يوميًّا بـ resample("D").
  • اطبع عدد الأيام ثم تاريخ اليوم الأعلى.

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

main.py
import pandas as pddf = pd.DataFrame({    "ts": ["2025-05-01 09:00","2025-05-01 20:00","2025-05-02 10:00","2025-05-03 08:00","2025-05-03 21:00"],    "visits": [100, 50, 300, 80, 90],})df["ts"] = pd.to_datetime(df["ts"])# اجمع يوميًّا ثم اطبع عدد الأيام وتاريخ الأعلى
المطلوب×
3
2025-05-02
💡 تلميح 1
daily = df.set_index("ts").resample("D")["visits"].sum().
💡 تلميح 2
الأعلى: daily.idxmax().date().

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

main.py
import pandas as pddf = pd.DataFrame({    "ts": ["2025-05-01 09:00","2025-05-01 20:00","2025-05-02 10:00","2025-05-03 08:00","2025-05-03 21:00"],    "visits": [100, 50, 300, 80, 90],})df["ts"] = pd.to_datetime(df["ts"])daily = df.set_index("ts").resample("D")["visits"].sum()print(len(daily))print(daily.idxmax().date())
انتقل إلى تقييم الدرساختيار من متعدد، وصح وخطأ، وأكمل الفراغ، وتتبّع الناتج.ابدأ التقييم ←

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