在开始构建直播电商数据分析看板之前,必须先配置好Python运行环境。本指南基于Python 3.8版本开发,所有依赖库均通过pip直接安装。请确保你的终端或命令行工具已经准备就绪。
我们需要安装Streamlit框架用于快速构建Web界面,Pandas用于数据处理,Plotly用于绘制交互式图表,以及Faker用于生成模拟的直播数据。请在终端执行以下命令:
pip install streamlit pandas plotly faker numpy
安装完成后,新建一个项目文件夹,并在该文件夹下创建一个名为 app.py 的主程序文件。接下来的所有代码都将写入此文件。
由于真实的直播电商接口通常涉及复杂的鉴权流程,为了保证代码的可复制性和零门槛运行,我们将编写一个函数来模拟产生直播间的实时核心数据,包括:时间戳、当前在线人数、累计成交额(GMV)、新增订单数和商品ID。
在 app.py 中输入以下代码:
```python
import pandas as pd
import numpy as np
import plotly.express as px
import plotly.graph_objects as go
from datetime import datetime, timedelta
import streamlit as st
import random
设置页面配置
st.set_page_config(page_title="直播电商实时数据看板", layout="wide")
模拟生成直播数据的函数
def get_live_data():
模拟当前时间
now = datetime.now()
模拟基础数据波动
base_viewers = 5000
viewers = int(base_viewers + np.random.normal(0, 500))
gmv_increment = np.random.choice([0, 0, 0, 99, 199, 299, 599], p=[0.6, 0.1, 0.1, 0.1, 0.05, 0.03, 0.02])
orders = 1 if gmv_increment > 0 else 0
data = {
"timestamp": now,
"viewers": max(0, viewers),
"gmv": gmv_increment,
"orders": orders,
"product_id": random.choice(["P001", "P002", "P003", "P004"])
}
return data
```
这段代码利用正态分布模拟观众人数的自然波动,并使用加权随机选择模拟真实的下单场景(大多数时间无订单,偶尔有不同金额的订单)。
Streamlit应用每次交互都会重新运行脚本,为了保存历史数据并实现累加效果,我们需要使用 st.session_state 来存储数据状态。我们需要在页面加载时初始化一个空的DataFrame,并设置一个自动刷新机制。
继续在 app.py 中追加以下代码:
```python
初始化Session State
if 'history_df' not in st.session_state:
创建一个空的DataFrame用于存储历史数据
st.session_state.history_df = pd.DataFrame(columns=["timestamp", "viewers", "gmv", "orders", "product_id"])
if 'total_gmv' not in st.session_state:
st.session_state.total_gmv = 0
获取最新数据并更新状态
new_data = get_live_data()
st.session_state.total_gmv += new_data['gmv']
将新数据追加到历史记录中
new_row_df = pd.DataFrame([new_data])
st.session_state.history_df = pd.concat([st.session_state.history_df, new_row_df], ignore_index=True)
为了演示效果,仅保留最近100条数据,避免内存溢出
if len(st.session_state.history_df) > 100:
st.session_state.history_df = st.session_state.history_df.tail(100).reset_index(drop=True)
```
这里的核心逻辑是:每次脚本运行时,生成一条新数据,累加GMV,并将其拼接到历史DataFrame中。通过 tail(100) 方法限制数据量,确保看板运行流畅。
直播电商最关注的指标包括:实时在线人数、累计GMV、实时转化率(CVR)和千GPM(千次观看成交金额)。我们需要根据当前的数据流计算这些指标并展示在页面顶部。
追加以下代码实现指标卡片:
```python
计算核心指标
current_viewers = new_data['viewers']
current_total_gmv = st.session_state.total_gmv
total_orders = st.session_state.history_df['orders'].sum()
total_views = st.session_state.history_df['viewers'].sum() 简单累加作为总曝光估算
计算GPM (Gross Value Per Mille)
防止除以0的错误
gpm = (current_total_gmv / (total_views / 1000)) if total_views > 0 else 0
顶部指标布局
col1, col2, col3, col4 = st.columns(4)
with col1:
st.metric(label="实时在线人数", value=f"{current_viewers:,}", delta=f"{random.randint(-50, 50)}")
with col2:
st.metric(label="累计成交额 (GMV)", value=f"¥{current_total_gmv:,.2f}")
with col3:
st.metric(label="总订单数", value=f"{total_orders}")

with col4:
st.metric(label="GPM (元/千次观看)", value=f"¥{gpm:.2f}")
```
st.metric 是Streamlit专门用于展示KPI的组件,它不仅显示数值,还能通过 delta 参数显示数值的变化趋势。这里为了演示,在线人数的波动是随机生成的。
仅有数字是不够的,我们需要通过折线图观察流量和成交额的趋势。我们将使用Plotly Express创建两个图表:一个展示在线人数趋势,另一个展示GMV的累积走势。
追加图表绘制代码:
```python
st.markdown("") 分隔线
创建两列布局用于展示图表
chart_col1, chart_col2 = st.columns(2)
图表1:实时在线人数趋势
with chart_col1:
st.subheader("实时在线人数趋势")
复制一份数据避免修改原数据
chart_data = st.session_state.history_df.copy()
转换时间格式以便X轴显示正确
chart_data['time_str'] = chart_data['timestamp'].dt.strftime('%H:%M:%S')
fig_viewers = px.line(
chart_data,
x='time_str',
y='viewers',
title='观众流量波动',
labels={'time_str': '时间', 'viewers': '人数'}
)
fig_viewers.update_traces(line_color='1f77b4', line_width=2)
st.plotly_chart(fig_viewers, use_container_width=True)
图表2:成交分布(模拟热力图或柱状图)
with chart_col2:
st.subheader("商品贡献占比")
统计每个商品的成交额
product_gmv = chart_data.groupby('product_id')['gmv'].sum().reset_index()
fig_product = px.bar(
product_gmv,
x='product_id',
y='gmv',
title='各单品成交贡献',
color='gmv',
labels={'product_id': '商品ID', 'gmv': '成交额'}
)
st.plotly_chart(fig_product, use_container_width=True)
```
这部分代码通过 groupby 对数据进行了聚合分析,展示了不同商品ID对总GMV的贡献。使用 use_container_width=True 确保图表能够自适应屏幕宽度。
为了方便排查数据异常,我们需要在页面底部展示一个原始数据流表格。Streamlit的 st.data_editor 或 st.dataframe 非常适合此场景。
追加表格展示代码:
```python
st.markdown("")
st.subheader("实时数据流明细")
格式化展示数据
display_df = st.session_state.history_df.copy()
display_df['timestamp'] = display_df['timestamp'].dt.strftime('%Y-%m-%d %H:%M:%S')
将数据倒序排列,最新的显示在最上面
st.dataframe(display_df.sort_values(by='timestamp', ascending=False).head(10), use_container_width=True)
```
为了让看板动起来,我们需要在代码的最后添加Streamlit的自动刷新组件。这会每隔一定时间自动重新运行脚本,从而获取新数据并更新界面。
在 app.py 的最后一行添加:
```python
设置自动刷新,每2000毫秒(2秒)刷新一次
time.sleep(2)
st.rerun()
```
注意:你需要引入 time 模块,请在文件顶部的 import 区域添加 import time。
至此,所有代码已经编写完成。请确保你的 app.py 文件顶部包含所有必要的 import 语句:
```python
import pandas as pd
import numpy as np
import plotly.express as px
import streamlit as st
import random
import time
from datetime import datetime
```
现在,回到终端,在项目目录下运行以下命令启动看板:
streamlit run app.py
命令执行后,浏览器会自动弹出 http://localhost:8501。你将看到一个包含实时跳动数字、动态折线图和不断刷新数据表格的直播电商数据看板。每隔2秒,数据会自动更新,模拟真实的直播间监控场景。你可以尝试修改 get_live_data 函数中的参数,或者替换该函数接入真实的API数据源,即可将其转化为生产环境可用的监控工具。
易频IT社区是综合性互联网IT技术门户网站,专注分享网络技术、服务器运维、网络安全、编程开发、系统架构、云计算、大数据等行业干货,实时更新IT行业资讯、零基础教程、实战案例,为IT从业者、技术爱好者提供专业的学习交流平台。
Copyright © 2021-2026 易频IT社区. All Rights Reserved. 备案号:闽ICP备2023013482号 网站地图