Streamlit:最快的方式建立和分享數(shù)據(jù)的工具

Streamlit 是第一個專門針對機器學(xué)習(xí)和數(shù)據(jù)科學(xué)團隊的應(yīng)用 開發(fā)框架,它是開發(fā)自定義機器學(xué)習(xí)工具的最快的方法,你可以認(rèn)為 它的目標(biāo)是取代 Flask 在機器學(xué)習(xí)項目中的地位,可以幫助機器學(xué)習(xí)工程師快速開發(fā)用戶交互工具。Streamlit 的宗旨很明確,就是要讓人只需要通過編寫簡單的 Python 代碼,就可以完成構(gòu)建應(yīng)用的需求。它支持所見即所得的熱更新,而且你不需要寫一行 HTTP 請求代碼及前端代碼,你只需要一個 Python IDE 和一個瀏覽器,就能快速看到你自己構(gòu)建的應(yīng)用。Streamlit 的上手特別簡單,并且支持諸如 Tensorflow,Keras,PyTorch,Pandas,Seaborn 等主流的機器學(xué)習(xí),深度學(xué)習(xí),數(shù)據(jù)分析,數(shù)據(jù)可視化框架。隨便創(chuàng)建一個 hello.py 文件,然后只需要寫幾行代碼,就能完成一個簡單的功能。

安裝很簡單(確保是 Python3.6~3.8),使用 PyPI 安裝:

pip install streamlit
# 啟動測試
streamlit hello

接著,便使用你的默認(rèn)瀏覽器打開一個標(biāo)簽頁,載入官方案例:

創(chuàng)建自定義的 App,僅僅需要三步:

  1. 在你的 Python 腳本中載入 streamlit,并寫一些代碼
  2. 使用 streamlit run [filename] 運行代碼文件
  3. 點擊 Streamlit 菜單欄的 ‘Deploy’ 按鈕,便可以 分享你的應(yīng)用給全世界!

1 創(chuàng)建你的第一個 App

本教程使用 vscode 進行代碼的編寫。創(chuàng)建一個名為 first_app.py 的文件,并寫入如下代碼用于載入一些模塊:

import streamlit as st
# To make things easier later, we're also importing numpy and pandas for
# working with sample data.
import numpy as np
import pandas as pd

在終端輸入 streamlit run first_app.py 運行您的應(yīng)用。新的標(biāo)簽頁將在您的默認(rèn)瀏覽器中打開。目前為空白,沒關(guān)系,下面我們會添加一些東西。運行 Streamlit 應(yīng)用程序與任何其他 Python 腳本沒有什么不同。每當(dāng)您需要查看應(yīng)用程序時,都可以使用此命令。

Tips: 您知道嗎,您還可以將 URL 傳遞給 streamlit run? 當(dāng)與 Github Gists 結(jié)合使用時,這很棒。 例如:

$ streamlit run https://raw.githubusercontent.com/streamlit/demo-uber-nyc-pickups/master/app.py

Ctrl + c 可以中止 streamlit run。

很棒!你完成了一個 App 的創(chuàng)建,雖然,它什么功能也沒有,但也是一個 App。

2 添加文本和數(shù)據(jù)

Streamlit 有多種向應(yīng)用程序添加文本的方法。 查看 API reference 以獲取完整列表。

  1. 添加一個標(biāo)題
st.title('My first app')
  1. 編寫 Markdown 可以使用 st.write(),比如:
x = 5
# 使用 Markdown 格式輸出 x^4
st.write(f'${x}^4$ is', x ** 4) 

可以看看效果:

這里的公式是使用 Markdown 的語法,你也可以使用 latex:

st.latex("\sum_{i=1}^{n}")

更多的使用如下:

st.title("st.title")
st.header("st.header")
st.subheader("st.subheader")

st.markdown("# markdown一級標(biāo)題")
st.markdown("## markdown二級標(biāo)題")
st.markdown("### markdown三級標(biāo)題")

# ------------------------------------

st.write("st.write")
st.markdown("markdown普通文字")
st.text("st.text")

# ------------------------------------

st.markdown("""
Markdown列表:
- hello 
- world
- China
""")

st.markdown("***markdown粗斜體***")

# ------------------------------------

st.latex("\sum_{i=1}^{n}")

# ------------------------------------

st.write(1234)
st.write("1234")
st.write("1 + 1 = ", 2)

效果:

