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

Streamlit 是第一個(gè)專(zhuān)門(mén)針對(duì)機(jī)器學(xué)習(xí)和數(shù)據(jù)科學(xué)團(tuán)隊(duì)的應(yīng)用 開(kāi)發(fā)框架法褥,它是開(kāi)發(fā)自定義機(jī)器學(xué)習(xí)工具的最快的方法子檀,你可以認(rèn)為 它的目標(biāo)是取代 Flask 在機(jī)器學(xué)習(xí)項(xiàng)目中的地位爷怀,可以幫助機(jī)器學(xué)習(xí)工程師快速開(kāi)發(fā)用戶(hù)交互工具麦牺。Streamlit 的宗旨很明確稀并,就是要讓人只需要通過(guò)編寫(xiě)簡(jiǎn)單的 Python 代碼其障,就可以完成構(gòu)建應(yīng)用的需求银室。它支持所見(jiàn)即所得的熱更新,而且你不需要寫(xiě)一行 HTTP 請(qǐng)求代碼及前端代碼励翼,你只需要一個(gè) Python IDE 和一個(gè)瀏覽器蜈敢,就能快速看到你自己構(gòu)建的應(yīng)用。Streamlit 的上手特別簡(jiǎn)單汽抚,并且支持諸如 Tensorflow抓狭,Keras,PyTorch造烁,Pandas否过,Seaborn 等主流的機(jī)器學(xué)習(xí),深度學(xué)習(xí)惭蟋,數(shù)據(jù)分析苗桂,數(shù)據(jù)可視化框架。隨便創(chuàng)建一個(gè) hello.py 文件告组,然后只需要寫(xiě)幾行代碼煤伟,就能完成一個(gè)簡(jiǎn)單的功能。

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

pip install streamlit
# 啟動(dòng)測(cè)試
streamlit hello

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

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

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

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

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

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ùn)行您的應(yīng)用掸冤。新的標(biāo)簽頁(yè)將在您的默認(rèn)瀏覽器中打開(kāi)。目前為空白友雳,沒(méi)關(guān)系贩虾,下面我們會(huì)添加一些東西。運(yùn)行 Streamlit 應(yīng)用程序與任何其他 Python 腳本沒(méi)有什么不同沥阱。每當(dāng)您需要查看應(yīng)用程序時(shí)缎罢,都可以使用此命令。

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

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

Ctrl + c 可以中止 streamlit run咽袜。

很棒!你完成了一個(gè) App 的創(chuàng)建枕稀,雖然询刹,它什么功能也沒(méi)有,但也是一個(gè) App萎坷。

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

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

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

可以看看效果:

這里的公式是使用 Markdown 的語(yǔ)法蔽挠,你也可以使用 latex:

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

更多的使用如下:

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

st.markdown("# markdown一級(jí)標(biāo)題")
st.markdown("## markdown二級(jí)標(biāo)題")
st.markdown("### markdown三級(jí)標(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() 是一個(gè)泛型函數(shù),根據(jù)傳入對(duì)象不同采取不同的展示方式瓜浸,比如傳入 pandas.DataFrame 時(shí)澳淑,st.write(df) 默認(rèn)調(diào)用 st.dataframe(),傳入 markdown時(shí)插佛,st.write(markdown) 默認(rèn)調(diào)用 st.markdown()杠巡。可傳入的對(duì)象有:

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绑改,同時(shí)執(zhí)行 Code;需要將code放入 st.echo() 內(nèi):

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

3 寫(xiě)入 data frame

st.write()magic commands 一起構(gòu)成了 Streamlit 的“瑞士軍刀”兄一。幾乎可以將任何內(nèi)容傳遞給 st.write(): 文本,數(shù)據(jù)识腿,Matplotlib圖形出革,Altair圖表等等。不用擔(dān)心渡讼,Streamlit 會(huì)弄清楚并以正確的方式呈現(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 使用魔法命令

您也可以編寫(xiě)應(yīng)用程序而無(wú)需調(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 上看到變量或文字值時(shí)混驰,它將使用 自動(dòng)將其寫(xiě) st.write() 入您的應(yīng)用程序。有關(guān)更多信息皂贩,請(qǐng)參閱 magic commands栖榨。

5 繪制圖表和地圖

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

5.1 畫(huà)折線圖

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

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

st.line_chart(chart_data)

效果:

5.2 畫(huà)地圖

使用 st.map() 可以在地圖上顯示數(shù)據(jù)點(diǎn)轰枝。讓我們使用 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ù)選框顯示/隱藏?cái)?shù)據(jù)

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

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 使用選擇框進(jìn)行選擇

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 從序列中進(jìn)行選擇韧衣。您可以編寫(xiě)所需的選項(xiàng),也可以通過(guò)數(shù)組或數(shù)據(jù)框列。讓我們使用之前創(chuàng)建的 df 數(shù)據(jù)框畅铭。

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

