Streamlit 是一个用于快速构建数据科学和机器学习 Web 应用的 Python 框架。它让数据科学家和开发者能够用简单的 Python 脚本创建交互式、美观的应用,而无需前端开发经验。
1. Streamlit 安装方法 #
在 Windows 系统下,推荐使用 pip 进行安装。请确保已安装 Python 3.7 及以上版本。
- 打开命令提示符(Win+R 输入 cmd 回车)
升级 pip(可选,但推荐):
python -m pip install --upgrade pip安装 Streamlit:
pip install streamlit验证安装是否成功:
streamlit hello如果浏览器自动打开并显示 Streamlit 示例页面,说明安装成功。
注意事项:
- 如遇权限问题,可尝试在命令前加
python -m或使用管理员权限运行命令提示符。- 建议在虚拟环境(如 venv、conda)中安装和管理依赖,避免与系统包冲突。
1. Streamlit 核心特点 #
- 极简开发:只需 Python 脚本,无需 HTML/CSS/JavaScript
- 即时更新:保存代码后应用自动刷新
- 丰富的组件:内置图表、表格、表单等交互元素
- 数据缓存:优化性能,避免重复计算
- 部署简单:可轻松部署到 Streamlit Cloud 或其他平台
2. 基础组件 #
2.1 文本显示 #
这是 Streamlit 中常用的文本显示方法,包括主标题、标题、子标题、普通文本、Markdown 格式文本以及数学公式的渲染。适用于页面结构搭建和内容展示。
# 导入 Streamlit 库
import streamlit as st
# 显示页面主标题
st.title("我的第一个Streamlit应用")
# 显示一级标题
st.header("这是标题")
# 显示二级标题
st.subheader("这是子标题")
# 显示普通文本
st.text("这是普通文本")
# 显示 Markdown 格式文本
st.markdown("**这是Markdown** *文本*")
# 显示数学公式,支持 LaTeX 语法
st.latex(r"\frac{n!}{k!(n-k)!} = \binom{n}{k}")2.2 数据显示 #
这是如何在 Streamlit 中显示数据,包括交互式表格、静态表格和 JSON 数据。常用于数据分析结果的展示。
# 导入 pandas 库用于数据处理
import pandas as pd
# 创建一个简单的数据框
# A、B 两列分别有 1,2,3 和 4,5,6 三个值
df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]})
# 显示交互式表格,可排序、筛选
df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]})
st.dataframe(df) # 交互式表格
# 显示静态表格
st.table(df) # 静态表格
# 显示 JSON 数据
st.json({"name": "John", "age": 30}) # JSON显示2.3 图表展示 #
这是如何在 Streamlit 中绘制图表,包括使用 Matplotlib 绘图和 Streamlit 内置的折线图、柱状图、面积图。适用于数据可视化。
# 安装 matplotlib 库(如未安装需先执行)
pip install matplotlib# 导入 Matplotlib、NumPy、Streamlit、pandas 库
import matplotlib.pyplot as plt
import numpy as np
import streamlit as st
import pandas as pd
# 生成 0~10 的等间隔 100 个点
x = np.linspace(0, 10, 100)
# 绘制正弦曲线
y = np.sin(x)
plt.plot(x, y)
# 在 Streamlit 页面中显示 Matplotlib 图形
st.pyplot(plt)
# 创建一个包含两列的数据框,A 为等间隔,B 为正弦值
df = pd.DataFrame({"A": np.linspace(0, 10, 100), "B": np.sin(np.linspace(0, 10, 100))})
# 显示折线图
st.line_chart(df)
# 显示柱状图
st.bar_chart(df)
# 显示面积图
st.area_chart(df)3. 交互组件 #
3.1 用户输入 #
这是 Streamlit 中常用的交互输入组件,包括按钮、复选框、单选按钮、下拉选择、多选、滑块和文本输入。通过这些组件可以实现与用户的交互,适用于表单、参数选择等场景。
# 导入 Streamlit 库
import streamlit as st
# 按钮,点击后显示提示文本
if st.button("点击我"):
# 按钮被点击时执行
st.write("按钮被点击了!")
# 复选框,勾选后显示感谢文本
agree = st.checkbox("我同意")
if agree:
# 复选框被勾选时执行
st.write("感谢您的同意!")
# 单选按钮,选择电影类型
genre = st.radio("你最喜欢的电影类型", ("喜剧", "动作", "爱情"))
# 显示选择结果
st.write(f"你选择了: {genre}")
# 下拉选择,选择数字
option = st.selectbox("选择数字", [1, 2, 3])
# 显示选择结果
st.write(f"你选择了: {option}")
# 多选,选择颜色
options = st.multiselect("选择颜色", ["红", "绿", "蓝"])
# 显示选择结果
st.write(f"你选择了: {options}")
# 滑块,选择年龄
age = st.slider("你的年龄", 0, 100, 25)
# 显示选择结果
st.write(f"你的年龄是: {age}")
# 文本输入,输入名字
name = st.text_input("你的名字")
if name:
# 输入后显示问候
st.write(f"你好, {name}!")3.2 文件上传 #
这是如何通过 Streamlit 的文件上传组件上传 CSV 文件,并用 pandas 读取和展示内容。适用于数据导入、用户上传等场景。
# 文件上传组件,限制类型为 csv
uploaded_file = st.file_uploader("上传CSV文件", type="csv")
if uploaded_file is not None:
# 读取上传的 CSV 文件为 DataFrame
df = pd.read_csv(uploaded_file)
# 显示上传的数据
st.write(df)4. 布局管理 #
4.1 侧边栏 #
这是如何使用 Streamlit 的 sidebar 侧边栏功能,将输入控件放置在页面侧边,常用于参数设置、用户信息输入等场景。
# 导入 Streamlit 库
import streamlit as st
# 在侧边栏显示标题
st.sidebar.title("设置面板")
# 在侧边栏添加文本输入框
user_name = st.sidebar.text_input("用户名")
# 在侧边栏添加滑块输入
user_age = st.sidebar.slider("年龄", 0, 100, 30)4.2 列布局 #
这是如何使用 Streamlit 的列布局功能,将页面分为多列并分别放置内容,适用于仪表盘、对比展示等场景。
# 创建两列布局
col1, col2 = st.columns(2)
# 在第一列显示标题和折线图
with col1:
# 显示列标题
st.header("第一列")
# 显示随机数据的折线图
st.line_chart(np.random.randn(10, 2))
# 在第二列显示标题和柱状图
with col2:
# 显示列标题
st.header("第二列")
# 显示随机数据的柱状图
st.bar_chart(np.random.randn(10, 2))4.3 标签页 #
这是如何使用 Streamlit 的 tabs 标签页功能,将内容分组到不同的选项卡中,适用于多视图切换、数据与图表分离展示等场景。
# 导入所需库
import numpy as np
import streamlit as st
import pandas as pd
# 创建数据框,A为等间隔,B为正弦值
df = pd.DataFrame({"A": np.linspace(0, 10, 100), "B": np.sin(np.linspace(0, 10, 100))})
# 创建两个标签页
tab1, tab2 = st.tabs(["图表", "数据"])
# 在第一个标签页显示折线图
with tab1:
st.line_chart(df)
# 在第二个标签页显示数据表
with tab2:
st.dataframe(df)5. 状态管理与会话 #
这是如何使用 Streamlit 的 session_state 实现会话状态管理。可以在多次交互中保存和更新变量,常用于计数器、表单等需要记忆用户操作的场景。
# 导入 Streamlit 库
import streamlit as st
# 如果 session_state 中没有 'counter',则初始化为 0
if "counter" not in st.session_state:
st.session_state.counter = 0
# 按钮,点击后计数加一
if st.button("增加计数"):
st.session_state.counter += 1
# 显示当前计数值
st.write(f"当前计数: {st.session_state.counter}")6. 性能优化 #
6.1 数据缓存 #
这是如何使用 @st.cache_data 装饰器缓存数据加载结果,避免重复读取和计算,提高应用性能。适用于大数据集的加载。
# 导入 pandas 和 Streamlit 库
import pandas as pd
import streamlit as st
# 使用缓存装饰器,缓存数据加载结果
@st.cache_data
def load_data(url):
# 读取指定 url 的 CSV 文件
return pd.read_csv(url)
# 加载数据并显示
# 只会在 url 变化或首次运行时真正读取
df = load_data("https://static.docs-hub.com/users_1753115663538.csv")
st.dataframe(df)6.2 计算缓存 #
这是如何缓存耗时计算结果,避免重复计算,提高响应速度。适用于复杂计算、模型推理等场景。
# 导入 time 和 Streamlit 库
import time
import streamlit as st
# 使用缓存装饰器,缓存计算结果
@st.cache_data
def expensive_computation(a, b):
# 模拟耗时计算
time.sleep(2)
return a * b
# 调用耗时计算函数
result = expensive_computation(5, 10)
# 显示计算结果
st.write(result)7. 部署应用 #
本地运行:
streamlit run app.py部署到 Streamlit Cloud:
- 将代码推送到 GitHub 仓库
- 登录 share.streamlit.io
- 选择仓库和主文件
其他部署选项:
- Docker 容器
- AWS/Azure/GCP
- Heroku
8. 实际应用示例 #
这是一个完整的数据分析仪表板应用,包含数据加载、侧边栏交互、数据筛选、Plotly 绘图和数据表展示。适用于实际数据分析、可视化展示等场景。
# 安装 plotly 库(如未安装需先执行)
pip install plotly# 导入所需库
import streamlit as st
import pandas as pd
import plotly.express as px
# 加载数据,使用缓存避免重复下载
@st.cache_data
def load_data():
# 从远程 CSV 加载数据
return pd.read_csv("https://raw.githubusercontent.com/plotly/datasets/master/gapminderDataFiveYear.csv")
# 调用数据加载函数
df = load_data()
# 侧边栏添加控制面板
st.sidebar.header("控制面板")
# 侧边栏选择年份
year = st.sidebar.slider("选择年份", int(df['year'].min()), int(df['year'].max()))
# 侧边栏多选大洲
continent = st.sidebar.multiselect("选择大洲", df['continent'].unique())
# 根据年份筛选数据
filtered_df = df[(df['year'] == year)]
# 如果选择了大洲,则进一步筛选
if continent:
filtered_df = filtered_df[filtered_df['continent'].isin(continent)]
# 主界面显示标题
st.title("世界发展指标")
# 显示当前年份
st.write(f"显示 {year} 年数据")
# 绘制气泡图
fig = px.scatter(
filtered_df, x="gdpPercap", y="lifeExp",
size="pop", color="continent", hover_name="country",
log_x=True, size_max=60
)
# 显示 Plotly 图表
st.plotly_chart(fig)
# 显示原始数据表
st.subheader("原始数据")
st.dataframe(filtered_df)9. 学习资源 #
Streamlit 通过其简洁的 API 和强大的功能,让数据科学家能够快速将分析结果转化为交互式 Web 应用,极大地提高了工作效率和成果展示能力。