目录
一、引言
在当今数据驱动的时代,数据科学家和机器学习工程师常常面临一个挑战:如何将他们复杂而精妙的数据分析和模型成果,以一种直观、交互且易于理解的方式展示给更广泛的受众。传统的 Web 开发技术虽然强大,但对于专注于数据处理和算法的专业人员来说,往往需要投入大量的时间和精力去学习和掌握 HTML、CSS、JavaScript 等前端技术,这无疑增加了额外的负担,分散了他们在核心业务上的注意力。
Streamlit 的出现,犹如一道曙光,为这一困境提供了完美的解决方案。它是一个开源的 Python 框架,旨在让数据科学家和机器学习工程师能够快速、轻松地创建交互式 Web 应用程序,而无需深厚的前端开发背景。通过 Streamlit,只需使用熟悉的 Python 语言,就能将数据分析脚本转化为功能齐全、美观大方的 Web 应用,实现数据可视化、用户交互以及模型部署等多种功能,极大地提高了工作效率,加速了数据驱动项目的开发和落地。
二、Streamlit 基础入门
2.1 安装 Streamlit
安装 Streamlit 非常简单,如果你已经安装了 Python 和 pip(Python 的包管理工具),那么在命令行中输入以下命令即可完成安装:
pip install streamlit
安装过程中,pip 会自动下载并安装 Streamlit 及其所有依赖项。安装完成后,可以通过以下命令来验证安装是否成功:
streamlit hello
执行上述命令后,Streamlit 会启动一个示例应用程序,并在默认浏览器中打开该应用。这个示例应用展示了 Streamlit 的一些基本功能和特性,让你对 Streamlit 有一个初步的直观感受。如果能够正常看到示例应用的页面,说明 Streamlit 已经成功安装在你的系统中,可以开始使用它来创建自己的应用程序了。
2.2 第一个 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 应用会自动实时更新页面显示,无需手动重启服务器,这大大提高了开发效率,让你能够快速看到代码修改后的效果。
2.3 Streamlit 应用的运行机制
当你执行streamlit run命令时,Streamlit 会启动一个本地服务器。这个服务器会读取你编写的 Python 脚本,并解析其中的 Streamlit 代码。Streamlit 会根据代码中定义的各种元素(如标题、文本、图表、交互组件等),在浏览器端生成相应的 HTML、CSS 和 JavaScript 代码,从而构建出一个完整的 Web 应用界面。
Streamlit 的一个重要特性是实时更新。它会持续监控 Python 脚本文件的变化,一旦检测到文件被修改并保存,就会立即重新运行脚本,并将新的界面更新推送到浏览器端。这种实时反馈机制使得开发过程变得非常流畅,你可以快速尝试不同的想法,修改代码后马上就能看到效果,就像在使用一个交互式的 Python shell 一样方便。同时,Streamlit 还负责处理与浏览器的通信、用户输入的接收和处理等底层细节,开发者无需关心这些复杂的 Web 开发技术,只需专注于用 Python 编写应用的逻辑和展示内容即可。
三、Streamlit 核心功能详解
3.1 丰富的文本与标题展示
在 Streamlit 中,文本和标题的展示是构建应用的基础。除了前面示例中使用的st.title()和st.write()函数外,还有其他多种方式来呈现不同样式和层次的文本。
- st.header():用于创建一级标题,字体大小小于st.title(),通常用于划分页面的主要部分。例如:
st.header('This is a header')
- st.subheader():创建二级标题,字体大小小于st.header(),用于进一步细分内容。示例:
st.subheader('This is a subheader')
- st.markdown():这个函数非常强大,它允许你使用 Markdown 语法来编写文本内容。Markdown 是一种轻量级的标记语言,通过简单的符号(如#表示标题,*表示列表等)就能创建出具有丰富格式的文本。例如:
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)的格式。
3.2 数据可视化
数据可视化是 Streamlit 的一大核心功能,它使得数据科学家能够将复杂的数据以直观、易懂的图表形式展示出来。Streamlit 支持多种流行的数据可视化库,如 Matplotlib、Seaborn、Plotly、Altair 等,并且能够与这些库无缝集成,让你可以使用熟悉的绘图语法在 Streamlit 应用中创建精美的可视化图表。
- 使用 Matplotlib 进行可视化:Matplotlib 是 Python 中最常用的绘图库之一。在 Streamlit 中使用 Matplotlib 非常简单,首先需要导入 Matplotlib 库,然后创建图表对象并进行绘图操作,最后使用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)
- 使用 Seaborn 进行可视化:Seaborn 是基于 Matplotlib 的统计数据可视化库,它提供了更高级、美观的绘图风格。同样,在 Streamlit 中使用 Seaborn 也很便捷。例如,绘制一个 Seaborn 的散点图:
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)
- 使用 Plotly 创建交互式图表:Plotly 生成的图表具有交互性,用户可以在浏览器中通过鼠标操作(如缩放、平移、悬停查看数据点信息等)来更好地探索数据。在 Streamlit 中使用 Plotly,首先要导入 Plotly 库,然后创建 Plotly 图表对象,最后使用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)
- 使用 Altair 进行可视化:Altair 是一个声明式统计可视化库,其语法简洁直观。在 Streamlit 中使用 Altair 时,创建好 Altair 图表对象后,使用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)
3.3 交互式组件
Streamlit 提供了丰富的交互式组件,这些组件允许用户与应用进行交互,从而实现更加动态和个性化的数据展示与分析。通过这些交互式组件,用户可以输入数据、选择选项、调整参数等,应用会根据用户的操作实时更新显示内容。
- 按钮(Button):st.button()函数用于创建一个按钮。当按钮被点击时,可以触发相应的操作。例如,创建一个简单的按钮,并在按钮被点击时显示一条消息:
import streamlit as st
if st.button('Click me'):
st.write('You clicked the button!')
- 文本输入框(Text Input):st.text_input()函数创建一个文本输入框,用户可以在其中输入文本内容。应用可以获取用户输入的文本并进行处理。例如,获取用户输入的名字并进行问候:
import streamlit as st
name = st.text_input('Enter your name')
if name:
st.write(f'Hello, {name}!')
- 数字输入框(Number Input):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}')
- 滑块(Slider):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)
- 下拉选择框(Selectbox):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}')
- 多选框(Multiselect):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}')
- 复选框(Checkbox):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)
3.4 文件上传功能
在数据处理和分析中,经常需要处理用户上传的文件。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库进行处理)等,具体的处理方式根据文件类型和业务需求而定。
3.5 布局与容器
合理的布局和容器使用可以使 Streamlit 应用的界面更加整洁、美观和易于使用。Streamlit 提供了多种布局和容器选项,帮助你更好地组织应用中的元素。
- 列布局(Columns):使用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])表示第一列宽度是第二列宽度的三倍。
- 容器(Container):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')
容器可以嵌套使用,从而创建更复杂的布局结构。例如,可以在一个容器中再创建列布局,然后在列中放置其他组件。
- 侧边栏(Sidebar):侧边栏是 Streamlit 应用中常用的布局元素,通常用于放置导航菜单、配置选项等。使用st.sidebar属性可以在侧边栏中添加各种组件。例如,在侧边栏中添加一个标题和一个下拉选择框:
import streamlit as st
# 在侧边栏添加标题
st.sidebar.title("应用设置")
# 在侧边栏添加下拉选择框
option = st.sidebar.selectbox(
'请选择一个选项',
['选项1', '选项2', '选项3', '选项4']
)
# 在主界面显示选择结果
st.write(f'你选择了: {option}')
四、Streamlit 高级特性
**
4.1 状态管理
在复杂的 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中的状态也会被保留,确保应用状态的一致性。
4.2 自定义主题
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 代码中动态设置主题,为应用提供更灵活的外观定制方案。
4.3 与机器学习模型集成
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 应用部署到服务器上,以便让更多用户访问。以下是几种常见的部署方式:
5.1 Streamlit 社区云
Streamlit 社区云是最便捷的部署方式,它完全免费且无需配置服务器。只需将应用代码上传到 GitHub 仓库,然后在 Streamlit 社区云平台进行简单的链接设置,即可完成部署。具体步骤如下:
- 将 Streamlit 应用的所有代码和依赖项(如requirements.txt文件)上传到一个公开的 GitHub 仓库。
- 访问 Streamlit 社区云网站,使用 GitHub 账号登录。
- 按照平台提示,选择要部署的 GitHub 仓库,配置相关参数(如分支、运行命令等)。
- 点击部署按钮,等待平台自动构建和部署应用,部署完成后即可获得应用的访问链接。
5.2 部署到 Heroku
Heroku 是一个流行的云平台即服务(PaaS),支持多种编程语言应用的部署。部署 Streamlit 应用到 Heroku 的步骤如下:
- 注册并安装 Heroku 命令行工具。
- 在应用项目目录下,创建Procfile文件(无文件扩展名),并添加内容web: streamlit run your_app.py(your_app.py替换为实际的应用主文件)。
- 创建requirements.txt文件,列出应用所需的所有 Python 依赖项,如streamlit、numpy、pandas等。
- 初始化 Git 仓库(如果尚未初始化),提交代码更改。
- 使用 Heroku 命令行工具登录账号,创建新的应用实例,将本地代码推送到 Heroku 远程仓库,触发应用的构建和部署。
5.3 其他云平台
除了上述方式,还可以将 Streamlit 应用部署到 AWS、Google Cloud Platform、Microsoft Azure 等主流云平台。以 AWS 为例,通常需要创建 EC2 实例或使用 AWS Elastic Beanstalk 等服务,配置 Python 运行环境,安装 Streamlit 及其依赖,上传应用代码,并进行端口映射等相关配置,从而实现应用的稳定运行和对外访问 。
六、Streamlit 实际应用案例
6.1 数据探索与分析应用
某电商公司使用 Streamlit 开发了一个数据探索应用,帮助业务人员快速分析销售数据。通过文件上传功能,业务人员可以上传不同时间段的销售 CSV 文件。应用中利用交互式组件,如日期选择器筛选销售日期范围,下拉选择框选择产品类别;结合数据可视化库,以柱状图展示各产品销售额对比,折线图呈现销售额随时间的变化趋势。通过这些功能,业务人员能够直观地发现销售数据中的规律和问题,为决策提供有力支持。
6.2 机器学习模型演示应用
一个机器学习研究团队开发了一个图像分类模型,使用 Streamlit 创建应用来演示模型的效果。用户可以通过文件上传功能上传本地图片,应用将图片传入模型进行分类预测,并在页面上显示原始图片和预测结果。同时,应用还展示了模型的训练数据信息、评估指标等内容,方便用户了解模型的性能和特点,这种直观的演示方式有助于向非技术人员展示机器学习模型的价值。
七、总结与展望
Streamlit 凭借其简单易用、功能强大的特点,成为数据科学家和机器学习工程师进行快速原型开发和应用部署的首选工具之一。从基础的安装使用、丰富的核心功能,到高级的状态管理、主题定制以及与机器学习模型的集成,再到多种灵活的部署方式和丰富的实际应用案例,Streamlit 为数据驱动的 Web 应用开发提供了一站式解决方案。
随着开源社区的不断发展和更新迭代,未来 Streamlit 有望引入更多创新功能,进一步优化性能和用户体验,与更多的工具和平台实现深度集成。无论是数据科学领域的新手还是经验丰富的专业人士,都能在 Streamlit 的世界中找到属于自己的应用开发乐趣和价值,让数据和模型以更直观、更交互的方式展现出来,推动数据驱动的创新和发展。
八、合规建议
Streamlit采用**Apache License 2.0**开源许可协议, 完整许可文本见:https://github.com/streamlit/streamlit/blob/main/LICENSE