前言

作为开发者,我们经常需要将数据分析结果、模型预测或一些小工具以一种直观的方式展示给他人。传统的前端开发(HTML/CSS/JavaScript)流程复杂,学习曲线陡峭。有没有一种方法可以让我们只用Python就快速构建出漂亮的、可交互的Web应用?

答案就是 Streamlit

Streamlit是一个开源的Python库,它能让你在几分钟内为你的数据科学和机器学习项目创建并分享美观的Web应用。你不需要任何前端知识,只需像写Python脚本一样,就能创造出丰富的用户界面。

本文是Streamlit的入门教程,我们将从零开始,一步步构建一个简单的交互式应用。

环境准备

1. 安装Streamlit

安装Streamlit非常简单:

pip install streamlit

2. 验证安装

安装完成后,可以运行官方的hello应用来验证一切是否正常:

streamlit hello

这会在你的浏览器中打开一个新标签页,展示一个包含多个示例的Streamlit应用。如果能看到这个页面,说明安装成功!

Streamlit核心理念:脚本即应用

Streamlit最神奇的地方在于,它将一个普通的Python脚本转换为一个Web应用。你不需要写路由,不需要管理状态,甚至不需要写回调函数。

Streamlit应用的数据流非常简单:每次用户与页面上的小部件(widget)交互,整个脚本都会从头到尾重新运行。

这个模型听起来可能效率不高,但Streamlit在底层做了大量的智能缓存和优化,使得大多数应用都能流畅运行。这种简单性正是其魅力所在。

实战:构建一个数据探索应用

让我们来构建一个简单的应用,它可以加载一个数据集,并允许用户通过交互式小部件来探索数据。

1. 创建你的第一个应用

创建一个名为 my_app.py的Python文件,并写入以下代码:

import streamlit as st
import pandas as pd
import numpy as np

st.title('我的第一个Streamlit应用')

st.write("这是一个简单的表格展示:")
st.write(pd.DataFrame({
    '第一列': [1, 2, 3, 4],
    '第二列': [10, 20, 30, 40]
}))

2. 运行应用

在终端中运行以下命令:

streamlit run my_app.py

你的浏览器会自动打开一个新的页面,显示应用的标题和我们创建的Pandas DataFrame。

3. 添加交互式小部件

现在,让我们的应用变得更有趣。我们将添加一个滑块(slider),让用户可以选择一个数字,然后我们用这个数字来生成一个图表。

修改 my_app.py

import streamlit as st
import pandas as pd
import numpy as np

st.title('交互式数据探索')

# 1. 添加一个滑块小部件
x = st.slider('选择一个值', 0, 100, 25) # 最小值, 最大值, 默认值

# 2. 使用滑块的值
st.write(f'你选择了: {x}')

# 3. 创建一个简单的图表
st.subheader('动态生成的图表')
chart_data = pd.DataFrame(
    np.random.randn(x, 2), # 使用滑块的值x作为行数
    columns=['a', 'b'])
st.line_chart(chart_data)

# 4. 添加一个复选框来显示/隐藏原始数据
if st.checkbox('显示原始数据'):
    st.subheader('原始数据')
    st.write(chart_data)

保存文件。回到你的浏览器,你会发现Streamlit已经检测到文件变更,并提示你可以重新运行。点击“Rerun”,你就会看到新的滑块和图表。尝试拖动滑块,看看图表和文本是如何实时更新的!

Streamlit常用组件

Streamlit提供了丰富的组件来构建你的应用:

  • 文本显示: st.title(), st.header(), st.subheader(), st.text(), st.markdown(), st.code()
  • 数据展示: st.dataframe(), st.table(), st.metric(), st.json()
  • 图表绘制: st.line_chart(), st.area_chart(), st.bar_chart(), st.pyplot() (支持Matplotlib), st.altair_chart(), st.plotly_chart()
  • 交互式输入: st.button(), st.checkbox(), st.radio(), st.selectbox(), st.multiselect(), st.slider(), st.text_input(), st.number_input(), st.date_input(), st.file_uploader()
  • 布局控制: st.sidebar, st.columns, st.expander, st.container()

缓存:优化你的应用

当应用变得复杂,特别是涉及到加载大量数据或执行耗时计算时,“每次都重跑脚本”的模式会变慢。为此,Streamlit提供了强大的缓存机制。

你只需要在耗时的函数上添加一个装饰器 @st.cache_data@st.cache_memoize

@st.cache_data
def load_large_dataset(url):
    # 这个函数只会在第一次被调用时执行
    # 后续调用如果参数url没有变化,会直接返回缓存的结果
    df = pd.read_csv(url)
    return df

my_dataset = load_large_dataset('https://path/to/large/dataset.csv')
st.dataframe(my_dataset)

使用缓存后,即使用户与其它小部件交互导致脚本重跑,load_large_dataset函数也不会再次执行,从而极大地提升了应用的响应速度。

总结

Streamlit为Python开发者打开了一扇通往Web开发世界的大门。它让你能够专注于逻辑和数据,而将UI构建的复杂性降到最低。无论是创建数据看板、机器学习模型演示,还是内部小工具,Streamlit都是一个快速、高效且令人愉悦的选择。

这篇入门教程只是一个开始。Streamlit还有更多高级功能,如会话状态管理(st.session_state)、自定义组件等,等待你去探索。

在下一篇文章中,我们将学习另一个强大的自动化工具 Playwright,看看它是如何革新浏览器自动化和端到端测试的。