Search

Travel Tips

Lorem ipsum dolor sit amet, consectetur adipiscing elit.

Lifestyle

Lorem ipsum dolor sit amet, consectetur adipiscing elit.

Hotel Review

Lorem ipsum dolor sit amet, consectetur adipiscing elit.

Python数据分析实战——电商打折套路解析

Python数据分析分析电商打折套路


  电商打折套路解析


引入库

'''
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
import warnings
warnings.filterwarnings('ignore') 
# 不发出警告
from bokeh.io import output_notebook
output_notebook()
# 导入notebook绘图模块
from bokeh.plotting import figure,show
from bokeh.models import ColumnDataSource
# 导入图表绘制、图标展示模块
# 导入ColumnDataSource模块
'''

1、从现有数据中,分析出“各个品牌都有多少商品参加了双十一活动?”

要求:

① 计算得到:商品总数、品牌总数

② 双十一当天在售的商品占比情况(思考:是不是只有双十一当天在售的商品是“参与双十一活动的商品?”)

③ 未参与双十一当天活动的商品,在双十一之后的去向如何?

④ 真正参与双十一活动的品牌有哪些?其各个品牌参与双十一活动的商品数量分布是怎样的?

   * 用bokeh绘制柱状图表示

提示:

① 数据的“id”字段为商品的实际唯一标识,“title”字段则为商品在网页上显示的名称

   * 仔细看数据可以发现,同一个id的title不一定一样(双十一前后)

② 数据的“店名”字段为品牌的唯一标识

③ 按照商品销售节奏分类,我们可以将商品分为7类

   A. 11.11前后及当天都在售 → 一直在售

   B. 11.11之后停止销售 → 双十一后停止销售

   C. 11.11开始销售并当天不停止 → 双十一当天上架并持续在售

   D. 11.11开始销售且当天停止 → 仅双十一当天有售

   E. 11.5 - 11.10 → 双十一前停止销售

   F. 仅11.11当天停止销售 → 仅双十一当天停止销售

   G. 11.12开始销售 → 双十一后上架

④ 未参与双十一当天活动的商品,可能有四种情况:

   con1 → 暂时下架(F)

   con2 → 重新上架(E中部分数据,数据中同一个id可能有不同title,“换个马甲重新上架”),字符串查找特定字符 dataframe.str.contains('预售')

   con3 → 预售(E中部分数据,预售商品的title中包含“预售”二字)

   con4 → 彻底下架(E中部分数据),可忽略

⑤ 真正参加活动的商品 = 双十一当天在售的商品 + 预售商品 (可以尝试结果去重)

   通过上述几个指标计算,研究出哪些是真正参与双十一活动的品牌,且其商品数量是多少


