這將為我們的團(tuán)隊(duì)節(jié)省每天重復(fù)的數(shù)據(jù)處理時(shí)間......

簡介
如果你目前在一個(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)。
因此,對于這些平凡的重復(fù)性報(bào)告,節(jié)省我們時(shí)間的最好方法是建立一個(gè)網(wǎng)絡(luò)應(yīng)用程序,其他團(tuán)隊(duì)可以自己訪問和下載報(bào)告。
我說的不是Tableau或PowerBI這樣的付費(fèi)工具(如果公司預(yù)算充足的話,你可以使用它們)。有一些高級的網(wǎng)絡(luò)框架,比如Flask和Django,通常用于建立一個(gè)正常運(yùn)作的網(wǎng)站。
但是,對于一個(gè)快速的網(wǎng)絡(luò)儀表盤來報(bào)告指標(biāo)和數(shù)字,你可以考慮使用Streamlit,這是一個(gè)相對較新的網(wǎng)絡(luò)框架,是為ML從業(yè)者和數(shù)據(jù)科學(xué)團(tuán)隊(duì)建立的。它使用起來非常簡單和直觀。
內(nèi)容
我將通過使用一個(gè)群組分析的例子來指導(dǎo)你如何構(gòu)建和部署它。
對于每個(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ù)可以在公眾號后臺回復(fù)【云朵君】,聯(lián)系作者獲取。
# 1.導(dǎo)入必要的庫
import pandas as pd
import numpy as np
import streamlit as st
# 2.設(shè)置頁面配置
st.set_page_config(
page_title="This is my title", # 頁面的標(biāo)題
page_icnotallow="??", # favicon
layout="wide",
)
# 3.定義你的項(xiàng)目中使用的所有函數(shù)
# 4.對于每一個(gè)函數(shù),在其前面添加"@st.experimental_memo"。這就是
# 來記憶每個(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_icnotallow="??",
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
# 我沒有在這里定義所有的函數(shù),因?yàn)檫@將延長文章的篇幅。
# 我將在文章的最后提供完整的代碼。
現(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") # 來上傳文件
一旦用戶上傳了一個(gè)文件,下一個(gè)屏幕將看起來像這樣。

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

代碼模板
If uploaded_file is not None:# 這很重要,因?yàn)闆]有這個(gè)。
# 當(dāng)沒有上傳的文件時(shí),會(huì)出現(xiàn)
# 一個(gè)錯(cuò)誤,因?yàn)閐f沒有被定義....
df = pd.read_csv(upload_file) # 讀取該文件
df_processed = process_df(df) # 清潔數(shù)據(jù)
# 儀表盤標(biāo)題
st.header("Live Dashboard")
# 過濾器
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') # 來下載該文件
組群分析
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)
# 通過使用f-strings動(dòng)態(tài)標(biāo)題
st.header(f"Live {cohorts.index[0]} to {cohorts.index[-1]} Cohort Dashboard")
# 過濾器
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倉庫

創(chuàng)建requirements.txt、setup.sh和Procfile
requirements.txt(這是為了添加你在cohort-demo.py中使用的所有必要庫。)
#只是簡單地列出所有的庫。你也可以包括版本
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上傳至資源庫
- 打開Heroku(你應(yīng)該在Heroku上創(chuàng)建一個(gè)賬戶)。
在右上角,點(diǎn)擊 "Create new app"

在部署方式下,選擇GitHub

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

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

總結(jié)
希望能夠幫助到大家,僅作為一個(gè)demo參考。其實(shí)Streamlit可以做很多很酷的事情,如果你像我一樣,在不了解Nodejs、Flask和Django等網(wǎng)絡(luò)開發(fā)框架的情況下,可以使用它來快速創(chuàng)建一個(gè)儀表盤。
雖然如此,我仍然相信了解JS/HTML/CSS和軟件工程概念會(huì)更有優(yōu)勢。所以我確實(shí)建議你花空閑時(shí)間學(xué)習(xí)這些技術(shù)。