Walmart 財報視覺化分析 - 02 轉成 Pandas DataFrame

更新於 發佈於 閱讀時間約 14 分鐘

前情提要:

視覺化 Walmart 財報- 01 (安裝環境、檔案基本介紹)

本筆記要開始進入拆解程式碼跟邏輯的階段,為了方便講解,我用 Colab 作筆記 (其實是有點懶得安裝套件)。我的學習方式中英文網頁搜尋 + 搭配ChatGPT 問「為什麼」,目的是我可以「白話文解釋程式碼」

課前補充: 資料分析的 Pandas DataFrame

📌 為什麼要轉成 Pandas DataFrame?

  1. 篩選數據更快(像 SQL 一樣操作),不用像 Excel按 Filter
  2. 計算更直覺(+ - * / 直接用),不用像 Excel 拖拉公式
  3. 畫圖視覺化簡單(配合 Matplotlib / Plotly),比 Excel 更多繪圖選擇
  4. 方便存成不同格式(CSV, Excel, JSON)
  5. 可與 SQL、AI、機器學習整合

我猜因為財報的數據量大所以 duckdb.ipynbPandas SQL sent.ipynb 也用 Pandas 來處理財報數據!

DataFreame 是2維的資料結構,更一步的介紹請看:

官方網站介紹


準備資料

1.下載財報Excel 檔(原作者已整理),共有 20 sheet

FY25Q4_Link = 'https://app.quotemedia.com/data/downloadFiling?...' #Excel 檔的網址,點擊可下載
import urllib
dls = FY25Q4_Link
urllib.request.urlretrieve(dls, "data.xlsx") #從網址下載 Excel 檔案,並儲存為 data.xlsx。

要先 import urllib 函式庫,這個函式庫用來發送 HTTP 請求,像是urllib.request發送 HTTP 請求(下載網頁或檔案)再.urlretrieve 表示下載檔案。補充,urllin.request.urlopen 是打開網頁

2. 使用 OpenPyXL 讀取 Excel 檔案

from openpyxl import load_workbook
wb = load_workbook(filename='data.xlsx', read_only=True) 

為甚麼要用 OpenPyXL ?不用 Pandas?這兩種方式最大的差別是

OpenPyXL 像人工操作 Excel 可以做到

讀取、修改 Excel(如寫入新數據)

讀 Excel 的部分區域(特定儲存格),設定讀取範圍

讀 Excel 的格式(顏色、合併儲存格、公式)

但 pandas.read.excel() 只能「讀取整張表」,剛好這個表格每個 sheet 只有特定範圍,所以用 OpenPyXL 比較快。

只想讀 Excel,轉成 Pandas DataFrame 分析pandas.read_excel("data.xlsx")

不需要修改 Excel,單純做數據分析pandas 會更方便


開始解析資料

3. 解析「營運總部地址」財報頁面

ws = wb['address of principal execu-4'] #讀分頁worksheet=ws

data_rows = [] # 建立一個空的列大表,之後再轉dataFrame 後續
for row in ws['A4':'H45']:
data_cols = [] #把資料存到新的colomn
for cell in row: # 遍歷該行的每個儲存格(cell)
data_cols.append(cell.value) #把儲存格的值加到column list裡
data_rows.append(data_cols)# 再把每個column list 放到data_row 大表

df_earnings = pd.DataFrame(data_rows)#轉dataframe
  • 選擇 Excel 工作表 address of principal execu-4(財報的 "Principal Executive Office" 分頁)。
raw-image
  • 抓取 A4 到 H45 的資料(通常是表格數據)。

小問題,為什麼不要直接寫?還要先把資料存成一行一行,再存入大表呢?雖然少一行程式碼,但是不容易理解,而且當要整理資料(例如去掉0,這樣程式碼就不好維護)

data_rows.append([cell.value for cell in row]) # 直接存入 data_rows
raw-image

為了解先解析cell.value到row裡面,加入 print 來觀察。

嘗試每個指令print 出,感覺一下

嘗試每個指令print 出,感覺一下

raw-image
raw-image
  • 轉換為 Pandas DataFrame (df_earnings) 方便分析。

4. 解析「業務細分」財報頁面 (跟上面一樣)

ws_breakdown = wb['segment information']

data_rows = []
for row in ws_breakdown['A4':'H45']:
data_cols = []
for cell in row:
data_cols.append(cell.value)
data_rows.append(data_cols)

df_breakdown = pd.DataFrame(data_rows)

