Python 开源库 Streamlit 详解与实战
Streamlit 是一个用于快速构建数据科学 Web 应用的 Python 开源框架。 Streamlit 的安装、基础用法、核心功能(文本展示、数据可视化、交互组件、文件上传、布局)、高级特性(状态管理、主题定制、模型集成)以及部署方式。通过示例代码展示了如何从零创建应用,并结合电商数据分析与机器学习模型演示案例,帮助开发者高效实现数据驱动项目的开发与落地。

Streamlit 是一个用于快速构建数据科学 Web 应用的 Python 开源框架。 Streamlit 的安装、基础用法、核心功能(文本展示、数据可视化、交互组件、文件上传、布局)、高级特性(状态管理、主题定制、模型集成)以及部署方式。通过示例代码展示了如何从零创建应用,并结合电商数据分析与机器学习模型演示案例,帮助开发者高效实现数据驱动项目的开发与落地。

在当今数据驱动的时代,数据科学家和机器学习工程师常常面临一个挑战:如何将他们复杂而精妙的数据分析和模型成果,以一种直观、交互且易于理解的方式展示给更广泛的受众。传统的 Web 开发技术虽然强大,但对于专注于数据处理和算法的专业人员来说,往往需要投入大量的时间和精力去学习和掌握 HTML、CSS、JavaScript 等前端技术,这无疑增加了额外的负担,分散了他们在核心业务上的注意力。
Streamlit 的出现,犹如一道曙光,为这一困境提供了完美的解决方案。它是一个开源的 Python 框架,旨在让数据科学家和机器学习工程师能够快速、轻松地创建交互式 Web 应用程序,而无需深厚的前端开发背景。通过 Streamlit,只需使用熟悉的 Python 语言,就能将数据分析脚本转化为功能齐全、美观大方的 Web 应用,实现数据可视化、用户交互以及模型部署等多种功能,极大地提高了工作效率,加速了数据驱动项目的开发和落地。
安装 Streamlit 非常简单,如果你已经安装了 Python 和 pip(Python 的包管理工具),那么在命令行中输入以下命令即可完成安装:
pip install streamlit
安装过程中,pip 会自动下载并安装 Streamlit 及其所有依赖项。安装完成后,可以通过以下命令来验证安装是否成功:
streamlit hello
执行上述命令后,Streamlit 会启动一个示例应用程序,并在默认浏览器中打开该应用。这个示例应用展示了 Streamlit 的一些基本功能和特性,让你对 Streamlit 有一个初步的直观感受。如果能够正常看到示例应用的页面,说明 Streamlit 已经成功安装在你的系统中,可以开始使用它来创建自己的应用程序了。
下面我们通过一个简单的 "Hello, Streamlit!" 应用来了解 Streamlit 应用的基本结构和创建过程。创建一个新的 Python 文件,例如命名为 hello_streamlit.py,在文件中输入以下代码:
import streamlit as st
# 设置页面标题
st.title('Hello, Streamlit!')
# 显示一段文本
st.write('This is my first Streamlit app.')
上述代码中,首先导入了 Streamlit 库,并将其别名为 st,这是使用 Streamlit 的标准做法。然后使用 st.title() 函数设置了应用的页面标题为 "Hello, Streamlit!",st.write() 函数用于在页面上显示一段文本内容。
保存好代码后,在命令行中进入到该 Python 文件所在的目录,然后执行以下命令来运行这个 Streamlit 应用:
streamlit run hello_streamlit.py
命令执行后,Streamlit 会启动一个本地服务器,并自动在默认浏览器中打开应用页面。你将看到页面上显示着设置的标题和文本内容,这就是一个最简单的 Streamlit 应用。每次修改代码并保存后,Streamlit 应用会自动实时更新页面显示,无需手动重启服务器,这大大提高了开发效率,让你能够快速看到代码修改后的效果。
当你执行 streamlit run 命令时,Streamlit 会启动一个本地服务器。这个服务器会读取你编写的 Python 脚本,并解析其中的 Streamlit 代码。Streamlit 会根据代码中定义的各种元素(如标题、文本、图表、交互组件等),在浏览器端生成相应的 HTML、CSS 和 JavaScript 代码,从而构建出一个完整的 Web 应用界面。
Streamlit 的一个重要特性是实时更新。它会持续监控 Python 脚本文件的变化,一旦检测到文件被修改并保存,就会立即重新运行脚本,并将新的界面更新推送到浏览器端。这种实时反馈机制使得开发过程变得非常流畅,你可以快速尝试不同的想法,修改代码后马上就能看到效果,就像在使用一个交互式的 Python shell 一样方便。同时,Streamlit 还负责处理与浏览器的通信、用户输入的接收和处理等底层细节,开发者无需关心这些复杂的 Web 开发技术,只需专注于用 Python 编写应用的逻辑和展示内容即可。
在 Streamlit 中,文本和标题的展示是构建应用的基础。除了前面示例中使用的 st.title() 和 st.write() 函数外,还有其他多种方式来呈现不同样式和层次的文本。
st.title(),通常用于划分页面的主要部分。例如:st.header('This is a header')
st.header(),用于进一步细分内容。示例:st.subheader('This is a subheader')
st.markdown('### This is a Markdown - style header')
st.markdown('* This is an item in an unordered list')
st.markdown('1. This is an item in an ordered list')
通过 st.markdown(),你可以轻松实现文本的加粗、斜体、链接、图片嵌入等复杂格式。例如,要显示加粗文本可以使用 **text**,显示斜体文本可以使用 *text*,添加链接可以使用 [link text](url) 的格式。
数据可视化是 Streamlit 的一大核心功能,它使得数据科学家能够将复杂的数据以直观、易懂的图表形式展示出来。Streamlit 支持多种流行的数据可视化库,如 Matplotlib、Seaborn、Plotly、Altair 等,并且能够与这些库无缝集成,让你可以使用熟悉的绘图语法在 Streamlit 应用中创建精美的可视化图表。
st.pyplot() 函数将图表显示在 Streamlit 应用中。例如,绘制一个简单的折线图:import streamlit as st
import matplotlib.pyplot as plt
import numpy as np
# 生成数据
x = np.linspace(0, 10, 100)
y = np.sin(x)
# 创建图表
fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_title('Sine Wave')
ax.set_xlabel('X')
ax.set_ylabel('Y')
# 在 Streamlit 中显示图表
st.pyplot(fig)
import streamlit as st
import seaborn as sns
import pandas as pd
import numpy as np
# 生成数据
data = pd.DataFrame({'x': np.random.randn(100), 'y': np.random.randn(100)})
# 创建 Seaborn 散点图
fig, ax = plt.subplots()
sns.scatterplot(x='x', y='y', data=data, ax=ax)
ax.set_title('Scatter Plot')
# 在 Streamlit 中显示图表
st.pyplot(fig)
st.plotly_chart() 函数展示图表。例如,创建一个 Plotly 的柱状图:import streamlit as st
import plotly.express as px
import pandas as pd
# 生成数据
data = pd.DataFrame({
'Category': ['A', 'B', 'C', 'D'],
'Value': [25, 40, 15, 30]
})
# 创建 Plotly 柱状图
fig = px.bar(data, x='Category', y='Value', title='Bar Chart')
# 在 Streamlit 中显示图表
st.plotly_chart(fig)
st.altair_chart() 函数进行展示。例如,绘制一个 Altair 的折线图:import streamlit as st
import altair as alt
import pandas as pd
import numpy as np
# 生成数据
data = pd.DataFrame({
'x': np.linspace(0, 10, 100),
'y': np.sin(np.linspace(0, 10, 100))
})
# 创建 Altair 折线图
chart = alt.Chart(data).mark_line().encode(
x='x',
y='y'
).properties(title='Altair Line Chart')
# 在 Streamlit 中显示图表
st.altair_chart(chart)
Streamlit 提供了丰富的交互式组件,这些组件允许用户与应用进行交互,从而实现更加动态和个性化的数据展示与分析。通过这些交互式组件,用户可以输入数据、选择选项、调整参数等,应用会根据用户的操作实时更新显示内容。
st.button() 函数用于创建一个按钮。当按钮被点击时,可以触发相应的操作。例如,创建一个简单的按钮,并在按钮被点击时显示一条消息:import streamlit as st
if st.button('Click me'):
st.write('You clicked the button!')
st.text_input() 函数创建一个文本输入框,用户可以在其中输入文本内容。应用可以获取用户输入的文本并进行处理。例如,获取用户输入的名字并进行问候:import streamlit as st
name = st.text_input('Enter your name')
if name:
st.write(f'Hello, {name}!')
st.number_input() 函数用于创建一个数字输入框,用户可以在其中输入数字。可以设置输入框的最小值、最大值、默认值等参数。例如,创建一个数字输入框,让用户输入年龄:import streamlit as st
age = st.number_input('Enter your age', min_value=0, max_value=120, value=25)
st.write(f'Your age is {age}')
st.slider() 函数创建一个滑块,用户可以通过拖动滑块来选择一个范围内的值。可以设置滑块的最小值、最大值、步长、默认值等。例如,使用滑块来调整正弦波的频率:import streamlit as st
import numpy as np
import matplotlib.pyplot as plt
# 设置页面标题
st.title('Sine Wave with Adjustable Frequency')
# 创建滑块,允许用户调整频率
frequency = st.slider('Select frequency:', 1, 10, 5)
# 生成数据
x = np.linspace(0, 2 * np.pi, 1000)
y = np.sin(frequency * x)
# 绘制图表
fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_title('Sine Wave')
ax.set_xlabel('X')
ax.set_ylabel('Y')
# 在 Streamlit 中显示图表
st.pyplot(fig)
st.selectbox() 函数创建一个下拉选择框,用户可以从预定义的选项中选择一个。例如,创建一个下拉选择框,让用户选择喜欢的颜色:import streamlit as st
colors = ['Red', 'Green', 'Blue', 'Yellow']
selected_color = st.selectbox('Select your favorite color', colors)
st.write(f'You selected {selected_color}')
st.multiselect() 函数创建一个多选框,用户可以从多个选项中选择一个或多个。例如,创建一个多选框,让用户选择喜欢的水果:import streamlit as st
fruits = ['Apple', 'Banana', 'Orange', 'Mango', 'Strawberry']
selected_fruits = st.multiselect('Select your favorite fruits', fruits)
st.write(f'You selected {selected_fruits}')
st.checkbox() 函数创建一个复选框,用户可以勾选或取消勾选。例如,使用复选框来控制图表的显示:import streamlit as st
import matplotlib.pyplot as plt
import numpy as np
# 设置页面标题
st.title('Show/Hide Plot')
# 创建复选框
show_plot = st.checkbox('Show plot')
if show_plot:
# 生成数据
x = np.linspace(0, 10, 100)
y = np.sin(x)
# 绘制图表
fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_title('Sine Wave')
ax.set_xlabel('X')
ax.set_ylabel('Y')
# 在 Streamlit 中显示图表
st.pyplot(fig)
在数据处理和分析中,经常需要处理用户上传的文件。Streamlit 提供了便捷的文件上传功能,允许用户将本地文件上传到应用中进行处理。使用 st.file_uploader() 函数可以创建一个文件上传组件。例如,创建一个文件上传组件,用于上传 CSV 文件,并读取和显示文件内容:
import streamlit as st
import pandas as pd
# 设置页面标题
st.title('File Upload Example')
# 创建文件上传组件
uploaded_file = st.file_uploader('Choose a CSV file', type=['csv'])
if uploaded_file is not None:
try:
# 使用 pandas 读取 CSV 文件
data = pd.read_csv(uploaded_file)
st.write('File uploaded successfully. Here is the data:')
st.dataframe(data)
except Exception as e:
st.write(f'Error reading the file: {e}')
上述代码中,st.file_uploader() 函数的第一个参数是上传组件的标题,type=['csv'] 表示只允许上传 CSV 文件。当用户选择并上传一个文件后,uploaded_file 变量将包含上传文件的相关信息。通过 pd.read_csv(uploaded_file) 可以读取 CSV 文件的内容,并使用 st.dataframe() 函数将数据以表格形式显示在应用页面上。如果读取文件过程中出现错误,会捕获异常并显示相应的错误信息。Streamlit 还支持上传其他类型的文件,如 Excel 文件(使用 pandas 的 read_excel 函数读取)、图像文件(使用 PIL 库或 OpenCV 库进行处理)等,具体的处理方式根据文件类型和业务需求而定。
合理的布局和容器使用可以使 Streamlit 应用的界面更加整洁、美观和易于使用。Streamlit 提供了多种布局和容器选项,帮助你更好地组织应用中的元素。
st.columns() 函数可以将页面分为多列,在每一列中可以独立放置不同的组件。例如,创建两列布局,在第一列中显示一个标题,在第二列中显示一个按钮:import streamlit as st
# 创建两列布局
col1, col2 = st.columns(2)
with col1:
st.title('Column 1')
with col2:
if st.button('Button in Column 2'):
st.write('Button in Column 2 clicked')
st.columns() 函数接受一个整数参数,表示要创建的列数。这里将页面分为两列,通过 with 语句分别在不同的列中添加组件。列的宽度会根据内容自动调整,也可以通过传递一个包含列宽比例的列表来指定列宽。例如,col1, col2 = st.columns([3, 1]) 表示第一列宽度是第二列宽度的三倍。
st.container() 函数创建一个容器,你可以在容器中放置多个组件,将相关的组件组合在一起。容器可以帮助你更好地组织和管理应用的结构。例如,创建一个容器,在容器中添加标题、文本和按钮:import streamlit as st
# 创建容器
container = st.container()
with container:
st.title('Container Example')
st.write('This is some text inside the container.')
if st.button('Button in Container'):
st.write('Button in container clicked')
容器可以嵌套使用,从而创建更复杂的布局结构。例如,可以在一个容器中再创建列布局,然后在列中放置其他组件。
st.sidebar 属性可以在侧边栏中添加各种组件。例如,在侧边栏中添加一个标题和一个下拉选择框:import streamlit as st
# 在侧边栏添加标题
st.sidebar.title("应用设置")
# 在侧边栏添加下拉选择框
option = st.sidebar.selectbox(
'请选择一个选项',
['选项 1', '选项 2', '选项 3', '选项 4']
)
# 在主界面显示选择结果
st.write(f'你选择了:{option}')
在复杂的 Streamlit 应用中,管理用户交互产生的状态至关重要。Streamlit 提供了 st.session_state 来帮助开发者处理状态相关的问题。st.session_state 是一个类似于字典的对象,用于存储和管理应用运行过程中的各种状态信息,比如用户输入的值、按钮的点击次数、数据的处理中间结果等。
举个例子,实现一个简单的计数器功能:
import streamlit as st
if 'count' not in st.session_state:
st.session_state.count = 0
def increment():
st.session_state.count += 1
st.button('Increment', on_click=increment)
st.write(f'Count: {st.session_state.count}')
在上述代码中,首先检查 st.session_state 中是否存在 count 键,如果不存在则初始化其值为 0。当用户点击按钮时,触发 increment 函数,更新 st.session_state.count 的值,从而实现计数器的功能。并且,即使页面因用户的其他操作重新加载,st.session_state 中的状态也会被保留,确保应用状态的一致性。
Streamlit 默认提供了简洁的主题样式,但开发者可以根据项目需求和个人喜好来自定义应用的主题。通过创建并配置 .streamlit/config.toml 文件,能够修改应用的背景颜色、字体样式、组件颜色等外观属性。
创建 .streamlit 文件夹(如果不存在),在其中新建 config.toml 文件,并添加以下内容来修改主题:
[theme]
base = "light"
primaryColor = "#FF5733"
backgroundColor = "#F8F9FA"
secondaryBackgroundColor = "#E9ECEF"
textColor = "#212529"
font = "sans serif"
上述配置中,base 设置主题为浅色模式;primaryColor 定义了主要颜色;backgroundColor 和 secondaryBackgroundColor 分别设置背景和二级背景颜色;textColor 设置文本颜色;font 指定字体。保存文件后,重新运行 Streamlit 应用,就能看到自定义主题的效果。此外,还可以通过编程的方式在 Python 代码中动态设置主题,为应用提供更灵活的外观定制方案。
Streamlit 强大之处还在于能够轻松集成机器学习模型,将模型预测功能嵌入到 Web 应用中,实现模型的可视化部署。以 Scikit-learn 库训练的简单线性回归模型为例,展示如何进行集成:
import streamlit as st
import numpy as np
from sklearn.linear_model import LinearRegression
# 生成模拟数据
x = np.array([1, 2, 3, 4, 5]).reshape(-1, 1)
y = np.array([2, 4, 6, 8, 10])
# 训练线性回归模型
model = LinearRegression()
model.fit(x, y)
# Streamlit 应用
st.title("线性回归预测")
user_input = st.number_input("输入 x 值", min_value=0.0, max_value=10.0)
if user_input:
input_data = np.array([user_input]).reshape(-1, 1)
prediction = model.predict(input_data)
st.write(f"预测的 y 值为:{prediction[0]}")
在这个示例中,先使用 Scikit-learn 训练一个简单的线性回归模型,然后在 Streamlit 应用中创建一个数字输入框接收用户输入的 x 值,将该值传入训练好的模型进行预测,并展示预测结果。实际应用中,无论是复杂的深度学习模型,还是其他机器学习模型,都可以通过类似的方式与 Streamlit 集成,为用户提供直观的模型预测交互界面。
完成本地开发后,需要将 Streamlit 应用部署到服务器上,以便让更多用户访问。以下是几种常见的部署方式:
Streamlit 社区云是最便捷的部署方式,它完全免费且无需配置服务器。只需将应用代码上传到 GitHub 仓库,然后在 Streamlit 社区云平台进行简单的链接设置,即可完成部署。具体步骤如下:
Heroku 是一个流行的云平台即服务(PaaS),支持多种编程语言应用的部署。部署 Streamlit 应用到 Heroku 的步骤如下:
web: streamlit run [your_app.py]([your_app.py] 替换为实际的应用主文件)。除了上述方式,还可以将 Streamlit 应用部署到 AWS、Google Cloud Platform、Microsoft Azure 等主流云平台。以 AWS 为例,通常需要创建 EC2 实例或使用 AWS Elastic Beanstalk 等服务,配置 Python 运行环境,安装 Streamlit 及其依赖,上传应用代码,并进行端口映射等相关配置,从而实现应用的稳定运行和对外访问。
某电商公司使用 Streamlit 开发了一个数据探索应用,帮助业务人员快速分析销售数据。通过文件上传功能,业务人员可以上传不同时间段的销售 CSV 文件。应用中利用交互式组件,如日期选择器筛选销售日期范围,下拉选择框选择产品类别;结合数据可视化库,以柱状图展示各产品销售额对比,折线图呈现销售额随时间的变化趋势。通过这些功能,业务人员能够直观地发现销售数据中的规律和问题,为决策提供有力支持。
一个机器学习研究团队开发了一个图像分类模型,使用 Streamlit 创建应用来演示模型的效果。用户可以通过文件上传功能上传本地图片,应用将图片传入模型进行分类预测,并在页面上显示原始图片和预测结果。同时,应用还展示了模型的训练数据信息、评估指标等内容,方便用户了解模型的性能和特点,这种直观的演示方式有助于向非技术人员展示机器学习模型的价值。
Streamlit 凭借其简单易用、功能强大的特点,成为数据科学家和机器学习工程师进行快速原型开发和应用部署的首选工具之一。从基础的安装使用、丰富的核心功能,到高级的状态管理、主题定制以及与机器学习模型的集成,再到多种灵活的部署方式和丰富的实际应用案例,Streamlit 为数据驱动的 Web 应用开发提供了一站式解决方案。
随着开源社区的不断发展和更新迭代,未来 Streamlit 有望引入更多创新功能,进一步优化性能和用户体验,与更多的工具和平台实现深度集成。无论是数据科学领域的新手还是经验丰富的专业人士,都能在 Streamlit 的世界中找到属于自己的应用开发乐趣和价值,让数据和模型以更直观、更交互的方式展现出来,推动数据驱动的创新和发展。
Streamlit 采用 Apache License 2.0 开源许可协议,完整许可文本见:https://github.com/streamlit/streamlit/blob/main/LICENSE

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online