一年N度的情人節(jié)又又又到了厅须!各位程序猿們給女朋友準備禮物了嗎蟀拷?剛鐵直男都存在一個困惑的問題:送女朋友什么禮物好?今天特意爬取了某東的數(shù)據(jù)抬旺,來分析下大家情人節(jié)都送什么給女朋友。
主要使用 Excel 和 Python 的 Pandas 庫祥楣、Streamlit 庫开财、Plotly 庫進行搭建可視化大屏。
一误褪、前提準備
本案例數(shù)據(jù)相對結(jié)構(gòu)化责鳍,僅用 excel結(jié)合 Pandas 做簡單處理即可,Plotly 制作可視化圖表兽间,Streamlit 搭建可視化頁面历葛。
① 安裝依賴庫
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
② Plotly
Plotly Express是一個新的高級 Python 可視化庫,它為復雜的圖表提供了一個簡單的語法嘀略。Plotly交互效果明顯優(yōu)于Python的兩大傳統(tǒng)可視化庫 Matplotlib 和 seaborn恤溶。相比 Power BI 和Tableau 等 BI 工具,Plotly 無法勝任數(shù)據(jù)清洗帜羊、關系模型等功能咒程,僅是一個可視化工具。但與Python 其它庫讼育,比如今天使用的 streamlit 配合帐姻,可以創(chuàng)造出像網(wǎng)站、可視化大屏奶段、機器學習工具等各種精彩的應用饥瓷。
③ streamlit
Streamlit,它是一個功能強大忧饭,完全免費的開源應用程序框架扛伍,它能幫你不用懂得復雜的HTML,CSS等前端技術(shù)就能快速做出來一個炫酷的Web頁面词裤。Streamlit 是一個用于機器學習刺洒、數(shù)據(jù)可視化的 Python 框架鳖宾,用極短的時間快速生成一個基于 web 的 GUI。當然逆航,你也可以將其用于給自己的 python 腳本創(chuàng)建前端展示頁面鼎文,也是一個不錯的選擇。
一因俐、準備數(shù)據(jù)
關鍵字搜索【情人節(jié)禮物 女友 2022】拇惋,用三方采集軟件爬取數(shù)據(jù) 2500 +,數(shù)據(jù)準備如下:
二抹剩、分析目的
- 通過禮品類別撑帖、品牌、和價格區(qū)間進行篩選聯(lián)動
①禮品類別(大類)銷量對比情況
②禮品價格區(qū)間占比情況
③各禮品小類的銷量對比(和大類進行聯(lián)動)
④禮品類別的價格分布
⑤品牌禮品的 Top 10 推薦
三澳眷、代碼思路
① 導入相關包
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
# 設置網(wǎng)頁
st.set_page_config(page_title="數(shù)據(jù)大屏", page_icon=":bar_chart:", layout="wide")
st.balloons()
② 讀取數(shù)據(jù)
# 讀取數(shù)據(jù)
@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()
③ 設計左側(cè)邊欄和標題
# 側(cè)邊欄
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(
"價格區(qū)間:",
options=df["價格區(qū)間"].unique(),
default=df["價格區(qū)間"].unique()
)
df_selection = df.query(
"禮品類別 == @category & 品牌 == @brand & 價格區(qū)間 == @price"
)
# 主頁面標題
st.title(":bar_chart: 情人節(jié)看看大家都送什么禮物")
st.markdown("##")
④ 畫可視化圖
# 橫向條形圖:各類別禮品銷量
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))
)
從禮品類別來看胡嘿,送美妝護膚類的穩(wěn)居第一,看來情人節(jié)口紅必不可少呀钳踊;排名第二的是箱包皮具類衷敌,看來送包包也是也非常不錯的選擇呢。
# 圓環(huán)圖:禮物價格區(qū)間占比
las = df_selection.groupby(df_selection['價格區(qū)間']).size()
las.sort_values(ascending=True,inplace=True)
layout = go.Layout(
title = '<b>禮品價格區(qū)間占比</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%,價格區(qū)間占比最屑拦 面氓;再看看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)),
)
上面結(jié)果是按照所有類別進行分析的,當然你也可以按照自己喜歡的類別航罗,查看品牌銷量前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>詳細類別產(chǎn)品的銷量</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)),
)
價格區(qū)間篩選了【1000以下】的禮品,從結(jié)果來看缭嫡,鐘表的價格最高缔御,大部分都在500元以上,好像找到了鐘表銷量最低的原因吶妇蛀;要說性價比耕突,還是創(chuàng)意禮品笤成、包包、美妝護膚眷茁,中位數(shù)趨于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
最后運行上面命令,這樣一個關于情人節(jié)的數(shù)據(jù)可視化看板上祈,就搭建完成啦培遵!
其實送禮物這事兒,說難也不難登刺,但也不是一件簡單的事兒~送對了感情升溫籽腕,送錯了讓你恢復單身!最后祝大家情人節(jié)快樂纸俭!