السلاسل الزمنية واتجاهات الزيارات
الزيارات عبر الزمن: كيف نرى الاتجاه، ونعرف ساعات الذروة وأيامها؟ ⏱ نحو 45 دقيقة.
- تحوّل التواريخ النصّية إلى نوع زمنيّ.
- تستخرج مكوّنات الوقت بـ .
dt. - تجمّع البيانات زمنيًّا بـ
resample. - ترى الاتجاه بالرسم والمتوسط المتحرّك.
١الوقت بُعدٌ لا نصّ
بيانات الويب مؤرّخة: متى وقعت الزيارة؟ ما دام التاريخ نصًّا، لا يمكنك حساب «لكل يوم» أو «حسب الساعة». الخطوة الأولى دائمًا: تحويله إلى نوع زمنيّ بـ pd.to_datetime:
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])
بعد التحويل يفتح .dt بابًا لكل مكوّنات الوقت: اليوم، الساعة، اسم اليوم، الأسبوع… تستخرجها كأعمدةٍ للتحليل.
٢التجميع الزمني: resample
لتلخيص البيانات بفترات (يومي، أسبوعي)، نجعل الوقت فهرسًا ثم نستخدم resample — مثل groupby لكن على الزمن:
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(), "زيارة")
resample("D") يجمّع يوميًّا، و"W" أسبوعيًّا، و"h" بالساعة. هكذا ترى الاتجاه عبر الزمن لا مجرد مجموعٍ أعمى.
٣رؤية الاتجاه بالرسم
السلاسل الزمنية تُفهَم بالعين. ارسم الزيارات اليومية ثم شغّل:
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()
توقّع وتحقّق
لتحويل عمود تاريخ نصّي:
لاستخراج الساعة من عمود زمنيّ:
للتجميع الزمني (يومي/أسبوعي):
resample("D") يجمّع:
الخلاصة
- حوّل التاريخ بـ
to_datetimeأولًا؛ النصّ لا يُحلَّل زمنيًّا. - .
dtيستخرج اليوم والساعة واسم اليوم من العمود الزمنيّ. resampleيجمّع على فترات(D/W/h)كـgroupbyعلى الزمن.- الاتجاه يُفهَم بالرسم؛ والمتوسط المتحرّك ينعّم التذبذب.
تحدٍّ برمجي: اتجاه يوميّ
متقدمجمّع الزيارات يوميًّا، واطبع عدد الأيام، واليوم الأعلى زيارةً (التاريخ).
- حوّل الوقت، واجمع الزيارات يوميًّا بـ
resample("D"). - اطبع عدد الأيام ثم تاريخ اليوم الأعلى.
ابدأ من هذا الكود، واضغط ▶ شغّل هنا لتكتب حلّك وتجرّبه مباشرة:
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"])# اجمع يوميًّا ثم اطبع عدد الأيام وتاريخ الأعلى
💡 تلميح 1
daily = df.set_index("ts").resample("D")["visits"].sum().💡 تلميح 2
daily.idxmax().date().حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.
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())