st.write() 是一個泛型函數(shù),根據(jù)傳入對象不同采取不同的展示方式,比如傳入 pandas.DataFrame 時,st.write(df) 默認(rèn)調(diào)用 st.dataframe(),傳入 markdown時,st.write(markdown) 默認(rèn)調(diào)用 st.markdown()。可傳入的對象有:

write(data_frame) : Displays the DataFrame as a table.
write(func) : Displays information about a function.
write(module) : Displays information about the module.
write(dict) : Displays dict in an interactive widget.
write(obj) : The default is to print str(obj).
write(mpl_fig) : Displays a Matplotlib figure.
write(altair) : Displays an Altair chart.
write(keras) : Displays a Keras model.
write(graphviz) : Displays a Graphviz graph.
write(plotly_fig) : Displays a Plotly figure.
write(bokeh_fig) : Displays a Bokeh figure.
write(sympy_expr) : Prints SymPy expression using LaTeX.
write(markdown):

僅僅展示代碼,而不執(zhí)行,可以:

code = """
def sum_(x):
    return np.sum(x)
"""
st.code(code, language="python")

code = """
for (i i 1:10) {
    print(i)
}
"""
st.code(code, language="r")

st.markdown("""
?```python
print("hello")
""")

展示 Code,同時執(zhí)行 Code;需要將code放入 st.echo() 內(nèi):

with st.echo():
    for i in range(5):
        st.write("hello")

3 寫入 data frame

st.write()magic commands 一起構(gòu)成了 Streamlit 的“瑞士軍刀”。幾乎可以將任何內(nèi)容傳遞給 st.write(): 文本,數(shù)據(jù),Matplotlib圖形,Altair圖表等等。不用擔(dān)心,Streamlit 會弄清楚并以正確的方式呈現(xiàn)事物。

st.write("這是我們使用數(shù)據(jù)創(chuàng)建表的首次嘗試:")
df = pd.DataFrame({
    'first column': [1, 2, 3, 4],
    'second column': [10, 20, 30, 40]
})
st.write(df)

效果:

還有其他一些特定于數(shù)據(jù)的函數(shù),例如 st.dataframe()st.table() 也可以用于顯示數(shù)據(jù)。

4 使用魔法命令

您也可以編寫應(yīng)用程序而無需調(diào)用任何 Streamlit 方法。Streamlit支持“magic commands”,這意味著您根本不必使用 st.write() ! 嘗試使用以下代碼片段替換上面的代碼:

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

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

df

每當(dāng) Streamlit 在自己的 line 上看到變量或文字值時,它將使用 自動將其寫 st.write() 入您的應(yīng)用程序。有關(guān)更多信息,請參閱 magic commands

5 繪制圖表和地圖

Streamlit 支持多種流行的數(shù)據(jù)圖表庫,例如 Matplotlib, Altair, deck.gl, and more 等。在本部分中,您將向您的應(yīng)用添加條形圖,折線圖和地圖。

5.1 畫折線圖

您可以使用 st.line_chart() 輕松將折線圖添加到您的應(yīng)用中。我們將使用 Numpy 生成一個隨機樣本,然后將其繪制成圖表。

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

st.line_chart(chart_data)

效果:

5.2 畫地圖

使用 st.map() 可以在地圖上顯示數(shù)據(jù)點。讓我們使用 Numpy 生成一些示例數(shù)據(jù)并將其繪制在舊金山地圖上。

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

st.map(map_data)

6 添加可交互的小部件

借助小部件,Streamlit 允許您使用復(fù)選框,按鈕,滑塊等將交互性直接烘焙到應(yīng)用程序中。查看 API reference 以獲取交互式窗口小部件的完整列表。

6.1 使用復(fù)選框顯示/隱藏數(shù)據(jù)

復(fù)選框的一個用例是隱藏或顯示應(yīng)用程序中的特定圖表或部分。st.checkbox() 采用單個參數(shù),即小部件標(biāo)簽。在此示例中,該復(fù)選框用于切換條件語句。

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

    st.line_chart(chart_data)

效果:

6.2 使用選擇框進行選擇

Use st.selectbox to choose from a series. You can write in the options you want, or pass through an array or data frame column.

Let’s use the df data frame we created earlier.

使用 st.selectbox 從序列中進行選擇。您可以編寫所需的選項,也可以通過數(shù)組或數(shù)據(jù)框列。讓我們使用之前創(chuàng)建的 df 數(shù)據(jù)框。

