美妆数据分析

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值