Streamlit:使用 Python 快速开发 Web 应用

Streamlit:使用 Python 快速开发 Web 应用

很早就知道 Streamlit 了,但是一直没怎么用起来。最近用各种自制终端工具的时候体验始终不如意,少不了可视化的需求,但是所有小工具都去做前后端开发很麻烦,Streamlit 正好解决了这个问题(虽然它的初衷是开发数据应用)。

文章很长,基于我自身经验,大部分情况下看完之后也不知道这东西有啥用,还觉得复杂,最后看了就真看了。

白话一下就是,Streamlit 可以让没有任何前端基础的人,使用 Python 开发 Web 应用,没有复杂的配置,没有复杂的语法,开箱即用,拎包入住。

演示环境

  1. Windows 11
  2. Python 3.10.11
  3. Streamlit 1.31.1

简介

Streamlit 是一个开源 Python 库,于 2019 年发布,官网地址:

https://streamlit.io/

主要目的是以高效的方式开发数据应用,注重简单性和效率,只需几行 Python 代码,就可以将复杂的数据分析转化为交互式的 Web 应用,无需深入了解 Web 开发技术或框架。

不仅仅是数据开发,像我这样有可视化终端小工具需求的不在少数。

Streamlit 的设计哲学是“用少量的努力做更多的事”,这使得它非常适合快速原型开发和数据探索任务。它提供了一种直观的方式来创建数据视图,包括图表、地图和表格,同时支持实时数据更新和用户交互。这些特性让 Streamlit 成为展示数据洞察、构建数据驱动的故事和开发复杂数据应用的强大工具。

核心特性

  1. 快速开发:Streamlit 的设计目标是加速 Web 应用的开发过程。它允许开发者仅用几行 Python 代码就能创建出功能丰富的应用,这一点不管是快速展示数据结果还是快速开发功能应用都很方便。
  2. 无需前端知识:使用 Streamlit,不需要有 Web 开发的背景或深入了解 HTML/CSS/JavaScript。所有的前端复杂性都被抽象化了,可以专注于应用逻辑,Streamlit 会自动处理用户界面。
  3. 交互式组件:Streamlit 提供了丰富的内置组件,如滑动条、按钮、选择框、上传组件等,这些组件直接通过 Python 代码交互,不需要使用任何前端框架。
  4. 易于部署:因为不需要任何前端框架,Streamlit 应用可以轻松部署和共享,只要具备 Python 运行环境就可以了。
  5. 可扩展性:Streamlit 支持自定义组件和 API,可以适应各种复杂场景。

安装与设置

安装

电脑具备基础的 Python 环境,Streamlit 支持 Python 3.6 及以上版本,终端执行安装命令:

pip install streamlit

# 查看安装结果
streamlit --version

# Out
'(common)'D:\WorkSpace>streamlit --version
Streamlit, version 1.31.1

Hello World

常规操作,安装完成后任意位置创建一个 app.py 文件,文件内容如下:

import streamlit as st

st.title('Hello World')
st.write('第一次使用 Streamlit!')

这段代码创建了一个带有标题和文字信息的简单应用,接下来运行文件。终端定位到 app.py 所在的目录,执行如下命令运行 Streamlit 应用:

streamlit run app.py

# Out
'(common)'D:\WorkSpace\Moran_Tools\Streamlit>streamlit run app.py

  You can now view your Streamlit app in your browser.

  Local URL: http://localhost:8501
  Network URL: http://192.168.1.53:8501

Streamlit 会启动开发服务器,并在默认浏览器中打开应用,下图:

20240217162000.png

主要组件和功能

Streamlit 的强大之处在于其丰富的组件和功能,使得创建交互式数据应用变得既简单又快速。这里介绍几个关键的组件和功能,以及如何利用它们来展示数据和获取用户输入。

1. 文本和数据显示

Streamlit 提供了多种方式来显示文本和数据。使用 st.write() 函数可以轻松地在应用中输出文本、数据帧(DataFrame)、图像等。

为了更具体地控制输出,可以使用 st.text() 显示纯文本,st.dataframe() 显示表格数据,st.image() 来展示图像等。