'''
# 查看数据, 计算商品总数、品牌总数
import os
os.chdir('/home/zty/Documents/python/Python进阶数据分析及可视化/实战/练习04_电商打折套路解析/')
# 创建工作路径
df = pd.read_excel('双十一淘宝美妆数据.xlsx',sheet_name=0,header=0,index_col=0)
df_length = len(df)
df_columns = df.columns.tolist()
df.fillna(0,inplace = True)   # 填充缺失值
df['date'] = df.index.day     # 提取销售日期
print('数据量为%i条' % len(df))
print('数据时间周期为:\n', df.index.unique())
df.head()

image.png

# 双十一当天在售的商品占比情况

# 按照商品销售节奏分类,我们可以将商品分为7类

#   A. 11.11前后及当天都在售 → 一直在售

#   B. 11.11之后停止销售 → 双十一后停止销售

#   C. 11.11开始销售并当天不停止 → 双十一当天上架并持续在售

#   D. 11.11开始销售且当天停止 → 仅双十一当天有售

#   E. 11.5 - 11.10 → 双十一前停止销售

#   F. 仅11.11当天停止销售 → 仅双十一当天停止销售

#   G. 11.12开始销售 → 双十一后上架


data1 = df[['id','title','店名','date']]
#print(data1.head())
# 筛选数据
d1 = data1[['id','date']].groupby(by = 'id').agg(['min','max'])['date']  
# 统计不同商品的销售开始日期、截止日期
id_11 = data1[data1['date']==11]['id'].unique()
d2 = pd.DataFrame({'id':id_11,'双十一当天是否售卖':True})
# 筛选双十一当天售卖的商品id
id_date = pd.merge(d1,d2,left_index=True,right_on='id',how = 'left')
id_date['双十一当天是否售卖'][id_date['双十一当天是否售卖']!=True] = False
#print(id_date.head())
# 合并数据
m = len(data1['id'].unique())
m_11 = len(id_11)
m_11_pre = m_11/m
print('商品总数为%i个\n-------' % m)
print('双十一当天参与活动的商品总数为%i个,占比为%.2f%%\n-------' % (m_11,m_11_pre*100))
print('品牌总数为%i个\n' % len(data1['店名'].unique()),data1['店名'].unique())
# 统计

image.png

id_date['type'] = '待分类'
id_date['type'][(id_date['min'] <11)&(id_date['max']>11)] = 'A'      #  A类:11.11前后及当天都在售 → 一直在售
id_date['type'][(id_date['min'] <11)&(id_date['max']==11)] = 'B'     #  B类:11.11之后停止销售 → 双十一后停止销售
id_date['type'][(id_date['min'] ==11)&(id_date['max']>11)] = 'C'     #  C类:11.11开始销售并当天不停止 → 双十一当天上架并持续在售
id_date['type'][(id_date['min'] ==11)&(id_date['max']==11)] = 'D'    #  D类:11.11开始销售且当天停止 → 仅双十一当天有售
id_date['type'][id_date['双十一当天是否售卖']== False] = 'F'         #  F类:仅11.11当天停止销售 → 仅双十一当天停止销售
id_date['type'][id_date['max']<11] = 'E'                             #  E类:11.5 - 11.10 → 双十一前停止销售
id_date['type'][id_date['min'] >11] = 'G'                            #  G类:11.11之后开始销售 → 双十一后上架
# 商品销售节奏分类
result1 = id_date['type'].value_counts()
result1 = result1.loc[['A','C','B','D','E','F','G']]  # 调整顺序
# 计算不同类别的商品数量
from bokeh.palettes import brewer
colori = brewer['YlGn'][7]
# 设置调色盘
plt.axis('equal')  # 保证长宽相等
plt.pie(result1,labels = result1.index, autopct='%.2f%%',pctdistance=0.8,labeldistance =1.1,
        startangle=90, radius=1.5,counterclock=False, colors = colori)
# 绘制饼图
result1

image.png

# 未参与双十一当天活动的商品,在双十一之后的去向如何?

#   con1 → 暂时下架(F)

#   con2 → 重新上架(E中部分数据,数据中同一个id可能有不同title,“换个马甲重新上架”)

#   con3 → 预售(E中部分数据,预售商品的title中包含“预售”二字),字符串查找特定字符 dataframe.str.contains('预售')

#   con4 → 彻底下架(E中部分数据),可忽略


id_not11 = id_date[id_date['双十一当天是否售卖']==False]  # 筛选出双十一当天没参加活动的产品id
print('双十一当天没参加活动的商品总数为%i个,占比为%.2f%%\n-------' % (len(id_not11),len(id_not11)/m*100))
print('双十一当天没参加活动的商品销售节奏类别为:\n',id_not11['type'].value_counts().index.tolist())
print('------')
# 找到未参与双十一当天活动的商品id
df_not11 = id_not11[['id','type']]
data_not11 = pd.merge(df_not11,df,on = 'id', how = 'left')
# 筛选出未参与双十一当天活动商品id对应的原始数据
id_con1 = id_date['id'][id_date['type'] == 'F'].values
# 筛选出con1的商品id
# con1 → 暂时下架(F)
data_con2 = data_not11[['id','title','date']].groupby(by = ['id','title']).count()   # 按照id和title分组(找到id和title一对多的情况)
title_count = data_con2.reset_index()['id'].value_counts()   # 计算id出现的次数,如果出现次数大于1,则说明该商品是更改了title的
id_con2 = title_count[title_count>1].index
# 筛选出con2的商品id
# con2 → 重新上架(E中部分数据,数据中同一个id可能有不同title,“换个马甲重新上架”)
data_con3 = data_not11[data_not11['title'].str.contains('预售')]   # 筛选出title中含有“预售”二字的数据
id_con3 = data_con3['id'].value_counts().index     
# 筛选出con3的商品id
# con3 → 预售(E中部分数据,预售商品的title中包含“预售”二字)
print("未参与双十一当天活动的商品中:\n暂时下架商品的数量为%i个,重新上架商品的数据量为%i个,预售商品的数据量为%i个" 
      % (len(id_con1), len(id_con2), len(id_con3)))

image.png

# 真正参与双十一活动的品牌有哪些?其各个品牌参与双十一活动的商品数量分布是怎样的?

# 真正参加活动的商品 = 双十一当天在售的商品 + 预售商品 (相加后再去重,去掉预售且当天在售的商品)


data_11sale = id_11
#print('双十一当天在售的商品的数量为%i个\n' % len(data_11sale),data_11sale)
#print('--------')
# 得到“双十一当天在售的商品”id及数量
id_11sale_final = np.hstack((data_11sale,id_con3))
result2_id = pd.DataFrame({'id':id_11sale_final})
print('商品总数为%i个' % m)
print('真正参加活动的商品商品总数为%i个,占比为%.2f%%\n-------' % (len(result2_id),len(result2_id)/m*100))
#result2['id'].duplicated() 
# 得到真正参与双十一活动的商品id

image.png

x1 =  pd.DataFrame({'id':id_11})
x1_df = pd.merge(x1,df,on = 'id', how = 'left')    # 筛选出真正参与活动中 当天在售的商品id对应源数据 
brand_11sale = x1_df.groupby('店名')['id'].count()
# 得到不同品牌的当天参与活动商品的数量
x2 =  pd.DataFrame({'id':id_con3})
x2_df = pd.merge(x2,df,on = 'id', how = 'left')    # 筛选出真正参与活动中 当天在售的商品id对应源数据 
brand_ys = x2_df.groupby('店名')['id'].count()
# 得到不同品牌的预售商品的数量
result2_data = pd.DataFrame({'当天参与活动商品数量':brand_11sale,
                            '预售商品数量':brand_ys})
result2_data['参与双十一活动商品总数'] = result2_data['当天参与活动商品数量'] + result2_data['预售商品数量']
result2_data.sort_values(by = '参与双十一活动商品总数',inplace = True,ascending = False)
result2_data

image.png

# 制作堆叠图查看各个品牌参与双十一活动的商品数量分布


from bokeh.models import HoverTool
from bokeh.core.properties import value
# 导入相关模块
lst_brand = result2_data.index.tolist()
lst_type = result2_data.columns.tolist()[:2]
colors = ["#718dbf" ,"#e84d60"]
# 设置好参数
result2_data.index.name = 'brand'
result2_data.columns = ['sale_on_11','presell','sum']
# 修改数据index和columns名字为英文
source = ColumnDataSource(data=result2_data)
# 创建数据
hover = HoverTool(tooltips=[("品牌", "@brand"),
                            ("双十一当天参与活动的商品数量", "@sale_on_11"),
                            ("预售商品数量", "@presell"),
                            ("参与双十一活动商品总数", "@sum")
                           ])  # 设置标签显示内容
p = figure(x_range=lst_brand, plot_width=900, plot_height=350, title="各个品牌参与双十一活动的商品数量分布",
          tools=[hover,'reset,xwheel_zoom,pan,crosshair'])
# 构建绘图空间
p.vbar_stack(lst_type,          # 设置堆叠值,这里source中包含了不同年份的值,years变量用于识别不同堆叠层
             x='brand',     # 设置x坐标
             source=source,
             width=0.9, color=colors, alpha = 0.8,legend=[value(x) for x in lst_type],
             muted_color='black', muted_alpha=0.2
             )
# 绘制堆叠图
p.xgrid.grid_line_color = None
p.axis.minor_tick_line_color = None
p.outline_line_color = None
p.legend.location = "top_right"
p.legend.orientation = "horizontal"
p.legend.click_policy="mute"
# 设置其他参数


show(p)

image.png

这是一个简介
    互联网冲浪金牌选手。赖床世锦赛纪录保持者,拖延俱乐部顶级VIP,夜宵外卖一级鉴赏师,国家脱单脱贫重点扶持对象,中央戏精学院优秀学生,亚洲酸柠檬推广大使,国家一级退堂鼓表演艺术家。
评论 (125)
评论

我是 s enim interduante quis metus. Duis porta ornare nulla ut bibendum

Rosie

6 minutes ago

Sed ac lorem felis. Ut in odio lorem. Quisque magna dui, maximus ut commodo sed, vestibulum ac nibh. Aenean a tortor in sem tempus auctor

Agatha Christie

December 4, 2020 at 3:12 pm

Sed ac lorem felis. Ut in odio lorem. Quisque magna dui, maximus ut commodo sed, vestibulum ac nibh. Aenean a tortor in sem tempus auctor

Steven

December 4, 2020 at 3:12 pm

Donec in ullamcorper quam. Aenean vel nibh eu magna gravida fermentum. Praesent eget nisi pulvinar, sollicitudin eros vitae, tristique odio.

Danielle Steel

December 4, 2020 at 3:12 pm