🔹 這裡的作用

  • 讀取 "segment information"業務細分)頁面的 A4 到 H45 資料。
  • 存入 Pandas DataFrame (df_breakdown)。
  • dfPandas 中「DataFrame」的縮寫,表示一個 表格狀的數據結構,類似於:

📌 5. 提取關鍵財務數據

(1) 營收 (Total Revenue)

lookupn = 6  # 第 6 欄的數值 
df_Total_Revenue = df_earnings.loc[df_earnings.iloc[:, 0] == 'Total revenues'].iloc[:, lookupn].item()/1000
  • 找出 "Total revenues" 的數據,並取出 第 6 欄 的數值(單位:十億美金)。第0是索引值,對應 Excel 第 H欄
  • 先從裡面拆解:
  1. df_earnings.iloc[:, 0] .iloc 是 pandas 裡的篩選功能取出[row,column]先以第 0 Column 。: 是全部列
  2. df_earnings.loc[df_earnings.iloc[:, 0] == 'Total revenues'] → 只保留這一row數據 (往前)看
  3. .iloc[:, lookupn].item()/1000 最後看後面,因為前面有設定lookupn是第6 column 再.item() 把 Series 轉換成數字除以 1000,之後用百萬美元(million USD),這行程式碼的目的是把它轉換成 十億美元(billion USD)
概念是這樣擷取

概念是這樣擷取


(2) 各業務收入

