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)]
总结:
- Streamlit应用程序是从上到下运行的Python脚本
- 每次用户打开指向你的应用的浏览器选项卡时,脚本都是 重新执行
- 当脚本执行时,Streamlit 在浏览器中实时绘制其输出
- 脚本使用 Streamlit 缓存来避免重新计算昂贵的函数,因此 更新发生得非常快
- 每次用户与小部件交互时,您的脚本都会重新执行并 在该运行期间,该小组件的输出值将设置为新值。
- 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)
网友评论