iT邦幫忙

2024 iThome 鐵人賽

DAY 29
0
Python

Python 錦囊密技系列 第 29

【Python錦囊㊙️技29】輕鬆建構儀表板(Dashboard) -- 個案模擬

  • 分享至 

  • xImage
  •  

上一篇討論儀表板(Dashboard)製作概念,這次進一步結合資料庫,設計一般企業都適用的儀表板,個案模擬企業年度檢討報告情境,以多維度方式進行業務分析。

資料庫存取

Streamlit以Pandas套件的DataFrame為主要資料來源,Pandas也支援以SQL存取資料庫,直接回傳DataFrame,真是一個完美的解決方案,我們馬上來實作一個範例,資料庫採用MS SQL Server的Northwind,為使操作較簡易,自網路找到SQLite版本,資料表關聯如下。
https://ithelp.ithome.com.tw/upload/images/20240927/20001976UhW6Iyotdx.png

範例1. 仿效上一篇的多頁式網頁,製作圖表並列的功能,程式包括29\app.py、util.py及pages資料夾。

  1. 安裝SQLAlchemy套件:它是Pandas執行SQL的基礎套件。
pip install sqlalchemy
  1. app.py與上一篇大同小異。
  2. util.py負責讀取資料庫:
import pandas as pd
from sqlalchemy import create_engine, inspect
import streamlit as st

@st.cache_data
def get_data(SQL):
    engine = create_engine('sqlite:///./northwind_ORM.db', echo=False)
    df=pd.read_sql(SQL, engine)
    return df
  1. pages\1_📈_商品類別銷售額統計.py:依商品類別統計銷售額。
  • 引入套件及util.py。
import streamlit as st
import pandas as pd
from sqlalchemy import create_engine, inspect
from util import *
  • 撰寫SQL,取得資料:Category_Sales為View,在資料庫內定義。
SQL = 'select * from Category_Sales'
df = get_data(SQL)
  • Category_Sales View的內容如下,呼叫另一個Product_Sales View。
CREATE VIEW [Category_Sales] AS
SELECT     [Product_Sales].CategoryName, 
       Sum([Product_Sales].ProductSales) AS CategorySales
FROM [Product_Sales]
GROUP BY [Product_Sales].CategoryName;
  • Product_Sales View的內容如下,連結一堆資料表。
CREATE VIEW [Product_Sales] AS
SELECT Categories.CategoryName, 
       Products.ProductName, 
       Sum(([Order Details].UnitPrice*Quantity*(1-Discount)/100)*100) AS ProductSales
FROM Categories
 JOIN    Products On Categories.CategoryID = Products.CategoryID
    JOIN  [Order Details] on Products.ProductID = [Order Details].ProductID     
     JOIN  [Orders] on Orders.OrderID = [Order Details].OrderID 
WHERE Orders.ShippedDate Between DATETIME('2017-01-01') And DATETIME('2017-12-31')
GROUP BY Categories.CategoryName, Products.ProductName;
  • 製作UI:使用st.bar_chart繪製長條圖。
Categories = st.multiselect(
    "商品類別:", df['CategoryName'].values, df['CategoryName'].values
)
if not Categories:
    st.error("Please select at least one category.")
else:
    df = df.query('CategoryName in @Categories')
    st.bar_chart(data=df, x='CategoryName', y='CategorySales')
  1. pages資料夾其他檔案如法炮製,請自行參閱檔案內容。

  2. 執行程式:

streamlit run app.py
  1. 執行結果:選單如下。
    https://ithelp.ithome.com.tw/upload/images/20241013/20001976yvhay5UhOf.png

模擬企業年度檢討報告

以下模擬企業年度檢討報告情境,以多維度方式進行業務分析。

  1. 測試情境:模擬企業年度檢討報告。
  • 先點擊【商品類別銷售額統計】,報告今年各部門業績,發現今年業績退步。
    https://ithelp.ithome.com.tw/upload/images/20241013/20001976h1QfIZ9d1P.png

  • 點擊【商品類別年度比較】,比較去年與今年的業績:發現【穀物】(Grains)、【調味品】(Condiments)部門業績衰退很多。
    https://ithelp.ithome.com.tw/upload/images/20241013/20001976vfiSYXQ6UI.png

  • 點擊【商品銷售額統計】,觀察【穀物】(Grains)部門內各項商品部業績,發現最暢銷的商品【愛麗絲公主麵疙瘩】(Gnocchi di nonna Alice)業績不佳。
    https://ithelp.ithome.com.tw/upload/images/20241013/20001976mab7DDtc20.png

  • 點擊【商品年度比較】,比較【愛麗絲公主麵疙瘩】去年與今年的業績,發現大幅消退,找到公司整體業績不佳的原因。
    https://ithelp.ithome.com.tw/upload/images/20241013/20001976WcIlZd2J5F.png

  • 可以依此方式再往下鑽(Drill down),追查是哪些客戶流失,進而探討原因,未來可進行服務補強或售價調整。

結語

除了圖表之外,也可以將樞紐分析(Pivot)、地理資訊(GIS)、機器學習預測模型(Machine Learning)導入至儀表板(Dashboard),讓企業戰情室更加完善。Streamlit是一個快速開發的概念,很適合作為POC的先導工具,透過驗證後,可以再移植到其他商用產品,進行更細膩的開發。

本系列的程式碼會統一放在GitHub,本篇的程式放在src/29資料夾,歡迎讀者下載測試,如有錯誤或疏漏,請不吝指正。


上一篇
【Python錦囊㊙️技28】輕鬆建構儀表板(Dashboard)
下一篇
【Python錦囊㊙️技30】程式設計師要懂數學與統計嗎?
系列文
Python 錦囊密技30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言