Python 實戰範例
從數據抓取到視覺化與 Excel 報表
上市公司每月營業收入表
Introduction
前言
在這篇文章中,我們將展示如何使用 Python 和 xlwings 工具來自動化生成和儲存包含多種分析圖表的 Excel 文件。我們將處理上市公司每月營業收入數據,這些數據對於了解公司財務狀況和行業趨勢至關重要。
我們將通過以下步驟來完成整個過程:
- 數據抓取與儲存:從台灣政府資料開放平台抓取最新的「上市公司每月營業收入彙總表」數據,並將其儲存為 CSV 檔案。
- 產業別營收氣泡圖:生成產業別營收氣泡圖,以視覺化展示各產業的營收規模及其相對大小。
- 產業增長圖:製作產業增長圖,顯示各產業的營收增長率,提供增長趨勢的清晰視覺化。
- 儲存到 Excel:將圖表和數據儲存到 Excel 文件中,以便於進一步分析和報告。
通過這些步驟,我們將實現數據的自動化處理和視覺化展示,提高分析效率並簡化報告製作過程。
本文提供的 Python 實戰範例將幫助您掌握從數據抓取到報告生成的全過程,完整程式碼可以直接在這邊下載。
數據抓取與儲存
首先,我們將從台灣政府資料開放平台抓取最新的「上市公司每月營業收入彙總表」數據,並將其保存為 CSV 檔案。這些資料已經經過整理,因此不需要進行額外的處理。以下是使用 Python 來抓取和儲存這些資料的程式碼:
import pandas as pd
# 設定下載連結
url = ' https://mopsfin.twse.com.tw/opendata/t187ap05_L.csv'
# 讀取資料
df = pd.read_csv(url)
# 儲存資料
local_filename = 'data.csv'
df.to_csv(local_filename, index=False)
print(f"處理後的資料已儲存為 {local_filename}")
df
程式碼說明
- 讀取資料: 使用
pandas
的read_csv
函數從指定的 URL 下載並讀取 CSV 資料。 - 儲存資料: 將讀取到的資料儲存為名為
data.csv
的檔案。 - 顯示成功消息: 輸出一條消息,確認資料已成功儲存。
資料展示: 以下是從下載的資料中提取的部分內容

產業別營收相對大小分析
這段程式碼生成並儲存產業別營收的氣泡圖,以分析不同產業的營收大小及其相對關係。
import plotly.express as px
import plotly.io as pio
# 設定 Plotly 的全域主題為 dark
pio.templates.default = "plotly_dark"
def generate_industry_revenue_bubble_chart(file_path, output_image='industry_revenue_bubble_chart.png'):
# 讀取CSV文件
data = pd.read_csv(file_path, encoding='utf-8')
# 按產業別分組,並計算當月營收的總和
industry_revenue = data.groupby('產業別')['營業收入-當月營收'].sum().reset_index()
# 繪製氣泡圖
fig = px.scatter(industry_revenue,
x='產業別',
y='營業收入-當月營收',
size='營業收入-當月營收',
title='產業別營收相對大小分析',
size_max=60)
# 在 Jupyter Notebook 中顯示圖表
fig.show()
# 保存圖表到文件
abs_image_path = os.path.abspath(output_image) # 生成絕對路徑
fig.write_image(abs_image_path)
# 返回圖檔名稱和 DataFrame
return industry_revenue, abs_image_path
# 調用函數
df, image_file = generate_industry_revenue_bubble_chart('data.csv')
程式碼說明
- 設定 Plotly 主題: 使用
plotly.io
設定全域主題為暗色模式,以便圖表在不同背景下呈現效果更佳。 - 定義函數
generate_industry_revenue_bubble_chart
:- 輸入:
file_path
: CSV 檔案路徑,包含產業別和營業收入數據。output_image
: 儲存圖表的檔案名稱(預設為 ‘industry_revenue_bubble_chart.png’)。
- 讀取資料: 使用
pandas
的read_csv
函數讀取 CSV 檔案中的數據。 - 數據處理: 按「產業別」分組,並計算每個產業當月營收的總和。
- 繪製圖表: 使用
plotly.express
的px.scatter
函數繪製氣泡圖,其中 X 軸為「產業別」,Y 軸為「營業收入-當月營收」,氣泡大小根據當月營收調整。 - 顯示圖表: 在 Jupyter Notebook 中顯示氣泡圖。
- 儲存圖表: 將圖表儲存為 PNG 檔案,生成圖檔的絕對路徑。
- 返回值: 返回產業營收的 DataFrame 和圖檔的絕對路徑。
- 輸入:
- 調用函數: 使用
generate_industry_revenue_bubble_chart
函數生成圖表並儲存為檔案。

