import pandas as pd
product=pd.read_excel('D:/日化.xlsx',sheet_name=1)
order = pd.read_excel('D:/日化.xlsx',sheet_name=0)
order.head(5)
product.head(5)
product.info()
order.info()
order['订单日期'].unique()
product.isnull().sum()
order.isnull().sum()
order.loc[order['所在区域'].isnull(),'所在区域']
order[order['所在省份']=='江苏省']
order.loc[order['所在省份'].isnull(),'所在省份']
order.loc[order['所在区域'].isnull(),'所在区域']=['东区','南区']
order.loc[order['所在省份'].isnull()]
order[order['所在地市']=='广州市']
order[order['所在地市']=='北京市']
order.loc[order['所在省份'].isnull(),'所在省份']
order.loc[order['所在省份'].isnull(),'所在省份']=['广东省','北京市']
order[order['商品编号'].isnull()]
order[order['订购数量'].isnull()]
#order['订购数量']=order['订购数量'].fillna(0)
#order['订购数量']
order[order['订购单价'].isnull()]
order[(order['订购单价'].isnull())&(order['商品编号'].notnull())&(order['订购数量'].notnull())]
product[product['商品编号']=='X011']['销售单价'].to_dict()[10]
list(product[product['商品编号']=='X011']['销售单价'].to_dict().values())[0]
ord_pro = pd.merge(order,product,how='inner',on='商品编号')
ord_pro[(ord_pro['订购单价'].isnull())&(ord_pro['商品编号'].notnull())&(ord_pro['订购数量'].notnull())]
order.loc[order['订单编码']=='D22086','订购单价']=list(product[product['商品编号']=='X011']['销售单价'].to_dict().values())[0]
order.loc[order['订单编码']=='D23111','订购单价']=list(product[product['商品编号']=='X096']['销售单价'].to_dict().values())[0]
order.loc[order['订单编码']=='D22086','金额']=order['订购数量']*order['订购单价']
order.loc[order['订单编码']=='D23111','金额']=order['订购数量']*order['订购单价']
order.isnull().sum()
order.dropna(inplace=True)
#order['订购单价']=order['订购单价'].fillna(0)
#order['订购单价']
order.isnull().sum()
product.duplicated().sum()
product['商品编号'].duplicated().sum()
product.describe()
order.duplicated().sum()
order=order.drop_duplicates()
order.reset_index(drop=True,inplace=True)
#order.index=range(order.shape[0])#重置索引
order
order.shape#几行几列
order.info()
order['订单日期']=order['订单日期'].apply(lambda x:pd.to_datetime(x,format="%Y#%m#%d") if isinstance(x,str) else x)
#pd.to_datetime(orser['订单日期'],format="%Y#%m#%d")
order['订单日期']
order['订购数量']=order['订购数量'].apply(lambda x:x.strip('个') if isinstance(x,str) else x).astype('int')
order['订购单价']=order['订购单价'].apply(lambda x:x.strip('元') if isinstance(x,str) else x).astype('float')
order['金额']=order['金额'].astype('float')
order['所在省份']=order['所在省份'].str.replace('自治区|维吾尔|回族|壮族|省|市','',regex=True)
#对省份做个清洗,便于可视化
order['所在省份'].unique()
order['客户编码'] = order['客户编码'].str.replace('编号','')
## 数据可视化
from pyecharts import options as opts
from pyecharts.charts import Bar,Map
#分组统计,分组依据:月:分组的数据:数量、金额
order['订单月份']=order['订单日期'].apply(lambda x:x.month)
#order.groupby('订单月份')['订购数量'].sum()
item=order.groupby('订单月份').agg({'订购数量':'sum','金额':'sum'}).to_dict()
#x=list(item['订购数量'].keys())
y1=[round(i/10000,2) for i in item['订购数量'].values()]
y2=[round(j/10000/10000,2) for j in item['金额'].values()]
#y2=[x for x in item['金额'].values()] #转换为列表
y2
bar=(
Bar()
.add_xaxis([f' {x}月' for x in item['订购数量'].keys()])
.add_yaxis('订购数量(单位:万件)',y1,label_opts=opts.LabelOpts(formatter='{@y1}万件'))
.add_yaxis('金额(单位:亿元)',y2,label_opts=opts.LabelOpts(formatter='{@y2}亿元'))
#添加标题
.set_global_opts(title_opts=opts.TitleOpts(title="每月订购数量及金额情况"))
)
bar.render('html/bar.html')
## 统计订购数量排行TOP20的城市
item = order.groupby('所在地市').agg({'订购数量':'sum'}).sort_values(by='订购数量',ascending=False)[:20].sort_values(by='订购数量').to_dict()['订购数量']
x=[*item.keys()]
y=[round(v/10000,2) for v in item.values()]
c2=(
Bar()
.add_xaxis(x)
.add_yaxis("订购量",y,
label_opts=opts.LabelOpts(position="right",formatter='{@y} 万'))
.reversal_axis() #x和y换方向
.set_global_opts(
title_opts=opts.TitleOpts("订购数量排行 TOP20")
)
)
c2.render('html/where.html')
## 按照订购数量统计美妆类型需求排序
#(1)堆叠pd.concat([df1,df2],axis=0)
#(2)主键合并pd.merge(df1,df2,on='key',how='inner')
#(3)检查数据的缺失值
ord_pro = pd.merge(order,product,on='商品编号',how='inner')#表关联
ord_pro
ord_pro.groupby(['商品大类','商品小类']).agg({'订购数量':'sum'}).sort_values(by=['商品大类','订购数量'],ascending=[True,False])
#by=['商品大类','订购数量']按大类降序排序
## 统计各省份的美妆需求量分布;
item = order.groupby('所在省份').agg({'订购数量':'sum'}).to_dict()['订购数量']
c3 = (
Map()
.add("订购数",[*item.items()],"china",is_map_symbol_show=False)
.set_global_opts(
title_opts=opts.TitleOpts(title='省份分布'),
visualmap_opts=opts.VisualMapOpts(max_=1000000),
)
)
c3.render('html/sheng.html')
from pyecharts import options as opts
from pyecharts.charts import BMap
from pyecharts.faker import Faker
c = (
BMap()
.add_schema(baidu_ak="83DvVsCL8nC3omGhwp4gM2hs",center=[120.13066322374,30.240018034923])
.add(
"bamp",
[list(z) for z in zip(Faker.provinces,Faker.values())],
label_opts=opts.LabelOpts(formatter="{b}"),
)
.set_global_opts(title_opts=opts.TitleOpts(title="BMap-基本示例"))
)
c.render("html/bmap_base.html")
## 通过RFM模型挖掘客户价值
ord_pro
data_rfm=order.groupby('客户编码').agg({'订单日期':'max','订单编码':'count','金额':'sum'})
data_rfm.columns=['最近一次购买时间','消费频率','消费金额']
data_rfm
#rank给出排序的顺序 不影响原数据
data_rfm['R'] = data_rfm['最近一次购买时间'].rank(pct=True) #转化为排名 百分比,便于后续计算权重
data_rfm['F'] = data_rfm['消费频率'].rank(pct=True)
data_rfm['M'] = data_rfm['消费金额'].rank(pct=True)
data_rfm.sort_values(by='R',ascending=False)
data_rfm['score'] = data_rfm['R'] * 20 + data_rfm['F'] * 30 + data_rfm['M'] * 50
data_rfm['score'] = data_rfm['score'].round(1)
data_rfm.sort_values(by='score',ascending=False)