Python實(shí)現(xiàn)構(gòu)建一個(gè)儀表板的示例代碼
這將為我們的團(tuán)隊(duì)節(jié)省每天重復(fù)的數(shù)據(jù)處理時(shí)間......

簡(jiǎn)介
如果你目前在一個(gè)數(shù)據(jù)或商業(yè)智能團(tuán)隊(duì)工作,你的任務(wù)之一可能是制作一些每日、每周或每月的報(bào)告。
雖然獲得這些報(bào)告并不困難,但還是需要花費(fèi)不少時(shí)間。我們的寶貴時(shí)間應(yīng)該花在更困難的任務(wù)上,如訓(xùn)練神經(jīng)網(wǎng)絡(luò)或建立數(shù)據(jù)管道架構(gòu)。
因此,對(duì)于這些平凡的重復(fù)性報(bào)告,節(jié)省我們時(shí)間的最好方法是建立一個(gè)網(wǎng)絡(luò)應(yīng)用程序,其他團(tuán)隊(duì)可以自己訪問(wèn)和下載報(bào)告。
我說(shuō)的不是Tableau或PowerBI這樣的付費(fèi)工具(如果公司預(yù)算充足的話,你可以使用它們)。有一些高級(jí)的網(wǎng)絡(luò)框架,比如Flask和Django,通常用于建立一個(gè)正常運(yùn)作的網(wǎng)站。
但是,對(duì)于一個(gè)快速的網(wǎng)絡(luò)儀表盤來(lái)報(bào)告指標(biāo)和數(shù)字,你可以考慮使用Streamlit,這是一個(gè)相對(duì)較新的網(wǎng)絡(luò)框架,是為ML從業(yè)者和數(shù)據(jù)科學(xué)團(tuán)隊(duì)建立的。它使用起來(lái)非常簡(jiǎn)單和直觀。
內(nèi)容
我將通過(guò)使用一個(gè)群組分析的例子來(lái)指導(dǎo)你如何構(gòu)建和部署它。
對(duì)于每個(gè)部分,我將介紹一個(gè)代碼模板(你可以在你自己的項(xiàng)目中重新使用)和我的代碼(用于本文中使用的隊(duì)列分析例子)。
- 創(chuàng)建一個(gè)Python文件
- 在終端上運(yùn)行該文件,在本地機(jī)器上看到儀表板
- 部署給其他團(tuán)隊(duì)使用
1.創(chuàng)建一個(gè)Python文件
我們必須創(chuàng)建一個(gè)Python文件,以后我們可以從終端調(diào)用該文件,在瀏覽器上顯示結(jié)果。
你可以給這個(gè)文件取任何你想要的名字。這里我把它叫做cohort-demo.py。
代碼模板
#?這些數(shù)據(jù)可以在公眾號(hào)后臺(tái)回復(fù)【云朵君】,聯(lián)系作者獲取。 #?1.導(dǎo)入必要的庫(kù) import?pandas?as?pd import?numpy?as?np import?streamlit?as?st #?2.設(shè)置頁(yè)面配置 st.set_page_config( ????page_title="This?is?my?title",??#?頁(yè)面的標(biāo)題 ????page_icon="??",??????????????????#?favicon ????layout="wide", ) #?3.定義你的項(xiàng)目中使用的所有函數(shù) # 4.對(duì)于每一個(gè)函數(shù),在其前面添加"@st.experimental_memo"。這就是 #?來(lái)記憶每個(gè)函數(shù)的執(zhí)行。這將使應(yīng)用程序運(yùn)行得更快。 #?特別是當(dāng)用戶與儀表盤上的一些元素互動(dòng)時(shí) @st.experimental_memo def?function(x): ????return?y
組群分析
import?pandas?as?pd import?numpy?as?np? import?matplotlib.pyplot?as?plt? import?seaborn?as?sns import?matplotlib?as?mpl? from?datetime?import?date,?datetime import?streamlit?as?st?? st.set_page_config( ????page_title="Cohorts?Dashboard", ????page_icon="??", ????layout="wide", ) @st.experimental_memo def?purchase_rate(customer_id): ????purchase_rate?=?[1] ????counter?=?1 ????for?i?in?range(1,len(customer_id)): ????????if?customer_id[i]?!=?customer_id[i-1]: ????????????purchase_rate.append(1) ????????????counter?=?1 ????????else: ????????????counter?+=?1 ????????????purchase_rate.append(counter) ????return?purchase_rate @st.experimental_memo def?join_date(date,?purchase_rate): ????join_date?=?list(range(len(date))) ????for?i?in?range(len(purchase_rate)): ????????if?purchase_rate[i]?==?1: ????????????join_date[i]?=?date[i] ????????else: ????????????join_date[i]?=?join_date[i-1] ????return?join_date ?? #?我沒(méi)有在這里定義所有的函數(shù),因?yàn)檫@將延長(zhǎng)文章的篇幅。 #?我將在文章的最后提供完整的代碼。
現(xiàn)在我們建立第一個(gè)屏幕,如下所示。這將首先讓用戶上傳文件,然后運(yùn)行以產(chǎn)生輸出。