製作產業別營收增長率比較圖
這段程式碼生成並儲存產業別營收增長率的比較圖,以分析各產業的營收增長情況。
def generate_industry_growth_chart(file_path, output_image='industry_growth_chart.png'):
# 讀取 CSV 文件
df = pd.read_csv(file_path, encoding='utf-8')
# 轉換數據類型
df['營業收入-當月營收'] = pd.to_numeric(df['營業收入-當月營收'], errors='coerce')
df['營業收入-去年當月營收'] = pd.to_numeric(df['營業收入-去年當月營收'], errors='coerce')
# 按產業別分組並計算當月營收總和和去年同月營收總和
industry_revenue = df.groupby('產業別').agg({
'營業收入-當月營收': 'sum',
'營業收入-去年當月營收': 'sum'
}).reset_index()
# 計算產業別的增長率
industry_revenue['營收增長率(%)'] = ((industry_revenue['營業收入-當月營收'] - industry_revenue['營業收入-去年當月營收']) /
industry_revenue['營業收入-去年當月營收']) * 100
# 產業別增長率比較圖
fig = px.bar(industry_revenue,
x='產業別',
y='營收增長率(%)',
title='產業別增長率比較',
labels={'產業別': '產業別', '營收增長率(%)': '營收增長率 (%)'},
text='營收增長率(%)')
# 在 Jupyter Notebook 中顯示圖表
fig.show()
# 保存圖表到文件
abs_image_path = os.path.abspath(output_image) # 生成絕對路徑
fig.write_image(abs_image_path)
# 返回圖檔名稱和 DataFrame
return industry_revenue, abs_image_path
# 調用函數
df, image_file = generate_industry_growth_chart('data.csv')
程式碼說明
- 讀取 CSV 文件:讀取指定路徑的 CSV 檔案,並將其載入為 DataFrame。
- 轉換數據類型:將「當月營收」和「去年當月營收」轉換為數值型。
- 計算營收增長率:按產業別分組,計算當月營收和去年同月營收,並計算營收增長率。
- 生成並儲存圖表:使用
plotly.express
繪製條形圖,顯示各產業的營收增長率,並將圖表儲存為 PNG 檔案。

