streamlit cheat sheet
Install and import
$ pip install streamlit
# Import convention
import streamlit as st
Add widgets to sidebar
# Just add it after st.sidebar:
>>> a = st.sidebar.radio('Choose:',[1,2])
Magic commands
'_This_ is some __Markdown__' a=3 'dataframe:', data
Command line
$ streamlit --help
$ streamlit run your_script.py
$ streamlit hello
$ streamlit config show
$ streamlit cache clear
$ streamlit docs
$ streamlit --version
Pre-release features
pip uninstall streamlit
pip install streamlit-nightly --upgrade
Display text
st.text('Fixed width text')
st.markdown('_Markdown_') # see #*
st.caption('Balloons. Hundreds of them...')
st.latex(r''' e^{i\pi} + 1 = 0 ''')
st.write('Most objects') # df, err, func, keras!
st.write(['st', 'is <', 3]) # see *
st.title('My title')
st.header('My header')
st.subheader('My sub')
st.code('for i in range(8): foo()') # * optional kwarg unsafe_allow_html = True
Display data
st.dataframe(my_dataframe)
st.table(data.iloc[0:10])
st.json({'foo':'bar','fu':'ba'})
st.metric(label="Temp", value="273 K", delta="1.2 K")
Display media
st.image('./header.png') st.audio(data) st.video(data)
Columns
col1, col2 = st.columns(2) col1.write('Column 1') col2.write('Column 2') # Three columns with different widths col1, col2, col3 = st.columns([3,1,1]) # col1 is wider # Using 'with' notation: >>> with col1: >>> st.write('This is column 1')
Tabs
# Insert containers separated into tabs: >>> tab1, tab2 = st.tabs(["Tab 1", "Tab2"]) >>> tab1.write("this is tab 1") >>> tab2.write("this is tab 2") # You can also use "with" notation: >>> with tab1: >>> st.radio('Select one:', [1, 2])
Control flow
# Stop execution immediately: st.stop() # Rerun script immediately: st.experimental_rerun() # Group multiple widgets: >>> with st.form(key='my_form'): >>> username = st.text_input('Username') >>> password = st.text_input('Password') >>> st.form_submit_button('Login')
Personalize apps for users
# Show different content based on the user's email address. >>> if st.user.email == 'jane@email.com': >>> display_jane_content() >>> elif st.user.email == 'adam@foocorp.io': >>> display_adam_content() >>> else: >>> st.write("Please contact us to get access!")
Display interactive widgets
st.button('Hit me') st.data_editor('Edit data', data) st.checkbox('Check me out') st.radio('Pick one:', ['nose','ear']) st.selectbox('Select', [1,2,3]) st.multiselect('Multiselect', [1,2,3]) st.slider('Slide me', min_value=0, max_value=10) st.select_slider('Slide to select', options=[1,'2']) st.text_input('Enter some text') st.number_input('Enter a number') st.text_area('Area for textual entry') st.date_input('Date input') st.time_input('Time entry') st.file_uploader('File uploader') st.download_button('On the dl', data) st.camera_input("一二三,茄子!") st.color_picker('Pick a color')
# Use widgets' returned values in variables >>> for i in range(int(st.number_input('Num:'))): foo() >>> if st.sidebar.selectbox('I:',['f']) == 'f': b() >>> my_slider_val = st.slider('Quinn Mallory', 1, 88) >>> st.write(slider_val)
# Disable widgets to remove interactivity: >>> st.slider('Pick a number', 0, 100, disabled=True)
Build chat-based apps
# Insert a chat message container. >>> with st.chat_message("user"): >>> st.write("Hello 👋") >>> st.line_chart(np.random.randn(30, 3)) # Display a chat input widget. >>> st.chat_input("Say something")
Learn how to build chat-based apps
Mutate data
# Add rows to a dataframe after # showing it. >>> element = st.dataframe(df1) >>> element.add_rows(df2) # Add rows to a chart after # showing it. >>> element = st.line_chart(df1) >>> element.add_rows(df2)
Display code
st.echo() >>> with st.echo(): >>> st.write('Code will be executed and printed')
Placeholders, help, and options
# Replace any single element. >>> element = st.empty() >>> element.line_chart(...) >>> element.text_input(...) # Replaces previous. # Insert out of order. >>> elements = st.container() >>> elements.line_chart(...) >>> st.write("Hello") >>> elements.text_input(...) # Appears above "Hello". st.help(pandas.DataFrame) st.get_option(key) st.set_option(key, value) st.set_page_config(layout='wide') st.experimental_show(objects) st.experimental_get_query_params() st.experimental_set_query_params(**params)
Connect to data sources
st.experimental_connection('pets_db', type='sql') conn = st.experimental_connection('sql') conn = st.experimental_connection('snowpark') >>> class MyConnection(ExperimentalBaseConnection[myconn.MyConnection]): >>> def _connect(self, **kwargs) -> MyConnection: >>> return myconn.connect(**self._secrets, **kwargs) >>> def query(self, query): >>> return self._instance.query(query)
Optimize performance
Cache data objects
# E.g. Dataframe computation, storing downloaded data, etc. >>> @st.cache_data ... def foo(bar): ... # Do something expensive and return data ... return data # Executes foo >>> d1 = foo(ref1) # Does not execute foo # Returns cached item by value, d1 == d2 >>> d2 = foo(ref1) # Different arg, so function foo executes >>> d3 = foo(ref2) # Clear all cached entries for this function >>> foo.clear() # Clear values from *all* in-memory or on-disk cached functions >>> st.cache_data.clear()
Cache global resources
# E.g. TensorFlow session, database connection, etc. >>> @st.cache_resource ... def foo(bar): ... # Create and return a non-data object ... return session # Executes foo >>> s1 = foo(ref1) # Does not execute foo # Returns cached item by reference, s1 == s2 >>> s2 = foo(ref1) # Different arg, so function foo executes >>> s3 = foo(ref2) # Clear all cached entries for this function >>> foo.clear() # Clear all global resources from cache >>> st.cache_resource.clear()
Deprecated caching
>>> @st.cache ... def foo(bar): ... # Do something expensive in here... ... return data >>> # Executes foo >>> d1 = foo(ref1) >>> # Does not execute foo >>> # Returns cached item by reference, d1 == d2 >>> d2 = foo(ref1) >>> # Different arg, so function foo executes >>> d3 = foo(ref2)
Display progress and status
# Show a spinner during a process >>> with st.spinner(text='In progress'): >>> time.sleep(3) >>> st.success('Done') # Show and update progress bar >>> bar = st.progress(50) >>> time.sleep(3) >>> bar.progress(100) st.balloons() st.snow() st.toast('Mr Stay-Puft') st.error('Error message') st.warning('Warning message') st.info('Info message') st.success('Success message') st.exception(e)