用Streamlit快速搭建销售分析看板
不需要写一行HTML/CSS,只要会Python就能把数据脚本变成一个带交互的Web应用,这就是Streamlit最吸引我的地方。对于我们这种不想在前端样式上浪费时间、只想快速验证数据结果的开发者来说,简直是神器。
下一篇
389个测试通过了,但结果依然是错的 →
下面是我实操的一个销售分析看板,重点解决了数据实时过滤和性能缓存的问题。
一、环境准备与数据加载
首先安装必要的库:
pip install streamlit pandas numpy为了避免每次操作侧边栏过滤器都导致整个脚本重新运行(那样太慢了),必须用@st.cache_data来缓存数据加载过程。
import streamlit as st
import pandas as pd
import numpy as np
# 配置页面为宽屏模式
st.set_page_config(page_title="Sales Dashboard", layout="wide")
@st.cache_data
def load_data():
dates = pd.date_range("2025-01-01", periods=180)
regions = ["North", "South", "East", "West"]
df = pd.DataFrame({
"date": np.random.choice(dates, 500),
"region": np.random.choice(regions, 500),
"product": np.random.choice(["A", "B", "C"], 500),
"sales": np.random.randint(100, 5000, 500),
"units": np.random.randint(1, 50, 500),
})
return df.sort_values("date")
df = load_data()二、构建交互式过滤侧边栏
通过st.sidebar可以把所有筛选条件扔到左侧,通过布尔掩码(mask)动态过滤 DataFrame,这种实操方式比写复杂的 SQL 查询要快得多。
st.sidebar.header("Filters")
region_filter = st.sidebar.multiselect("Region", df["region"].unique(), default=df["region"].unique())
product_filter = st.sidebar.multiselect("Product", df["product"].unique(), default=df["product"].unique())
date_range = st.sidebar.date_input("Date range", [df["date"].min(), df["date"].max()])
mask = (
df["region"].isin(region_filter)
& df["product"].isin(product_filter)
& (df["date"] >= pd.to_datetime(date_range[0]))
& (df["date"] <= pd.to_datetime(date_range[1]))
)
filtered = df[mask]三、KPI指标卡与数据可视化
用st.columns可以快速创建分栏布局。对于关键指标,直接用st.metric就能做出很专业的仪表盘效果。
st.title("📈 Sales Dashboard")
st.caption(f"Showing {len(filtered):,} records")
# 创建4列显示核心KPI
c1, c2, c3, c4 = st.columns(4)
c1.metric("Total Sales", f"${filtered['sales'].sum():,.0f}")
c2.metric("Total Units", f"{filtered['units'].sum():,}")
c3.metric("Avg Order", f"${filtered['sales'].mean():,.0f}" if len(filtered) else "$0")
c4.metric("Orders", f"{len(filtered):,}")
st.divider()
# 绘制趋势图和分布图
col1, col2 = st.columns(2)
with col1:
st.subheader("Sales Over Time")
daily = filtered.groupby("date")["sales"].sum()
st.line_chart(daily)
with col2:
st.subheader("Sales by Region")
by_region = filtered.groupby("region")["sales"].sum()
st.bar_chart(by_region)
# 原始数据通过折叠面板展示,避免占用过多空间
with st.expander("View raw data"):
st.dataframe(filtered, use_container_width=True)运行这个应用只需要在终端执行 streamlit run app.py 即可。整个过程从零到部署一个可交互的看板不到 100 行代码,效率提升非常明显。