上一篇討論儀表板(Dashboard)製作概念,這次進一步結合資料庫,設計一般企業都適用的儀表板,個案模擬企業年度檢討報告情境,以多維度方式進行業務分析。
Streamlit以Pandas套件的DataFrame為主要資料來源,Pandas也支援以SQL存取資料庫,直接回傳DataFrame,真是一個完美的解決方案,我們馬上來實作一個範例,資料庫採用MS SQL Server的Northwind,為使操作較簡易,自網路找到SQLite版本,資料表關聯如下。
範例1. 仿效上一篇的多頁式網頁,製作圖表並列的功能,程式包括29\app.py、util.py及pages資料夾。
pip install sqlalchemy
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
import streamlit as st
import pandas as pd
from sqlalchemy import create_engine, inspect
from util import *
SQL = 'select * from Category_Sales'
df = get_data(SQL)
CREATE VIEW [Category_Sales] AS
SELECT [Product_Sales].CategoryName,
Sum([Product_Sales].ProductSales) AS CategorySales
FROM [Product_Sales]
GROUP BY [Product_Sales].CategoryName;
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;
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')
pages資料夾其他檔案如法炮製,請自行參閱檔案內容。
執行程式:
streamlit run app.py
以下模擬企業年度檢討報告情境,以多維度方式進行業務分析。
先點擊【商品類別銷售額統計】,報告今年各部門業績,發現今年業績退步。
點擊【商品類別年度比較】,比較去年與今年的業績:發現【穀物】(Grains)、【調味品】(Condiments)部門業績衰退很多。
點擊【商品銷售額統計】,觀察【穀物】(Grains)部門內各項商品部業績,發現最暢銷的商品【愛麗絲公主麵疙瘩】(Gnocchi di nonna Alice)業績不佳。
點擊【商品年度比較】,比較【愛麗絲公主麵疙瘩】去年與今年的業績,發現大幅消退,找到公司整體業績不佳的原因。
可以依此方式再往下鑽(Drill down),追查是哪些客戶流失,進而探討原因,未來可進行服務補強或售價調整。
除了圖表之外,也可以將樞紐分析(Pivot)、地理資訊(GIS)、機器學習預測模型(Machine Learning)導入至儀表板(Dashboard),讓企業戰情室更加完善。Streamlit是一個快速開發的概念,很適合作為POC的先導工具,透過驗證後,可以再移植到其他商用產品,進行更細膩的開發。
本系列的程式碼會統一放在GitHub,本篇的程式放在src/29資料夾,歡迎讀者下載測試,如有錯誤或疏漏,請不吝指正。