每次情人节我都会问女朋友,你喜欢啥?你想要啥?但是每次女朋友每次都说:‘’你自己想,伸手要来的没有惊喜”。这搞的我还没到情人节就开始失眠了,总是担心送的礼物她会不喜欢,相信有很多朋友跟我一样苦恼吧。今天特意爬取了某东的数据,来分析下大家情人节都送什么给女朋友。
主要使用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 导入相关包
#####Python学习交流群:906715085####
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=\"<b>各类别礼品品销量</b>\" ) 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 = \'<b>礼品价格区间占比</b>\', 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=\"<b>TOP 10 销量最高品牌</b>\", ) 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=\"<b>详细类别产品的销量</b>\", ) 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=\"<b>各类别礼品的价格分布</b>\") 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 = \"\"\" <style> #MainMenu {visibility: hidden;} footer {visibility: hidden;} header {visibility: hidden;} </style> \"\"\" st.markdown(hide_st_style, unsafe_allow_html=True) streamlit run demo.py
最后运行上面命令,这样一个关于情人节的数据可视化看板,就搭建完成啦!这下情人节再也不用担心送的礼物女朋友不喜欢了,果然男孩子跟女孩子想的都是不一样的。有了这份数据再也不用担心女朋友生气了。
https://mp.weixin.qq.com/s?src=11×tamp=1648019476&ver=3693&signature=R3xGdbHN2G1P4Ess4Evw0-lrFX3UYfHxwdywj4uDqv-Y56SbKGOGfBOtAYyyVT4cE9UHIOG9xOwznTP-iQ1rocigusTyqjGGw3lgvbEvotLgyPWfb93nV*oIk-ldRgb5&new=1
Python绿色通道
来源:https://www.cnblogs.com/123456feng/p/16046514.html
本站部分图文来源于网络,如有侵权请联系删除。