示例代码:

import streamlit as st
import pandas as pd
import numpy as np
from PIL import Image

# 显示文本
st.write("Hello, Streamlit!")
st.text("这是一段纯文本。")

# 显示数据帧
data = {
    'Name': ['Alice', 'Bob', 'Charlie'],
    'Age': [25, 30, 35],
    'City': ['New York', 'Los Angeles', 'Chicago']
}
df = pd.DataFrame(data)
st.write("DataFrame 示例:")
st.dataframe(df)

# 显示图像
image = np.random.rand(100, 100, 3)  # 创建一个随机图像
st.write("图像示例:")
st.image(image, caption='随机图像')

应用效果:

20240217163123.png

2. 图表和可视化

数据可视化是数据分析不可或缺的一部分。Streamlit 内置了对多种图表的支持,如线图、柱状图、散点图等,通过 st.line_chart()st.bar_chart()st.plotly_chart() 等函数可以轻松添加。

Streamlit 也支持 Pydeck 用于高级地理空间数据可视化,以及 Plotly 和 Matplotlib 等其他可视化库,为数据呈现提供了丰富的选择。

示例代码:

import streamlit as st
import pandas as pd
import numpy as np
import plotly.express as px

# 创建示例数据
data = pd.DataFrame({
    'x': np.arange(1, 101),
    'y': np.random.randn(100).cumsum()
})

# 显示线图
st.line_chart(data)

# 显示柱状图
st.bar_chart(data)

# 使用 Plotly 创建散点图
fig = px.scatter(data, x='x', y='y', title='散点图示例')
st.plotly_chart(fig)

# 使用 Pydeck 进行地理空间数据可视化(示例)
import pydeck as pdk
df = pd.DataFrame(
    np.random.randn(1000, 2) / [50, 50] + [37.76, -122.4],
    columns=['lat', 'lon'])

st.pydeck_chart(pdk.Deck(
    map_style='mapbox://styles/mapbox/light-v9',
    initial_view_state=pdk.ViewState(
        latitude=37.76,
        longitude=-122.4,
        zoom=11,
        pitch=50,
    ),
    layers=[
        pdk.Layer(
            'HexagonLayer',
            data=df,
            get_position='[lon, lat]',
            radius=200,
            elevation_scale=4,
            elevation_range=[0, 1000],
            pickable=True,
            extruded=True,
        ),
        pdk.Layer(
            'ScatterplotLayer',
            data=df,
            get_position='[lon, lat]',
            get_color='[200, 30, 0, 160]',
            get_radius=200,
        ),
    ],
))

应用效果:

FireShot Capture 001 - app · Streamlit - localhost.png

3. 交互式组件

Streamlit 的交互式组件允许用户输入和控制数据应用。

常用的组件包括按钮(st.button())、复选框(st.checkbox())、滑动条(st.slider())和选择框(st.selectbox())。

通过这些组件,用户可以输入参数或选择数据子集,应用会根据这些输入实时更新,提供动态的数据探索体验。

示例代码:

import streamlit as st

# 按钮
if st.button('点我'):
    st.write('按钮被点击了!')

# 复选框
if st.checkbox('选我'):
    st.write('复选框被选中!')

# 滑动条
value = st.slider('滑动我', 0, 100, 50)
st.write(f'滑动条的值:{value}')

# 选择框
option = st.selectbox('选择一个选项', ['选项1', '选项2', '选项3'])
st.write(f'你选择了:{option}')

应用效果:

20240217164139.png

4. 侧边栏

Streamlit 允许将输入控件放在侧边栏,为应用提供一致且不干扰主要内容的输入界面。通过 st.sidebar() 方法,可以将任何标准的 Streamlit 组件添加到侧边栏。

示例代码:

import streamlit as st

# 在侧边栏添加一个滑动条
sidebar_value = st.sidebar.slider('侧边栏滑动条', 0, 100, 50)

# 在侧边栏添加一个选择框
sidebar_option = st.sidebar.selectbox('侧边栏选择框', ['选项1', '选项2', '选项3'])