'You selected: ', option

效果:

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

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

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

'You selected:', option

效果:

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

您還可以使用 st.beta_columns 并排布置小部件眶俩,或使用 st.beta_expander 通過(guò)隱藏大量?jī)?nèi)容來(lá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快鱼。不過(guò)請(qǐng)放心颠印,目前也在努力為這些產(chǎn)品增加支持!

8 顯示進(jìn)度

將長(zhǎng)時(shí)間運(yùn)行的計(jì)算添加到應(yīng)用程序時(shí)抹竹,可以使用 st.progress() 實(shí)時(shí)顯示狀態(tài)嗽仪。

首先,讓我們導(dǎo)入time柒莉。 然后使用 time.sleep() 方法來(lái)模擬長(zhǎng)時(shí)間運(yùn)行的計(jì)算:

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 免費(fèi)部署窿凤,管理和共享您的應(yīng)用程序。目前跨蟹,Streamlit 共享僅接受邀請(qǐng)雳殊,因此,請(qǐng) request an invite窗轩,我們將盡快與您聯(lián)系夯秃!

它可以通過(guò) 3 個(gè)簡(jiǎn)單的步驟工作:

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

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

10 得到幫助

如果您遇到困難舌缤,可以:

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

11 其他

Streamlit 提供即時(shí)模式的編程環(huán)境某残。當(dāng) Streamlit 檢測(cè)出源文件變更時(shí),只需點(diǎn)擊 Always rerun 即可陵吸。

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

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

Streamlit 適用于 GPU。Streamlit 可以直接訪問(wèn)機(jī)器級(jí)原語(yǔ)(如 TensorFlow喳整、PyTorch)谆构,并對(duì)這些庫(kù)進(jìn)行補(bǔ)充。例如框都,以下 demo 中搬素,Streamlit 的緩存存儲(chǔ)了整個(gè)英偉達(dá) PGGAN。該方法可使用戶(hù)在更新左側(cè)滑塊時(shí)魏保,app 執(zhí)行近乎即時(shí)的推斷熬尺。

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

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

Streamlit 是免費(fèi)開(kāi)源庫(kù)粱哼,而非私有 web app。你可以本地部署 Streamlit app檩咱,不用提前聯(lián)系我們揭措。你甚至可以在不聯(lián)網(wǎng)的情況下在筆記本電腦上本地運(yùn)行 Streamlit。此外刻蚯,現(xiàn)有項(xiàng)目也可以漸進(jìn)地使用 Streamlit绊含。

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

Streamlit 組件圖示
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市霸褒,隨后出現(xiàn)的幾起案子津坑,更是在濱河造成了極大的恐慌,老刑警劉巖傲霸,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疆瑰,死亡現(xiàn)場(chǎng)離奇詭異眉反,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)穆役,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)寸五,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人耿币,你說(shuō)我怎么就攤上這事梳杏。” “怎么了淹接?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵十性,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我塑悼,道長(zhǎng)劲适,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任厢蒜,我火速辦了婚禮霞势,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘斑鸦。我一直安慰自己愕贡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布巷屿。 她就那樣靜靜地躺著固以,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嘱巾。 梳的紋絲不亂的頭發(fā)上嘴纺,一...
    開(kāi)封第一講書(shū)人閱讀 51,692評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音浓冒,去河邊找鬼栽渴。 笑死,一個(gè)胖子當(dāng)著我的面吹牛稳懒,可吹牛的內(nèi)容都是我干的闲擦。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼场梆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼墅冷!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起或油,我...
    開(kāi)封第一講書(shū)人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤寞忿,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后顶岸,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體腔彰,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡叫编,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了霹抛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片搓逾。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖杯拐,靈堂內(nèi)的尸體忽然破棺而出霞篡,到底是詐尸還是另有隱情,我是刑警寧澤端逼,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布朗兵,位于F島的核電站,受9級(jí)特大地震影響顶滩,放射性物質(zhì)發(fā)生泄漏余掖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一诲祸、第九天 我趴在偏房一處隱蔽的房頂上張望浊吏。 院中可真熱鬧而昨,春花似錦救氯、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至务嫡,卻和暖如春甲抖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背心铃。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工准谚, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人去扣。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓柱衔,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親愉棱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子唆铐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

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