option = st.selectbox(
    '您最喜歡哪個數(shù)字?',
     df['first column'])

'You selected: ', option

效果:

7 布局您的應(yīng)用

為了使外觀更整潔,可以將小部件移動到側(cè)邊欄(sidebar)中。這將您的應(yīng)用保持在中心位置,而小部件固定在左側(cè)。讓我們來看看如何在應(yīng)用中使用 st.sidebar

option = st.sidebar.selectbox(
    '您最喜歡哪個數(shù)字?',
     df['first column'])

'You selected:', option

效果:

您可以使用以下語法將大部分可放入應(yīng)用程序中的元素放入側(cè)邊欄中:st.sidebar.[element_name]()。以下是一些顯示其用法的示例:st.sidebar.markdown(), st.sidebar.slider(), st.sidebar.line_chart()

您還可以使用 st.beta_columns 并排布置小部件,或使用 st.beta_expander 通過隱藏大量內(nèi)容來節(jié)省空間。

left_column, right_column = st.beta_columns(2)
pressed = left_column.button('Press me?')
if pressed:
    right_column.write("Woohoo!")

expander = st.beta_expander("FAQ")
expander.write("Here you could put in some really, really long explanations...")

效果:

現(xiàn)在唯一的例外是 st.echost.spinner。不過請放心,目前也在努力為這些產(chǎn)品增加支持!

8 顯示進度

將長時間運行的計算添加到應(yīng)用程序時,可以使用 st.progress() 實時顯示狀態(tài)。

首先,讓我們導(dǎo)入time。 然后使用 time.sleep() 方法來模擬長時間運行的計算:

import time

'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!'

效果:

9 分享您的應(yīng)用

構(gòu)建 Streamlit 應(yīng)用程序后,就該共享它了!要將其展示給全世界,您可以使用 Streamlit sharing 免費部署,管理和共享您的應(yīng)用程序。目前,Streamlit 共享僅接受邀請,因此,請 request an invite,我們將盡快與您聯(lián)系!

它可以通過 3 個簡單的步驟工作:

  1. 將您的應(yīng)用放入公開的 Github 存儲庫中(并確保其具有 requirements.txt!)
  2. 登錄到 share.streamlit.io
  3. 點擊 ‘Deploy an app’,然后粘貼您的 GitHub URL

您現(xiàn)在有了一個公開部署的應(yīng)用程序,可以與世界分享。單擊以了解有關(guān) how to use Streamlit sharing 的更多信息。如果您要為團隊尋求私人共享,請查看 Streamlit for Teams

10 得到幫助

如果您遇到困難,可以:

  • 查看 community forum 并發(fā)布問題
  • 使用 $ streamlit --help 從命令行快速獲得幫助
  • 閱讀更多文檔! 查看:

11 其他

Streamlit 提供即時模式的編程環(huán)境。當(dāng) Streamlit 檢測出源文件變更時,只需點擊 Always rerun 即可。

緩存簡化計算流程。一連串緩存函數(shù)自動創(chuàng)建出高效的計算流程!你可以嘗試以下代碼:https://gist.github.com/treuill...

基本上,該流程涉及加載元數(shù)據(jù)到創(chuàng)建摘要等步驟(load_metadata → create_summary)。該腳本每次運行時,Streamlit 僅需重新計算該流程的子集即可。

Streamlit 適用于 GPU。Streamlit 可以直接訪問機器級原語(如 TensorFlow、PyTorch),并對這些庫進行補充。例如,以下 demo 中,Streamlit 的緩存存儲了整個英偉達 PGGAN。該方法可使用戶在更新左側(cè)滑塊時,app 執(zhí)行近乎即時的推斷。

可使用戶在更新左側(cè)滑塊時,app 執(zhí)行近乎即時的推斷。

該 Streamlit app 使用 TL-GAN 展示了英偉達 PGGAN 的效果

Streamlit 是免費開源庫,而非私有 web app。你可以本地部署 Streamlit app,不用提前聯(lián)系我們。你甚至可以在不聯(lián)網(wǎng)的情況下在筆記本電腦上本地運行 Streamlit。此外,現(xiàn)有項目也可以漸進地使用 Streamlit。

以上只是 Streamlit 功能的冰山一角而已。它最令人興奮的一點是,這些原語可以輕松組成復(fù)雜 app,但看起來卻只是簡單腳本。這就要涉及架構(gòu)運作原理和功能了,本文暫不談及。

Streamlit 組件圖示
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容