在前幾天的練習裡,我們已經能夠抓取每日的股價資料,並進行一些基本統計。但是如果我們想從更長期的角度來觀察股票走勢,光看每日數據可能不夠清楚。今天要來把每天的數據整理成每個月的平均收盤價與總成交量。這樣可以更好地觀察趨勢,例如判斷某檔股票在近幾個月是逐漸走高,還是成交量逐漸減少。
# 新增功能:計算月平均價與月成交量
print("\n計算每月平均價與月成交量...")
# 確保 Volume 和 Close 是數字類型,以便計算
df['Volume'] = pd.to_numeric(df['Volume'])
df['Close'] = pd.to_numeric(df['Close'])
# 建立一個年份和月份的欄位來分組
df['YearMonth'] = df['Date'].dt.to_period('M')
# 依 YearMonth 分組並計算平均收盤價與總成交量
monthly_stats = df.groupby('YearMonth').agg(
月平均收盤價=('Close', 'mean'),
月總成交量=('Volume', 'sum')
).sort_index(ascending=False)
print("每月統計資料:")
print(monthly_stats)
df['Volume'] = pd.to_numeric(df['Volume'])
df['Close'] = pd.to_numeric(df['Close'])
有時候從網頁或 API 抓取的資料會是文字型別(string),像 "24,841,820" 或 "1265.5"。如果不先轉換,之後進行數學運算會出錯。這裡用 pd.to_numeric() 把 成交量 (Volume) 和 收盤價 (Close) 轉成數字格式。
df['YearMonth'] = df['Date'].dt.to_period('M')
這樣我們就可以用 年月 來分組,而不用處理每天的細節。
monthly_stats = df.groupby('YearMonth').agg(
月平均收盤價=('Close', 'mean'),
月總成交量=('Volume', 'sum')
)
這一段的重點是 groupby('YearMonth'),意思是按照 YearMonth 這個欄位來分組,接著用 .agg() 指定每個欄位要做的運算:
最後用 sort_index(ascending=False),把結果從最新的月份開始排序,方便我們觀察。
print("每月統計資料:")
print(monthly_stats)
執行後會看到類似以下的輸出:
每月統計資料:
月平均收盤價 月總成交量
YearMonth
2025-09 1285.3 248418200
2025-08 1268.5 320198000
2025-07 1242.7 289541600
這樣我們就能很快知道:
這樣的技巧在實務上非常有用,因為大家不只是看「每天」的數據,更會去關注「趨勢」是否持續。
那今天就先樣。