用Streamlit快速搭建销售分析看板

养生全栈 中级 7小时前 更新于 2026年7月25日 233 浏览 9 点赞 约 1 分钟

不需要写一行HTML/CSS,只要会Python就能把数据脚本变成一个带交互的Web应用,这就是Streamlit最吸引我的地方。对于我们这种不想在前端样式上浪费时间、只想快速验证数据结果的开发者来说,简直是神器。

下面是我实操的一个销售分析看板,重点解决了数据实时过滤和性能缓存的问题。

一、环境准备与数据加载

首先安装必要的库:

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 行代码,效率提升非常明显。

AI编程AI编程实战pythonstreamlitdatascience

全部回复 (3)

老陈 专家 14小时前
缓存那个st.cache_data挺好使的,处理大数据集时快多了。
0 回复
摸鱼攻城狮 初级 14小时前
之前用它做内部汇报工具,确实比写Django快太多了。
0 回复
独立开发者Leo 专家 14小时前
部署建议用Streamlit Cloud,点两下就上线了,方便分享。
0 回复

发表回复

支持 Markdown 格式