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,下一篇會再繼續拆解。






留言
avatar-img
越南放大鏡 X 下班資工系
60會員
108內容數
雙重身份:越南放大鏡 X 下班資工系 政大東南亞語言學系是我接觸越南語的起點,畢業後找越南外派工作的生活跟資訊時,發現幾乎都是清單式的分享,很難身歷其境。所以我希望「越南放大鏡」可以帶讀者看到更多細節和深入的觀察。 - 下班資工系則是自學資工系的課程內容,記錄實際操作的過程,學習理論的過程。希望可以跟讀者一起成長。
2025/04/24
本系列文章將循序漸進地介紹 JavaScript 的核心概念,從基礎語法到進階應用,例如非同步程式設計和 React 基礎。內容淺顯易懂,並使用生活化的比喻幫助讀者理解,搭配程式碼範例,適合 JavaScript 初學者學習。
Thumbnail
2025/04/24
本系列文章將循序漸進地介紹 JavaScript 的核心概念,從基礎語法到進階應用,例如非同步程式設計和 React 基礎。內容淺顯易懂,並使用生活化的比喻幫助讀者理解,搭配程式碼範例,適合 JavaScript 初學者學習。
Thumbnail
2025/04/21
本文介紹行動通訊網路的演進歷史,從1G到5G,並說明ITU與3GPP在制定通訊規格上的重要角色,以及5G的三大關鍵應用場景:URLLC、eMBB和mMTC。
Thumbnail
2025/04/21
本文介紹行動通訊網路的演進歷史,從1G到5G,並說明ITU與3GPP在制定通訊規格上的重要角色,以及5G的三大關鍵應用場景:URLLC、eMBB和mMTC。
Thumbnail
2025/04/11
這篇文章說明網路的七層模型、IP 位址、通訊埠、TCP/UDP 協定、HTTP 協定、HTTP 狀態碼以及 WebSocket,並解釋它們之間的關係與互動方式。文中包含許多圖表和範例,幫助讀者理解這些網路概念。
Thumbnail
2025/04/11
這篇文章說明網路的七層模型、IP 位址、通訊埠、TCP/UDP 協定、HTTP 協定、HTTP 狀態碼以及 WebSocket,並解釋它們之間的關係與互動方式。文中包含許多圖表和範例,幫助讀者理解這些網路概念。
Thumbnail
看更多
你可能也想看
Thumbnail
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
Python資料視覺化在數據分析中扮演關鍵角色,透過視覺化捕捉數據模式、趨勢和異常,透過Matplotlib等工具創建專業圖表變相對簡單和高效。
Thumbnail
Python資料視覺化在數據分析中扮演關鍵角色,透過視覺化捕捉數據模式、趨勢和異常,透過Matplotlib等工具創建專業圖表變相對簡單和高效。
Thumbnail
🎗️本次主題成果展示:人力資訊分析 上集回顧 🔗EXCEL儀表板 | 人力資訊分析儀表板 #1 | 上手等級:入門🔗 🔗EXCEL儀表板 | 人力資訊分析儀表板 #2 | 上手等級:入門🔗 🔗EXCEL儀表板 | 人力資訊分析儀表板 #3 | 上手等級:入門🔗
Thumbnail
🎗️本次主題成果展示:人力資訊分析 上集回顧 🔗EXCEL儀表板 | 人力資訊分析儀表板 #1 | 上手等級:入門🔗 🔗EXCEL儀表板 | 人力資訊分析儀表板 #2 | 上手等級:入門🔗 🔗EXCEL儀表板 | 人力資訊分析儀表板 #3 | 上手等級:入門🔗
Thumbnail
如何用Python將DataFrame中的資料擷取維新的DataFrame?
Thumbnail
如何用Python將DataFrame中的資料擷取維新的DataFrame?
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News