社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

我用 Python 给女朋友做了个选礼物看板!

凹凸数据 • 4 年前 • 554 次点击  
刚铁直男永远都存在一个困惑的问题:送女朋友什么礼物好?今天特意爬取了某东的数据,来分析下大家情人节都送什么给女朋友。

主要使用Excel和Python的Pandas 库、Streamlit 库、Plotly 库进行搭建可视化大屏。


一、前提准备


本案例数据相对结构化,仅用 Excel 结合 Pandas 做简单处理即可,Plotly 制作可视化图表,Streamlit 搭建可视化页面。

1.1 安装依赖库

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pandas==1.1.0
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple plotly==4.14.3
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple streamlit==0.86.0
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple openpyxl==3.0.6

1.2 Plotly

官方文档地址:https://plot.ly/python/plotly-express/

Plotly Express 是一个新的高级 Python 可视化库,它为复杂的图表提供了一个简单的语法。Plotly 交互效果明显优于 Python 的两大传统可视化库 Matplotlib 和 Seaborn。相比 Power BI 和 Tableau 等 BI 工具,Plotly 无法胜任数据清洗、关系模型等功能,仅是一个可视化工具。但与 Python 其它库,比如今天使用的 Streamlit 配合,可以创造出像网站、可视化大屏、机器学习工具等各种精彩的应用。

1.3 Streamlit

官方文档地址:https://docs.streamlit.io/

Streamlit 是一个功能强大,完全免费的开源应用程序框架,它能帮你不用懂得复杂的 HTML,CSS 等前端技术就能快速做出来一个炫酷的 Web 页面。Streamlit 是一个用于机器学习、数据可视化的 Python 框架,用极短的时间快速生成一个基于 Web 的 GUI。当然,你也可以将其用于给自己的 Python 脚本创建前端展示页面,也是一个不错的选择。

二、准备数据


关键字搜索【情人节礼物 女友 2022】,用第三方采集软件爬取数据 2500+ 条,准备数据如下:



三、分析目的

通过礼品类别、品牌、和价格区间进行筛选联动

① 礼品类别(大类)销量对比情况
② 礼品价格区间占比情况
③ 各礼品小类的销量对比(和大类进行联动)
④ 礼品类别的价格分布
⑤ 品牌礼品的 Top 10 推荐


四、代码思路

4.1 导入相关包




    
import pandas as pd
import plotly.express as px
import streamlit as st
import plotly.figure_factory as ff
import plotly as py
import plotly.graph_objs as go

# 设置网页
st.set_page_config(page_title="数据大屏", page_icon=":bar_chart:", layout="wide")
st.balloons()

4.2 读取数据

# 读取数据
@st.cache
def get_data_from_excel():
    df = pd.read_excel(
        io="data.xlsx",
        engine="openpyxl",
        sheet_name="data"
    )
    return df
df = get_data_from_excel()

4.3 设计左侧边栏和标题

# 侧边栏
st.sidebar.header("请在这里筛选:")
category = st.sidebar.multiselect(
    "礼物类别:",
    options=df["礼品类别"].unique(),
    default=df["礼品类别"].unique()
)

brand = st.sidebar.multiselect(
    "选择品牌:",
    options=df["品牌"].unique(),
    default=df["品牌"].unique(),
)

price = st.sidebar.multiselect(
    "价格区间:",
    options=df["价格区间"].unique(),
    default=df["价格区间"].unique()
)

df_selection = df.query(
    "礼品类别 == @category & 品牌 == @brand & 价格区间 == @price"
)

# 主页面标题
st.title(":bar_chart: 情人节看看大家都送什么礼物")
st.markdown("##")

4.4 画可视化图

# 横向条形图:各类别礼品销量
sales_by_product_line = (
    df_selection.groupby(by=["礼品类别"]).sum()[["销量" ]]
)

fig_product_sales = px.bar(
    sales_by_product_line,
    x="销量",
    y=sales_by_product_line.index,
    orientation="h",
    title="各类别礼品品销量"
)
fig_product_sales.update_layout(
    plot_bgcolor="rgba(0,0,0,0)",
    xaxis=(dict(showgrid=False))
)