# 显示侧边栏控件的值
st.write(f'侧边栏滑动条的值:{sidebar_value}')
st.write(f'侧边栏选择框的选项:{sidebar_option}')

应用效果:

20240217164335.png

5. 缓存

Streamlit 的缓存机制可以显著提高应用性能,特别是当涉及到耗时的数据处理或模型推理时。使用 @st.cache_data@st.cache_resource 装饰器可以使函数的输出被缓存,当输入参数不变时,函数不会被重复执行,直接返回缓存的结果。

示例代码:

import streamlit as st
import time

# 使用 @st.cache_data 装饰器缓存函数的输出
@st.cache_data
def expensive_computation(a, b):
    time.sleep(5)  # 模拟一个耗时的计算过程
    return a * b

a = st.slider('输入a', 0, 10, 5)
b = st.slider('输入b', 0, 10, 5)

# 调用被缓存的函数
result = expensive_computation(a, b)

st.write(f'计算结果:{result}')

应用效果:

20240217164809.png

这个没辙了,图片看不出效果,代码逻辑就是模拟了一个耗时的计算过程,首次计算的时候要等待 5s,再次运行的时候已经有缓存了,就会直接出缓存结果。

6. 会话状态和回调

Streamlit 提供了会话状态(Session State)和回调(Callbacks)功能,允许开发者构建更复杂的应用逻辑。

会话状态可以存储用户交互的中间结果,回调则可以在特定事件发生时触发函数执行。

示例代码:

import streamlit as st

# 初始化会话状态
if 'count' not in st.session_state:
    st.session_state.count = 0

# 定义一个回调函数,用于增加计数
def increment_counter():
    st.session_state.count += 1

# 定义一个回调函数,用于重置计数
def reset_counter():
    st.session_state.count = 0

# 创建一个按钮,点击时增加计数
st.button('增加计数', on_click=increment_counter)

# 创建一个按钮,点击时重置计数
st.button('重置计数', on_click=reset_counter)

# 显示当前计数
st.write(f'当前计数:{st.session_state.count}')

应用效果:

20240217165209.png

通过结合使用这些组件和功能,可以构建出功能丰富、交互性强的数据应用,有效地展示数据分析结果和洞察。

Streamlit 的灵活性和易用性使得从简单的数据展示到复杂的分析应用都能快速实现。

实际案例分析

Streamlit 通过其灵活性和易用性,已经被广泛应用于各种数据科学和机器学习项目中。

下面,介绍一些使用 Streamlit 构建的实际案例,这些案例展示了 Streamlit 如何在不同领域解决具体问题。

数据探索和可视化工具

一个常见的 Streamlit 应用案例是构建数据探索和可视化工具。

例如,一个数据科学团队可能使用 Streamlit 来创建一个交互式的 Web 应用,让团队成员能够上传数据集、选择不同类型的图表进行可视化,以及应用不同的数据过滤条件来探索数据。

这种工具可以加速数据分析过程,帮助团队快速发现数据中的趋势和洞察。

机器学习模型展示

Streamlit 也经常被用来展示和演示机器学习模型。

开发者可以构建一个应用,让用户通过简单的界面输入数据,然后实时展示模型的预测结果。

这不仅可以用于模型的内部评估,还可以作为向非技术利益相关者演示模型能力的工具。这类应用通常会包括模型的性能指标、预测结果的解释,以及模型预测的可视化。

复杂业务流程自动化

另一个案例是使用 Streamlit 来自动化复杂的业务流程。

比如,一个财务分析应用可能允许用户上传财务报表,自动执行预算分析、现金流预测等操作,并展示关键的财务指标和趋势图。

这样的应用可以节省大量手工处理数据和生成报告的时间,同时也提高了分析的准确性。


以上,Streamlit 的核心优势在于其能够让开发者专注于数据和逻辑,而不是编程和布局细节,这一点对于快速原型制作和迭代尤为重要。无论是个人项目、企业数据分析,还是学术研究,Streamlit 都提供了一个高效和易用的平台来展示数据洞察和模型。