Python实现构建一个仪表板的示例代码
作者:云朵君 发布时间:2023-10-03 11:53:27
这将为我们的团队节省每天重复的数据处理时间......
简介
如果你目前在一个数据或商业智能团队工作,你的任务之一可能是制作一些每日、每周或每月的报告。
虽然获得这些报告并不困难,但还是需要花费不少时间。我们的宝贵时间应该花在更困难的任务上,如训练神经网络或建立数据管道架构。
因此,对于这些平凡的重复性报告,节省我们时间的最好方法是建立一个网络应用程序,其他团队可以自己访问和下载报告。
我说的不是Tableau或PowerBI这样的付费工具(如果公司预算充足的话,你可以使用它们)。有一些高级的网络框架,比如Flask和Django,通常用于建立一个正常运作的网站。
但是,对于一个快速的网络仪表盘来报告指标和数字,你可以考虑使用Streamlit,这是一个相对较新的网络框架,是为ML从业者和数据科学团队建立的。它使用起来非常简单和直观。
内容
我将通过使用一个群组分析的例子来指导你如何构建和部署它。
对于每个部分,我将介绍一个代码模板(你可以在你自己的项目中重新使用)和我的代码(用于本文中使用的队列分析例子)。
创建一个Python文件
在终端上运行该文件,在本地机器上看到仪表板
部署给其他团队使用
1.创建一个Python文件
我们必须创建一个Python文件,以后我们可以从终端调用该文件,在浏览器上显示结果。
你可以给这个文件取任何你想要的名字。这里我把它叫做cohort-demo.py
。
代码模板
# 这些数据可以在公众号后台回复【云朵君】,联系作者获取。
# 1.导入必要的库
import pandas as pd
import numpy as np
import streamlit as st
# 2.设置页面配置
st.set_page_config(
page_title="This is my title", # 页面的标题
page_icon="📈", # favicon
layout="wide",
)
# 3.定义你的项目中使用的所有函数
# 4.对于每一个函数,在其前面添加"@st.experimental_memo"。这就是
# 来记忆每个函数的执行。这将使应用程序运行得更快。
# 特别是当用户与仪表盘上的一些元素互动时
@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
# 我没有在这里定义所有的函数,因为这将延长文章的篇幅。
# 我将在文章的最后提供完整的代码。
现在我们建立第一个屏幕,如下所示。这将首先让用户上传文件,然后运行以产生输出。
代码模板:你可以用任何名字替换 "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") # 来上传文件
一旦用户上传了一个文件,下一个屏幕将看起来像这样。
为了建立这个,我们需要。
选择群组的类型:这是一个单一的选择。它可以是独特的客户保留率,或百分比或AOV(平均订单价值)方面的。
选择队列:这是多选择。人们可以看一个特定的队列或更多。
代码模板
If uploaded_file is not None:# 这很重要,因为没有这个。
# 当没有上传的文件时,会出现
# 一个错误,因为df没有被定义....
df = pd.read_csv(upload_file) # 读取该文件
df_processed = process_df(df) # 清洁数据
# 仪表盘标题
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动态标题
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个指标
代码模板
kpi1, kpi2, kpi3 = st.columns(3) # 创建三个占位符
if uploaded_file is not None:
aov = np.mean(df['total_sales'])
aov_goal = 95.00
kpi1.metric(
# 给这个指标贴上标签
label="AOV",
# 计算度量值
value=f"$ {round(aov,2)}",
# 计算与目标相比的变化(向上/向下箭头)
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.在终端上运行该文件,在本地机器上显示
streamlit run cohort-demo.py
在右上角,你会看到一个选项,即每当你编辑cohort-demo.py时总是运行。
3.在Heroku上部署仪表板
首先在你的GitHub账户上创建GitHub仓库
创建requirements.txt、setup.sh和Procfile
requirements.txt(这是为了添加你在cohort-demo.py中使用的所有必要库。)
#只是简单地列出所有的库。你也可以包括版本
pandas
numpy
streamlit
matplotlib
seaborn
datetime
plotly
setup.sh
#只要复制和粘贴这个
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(你应该在Heroku上创建一个账户)。
在右上角,点击 "Create new app
"
在部署方式下,选择GitHub
然后将GitHub账户连接到Heroku。然后输入仓库的名称(在本例中,它是cohort_analysis_demo)。
一旦连接,在手动部署下,点击部署分支
到这里我们只需要等待它的部署。然后就完成了!URL链接将被创建。
刚刚将仪表盘部署到生产中,团队成员现在可以自己访问和分析数据。
他们可以简单地上传任何符合你定义的格式的数据集。即本例中的客户交易数据。
最终结果
来源:https://mp.weixin.qq.com/s/QvfS1wRa8S3QdVsptm2iVA
![](https://www.aspxhome.com/images/zang.png)
![](https://www.aspxhome.com/images/jiucuo.png)
猜你喜欢
- 在数据预处理过程中可能会遇到这样的问题,如下图:数据中某一个key有多组数据,如何分别对每个key进行相同的运算?dataframe里面给出
- 选择排序选择排序(selection sort)是一种原地(in-place)排序算法,适用于数据量较少的情况。由于选择操作是基于
- Vuex实现购物车功能(附:效果视频),供大家参考,具体内容如下功能描述:加购删除加减全选反选选中计算总价存储整体演示效果如下:首先介绍一下
- 以下是一个基于 Vue 3 实现的简单日历组件的代码示例。这个日历组件包含了前一个月、当前月、下一个月的日期,并且可以支持选择日期、切换月份
- 安装了个5.5版本的mysql,字符集出现了问题,之前的mysql服务器都是通过在my.cnf配置文件中进行配置便可,可是今儿怎么着都不行一
- 触发器权限和所有权CREATE TRIGGER 权限默认授予定义触发器的表所有者、sysadmin 固定服务器角色成员以及 db_owner
- 在之前一篇文章中我介绍了通过定义Response宏的方式来实现动态改变模板文件路径以实现主题功能: laravel实现模板主题功能,但后来我
- mysql5.5.28安装教程,供大家参考,具体内容如下安装步骤:1、首先单击mysql-5.5.28的安装文件,出现该数据库的安装向导界面
- 前言内存映射通常可以提高I/O的性能,因为使用内存映射时,不需要对每个访问都建立一个单独的系统调用,也不需要在缓冲区之间复制数据,内核和用户
- 1. 前言相信参与使用Oracle数据库进行项目开发、运维的同学常常被Oracle JDBC驱动的Maven依赖折磨。现在这一情况在今年二月
- 在 Python 中字符串连接有多种方式,这里简单做个总结,应该是比较全面的了,方便以后查阅。加号连接第一种,通过+号的形式:>>
- 本文实例讲述了PHP模拟asp中response类的方法。分享给大家供大家参考。具体如下:习惯了asp或是asp.net开发的人, 他们会经
- 绘制折线图命令形如:# 常用plt.plot(x, y, linewidth = '1', label = "te
- 1、纯粹的截取字符串function cutstr(thestr1,strlen) dim l,t,c&nbs
- 这是经常用的一个分页存储过程 希望大家指点不足 代码如下:USE [a6756475746] GO /****** Object
- 本文实例讲述了基于JavaScript实现的插入排序算法。分享给大家供大家参考,具体如下:根据排序过程中使用的存储器不同,可以将排序方法分为
- 我就废话不多说了,直接上代码吧!import datetimedef find_close(arr, e): start_time = da
- 这里采用PyCharm专业版可以直接创建Django项目,这里面自动部署了Django的基本环境。在创建项目时选择Django项目:第一次建
- 组建一个关于书籍、作者、出版社的例子:from django.db import modelsclass Publisher(models.
- 在IE下测试,发现最大值是:18014398509481984(0x40000000000000)另外发现一个奇怪的问题:JS世界居然不存在