今天我們把每日成交量匯總成「月總成交量」,並把它畫成下方的長條圖。這篇文章會從資料前處理、月聚合、到畫圖細節一步步講解。
# --- 資料前處理 ---
df['Date'] = pd.to_datetime(df['Date'])
df['Volume'] = pd.to_numeric(df['Volume'].astype(str).str.replace(',', ''), errors='coerce').fillna(0).astype(int)
# --- 月聚合:計算月總成交量 ---
df['Month'] = df['Date'].dt.to_period('M')
monthly = df.groupby('Month').agg({'Volume': 'sum'}).reset_index()
monthly['MonthStart'] = monthly['Month'].dt.to_timestamp()
monthly.rename(columns={'Volume': '月總成交量'}, inplace=True)
plot_monthly_stats = monthly[['MonthStart', '月總成交量']]
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 8), sharex=True,
gridspec_kw={'height_ratios': [1, 1.1]})
# 月總成交量長條圖
ax2.bar(plot_monthly_stats['MonthStart'], plot_monthly_stats['月總成交量'],
color='gray', width=20)
ax2.set_xlabel('月份', fontsize=12)
ax2.set_ylabel('月總成交量', fontsize=12)
ax2.grid(True)
ax2.xaxis.set_major_locator(mdates.MonthLocator())
ax2.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m'))
plt.xticks(rotation=45)
ax2.yaxis.set_major_formatter(FuncFormatter(lambda x, p: format(int(x), ',')))
ymax = plot_monthly_stats['月總成交量'].max()
for x, y in zip(plot_monthly_stats['MonthStart'], plot_monthly_stats['月總成交量']):
ax2.text(x, y + ymax * 0.01, f'{y:,}', ha='center', va='bottom', fontsize=9)
plt.tight_layout()
plt.show()
那今天就先這樣。