自動化儲存上市公司營收資料與視覺化圖表到 Excel
這段程式碼將數據從 CSV 檔案讀取到 Excel 文件,並生成多個工作表,包含上市公司每月營業收入彙總表、產業別營收氣泡圖、產業增長圖、前20家公司成長圖和異常變化備註資訊。
import xlwings as xw
# 檔案路徑
local_filename = 'data.csv'
excel_file_path = 'data.xlsx'
# 創建 Excel 文件
wb = xw.Book() # 創建新的 Excel 工作簿
# 創建工作表並寫入數據
sheet1 = wb.sheets.add(name='上市公司每月營業收入彙總表')
data = pd.read_csv(local_filename, encoding='utf-8')
sheet1.range('A1').options(index=False, header=True).value = data
# 生成產業別營收氣泡圖
df_bubble, image_bubble = generate_industry_revenue_bubble_chart(local_filename)
sheet2 = wb.sheets.add(name='產業別營收相對大小分析')
sheet2.range('A1').options(index=False, header=True).value = df_bubble
sheet2.pictures.add(image_bubble, left=sheet2.range('D4').left, top=sheet2.range('D4').top)
# 生成產業增長圖
df_growth, image_growth = generate_industry_growth_chart(local_filename)
sheet3 = wb.sheets.add(name='產業別營收增長分析')
sheet3.range('A1').options(index=False, header=True).value = df_growth
sheet3.pictures.add(image_growth, left=sheet3.range('F3').left, top=sheet3.range('F3').top)
# 生成前20家公司成長圖
df_top20, image_top20 = generate_top_20_growth_chart(local_filename)
sheet4 = wb.sheets.add(name='最大成長的前20家公司')
sheet4.range('A1').options(index=False, header=True).value = df_top20
sheet4.pictures.add(image_top20, left=sheet4.range('D23').left, top=sheet4.range('D23').top)
# 查找異常變化備註資訊
anomalies_df = find_anomalies_with_keywords(local_filename)
sheet5 = wb.sheets.add(name='異常變化備註資訊')
sheet5.range('A1').options(index=False, header=True).value = anomalies_df
# 儲存 Excel 文件
wb.save(excel_file_path)
wb.close()
程式碼說明
- 創建 Excel 文件:創建一個新的 Excel 工作簿。
- 創建工作表並寫入數據:在「上市公司每月營業收入彙總表」工作表中寫入從 CSV 文件讀取的數據。
- 生成產業別營收氣泡圖:調用
generate_industry_revenue_bubble_chart
函數生成產業別營收氣泡圖,並將結果寫入「產業別營收相對大小分析」工作表。 - 生成產業增長圖:調用
generate_industry_growth_chart
函數生成產業增長圖,並將結果寫入「產業別營收增長分析」工作表。 - 生成前20家公司成長圖:調用
generate_top_20_growth_chart
函數生成前20家公司成長圖,並將結果寫入「最大成長的前20家公司」工作表。 - 查找異常變化備註資訊:調用
find_anomalies_with_keywords
函數查找異常變化備註資訊,並將結果寫入「異常變化備註資訊」工作表。 - 儲存 Excel 文件:將所有變更儲存至指定的 Excel 文件並關閉工作簿。
本文提供的 Python 實戰完整程式碼(含前20家公司成長圖和異常變化備註資訊函數)可在這裡下載。

結論
在這篇文章中,我們展示了如何使用 Python 和 xlwings 工具來自動化生成和儲存包含多種分析圖表的 Excel 文件。以下是我們 Python 教學的主要重點:
- 數據讀取與儲存:我們從台灣政府資料開放平台抓取最新的「上市公司每月營業收入彙總表」數據,並將其儲存為 CSV 檔案。
- 產業別營收氣泡圖:使用 Plotly 生成產業別營收氣泡圖,直觀展示各產業的營收規模及其相對大小,幫助理解產業間的營收差異。
- 產業增長圖:通過 Plotly 創建產業增長圖,顯示各產業的營收增長率,提供清晰的增長趨勢視覺化。
- 儲存到 Excel:將圖表和數據自動儲存到 Excel 文件中,方便進一步分析和報告,提升工作效率。
這些步驟不僅實現了數據的自動化處理和視覺化展示,還簡化了報告製作過程,進一步提高了數據分析的效率和準確性。
參考資料
- 台灣政府資料開放平臺:提供各種公共數據,旨在促進資料開放與共享。 政府資料開放平臺
- Python 官方文檔:了解Python的基本功能和用法。 Python官方網站
- Plotly 官方文檔:提供關於Plotly的詳細資料和使用指南,用於資料視覺化。 Plotly官方網站
- xlwings 官方文檔:提供有關xlwings的使用說明,幫助將資料和圖表存入Excel。 xlwings官方網站
課程推薦
- Python 金融資訊爬蟲大師班:這是一門以「股票數據」、「金融資訊」與「財經新聞」為主軸的「網路爬蟲」課程。
- 用Python打造自己專屬的VIP看盤室:專注於使用Plotly進行資料視覺化,學習如何製作專業、美觀的互動圖表,幫助你有效地展示數據和趨勢。
- 用Python操作Excel|實現職場自動化與理財工具開發:掌握xlwings及其他工具來實現Excel的自動化處理,從數據整理到報告生成,全方位提升工作效率。
這些課程能夠幫助你進一步提升資料分析和視覺化的能力,並將所學應用到實際工作中,讓你在數據分析領域中更加游刃有餘。
全方位 Python 課程
無論你是初學者還是有經驗的開發者,這裡的課程都能滿足你的需求。精心設計的8堂課程,涵蓋不同類型的Python主題,幫助你在各個領域中脫穎而出。