logo

Streamlit

王哲峰 / 2024-08-04


目录

Streamlit 介绍

Streamlit 简介

Streamlit 是一个用于快速创建数据应用程序的开源 Python 库。 它的设计目标是让数据科学家能够轻松地将数据分析和机器学习模型转化为具有交互性的 Web 应用程序, 而无需深入了解 Web 开发。和常规 Web 框架,如 Flask/Django 的不同之处在于, 它不需要你去编写任何客户端代码(HTML/CSS/JS),只需要编写普通的 Python 模块, 就可以在很短的时间内创建美观并具备高度交互性的界面,从而快速生成数据分析或者机器学习的结果; 另一方面,和那些只能通过拖拽生成的工具也不同的是,你仍然具有对代码的完整控制权。

Streamlit 构建原则

Streamlit 生态

Streamlit 与下面的 Python 框架兼容:

Streamlit 安装

本地开发模式

$ pip install streamlit
$ streamlit hello

社区云

img

img

Streamlit 概念

Streamlit 运行命令

$ streamlit run your_script.py [-- script args]
$ # or
$ python -m streamlit run your_script.py [-- script args]
$ # or
$ streamlit run https://raw.githubusercontent.com/streamlit/demo-uber-nyc-pickups/master/streamlit_app.py

开发流

开发 Streamlit 应用程序时,建议并排布局编辑器和浏览器窗口,以便可以同时看到代码和应用程​​序。

从 Streamlit 版本 1.10.0 及更高版本开始,Streamlit 应用程序无法从 Linux 发行版的根目录运行。 如果使用的是 Streamlit 版本 1.10.0 或更高版本,主脚本应位于根目录以外的目录中。

使用 Docker 时,可以使用 WORKDIR 命令指定主脚本所在的目录。

数据流

Streamlit 的架构允许用户像编写普通 Python 脚本一样编写应用程序。 为了解决这个问题,Streamlit 应用程序具有独特的数据流:每当屏幕上需要更新某些内容时, Streamlit 都会从上到下重新运行整个 Python 脚本。这种运行方式会在以下两种情况发生:

当通过 on_changeon_click 参数将回调函数传递给组件时,回调函数始终在脚本的其余部分之前运行。 Streamlit 通过 @st.cache_data 装饰器让应用重新运行时跳过某些昂贵的运算。

数据展示和样式

在 Streamlit 应用中显示数据(表、数组、数据框)的方法有多种, Streamlit 的魔法命令和 st.write() 可以用于写入从文本到表格的任何内容。

魔法命令

Streamlit 支持魔法命令(magic commands),可以在不调用任何 Streamlit 方法的情况下将内容写入应用。 这意味着写入内容是可以根本不使用 st.write() 方法。

"""
# My first app
Here's our first attempt at using data to create a table:
"""

import streamlit as st
import pandas as pd

df = pd.DataFrame({
  'first column': [1, 2, 3, 4],
  'second column': [10, 20, 30, 40]
})

df

在上面的例子中,当 Streamlit 看到变量或文字时,它会使用 st.write() 自动将其写入应用。

写入 data frame

st.write() 几乎可以将任何传递给它的内容吸入应用,比如:文本、Matplotlib 图形、Altair 图形等。

import streamlit as st
import pandas as pd

st.write("Here's our first attempt at using data to create a table:")
st.write(pd.DataFrame({
    'first column': [1, 2, 3, 4],
    'second column': [10, 20, 30, 40]
}))

除了 st.write() 方法外,还有针对显示特定数据的函数,例如:st.dataframe()st.table()

import streamlit as st
import pandas as pd

dataframe = np.random.randn(10, 20)
st.dataframe(dataframe)
import streamlit as st
import pandas as pd
import numpy as np

dataframe = pd.DataFrame(
    np.random.randn(10, 20),
    columns = ('col %d' % i for i in range(20))
)
st.dataframe(dataframe.style.highlight_max(axis = 0))
import streamlit as st
import pandas as pd
import numpy as np

dataframe = pd.DataFrame(
    np.random.randn(10, 20),
    columns=('col %d' % i for i in range(20))
)
st.table(dataframe.style.highlight_max(axis = 0))

绘制图表和地图

Streamlit 支持多种流行的数据图表库,例如 Matplotlib、Altair、deck.gl 等。


绘制折线图

可以使用 st.line_chart() 轻松地将折线图添加到应用中。

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

chart_data = pd.DataFrame(
    np.random.randn(20, 3),
    columns = ["a", "b", "c"]
)
st.line_chart(chart_data)

绘制地图

使用 st.map() 您可以在地图上显示数据点

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

map_data = pd.DataFrame(
    np.random.randn(1000, 2) / [50, 50] + [37.76, -122.4],
    columns = ['lat', 'lon']
)
st.map(map_data)

组件

复选框显示和隐藏数据

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

if st.checkbox('Show dataframe'):
    chart_data = pd.DataFrame(
       np.random.randn(20, 3),
       columns=['a', 'b', 'c'])

    chart_data

选择框

import streamlit as st
import pandas as pd

df = pd.DataFrame({
    'first column': [1, 2, 3, 4],
    'second column': [10, 20, 30, 40]
    })

option = st.selectbox(
    'Which number do you like best?',
     df['first column'])

'You selected: ', option

布局

在 Streamlit 中可以使用 st.sidebar 轻松地在左侧面板侧边栏中组织组件。 传递到 st.sidebar 的每个元素都固定在左侧,允许用户专注于应用程序中的内容, 同时仍然可以访问 UI 控件。

例如,如果要将选择框和滑块添加到侧边栏, 请使用 st.sidebar.sliderst.sidebar.selectbox 而不是 st.sliderst.selectbox

import streamlit as st

# Add a selectbox to the sidebar:
add_selectbox = st.sidebar.selectbox(
    "How would you like to be contacted?",
    ("Email", "Home phone", "Mobile phone")
)

# Add a slider to the sidebar
add_slider = st.sidebar.slider(
    "Select a range of values",
    0.0, 
    100.0, 
    (25.0, 75.0)
)

除了侧边栏之外,Streamlit 还提供了几种其他方法来控制应用程序的布局。 st.columns 可让您并排放置小部件,而 st.expander 可让您通过隐藏大内容来节省空间。

left_column, right_column = st.columns(2)
# You can use a column just like st.sidebar:
left_column.button("Press me!")

# or even better, call Streamlit functions inside a "with" block
with right_column:
    chosen = st.radio(
        "Sorting hat",
        ("Gryffindor", "Ravenclaw", "Hufflepuff", "Slytherin")
    )
    st.write(f"You are in {chosen} house!")

显示进度

当向应用程序添加长时间运行的计算时,可以使用 st.progress() 来实时显示状态。

import time
import streamlit as st

"Starting a long computation..."

# Add a placeholder
latest_iteration = st.empty()
bar = st.progress(0)

for i in range(100):
    # Update the progress bar with each iteration
    latest_iteration.text(f"Iteration {i + 1}")
    bar.progress(i + 1)
    time.sleep(0.1)

"...and now we\'re done!"

缓存

会话状态

连接

Streamlit API

Streamlit 提供了一组简单而强大的基础模块,用于构建数据应用程序:

这些基础模块使得通过 Streamlit 能够轻松地构建交互式数据应用程序,并且在使用时可以根据需要进行组合和定制, 更多内容请查看Streamlit 官方文档

Streamlit 部署

参考