df_Revenue_b1 = df_earnings.loc[df_earnings.iloc[:, 0] == 'Membership and other income'].iloc[:, lookupn].item()/1000
df_Revenue_b2 = df_breakdown.loc[df_breakdown.iloc[:, 0] == 'Net sales'].iloc[0, lookupn_mix]/1000
df_Revenue_b3 = df_breakdown.loc[df_breakdown.iloc[:, 0] == 'Net sales'].iloc[1, lookupn_mix]/1000
df_Revenue_b4 = df_breakdown.loc[df_breakdown.iloc[:, 0] == 'Net sales'].iloc[2, lookupn_mix]/1000
df_Revenue_b5 = 0
df_Revenue_b6 = 0
  • df_Revenue_b1:會員收入 (Membership and other income)
  • df_Revenue_b2:第一個業務部門 (Net sales,可能是 Walmart U.S.)
  • df_Revenue_b3:第二個業務部門 (Net sales,可能是 Walmart International)
  • df_Revenue_b4:第三個業務部門 (Net sales,可能是 Sam's Club)

(3) 營業成本 (Cost of Sales)

df_Total_COGS = df_earnings.loc[df_earnings.iloc[:, 0] == 'Cost of sales'].iloc[:, lookupn].item()/1000
df_GP = df_Total_Revenue - df_Total_COGS
  • 用跟前面同樣的邏輯,把各項費用篩選出來。
  • df_Total_COGS:成本 (Cost of sales)
  • df_GP毛利 (Gross Profit) = 總營收 - 成本

(4) 營業費用 (Operating Expenses)

df_RD = 0
df_SGA = df_earnings.loc[df_earnings.iloc[:, 0].str.contains('selling, general and administrative', case=False, regex=True) & True].iloc[:, lookupn].item()/1000
df_Total_Operating_Expenses = df_RD + df_SGA
  • df_SGA:銷售、管理、行政費用 (Selling, General & Administrative Expenses)
  • df_Total_Operating_Expenses總營業費用 = 研發 (R&D) + SGA

(5) 營業利潤 (Operating Profit)

df_OP = df_GP - df_Total_Operating_Expenses
  • 營業利潤 (Operating Profit) = 毛利 (df_GP) - 營業費用 (df_Total_Operating_Expenses)

(6) 稅前利潤 (Pretax Profit)

df_Pretax_Profit = df_earnings.loc[df_earnings.iloc[:, 0].str.contains('Income before income taxes', case=False, regex=True) & True].iloc[:, lookupn].item()/1000
df_NOEI = df_OP - df_Pretax_Profit
  • df_Pretax_Profit:稅前淨利 (Income before income taxes)
  • df_NOEI:非營業收入 (Non-Operating Income),推測是 df_OP - df_Pretax_Profit

(7) 稅後利潤 (Net Profit)

df_Tax_Expense = df_earnings.loc[df_earnings.iloc[:, 0].str.contains('Provision for income taxes', case=False, regex=True) & True].iloc[:, lookupn].item()/1000
df_AfterTax_Revenue = 0
df_Net_Profit = df_Pretax_Profit - df_Tax_Expense + df_AfterTax_Revenue
  • df_Tax_Expense:所得稅 (Provision for income taxes)
  • .str.contains 找出包含「Provision for income taxes」的rowcase=False 大小寫不拘,regex=True是允許表達式(允許空格、模糊查詢),前面 case=False 大小寫不拘 使用 regex=True 讓 case=False 可以使用。

忽略大小寫(case=False允許正則表達式匹配(regex=True

  • df_Net_Profit淨利 (Net Profit) = 稅前利潤 - 所得稅

(8) 每股盈餘 (EPS)

df_EPS_Basic = df_earnings.loc[df_earnings.iloc[:, 0] == 'Basic'].iloc[:, lookupn].head(1).item()
df_EPS_Diluted = df_earnings.loc[df_earnings.iloc[:, 0] == 'Diluted'].iloc[:, lookupn].head(1).item()
  • df_EPS_Basic:基本每股盈餘 (Basic EPS)
  • df_EPS_Diluted:稀釋後每股盈餘 (Diluted EPS)

總結

這段程式碼的功能:

  1. 原作者爬蟲把 Walmart 財報存下來(data.xlsx)
  2. 解析財報中營收、成本、利潤、稅務等關鍵數據
  3. 將結果存成 Pandas DataFrame,方便後續分析

最後產生的變數:

  • df_Total_Revenue(總營收)
  • df_GP(毛利)
  • df_OP(營業利潤)
  • df_Net_Profit(淨利)
  • df_EPS_Basic(基本每股盈餘)

在我們把這些變數找到後,變成Pandas 格式,整理財務數據,並準備資料來畫 Sankey Diagram,下一篇會再繼續拆解。






雙重身份:越南放大鏡 X 下班資工系 政大東南亞語言學系是我接觸越南語的起點,畢業後找越南外派工作的生活跟資訊時,發現幾乎都是清單式的分享,很難身歷其境。所以我希望「越南放大鏡」可以帶讀者看到更多細節和深入的觀察。 - 下班資工系則是自學資工系的課程內容,記錄實際操作的過程,學習理論的過程。希望可以跟讀者一起成長。
留言
avatar-img
留言分享你的想法!

































































這篇文章記錄了將損益表變數套進Sankey Chart的過程。作者使用Threads上大神分享的練習題,逐步實作並加入註解。文章詳細介紹了每個步驟、使用的套件,以及ipynb檔案的結構和執行環境設定(Google Colab, VS Code)。
網路上很多分享 HTML, CSS 的資源,但很多超級多內容,一開始在學的時候以為每個指令都要背,實際上只要知道大方向跟邏輯,學會查就好了。本篇文章會記錄學習重點,和免費學習的資源。 HTML、CSS、JavaScript 差在哪裡? 👉 HTML = 骨架 🏗️(負責結構) 負責標記內容
本文介紹深度學習框架TensorFlow和PyTorch,以及CPU、GPU、CUDA如何影響運算效能。TensorFlow適合企業應用和大型模型部署,PyTorch更靈活,適合研究和開發。GPU透過CUDA加速運算,大幅提升訓練速度,尤其在大規模數據和深度神經網路訓練時。
很常聽到深度學習,但到底是在學些什麼?今天來跟我一起學習一個重要的概念: 多層感知機(MLP, Multi-Layer Perceptron)是最基礎的神經網路之一。它雖然簡單,卻是許多進階模型的基礎,例如 CNN(卷積神經網路) 和 Transformer(變換器)(某論文),用於處理自然語言模
這篇文章提供關於Git分支(Branch)和合併(Merge)的進階教學,包含建立分支、在不同分支修改檔案、合併分支以及處理合併衝突等步驟,並輔以圖文說明,適合初學者學習。
這篇文章提供 Git 版本控制系統的完整教學,從基礎概念到進階操作,包含圖文並茂的步驟說明和範例,讓讀者可以快速上手並應用於團隊協作及 GitHub Pages 部署網站。
這篇文章記錄了將損益表變數套進Sankey Chart的過程。作者使用Threads上大神分享的練習題,逐步實作並加入註解。文章詳細介紹了每個步驟、使用的套件,以及ipynb檔案的結構和執行環境設定(Google Colab, VS Code)。
網路上很多分享 HTML, CSS 的資源,但很多超級多內容,一開始在學的時候以為每個指令都要背,實際上只要知道大方向跟邏輯,學會查就好了。本篇文章會記錄學習重點,和免費學習的資源。 HTML、CSS、JavaScript 差在哪裡? 👉 HTML = 骨架 🏗️(負責結構) 負責標記內容
本文介紹深度學習框架TensorFlow和PyTorch,以及CPU、GPU、CUDA如何影響運算效能。TensorFlow適合企業應用和大型模型部署,PyTorch更靈活,適合研究和開發。GPU透過CUDA加速運算,大幅提升訓練速度,尤其在大規模數據和深度神經網路訓練時。
很常聽到深度學習,但到底是在學些什麼?今天來跟我一起學習一個重要的概念: 多層感知機(MLP, Multi-Layer Perceptron)是最基礎的神經網路之一。它雖然簡單,卻是許多進階模型的基礎,例如 CNN(卷積神經網路) 和 Transformer(變換器)(某論文),用於處理自然語言模
這篇文章提供關於Git分支(Branch)和合併(Merge)的進階教學,包含建立分支、在不同分支修改檔案、合併分支以及處理合併衝突等步驟,並輔以圖文說明,適合初學者學習。
這篇文章提供 Git 版本控制系統的完整教學,從基礎概念到進階操作,包含圖文並茂的步驟說明和範例,讓讀者可以快速上手並應用於團隊協作及 GitHub Pages 部署網站。
你可能也想看
Google News 追蹤
在此篇中,我們來拿實務的例子作實戰練習,我們會討論如何在Google Colab的環境下,撈取所有台美股的股票代碼,並獲取相關細節,最後將獲取的資訊存取於SQLite資料庫中。
Thumbnail
Python資料視覺化在數據分析中扮演關鍵角色,透過視覺化捕捉數據模式、趨勢和異常,透過Matplotlib等工具創建專業圖表變相對簡單和高效。
Thumbnail
本文介紹瞭如何使用 Python pandas 進行資料分析,包括如何使用 corr() 函數針對數字類型的欄位進行分析,以及如何刪除不需要的欄位和取得想要的小數位數。
Thumbnail
本篇文章分享從製作數據分析報告到PPT簡報技巧,內容包括數據分析報告的構成要素、主體的清晰邏輯設定,以及製作精準PPT簡報的方法。提供從製作報告的過程到提升製作效率的建議,適合初入職場的數據分析新人們參考喔~
Thumbnail
題目敘述 題目會給定一個pandas DataFrame作為輸入,要求我們以原有的資料表為基礎,融合不同的資料欄位。 以product作為index,融合quarter_1,quarter_2,quarter_3,quarter_4 這四個欄位,並且重新命名為quarter,並且將數值欄位名稱重
Thumbnail
題目敘述 題目會給定一個pandas DataFrame作為輸入,要求我們回傳資料表的前3個Row。 題目的原文敘述 測試範例 Example 1: Input: DataFrame employees +-------------+-----------+-------------
在此篇中,我們來拿實務的例子作實戰練習,我們會討論如何在Google Colab的環境下,撈取所有台美股的股票代碼,並獲取相關細節,最後將獲取的資訊存取於SQLite資料庫中。
Thumbnail
Python資料視覺化在數據分析中扮演關鍵角色,透過視覺化捕捉數據模式、趨勢和異常,透過Matplotlib等工具創建專業圖表變相對簡單和高效。
Thumbnail
本文介紹瞭如何使用 Python pandas 進行資料分析,包括如何使用 corr() 函數針對數字類型的欄位進行分析,以及如何刪除不需要的欄位和取得想要的小數位數。
Thumbnail
本篇文章分享從製作數據分析報告到PPT簡報技巧,內容包括數據分析報告的構成要素、主體的清晰邏輯設定,以及製作精準PPT簡報的方法。提供從製作報告的過程到提升製作效率的建議,適合初入職場的數據分析新人們參考喔~
Thumbnail
題目敘述 題目會給定一個pandas DataFrame作為輸入,要求我們以原有的資料表為基礎,融合不同的資料欄位。 以product作為index,融合quarter_1,quarter_2,quarter_3,quarter_4 這四個欄位,並且重新命名為quarter,並且將數值欄位名稱重
Thumbnail
題目敘述 題目會給定一個pandas DataFrame作為輸入,要求我們回傳資料表的前3個Row。 題目的原文敘述 測試範例 Example 1: Input: DataFrame employees +-------------+-----------+-------------