用 Python 做情人節(jié)選禮物攻略看板【案例】

一年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é)快樂纸俭!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末皇耗,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子掉蔬,更是在濱河造成了極大的恐慌廊宪,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件女轿,死亡現(xiàn)場離奇詭異箭启,居然都是意外死亡,警方通過查閱死者的電腦和手機蛉迹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門傅寡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人北救,你說我怎么就攤上這事荐操。” “怎么了珍策?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵托启,是天一觀的道長。 經(jīng)常有香客問我攘宙,道長屯耸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任蹭劈,我火速辦了婚禮疗绣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘铺韧。我一直安慰自己多矮,他們只是感情好,可當我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布哈打。 她就那樣靜靜地躺著塔逃,像睡著了一般讯壶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上患雏,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天鹏溯,我揣著相機與錄音,去河邊找鬼淹仑。 笑死丙挽,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的匀借。 我是一名探鬼主播颜阐,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼吓肋!你這毒婦竟也來了凳怨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤是鬼,失蹤者是張志新(化名)和其女友劉穎肤舞,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體均蜜,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡李剖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了囤耳。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片篙顺。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖充择,靈堂內(nèi)的尸體忽然破棺而出德玫,到底是詐尸還是另有隱情,我是刑警寧澤椎麦,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布宰僧,位于F島的核電站,受9級特大地震影響观挎,放射性物質(zhì)發(fā)生泄漏撒桨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一键兜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧穗泵,春花似錦普气、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽夷磕。三九已至,卻和暖如春仔沿,著一層夾襖步出監(jiān)牢的瞬間坐桩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工封锉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留绵跷,地道東北人。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓成福,卻偏偏與公主長得像碾局,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子奴艾,可洞房花燭夜當晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容