- 从现有数据中,分析出“各个品牌都有多少商品参加了双十一活动?”
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import os
from bokeh.plotting import figure,show,output_file
from bokeh.layouts import gridplot
from bokeh.models import ColumnDataSource,HoverTool
import warnings
warnings.filterwarnings('ignore')
df=pd.read_excel('双十一淘宝美妆数据.xlsx',sheetname=0)
df.fillna(0,inplace=True)
df.index=df['update_time']
df['date']=df.index.day
- 商品总数、品牌总数、双十一当天在售的商品占比情况
#(1)计算商品总数,品牌数量
product_id = df['id'].unique()
m1 = len(product_id)
brand_id = df['店名'].unique()
m2 = len(brand_id)
print('商品总数为%i,品牌总数为%i' %(m1,m2))
#(2)双十一当天在售的商品占比情况
data_sale11 = df[df['date'] == 11]
m4 = len(data_sale11)
m5 = m4 / m1
print('双十一当天在售的商品占比为%.2f%%' %(m5*100))
商品总数为3502,品牌总数为22
双十一当天在售的商品占比为66.70%
- 未参与双十一当天活动的商品,在双十一之后的去向如何
按照商品销售节奏分类,我们可以将商品分为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) 未参与双十一当天活动的商品中: 242个位暂时下架商品, 110个为重新上架商品,453个为预售商品
con2 → 重新上架(E中部分数据,数据中同一个id可能有不同title,“换个马甲重新上架”),字符串查找特定字符 dataframe.str.contains(‘预售’)
con3 → 预售(E中部分数据,预售商品的title中包含“预售”二字)
con4 → 彻底下架(E中部分数据),可忽略
saledate = df[['id','date']].groupby('id').agg(['min','max'])['date']
id_11 = df[df['date'] == 11]['id']
id_data = pd.DataFrame({'id':id_11, '双十一是否在售卖':True})
data_sale = pd.merge(saledate,id_data, left_index=True, right_on = 'id', how='left')
data_sale.fillna(False,inplace=True)
data_sale['type']=''
data_sale['type'][(data_sale['min']<11) & (data_sale['max'] > 11)] = 'A'
data_sale['type'][(data_sale['min']<11) & (data_sale['max'] == 11)] = 'B'
data_sale['type'][(data_sale['min']==11) & (data_sale['max'] > 11)] = 'C'
data_sale['type'][(data_sale['min']==11) & (data_sale['max'] == 11)] = 'D'
data_sale['type'][data_sale['双十一是否在售卖']==False] ='F'
data_sale['type'][(data_sale['max'] < 11)] = 'E'
data_sale['type'][data_sale['min'] > 11 ] = 'G'
product_type = data_sale['type'].value_counts()
product_type = product_type.loc[['A','C','F','D','E','G','B']]
plt.pie(product_type,radius=1.5,autopct='%.2f%%',labels=product_type.index)
#暂时下架
id_con1 = data_sale[data_sale['type'] == 'F']
#重新上架
data_title = df[['id','title','date','店名']]
data_not11 = data_sale[data_sale['双十一是否在售卖'] == False]
#datax = data_sale[data_sale['type']=='E']
data_con2 = pd.merge(data_not11,data_title,left_on='id',right_on='id',how='left')[['id','title']]
data_con2.drop_duplicates(inplace=True)
title_count = data_con2.groupby('id').count()
id_con2 = title_count[title_count['title']>1]
#预售商品
data_con3 = pd.merge(data_not11,data_title,left_on = 'id',right_on = 'id',how='left')
data_con3 = data_con3[data_con3['title'].str.contains('预售')]
id_con3 = data_con3['id'].value_counts()
print('未参与双十一当天活动的商品中: %i个位暂时下架商品, %i个为重新上架商品,%i个为预售商品'
%(len(id_con1),len(id_con2),len(id_con3)))
未参与双十一当天活动的商品中: 242个位暂时下架商品, 110个为重新上架商品,453个为预售商品
- 各个品牌参与双十一的情况
- 哪些商品真的在打折呢?
针对每个商品,评估其打折的情况
针对在打折的商品,其折扣率是多少
按照品牌分析,不同品牌的打折力度
datax = df[['id','price','店名','date']]
datax.reset_index(inplace=True)
datax['period'] = pd.cut(datax['date'],bins=[4,10,11,14],labels=['双十一前','双十一当天','双十一后'])
datay = datax[['id','price','period']].groupby(['id','price']).min()
datay.reset_index(inplace=True)
id_count = datay['id'].value_counts()
#筛选出打折商品数据
data_dz = pd.DataFrame(id_count[id_count!=1])
m = len(data_dz)/len(id_count)
print('价格在双十一前后存在波动的商品占比为%.2f%%' %(m*100))
data_before11 = datay[datay['period']=='双十一前']
data_on11 = datay[datay['period']=='双十一当天']
data = pd.merge(data_on11,data_before11,left_on = 'id',right_on = 'id')
data['zkl'] = data['price_x']/data['price_y']
data['period'] = pd.cut(data['zkl'],bins=np.linspace(0,1,21)).astype(str)
data = data[data['zkl']<=1] #删除双十一涨价商品
价格在双十一前后存在波动的商品占比为24.73%
针对在打折的商品,其折扣率是多少
按照品牌分析,不同品牌的打折力度
6. 商家营销套路挖掘
datax11 = datax[datax['date'] == 11]
data_brand11 = pd.DataFrame(datax11.groupby('店名').count()['id']) #参与双十一商品总数
data_brand_zk = pd.DataFrame(brand_zk.groupby('name')['id'].count()) #参与打折商品总数
brand_zkld = brand_zk.groupby('name').mean() #品牌打折力度
dataz = pd.merge(data_brand_zk,data_brand11,left_index = True,right_index = True,how='left')
dataz = pd.merge(dataz,brand_zkld,left_index = True,right_index = True,how='left')
dataz.columns = ['zk_amount11','amount11','zkld']
dataz['zk_per'] = dataz['zk_amount11']/dataz['amount11']
dataz = pd.merge(dataz,data_final1,left_index = True,right_index = True,how='left')
对各品牌打折商品的数量以及打折力度进行数据进行可视化