从礼品类别来看,送美妆护肤类的稳居第一,看来情人节口红必不可少呀;排名第二的是箱包皮具类,看来送包包也是也非常不错的选择呢。

# 圆环图:礼物价格区间占比
las = df_selection.groupby(df_selection['价格区间']).size()
las.sort_values(ascending=True,inplace=True)
layout = go.Layout(
    title = '礼品价格区间占比',
    barmode='stack'
)
fig_price_sales = go.Figure(data=[go.Pie(labels=las.index, hole =  0.7,values=las.values,hoverinfo = "label + percent")],layout=layout)
fig_price_sales.update_layout(
    xaxis=dict(tickmode="linear"),
    plot_bgcolor="rgba(0,0,0,0)",
    yaxis=(dict(showgrid=False)),
)

# 分隔符
st.markdown("""---""")


礼品价格想必是大家最关心的了吧,从占比来看近 50% 的礼品价格都在 100~500 元之间呐,100 元以下的 6%,价格区间占比最小;再看看 2000 元以上的礼品,占比 15%,这是真爱呀。

# TOP 10 销量最高品牌
sales_by_brand = df_selection.groupby(by=["品牌"])
brand_dic = {i:j['销量'].sum() for i,j in sales_by_brand}
brand_dic = sorted(brand_dic.items(), key = lambda kv:(kv[1], kv[0]),reverse=True)
ins = []
val = []
for i, j in brand_dic[:10]:
    ins.append(i.split()[0])
    val.append(j)
sales_by_brand = px.bar(
    x=ins,
    y=val,
    title="TOP 10 销量最高品牌",
)
sales_by_brand.update_layout(
    xaxis=dict(tickmode="linear"),
    plot_bgcolor="rgba(0,0,0,0)",
    yaxis=(dict(showgrid=False)),
)


上面结果是按照所有类别进行分析的,当然你也可以按照自己喜欢的类别,查看品牌销量前 10。

# 柱状图:各详细类别礼品销量对比
sales_by_goods = df_selection.groupby(by=["小类"]).sum()[["销量"]]
sales_by_goods = px.bar(
    sales_by_goods,
    x=sales_by_goods.index,
    y="销量",
    title="详细类别产品的销量",
)
sales_by_goods.update_layout(
    xaxis=dict(tickmode="linear"),
    plot_bgcolor="rgba(0,0,0,0)",
    yaxis=(dict(showgrid=False)),
)


这里选择【美妆护肤】这个类别,分析各小类的销量对比,原来第一的是眼霜和爽肤水,第二的是口红。想必这是小姐姐的最爱吧。

# 箱线图:各类别礼品的价格分布
fig = px.box(df_selection, x="礼品类别", y="价格",color="礼品类别",
    title="各类别礼品的价格分布")

fig.update_layout(
    xaxis=dict(tickmode="linear"),
    plot_bgcolor="rgba(0,0,0,0)",
    yaxis=(dict(showgrid=False)),
)


价格区间筛选了 1000 元以下的礼品,从结果来看,钟表的价格最高,大部分都在 500 元以上,好像找到了钟表销量最低的原因呐;要说性价比,还是创意礼品、包包、美妆护肤,中位数趋于 200~300 之间。

# 将图形显示到前端页面
left_column, right_column,r = st.columns(3)
right_column.plotly_chart(fig_price_sales, use_container_width=True)
left_column.plotly_chart(fig_product_sales, use_container_width=True)
r.plotly_chart(sales_by_brand, use_container_width=True)
st.markdown("""---""")
left, right = st.columns(2)
left.plotly_chart(sales_by_goods, use_container_width=True)
right.plotly_chart(fig, use_container_width=True)
# 隐藏streamlit默认格式信息
hide_st_style = """
            
            """

st.markdown(hide_st_style, unsafe_allow_html=True)

streamlit run demo.py

最后运行上面命令,这样一个关于情人节的数据可视化看板,就搭建完成啦! 

同时,我也在 B 站发布了本期内容的视频,欢迎三连呀!

其实送礼物这事儿,说难也不难,但也不是一件简单的事儿~送对了感情升温,送错了让你恢复单身!



点击这里,阅读更多数据文章!

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/127506