تغيير التردد
نادرًا ما تأتي البيانات بالتردد الذي تحتاجه. تصل التكّات بالميلي ثانية، ويريد النموذج أشرطة يومية، ويريد التقرير أشهرًا. تعيد إعادة التقطيع تجميع سلسلة زمنية في فترات جديدة. الانتقال من الدقيق إلى الخشن (أيام إلى أشهر) تقليل للعينات: تحوي كل فترة جديدة عدة ملاحظات قديمة فيجب أن تحدد كيف تجمعها. والانتقال من الخشن إلى الدقيق (أسابيع إلى أيام) زيادة للعينات: توجد فترات جديدة بلا بيانات فيجب أن تحدد ما يوضع فيها.
import pandas as pd
daily = pd.Series(
[100.0, 101, 103, 102, 104, 105, 103, 106],
index=pd.bdate_range("2026-02-25", periods=8), # Wed 25 Feb ... Fri 6 Mar
name="close",
)
print(daily.resample("ME").last()) # the last price of each month ("ME" = month end)
# 2026-02-28 103.0
# 2026-03-31 106.0
# Freq: ME, Name: close, dtype: float64
print(daily.resample("W-FRI").last()) # the last price of each week, weeks ending on Friday
# 2026-02-27 103.0
# 2026-03-06 106.0
# Freq: W-FRI, Name: close, dtype: float64اختيار دالة التجميع
لا يفعل series.resample("ME") وحده شيئًا: إنه يصف الفترات فقط. والدالة التجميعية التي تليه تحدد القيمة ويجب أن تناسب معنى البيانات. السعر لقطة، فيُمثَّل الشهر بقيمته الأخيرة last (أو الأولى first). والحجم كمية متداولة، فالشهر هو sum. والمدى يستخدم max وmin. وتتبع التسميات القاعدة: يسمّي "ME" الشهر بآخر يوم تقويمي فيه ولو كان سبتًا، ويسمّي "W-FRI" الأسبوع بيوم جمعته.
volume = pd.Series([10, 20, 30, 40, 50, 60, 70, 80], index=daily.index)
print(volume.resample("ME").sum().to_dict())
# {Timestamp('2026-02-28 00:00:00'): 60, Timestamp('2026-03-31 00:00:00'): 300}
# Several summaries at once
print(daily.resample("ME").agg(["first", "last", "max"]))
# first last max
# 2026-02-28 100.0 103.0 103.0
# 2026-03-31 102.0 106.0 106.0أشرطة من التكّات، وزيادة العينات
تستخدم الرسوم والنماذج أشرطة OHLC: الافتتاح (أول سعر) والأعلى والأدنى والإغلاق (آخر سعر) لكل فترة. يبنيها resample("D").ohlc() من أسعار خلال اليوم باستدعاء واحد. وتظهر الأيام التقويمية بلا أي صفقة، مثل عطلات نهاية الأسبوع، صفوفًا من NaN، فاختم بـ dropna() إن أردت أيام التداول فقط. وتسير زيادة العينات في الاتجاه المعاكس: يكرّر resample("D").ffill() آخر قيمة معروفة في الأيام بلا بيانات، وهذا ما يعنيه سعر يُنشر أسبوعيًا. لا تستخدم bfill مع الأسعار أبدًا: فهو ينسخ قيمة مستقبلية إلى الوراء ويسرّب معلومات الغد إلى اليوم.
times = ["2026-03-05 09:30", "2026-03-05 11:00", "2026-03-05 15:59",
"2026-03-09 09:30", "2026-03-09 12:00", "2026-03-09 15:59"]
ticks = pd.Series([100.0, 101.5, 99.8, 100.7, 102.0, 101.0], index=pd.to_datetime(times))
bars = ticks.resample("D").ohlc()
print(bars)
# open high low close
# 2026-03-05 100.0 101.5 99.8 99.8
# 2026-03-06 NaN NaN NaN NaN
# 2026-03-07 NaN NaN NaN NaN
# 2026-03-08 NaN NaN NaN NaN
# 2026-03-09 100.7 102.0 100.7 101.0
print(bars.dropna().index.strftime("%d %b").tolist()) # ['05 Mar', '09 Mar'] only the days that traded# Upsampling: observations on the 2nd, 6th and 10th, spread over every day with ffill
weekly = pd.Series([100.0, 103.0, 101.0], index=pd.to_datetime(["2026-03-02", "2026-03-06", "2026-03-10"]))
print(weekly.resample("D").ffill().tolist())
# [100.0, 100.0, 100.0, 100.0, 103.0, 103.0, 103.0, 103.0, 101.0]
print(int(weekly.resample("D").mean().isna().sum())) # 6 without a fill rule the new days are empty"ME"، واستخدم ffill (لا bfill) عند زيادة العينات، وأزِح الإشارة الشهرية إلى الأمام قبل استخدامها مع البيانات اليومية.series.resample(rule)تصف الفترات ("D"و"W-FRI"و"ME"و"h")؛ وتحسب الدالة التجميعية بعدها القيم.- الأسعار:
lastأوohlc()؛ الأحجام:sum؛ وتظهر الفترات الفارغةNaNويزيلهاdropna(). - تحتاج زيادة العينات إلى قاعدة تعبئة:
ffill()تكرر آخر قيمة معروفة؛ ولاbfill()مع الأسعار فهي تسرّب المستقبل.
التالي: النوافذ المتحركة، إحصاءات مثل المتوسطات المتحركة تُحسب على نافذة منزلقة من الفترات الأخيرة.
المختبر: ما الذي يُقيَّم
- خذ آخر سعر في كل شهر باستخدام
month_end_close25 نقطة - اجمع حجم التداول لكل أسبوع باستخدام
weekly_volume25 نقطة - ابنِ أشرطة يومية من أسعار خلال اليوم باستخدام
daily_ohlc25 نقطة - وزّع ملاحظات غير منتظمة على كل يوم باستخدام
fill_to_daily25 نقطة