การปรับความถี่อนุกรมเวลา
ลดความถี่ข้อมูลรายวันเป็นรายเดือนด้วย resample('ME').sum() และเพิ่มความถี่ด้วยการเติมค่าจากด้านหน้าเพื่อเติมช่วงเวลาที่หายไป
การปรับความถี่อนุกรมเวลา เป็นบทเรียน Pandas & NumPy Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Pandas & NumPy Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน
การปรับความถี่ใหม่คืออะไร
การปรับความถี่ใหม่ เปลี่ยนความถี่ของอนุกรมเวลา การลดความถี่ ทำให้ความถี่ลดลง เช่น แปลงข้อมูลรายวันเป็นผลรวมรายเดือน การเพิ่มความถี่ ทำให้ความถี่เพิ่มขึ้น เช่น แปลงข้อมูลรายเดือนเป็นรายวันและเติมช่องว่างด้วยค่าที่ประมาณแบบแทรก ทั้งสองการดำเนินการต้องใช้ DatetimeIndex และทำผ่านเมธอด resample() ซึ่งเป็นเวอร์ชันที่คำนึงถึงเวลาของ groupby() ใน Pandas
เมธอด resample()
df.resample(rule) สร้างออบเจ็กต์ DatetimeIndexResampler โดย rule คือนามแฝงของออฟเซ็ตความถี่ เช่นเดียวกับ groupby() ระบบจะยังไม่คำนวณจนกว่าจะเชื่อมต่อเมธอดการรวมค่า กฎที่ใช้บ่อย ได้แก่ 'D' (วัน), 'W' (สัปดาห์), 'ME' (สิ้นเดือน), 'QE' (สิ้นไตรมาส) และ 'YE' (สิ้นปี) DataFrame ต้องมี DatetimeIndex
import pandas as pd
import numpy as np
np.random.seed(42)
dates = pd.date_range('2024-01-01', periods=90, freq='D')
df = pd.DataFrame({'sales': np.random.randint(100, 500, 90)}, index=dates)
print(df.head())
print('Shape:', df.shape) # (90, 1) -- 90 daily rowsการลดความถี่: จากรายวันเป็นรายเดือน
หากต้องการลดความถี่จากข้อมูลรายวันเป็นรายเดือน ให้เรียก resample('ME') แล้วเชื่อมต่อการรวมค่า sum() ให้ผลรวมรายเดือน mean() ให้ค่าเฉลี่ยรายเดือน และ last() ให้ค่าสุดท้ายในแต่ละช่วง ผลลัพธ์มีหนึ่งแถวต่อหนึ่งช่วง โดยใช้วันที่สิ้นสุดช่วงเป็นป้ายกำกับดัชนี
# Monthly totals
monthly_sum = df.resample('ME').sum()
print(monthly_sum)
# sales
# 2024-01-31 9876
# 2024-02-29 8765
# 2024-03-31 9234
# Monthly averages
monthly_mean = df.resample('ME').mean().round(1)
print(monthly_mean)การลดความถี่เป็นรายสัปดาห์
ปรับความถี่ใหม่ด้วย 'W' เพื่อรวมค่าตามสัปดาห์ปฏิทินที่สิ้นสุดในวันอาทิตย์ ใช้ 'W-MON' หากต้องการให้สัปดาห์สิ้นสุดในวันจันทร์ Pandas จะจัดกลุ่มวันที่ทั้งหมดในแต่ละสัปดาห์เข้าด้วยกันแล้วใช้การรวมค่า วิธีนี้มีประโยชน์สำหรับการรายงานรายสัปดาห์ที่ต้องการแถวสรุปหนึ่งแถวต่อสัปดาห์
# Weekly sum
weekly = df.resample('W').sum()
print(weekly.head())
# sales
# 2024-01-07 2010 <- Jan 1-7
# 2024-01-14 2340 <- Jan 8-14
# ...
# Weekly max and count using agg()
weekly_stats = df.resample('W').agg(['sum', 'mean', 'max'])
print(weekly_stats.head())การใช้การรวมค่าหลายรูปแบบ
เช่นเดียวกับ groupby() คุณสามารถเชื่อมต่อ .agg() กับตัวปรับความถี่ใหม่เพื่อคำนวณสถิติหลายรายการในครั้งเดียว ส่งรายการชื่อฟังก์ชันหรือพจนานุกรมสำหรับการรวมค่าที่มีชื่อกำกับ วิธีนี้เป็นวิธีที่มีประสิทธิภาพสูงสุดในการสร้างตารางสรุปอนุกรมเวลาที่ครอบคลุม
monthly_stats = df.resample('ME').agg(
total_sales=('sales', 'sum'),
avg_sales=('sales', 'mean'),
peak_sales=('sales', 'max'),
days_counted=('sales', 'count')
)
print(monthly_stats.round(1))
# total_sales avg_sales peak_sales days_counted
# 2024-01-31 9876 318.6 499 31การปรับความถี่แบบ OHLC สำหรับข้อมูลการเงิน
สำหรับอนุกรมเวลาทางการเงิน เมธอด .ohlc() จะปรับความถี่ใหม่เป็นค่าเปิด สูงสุด ต่ำสุด และปิด (OHLC) ในแต่ละช่วง ซึ่งเป็นรูปแบบมาตรฐานของกราฟแท่งเทียน วิธีนี้มีความหมายเฉพาะกับข้อมูลตัวเลขที่แทนราคา אוระดับค่า แต่ละคอลัมน์ในข้อมูลนำเข้าจะได้คอลัมน์ OHLC สี่คอลัมน์ในผลลัพธ์
# OHLC monthly resampling
ohlc = df['sales'].resample('ME').ohlc()
print(ohlc)
# open high low close
# 2024-01-31 365 499 101 243
# 2024-02-29 ...การเพิ่มความถี่: จากรายเดือนเป็นรายวัน
การเพิ่มความถี่ ทำให้ความถี่เพิ่มขึ้น จึงสร้างแถวสำหรับค่าประทับเวลาที่ไม่มีอยู่ในข้อมูลเดิม แถวใหม่เหล่านี้จะมีค่า NaN ในตอนแรก จากนั้นจึงเติมค่าด้วยวิธีที่เหมาะกับข้อมูลของคุณ: ffill() (เติมไปข้างหน้า — ส่งต่อค่าที่ทราบล่าสุดไปข้างหน้า) หรือ bfill() (เติมย้อนกลับ — ใช้ค่าที่ทราบถัดไป) หรือใช้ interpolate() เพื่อแทรกค่าอย่างราบรื่น
# Monthly data
monthly = pd.Series(
[100, 120, 115],
index=pd.date_range('2024-01-31', periods=3, freq='ME')
)
print(monthly)
# Upsample to daily (creates NaN rows)
daily = monthly.resample('D').asfreq()
print(daily.head(10))
# 2024-01-31 100.0
# 2024-02-01 NaN <- new row
# ...การเติมช่องว่างหลังเพิ่มความถี่
หลังจากเพิ่มความถี่แล้ว ให้เติมช่องว่าง NaN ที่สร้างขึ้นสำหรับค่าประทับเวลาใหม่ ffill() จะส่งต่อค่าที่ทราบล่าสุดไปข้างหน้าจนถึงข้อมูลสังเกตจริงถัดไป เหมาะกับราคา ซึ่งราคาซื้อขายล่าสุดยังคงใช้ได้ ส่วน interpolate(method='linear') จะเติมค่าที่เว้นระยะเชิงเส้นระหว่างข้อมูลสังเกต เหมาะกับตัวแปรต่อเนื่องที่เปลี่ยนแปลงอย่างราบรื่น
# Forward fill: carry monthly value forward to every day
daily_ffill = monthly.resample('D').ffill()
print(daily_ffill.head(35))
# 2024-01-31 100
# 2024-02-01 100 <- forward filled
# ...
# 2024-02-29 120 <- new month value
# Linear interpolation
daily_interp = monthly.resample('D').interpolate(method='linear')
print(daily_interp.head(10))การปรับความถี่ใหม่ภายในกลุ่ม
คุณสามารถใช้ groupby() ร่วมกับ resample() เพื่อปรับความถี่ใหม่แยกกันภายในแต่ละกลุ่ม เรียก groupby(column).resample(rule) กับ DataFrame ที่มี DatetimeIndex ผลลัพธ์จะมี MultiIndex โดยระดับนอกสุดเป็นคีย์กลุ่ม และระดับในเป็นช่วงเวลาที่ปรับความถี่ใหม่แล้ว ซึ่งมีประโยชน์อย่างยิ่งสำหรับการวิเคราะห์อนุกรมเวลาระดับผลิตภัณฑ์หรือภูมิภาค
df2 = pd.DataFrame({
'product': ['A', 'B', 'A', 'B', 'A', 'B'],
'sales': [100, 150, 120, 130, 110, 160]
}, index=pd.date_range('2024-01-01', periods=6, freq='ME'))
# Monthly sum per product
result = df2.groupby('product').resample('QE').sum()
print(result)การกำหนดจุดยึดออฟเซ็ตแบบกำหนดเอง
โดยค่าเริ่มต้น 'ME' จะยึดกับวันที่สิ้นเดือนตามปฏิทิน สำหรับช่วงเวลาทางการเงินที่ไม่เป็นมาตรฐาน ให้ใช้ออฟเซ็ต เช่น 'QS-APR' (ไตรมาสที่เริ่มเดือนเมษายน) หรือ 'YS-OCT' (ปีที่เริ่มเดือนตุลาคม) Pandas รองรับนามแฝงออฟเซ็ตแบบมีจุดยึดจำนวนมาก โปรดดูเอกสาร Pandas สำหรับรายการทั้งหมดเมื่อต้องทำงานกับช่วงเวลาทางการเงินที่ไม่ตรงตามปฏิทิน
# Fiscal year starting in April
fiscal_annual = df.resample('YE-MAR').sum()
print(fiscal_annual)
# sales
# 2024-03-31 XXXX <- April 2023 to March 2024
# Quarter starting in April
fiscal_q = df.resample('QE-MAR').mean().round(0)
print(fiscal_q)การตรวจสอบความถูกต้องของผลลัพธ์หลังปรับความถี่
หลังจากปรับความถี่ใหม่แล้ว ให้ตรวจสอบเสมอว่าผลลัพธ์สมเหตุสมผล ตรวจสอบว่าจำนวนช่วงเวลาผลลัพธ์ตรงตามที่คาดไว้ ไม่มีช่วงเวลาใดหายไป (มองหา NaN ในผลลัพธ์) และผลรวมของยอดรายเดือนเท่ากับผลรวมของข้อมูลรายวันเดิมเมื่อปรับความถี่ด้วย sum() การตรวจสอบความสมเหตุสมผลเหล่านี้ช่วยจับข้อผิดพลาดแบบคลาดไปหนึ่งตำแหน่งในสตริงความถี่และช่วงวันที่ที่หายไป
monthly = df.resample('ME').sum()
# Verify: monthly totals should sum to daily total
assert monthly['sales'].sum() == df['sales'].sum(), 'Sum mismatch!'
# Verify: expected number of months
print('Months:', len(monthly)) # should be 3 for 90 days Jan-Mar
# Check for any NaN
print('NaN count:', monthly.isna().sum().sum())ตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบความเข้าใจของคุณเกี่ยวกับการปรับความถี่อนุกรมเวลาใหม่จากบทเรียนนี้
สรุปบทเรียน
ในบทเรียนนี้ คุณได้เรียนรู้ว่า resample() เป็นรูปแบบที่คำนึงถึงเวลาของ groupby() สำหรับเปลี่ยนความถี่ของอนุกรมเวลา; การลดความถี่ จะรวมข้อมูล (จากรายวันเป็นรายเดือนด้วย sum/mean); การเพิ่มความถี่ จะสร้างค่าประทับเวลาใหม่ที่ต้องเติมด้วย ffill() หรือ interpolate(); และคุณสามารถใช้ groupby() ร่วมกับ resample() เพื่อรวมค่าตามเวลาระดับกลุ่มได้ บทถัดไป เราจะสำรวจการเลื่อนค่าและคุณลักษณะแล็ก
เรียนรู้ Python ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 30
- บทเรียน
- 120
คำถามที่พบบ่อย
บทเรียน “การปรับความถี่อนุกรมเวลา” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การปรับความถี่อนุกรมเวลา” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Pandas & NumPy Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การปรับความถี่อนุกรมเวลา”
ลดความถี่ข้อมูลรายวันเป็นรายเดือนด้วย resample('ME').sum() และเพิ่มความถี่ด้วยการเติมค่าจากด้านหน้าเพื่อเติมช่วงเวลาที่หายไป คุณปฏิบัติ Pandas & NumPy Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Pandas & NumPy Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Pandas & NumPy Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การปรับความถี่อนุกรมเวลา” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Pandas & NumPy Academy นี้ได้ไหม
ได้ บทเรียน Pandas & NumPy Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- DatetimeIndex และช่วงเวลา
- การปรับความถี่อนุกรมเวลา
- การเลื่อนและคุณลักษณะหน่วงเวลา
- การแยกคุณลักษณะตามเวลา