Python 實戰範例

從數據抓取到視覺化與 Excel 報表

上市公司每月營業收入表

 

 

Introduction

前言

在這篇文章中,我們將展示如何使用 Python 和 xlwings 工具來自動化生成和儲存包含多種分析圖表的 Excel 文件。我們將處理上市公司每月營業收入數據,這些數據對於了解公司財務狀況和行業趨勢至關重要。

我們將通過以下步驟來完成整個過程:

  1. 數據抓取與儲存:從台灣政府資料開放平台抓取最新的「上市公司每月營業收入彙總表」數據,並將其儲存為 CSV 檔案。
  2. 產業別營收氣泡圖:生成產業別營收氣泡圖,以視覺化展示各產業的營收規模及其相對大小。
  3. 產業增長圖:製作產業增長圖,顯示各產業的營收增長率,提供增長趨勢的清晰視覺化。
  4. 儲存到 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

程式碼說明

  1. 讀取資料: 使用 pandasread_csv 函數從指定的 URL 下載並讀取 CSV 資料。
  2. 儲存資料: 將讀取到的資料儲存為名為 data.csv 的檔案。
  3. 顯示成功消息: 輸出一條消息,確認資料已成功儲存。

資料展示: 以下是從下載的資料中提取的部分內容

Python實戰範例 - 抓取上市公司每月營業收入並製作 Excel 報表

產業別營收相對大小分析

這段程式碼生成並儲存產業別營收的氣泡圖,以分析不同產業的營收大小及其相對關係。

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')

程式碼說明

  1. 設定 Plotly 主題: 使用 plotly.io 設定全域主題為暗色模式,以便圖表在不同背景下呈現效果更佳。
  2. 定義函數 generate_industry_revenue_bubble_chart:
    • 輸入:
      • file_path: CSV 檔案路徑,包含產業別和營業收入數據。
      • output_image: 儲存圖表的檔案名稱(預設為 ‘industry_revenue_bubble_chart.png’)。
    • 讀取資料: 使用 pandasread_csv 函數讀取 CSV 檔案中的數據。
    • 數據處理: 按「產業別」分組,並計算每個產業當月營收的總和。
    • 繪製圖表: 使用 plotly.expresspx.scatter 函數繪製氣泡圖,其中 X 軸為「產業別」,Y 軸為「營業收入-當月營收」,氣泡大小根據當月營收調整。
    • 顯示圖表: 在 Jupyter Notebook 中顯示氣泡圖。
    • 儲存圖表: 將圖表儲存為 PNG 檔案,生成圖檔的絕對路徑。
    • 返回值: 返回產業營收的 DataFrame 和圖檔的絕對路徑。
  3. 調用函數: 使用 generate_industry_revenue_bubble_chart 函數生成圖表並儲存為檔案。
Python實戰範例 - 抓取上市公司每月營業收入並製作 Excel 報表 02

製作產業別營收增長率比較圖

這段程式碼生成並儲存產業別營收增長率的比較圖,以分析各產業的營收增長情況。

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')

程式碼說明

  1. 讀取 CSV 文件:讀取指定路徑的 CSV 檔案,並將其載入為 DataFrame。
  2. 轉換數據類型:將「當月營收」和「去年當月營收」轉換為數值型。
  3. 計算營收增長率:按產業別分組,計算當月營收和去年同月營收,並計算營收增長率。
  4. 生成並儲存圖表:使用 plotly.express 繪製條形圖,顯示各產業的營收增長率,並將圖表儲存為 PNG 檔案。
Python實戰範例 - 抓取上市公司每月營業收入並製作 Excel 報表 03

自動化儲存上市公司營收資料與視覺化圖表到 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()

程式碼說明

  1. 創建 Excel 文件:創建一個新的 Excel 工作簿。
  2. 創建工作表並寫入數據:在「上市公司每月營業收入彙總表」工作表中寫入從 CSV 文件讀取的數據。
  3. 生成產業別營收氣泡圖:調用 generate_industry_revenue_bubble_chart 函數生成產業別營收氣泡圖,並將結果寫入「產業別營收相對大小分析」工作表。
  4. 生成產業增長圖:調用 generate_industry_growth_chart 函數生成產業增長圖,並將結果寫入「產業別營收增長分析」工作表。
  5. 生成前20家公司成長圖:調用 generate_top_20_growth_chart 函數生成前20家公司成長圖,並將結果寫入「最大成長的前20家公司」工作表。
  6. 查找異常變化備註資訊:調用 find_anomalies_with_keywords 函數查找異常變化備註資訊,並將結果寫入「異常變化備註資訊」工作表。
  7. 儲存 Excel 文件:將所有變更儲存至指定的 Excel 文件並關閉工作簿。

本文提供的 Python 實戰完整程式碼(含前20家公司成長圖和異常變化備註資訊函數)可在這裡下載

自動化儲存股票資料與視覺化圖表到 Excel

結論

在這篇文章中,我們展示了如何使用 Python 和 xlwings 工具來自動化生成和儲存包含多種分析圖表的 Excel 文件。以下是我們 Python 教學的主要重點:

  1. 數據讀取與儲存:我們從台灣政府資料開放平台抓取最新的「上市公司每月營業收入彙總表」數據,並將其儲存為 CSV 檔案。
  2. 產業別營收氣泡圖:使用 Plotly 生成產業別營收氣泡圖,直觀展示各產業的營收規模及其相對大小,幫助理解產業間的營收差異。
  3. 產業增長圖:通過 Plotly 創建產業增長圖,顯示各產業的營收增長率,提供清晰的增長趨勢視覺化。
  4. 儲存到 Excel:將圖表和數據自動儲存到 Excel 文件中,方便進一步分析和報告,提升工作效率。

這些步驟不僅實現了數據的自動化處理和視覺化展示,還簡化了報告製作過程,進一步提高了數據分析的效率和準確性。

參考資料

  1. 台灣政府資料開放平臺:提供各種公共數據,旨在促進資料開放與共享。 政府資料開放平臺
  2. Python 官方文檔:了解Python的基本功能和用法。 Python官方網站
  3. Plotly 官方文檔:提供關於Plotly的詳細資料和使用指南,用於資料視覺化。 Plotly官方網站
  4. xlwings 官方文檔:提供有關xlwings的使用說明,幫助將資料和圖表存入Excel。 xlwings官方網站

課程推薦

  1. Python 金融資訊爬蟲大師班:這是一門以「股票數據」、「金融資訊」與「財經新聞」為主軸的「網路爬蟲」課程。
  2. 用Python打造自己專屬的VIP看盤室:專注於使用Plotly進行資料視覺化,學習如何製作專業、美觀的互動圖表,幫助你有效地展示數據和趨勢。
  3. 用Python操作Excel|實現職場自動化與理財工具開發:掌握xlwings及其他工具來實現Excel的自動化處理,從數據整理到報告生成,全方位提升工作效率。

這些課程能夠幫助你進一步提升資料分析和視覺化的能力,並將所學應用到實際工作中,讓你在數據分析領域中更加游刃有餘。

全方位 Python 課程

無論你是初學者還是有經驗的開發者,這裡的課程都能滿足你的需求。精心設計的8堂課程,涵蓋不同類型的Python主題,幫助你在各個領域中脫穎而出。