streamlit

作者: 向暖而生 | 来源:发表于2023-09-15 10:51 被阅读0次

Get stared

安装:

pip install streamlit

运行:

streamlit run script.py [-- script args]

python -m streamlit run your_script.py

在向脚本传递一些自定义参数时,必须在两个短划线后传递它们。否则 参数被解释为 Streamlit 本身的参数。

开发流程:

每次要更新应用时,请保存源文件。当你这样做时 Streamlit会检测是否有更改,并询问您是否要 重新运行您的应用。 选择屏幕右上角的“始终重新运行”以 每次更改其源代码时自动更新您的应用程序。

这使您可以在快速交互式循环中工作:键入一些代码,保存 它,实时试用,然后键入更多代码,保存它,试用它,依此类推 直到您对结果感到满意。编码和查看之间的紧密循环 实时结果是Streamlit使您的生活更轻松的方式之一。

Streamlit的架构允许您以与编写普通方式相同的方式编写应用程序 Python 脚本。为了解锁这一点,Streamlit应用程序具有独特的数据流:任何 当屏幕上必须更新某些内容时,Streamlit会重新运行您的整个 Python 脚本从上到下。

这可能发生在两种情况下:

  • 每当修改应用的源代码时。
  • 每当用户与应用程序中的小组件交互时。例如,拖动时 滑块、在输入框中输入文本或单击按钮。

每当通过 (或) 参数将回调传递给小部件时,回调将始终在脚本的其余部分之前运行。有关回调 API 的详细信息,请参阅我们的会话状态 API 参考指南。on_changeon_click

为了使所有这些快速无缝,Streamlit做了一些繁重的工作 为您幕后。这个故事中的一个重要参与者是@st.cache_data装饰器,它允许开发人员跳过某些 当他们的应用程序重新运行时,计算成本很高。稍后我们将介绍缓存 页。

显示和设置数据样式

输出内容: st.write()

或者使用magic commands

import streamlit as st
import pandas as pd

df=pd.DataFrame(...)
df

每当 Streamlit 看到变量或文字时 值,它使用 st.write() 自动将其写入您的应用程序

当然,也可以直接调用

st.write(
    pd.DataFrame(...)
)

几乎可以把任何内容传递给st.write,它可以自动处理。

(此外,st.dataframe(),st.table(),也可以显示数据)

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

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))
st.write("#st.table() Demo")

st.table(dataframe)

绘制图标和地图

支持matplotlib,altair,deck.gl and more...

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

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

st.line_chart(chart_data)

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

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

st.map(map_data)

小组件

在使用的过程中,往往需要一些表单组件。这里有st.dlider(),st,button,st.selectbox等。

import streamlit as st
x = st.slider('x')  # 👈 this is a widget
st.write(x, 'squared is', x * x)

st.text_input("Your name", key="name")

# You can access the value at any point with:
st.session_state.name

可以给小组件定义键值,每个带有键的小组件都会自动添加到会话状态中,这样就可以自由的调用了。

复习框的Demo

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

布局

import streamlit as st

side_title=st.sidebar.write("TestPage")
side_cnt=st.sidebar.slider("参数范围",0,100,(30,60),key="cnt")

st.write("模拟数据生成:")
st.write(st.session_state.cnt)

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 streamlit as st
import time

'启动任务'

# 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'当前进度 {i+1}%')
  bar.progress(i + 1)
  time.sleep(0.1)

"任务执行完成!"

主题

可以在页面右上角的设置里,配置主题,然后保存到一个conf.toml文件里。

启动的时候,执行 streamlit script.py conf.toml ,即可以用自定义的主题。

配置样式:

[theme]
primaryColor="#ece7e7"
backgroundColor="#da1515"
secondaryBackgroundColor="#e04d08"
textColor="#d1dcef"
font="monospace"

关于缓存

Streamlit 缓存使你的应用即使在从 Web 加载数据、操作大型数据集或执行昂贵的计算时也能保持性能。

缓存背后的基本思想是存储昂贵的函数调用的结果,并在再次出现相同的输入时返回缓存的结果,而不是在后续运行时调用函数。

要在 Streamlit 中缓存函数,需要使用两个装饰器:st.cache_data 和 st.cache_resource

@st.cache_data
def long_running_function(param1, param2):
    return …

在这里,添加装饰器后,每次调用该函数,会检查两个方面:

  • 输出参数的值
  • 函数中代码逻辑

如果是第一次运行,它会把返回值存储到缓存中,下次使用的时候,就会完全跳过这个函数,并从缓存中直接获取结果。在开发中,缓存会随着函数代码的更改而自动更新,从而确保最新的更改反映在缓存中。

  • st.cache_data: 它在每次调用的时候都会存进数据的新副本,避免突变和竞争条件的影响。可以用于从csv加载数据,查询api,返回可序列化对象等。
  • st.cache_resource : 缓存全局资源,如果不想多次加载不可序列化对象,可以使用这个,可以在应用的所有重新运行和会话之间共享这些资源,而不需要复制。对缓存值的任何修改,都会直接改变缓存中的对象。

[图片上传失败...(image-e9bb9d-1694832628470)]

页面

多页面是开发中常遇到的一个情况。这里提供了一个比较有意思的方式。

  • 创建一个目录,把各个页面放在目录里
  • 创建一个main文件,执行 streamilit xxx.py pages
  • 这样就可以啦~

[图片上传失败...(image-ca90b1-1694832628470)]

总结:

  1. Streamlit应用程序是从上到下运行的Python脚本
  2. 每次用户打开指向你的应用的浏览器选项卡时,脚本都是 重新执行
  3. 当脚本执行时,Streamlit 在浏览器中实时绘制其输出
  4. 脚本使用 Streamlit 缓存来避免重新计算昂贵的函数,因此 更新发生得非常快
  5. 每次用户与小部件交互时,您的脚本都会重新执行并 在该运行期间,该小组件的输出值将设置为新值。
  6. Streamlit 应用可以包含多个页面,这些页面在文件夹中的单独文件中定义。.py pages

[图片上传失败...(image-f9ac6b-1694832628469)]

一个demo:

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

st.title('Uber pickups in NYC')

DATE_COLUMN = 'date/time'
DATA_URL = ('https://s3-us-west-2.amazonaws.com/streamlit-demo-data/uber-raw-data-sep14.csv.gz')

@st.cache_data
def load_data(nrows):
    data = pd.read_csv(DATA_URL, nrows=nrows)
    lowercase = lambda x: str(x).lower()
    data.rename(lowercase, axis='columns', inplace=True)
    data[DATE_COLUMN] = pd.to_datetime(data[DATE_COLUMN])
    return data

data_load_state = st.text('Loading data...')
data = load_data(10000)
data_load_state.text("Done! (using st.cache_data)")

if st.checkbox('Show raw data'):
    st.subheader('Raw data')
    st.write(data)

st.subheader('Number of pickups by hour')
hist_values = np.histogram(data[DATE_COLUMN].dt.hour, bins=24, range=(0,24))[0]
st.bar_chart(hist_values)

# Some number in the range 0-23
hour_to_filter = st.slider('hour', 0, 23, 17)
filtered_data = data[data[DATE_COLUMN].dt.hour == hour_to_filter]

st.subheader('Map of all pickups at %s:00' % hour_to_filter)
st.map(filtered_data)

相关文章

网友评论

      本文标题:streamlit

      本文链接:https://www.haomeiwen.com/subject/ckivvdtx.html