代碼模板:你可以用任何名字替換 "my_company"。
st.title("Cohort?Interactive?Dashboard?Demo")
st.markdown("""
This?webapp?performs?cohort?analysis?of?my_company?data!
*?**Python?libraries?used:**?base64,?pandas,?streamlit,?numpy,?matplotlib,?seaborn
*?**Data?source:**?[Shopify](https://company_name.myshopify.com/admin)
*?You?need?to?select?the?data?file?first?to?proceed.
""")
uploaded_file?=?st.file_uploader("Choose?a?file")?#?來(lái)上傳文件
一旦用戶上傳了一個(gè)文件,下一個(gè)屏幕將看起來(lái)像這樣。

為了建立這個(gè),我們需要。
- 選擇群組的類型:這是一個(gè)單一的選擇。它可以是獨(dú)特的客戶保留率,或百分比或AOV(平均訂單價(jià)值)方面的。
- 選擇隊(duì)列:這是多選擇。人們可以看一個(gè)特定的隊(duì)列或更多。

代碼模板
If?uploaded_file?is?not?None:#?這很重要,因?yàn)闆](méi)有這個(gè)。
?????????????????????????????#?當(dāng)沒(méi)有上傳的文件時(shí),會(huì)出現(xiàn)
?????????????????????????????#?一個(gè)錯(cuò)誤,因?yàn)閐f沒(méi)有被定義....
??df?=?pd.read_csv(upload_file)?#?讀取該文件
??df_processed?=?process_df(df)?#?清潔數(shù)據(jù)
??
??#?儀表盤標(biāo)題
??st.header("Live?Dashboard")
??#?過(guò)濾器
??first_filter?=?st.selectbox('Select?first?filter',['Option?1',?'Option?2',?'Option?3])
????second_filter?=?st.multiselect('Select?second?filter',?['Option?1','Option?2','Option?3','Option?4'])
????output?=?display_function(data_input,first_filter,second_filter)
????st.dataframe(output)
????st.download_button(label='Download?csv',?data=output.to_csv(),?mime='text/csv')?#?來(lái)下載該文件
組群分析
if?uploaded_file?is?not?None:
????df?=?pd.read_csv(uploaded_file)
????df_processed?=?process_df(df)
????df_cohorts?=?cohort_numbers(df_processed)
????cohorts?=?cohort_percent(df_cohorts)
????
????#?通過(guò)使用f-strings動(dòng)態(tài)標(biāo)題
????st.header(f"Live?{cohorts.index[0]}?to?{cohorts.index[-1]}?Cohort?Dashboard")
????
????#?過(guò)濾器
????first_filter=?st.selectbox('Select?type?of?cohort',['By?unique?customers',?'By?percentage',?'By?AOV'])
????second_filter?=?st.multiselect('Select?cohort',?list(cohorts.index))
????output?=?select_which_table_to_draw(df_processed,first_filter,second_filter)
????st.dataframe(output)
????st.download_button(label='Download?csv',?data=output.to_csv(),?mime='text/csv')
最后建立3個(gè)指標(biāo)

代碼模板
kpi1,?kpi2,?kpi3?=?st.columns(3)?#?創(chuàng)建三個(gè)占位符
if?uploaded_file?is?not?None:
????
????aov?=?np.mean(df['total_sales'])
????aov_goal?=?95.00
????kpi1.metric(
????????#?給這個(gè)指標(biāo)貼上標(biāo)簽
????????label="AOV",?
????????#?計(jì)算度量值
????????value=f"$?{round(aov,2)}",
????????#?計(jì)算與目標(biāo)相比的變化(向上/向下箭頭)
????????delta=f"-${round(aov_goal-aov,2)}"?if?aov_goal>aov?else?f"${round(aov-aov_goal,2)}",
????)
????nc?=?np.mean(df.loc[df['customer_type']=='First-time'].groupby(['day']).count()['customer_id'])
????nc_goal?=?30
????kpi2.metric(
????????label="New?customers/day",
????????value=int(nc),
????????delta=f"-{round((nc_goal-nc)/nc_goal*100,2)}%"?if?nc_goal>nc?else?f"{round((nc?-?nc_goal)/nc_goal*100,0)}%",
????)
????rc?=?np.mean(df.loc[df['customer_type']=='Returning'].groupby(['day']).count()['customer_id'])
????rc_goal?=?250
????kpi3.metric(
????????label="Returning?customers/day",
????????value=?int(rc),
????????delta=f"-{round((rc_goal?-?rc)/rc_goal*100,2)}%"?if?rc_goal>rc?else?f"{round((rc-rc_goal)/rc_goal*100,2)}%"
????)
2.在終端上運(yùn)行該文件,在本地機(jī)器上顯示
streamlit?run?cohort-demo.py

在右上角,你會(huì)看到一個(gè)選項(xiàng),即每當(dāng)你編輯cohort-demo.py時(shí)總是運(yùn)行。
3.在Heroku上部署儀表板
首先在你的GitHub賬戶上創(chuàng)建GitHub倉(cāng)庫(kù)

創(chuàng)建requirements.txt、setup.sh和Procfile
requirements.txt(這是為了添加你在cohort-demo.py中使用的所有必要庫(kù)。)
#只是簡(jiǎn)單地列出所有的庫(kù)。你也可以包括版本
pandas
numpy
streamlit
matplotlib
seaborn
datetime
plotly
setup.sh
#只要復(fù)制和粘貼這個(gè) mkdir?-p?~/.streamlit/ echo?"\ [server]\n\ headless?=?true\n\ port?=?$PORT\n enableCORS?=?false\n \n\ "?>?~/.streamlit/config.toml
Procfile
web: sh setup.sh && streamlit run cohort-demo.py
- 將
cohort-demo.py上傳至資源庫(kù) - 打開(kāi)Heroku(你應(yīng)該在Heroku上創(chuàng)建一個(gè)賬戶)。
在右上角,點(diǎn)擊 "Create new app"

在部署方式下,選擇GitHub

然后將GitHub賬戶連接到Heroku。然后輸入倉(cāng)庫(kù)的名稱(在本例中,它是cohort_analysis_demo)。
一旦連接,在手動(dòng)部署下,點(diǎn)擊部署分支

到這里我們只需要等待它的部署。然后就完成了!URL鏈接將被創(chuàng)建。
剛剛將儀表盤部署到生產(chǎn)中,團(tuán)隊(duì)成員現(xiàn)在可以自己訪問(wèn)和分析數(shù)據(jù)。
他們可以簡(jiǎn)單地上傳任何符合你定義的格式的數(shù)據(jù)集。即本例中的客戶交易數(shù)據(jù)。
最終結(jié)果

總結(jié)
希望能夠幫助到大家,僅作為一個(gè)demo參考。其實(shí)Streamlit可以做很多很酷的事情,如果你像我一樣,在不了解Nodejs、Flask和Django等網(wǎng)絡(luò)開(kāi)發(fā)框架的情況下,可以使用它來(lái)快速創(chuàng)建一個(gè)儀表盤。
雖然如此,我仍然相信了解JS/HTML/CSS和軟件工程概念會(huì)更有優(yōu)勢(shì)。所以我確實(shí)建議你花空閑時(shí)間學(xué)習(xí)這些技術(shù)。
到此這篇關(guān)于Python實(shí)現(xiàn)構(gòu)建一個(gè)儀表板的示例代碼的文章就介紹到這了,更多相關(guān)Python構(gòu)建儀表板內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何在Python里使用ChatGPT及ChatGPT簡(jiǎn)介
今年最火的應(yīng)該就是ChatGPT了,現(xiàn)在短短2個(gè)月已經(jīng)突破了1億注冊(cè)用戶,馬斯克可高興壞了,這篇文章主要介紹了如何在Python里使用ChatGPT及ChatGPT是什么?注冊(cè)方式?需要的朋友可以參考下2023-02-02
基于Python爬蟲(chóng)采集天氣網(wǎng)實(shí)時(shí)信息
這篇文章主要介紹了基于Python爬蟲(chóng)采集天氣網(wǎng)實(shí)時(shí)信息,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
Python實(shí)現(xiàn)批量修改文件名實(shí)例
這篇文章主要介紹了Python實(shí)現(xiàn)批量修改文件名的方法,實(shí)例分析了兩種實(shí)現(xiàn)批量修改文件名的技巧,涉及os.rename重命名方法、正則替換及字符串操作的相關(guān)技巧,需要的朋友可以參考下2015-07-07
Django學(xué)習(xí)筆記之為Model添加Action
這篇文章主要介紹了Django給admin添加Action,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-04-04
pandas 實(shí)現(xiàn)將兩列中的較大值組成新的一列
這篇文章主要介紹了pandas 實(shí)現(xiàn)將兩列中的較大值組成新的一列,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03
Python判斷對(duì)象是否為文件對(duì)象(file object)的三種方法示例
這篇文章主要介紹了Python判斷對(duì)象是否為文件對(duì)象(file object)的三種方法示例,https://www.pythontab.com/html/2018/pythonhexinbiancheng_1015/1362.html2019-04-04

