前言
import pandas as pd
import numpy as np
一、数据清洗
data = pd.read_csv(r'C:\Users\B\Desktop\dataset.csv',encoding='gbk')
data.head()
data.columns = ['行编号','订单ID','订单日期','发货日期','发货模式','客户ID','客户姓名','客户类别','客户所在城市','客户所在州','客户所在国家','邮编','商店所属区域','商店所属州','产品ID','产品类别','产品子类别','产品名称','售价','销售量','折扣','利润','发货成本','订单优先级']
data.columns
data.isnull().mean()
# 1) 日期类型转换
data['发货日期'] = pd.to_datetime(data['发货日期'])
data['订单日期'] = pd.to_datetime(data['订单日期'])
# 计算时间差
data['发货秒数'] = (data['发货日期']- data['订单日期']).dt.total_seconds()
data.head()
data.describe(include='all')
# 基于索引删除
data.drop(index=data[data['发货秒数']<0].index,inplace=True)
data.drop_duplicates('行编号',inplace=True)
# 发货模式
data['发货模式'].mode()
data['发货模式'].fillna(value=data['发货模式'].mode()[0],inplace=True)
data.drop(columns='邮编',inplace=True)
# 把折扣>1的,替换为空值
data['折扣'] = data['折扣'].mask(data['折扣']>1,None)
data['折扣'].isnull().sum()
# 把折扣为空值的用平均值填充
data['折扣'].fillna(value= round(data['折扣'].mean(),2),inplace=True)
# 去重
data.duplicated().sum()
# 订单日期拆分
data['下订单年'] = data['订单日期'].dt.year
data['下订单月'] = data['订单日期'].dt.month
data['下订单季度'] = data['订单日期'].dt.to_period('Q')
二、数据分析
1.每年销售额的增长情况
代码如下(示例):
data['销售额'] = data['销售量']*data['售价']
data.head()
sales_year = data.groupby(by='下订单年')['销售额'].sum()
sales_year
# 增长率
sale_rate_12 = (sales_year[2012]/sales_year[2011]) -1
sale_rate_13 = (sales_year[2013]/sales_year[2012]) -1
sale_rate_14 = (sales_year[2014]/sales_year[2013]) -1
# 把上面的增长率变成百分比
sale_rate_12_label = "{:.2%}".format(sale_rate_12)
sale_rate_13_label = "{:.2%}".format(sale_rate_13)
sale_rate_14_label = "{:.2%}".format(sale_rate_14)
# 保存到表格里
sales_rate = pd.DataFrame(data= {
'年销售额':sales_year.values.tolist(),
'年订单增长率':[0,sale_rate_12,sale_rate_13,sale_rate_14],
'订单增长百分率':[0,sale_rate_12_label,sale_rate_13_label,sale_rate_14_label]
},index=sales_year.index.tolist())
sales_rate
import matplotlib.pyplot as plt
# 中文显示
plt.rcParams['font.family'] = 'SimHei'
plt.rcParams['font.size'] = 13
# 设置风格
# plt.style.use('ggplot')
x = [str(value) for value in sales_rate.index.tolist()]
y1 = sales_rate['年销售额']
y2 = sales_rate['年订单增长率']
fig = plt.figure(figsize=(12,6))
# 新建子图
ax1 = fig.add_subplot(1,1,1)
ax2 = ax1.twinx() # 共享x轴
ax1.bar(x,y1,color='blue',alpha=0.6,label='年销售额')
ax2.plot(x,y2,color='r',alpha=0.6,linewidth=3,markersize='10',marker='*',label='年增长率')
# y轴标签
ax1.set_ylabel('年销售额(元)')
ax2.set_ylabel('年增长率')
ax1.legend(loc='upper right',bbox_to_anchor=(1.2,1))
ax2.legend(loc='upper right',bbox_to_anchor=(1.2,1.05))
plt.show()
2.各个地区分店的销售额
代码如下(示例):
sales_area = data.groupby('商店所属区域')['销售额'].sum()
sales_area
sales_area.plot(kind='pie',autopct='%1.1f%%',title='各分店的总销售额情况',fontsize=15,figsize=(8,8))
# 结论:APAC店销售额占比最大,达29.6%;其次是EU,占比是23.9%。
3.各地区每年销售额
sale_area2 = pd.pivot_table(data,index='商店所属区域',columns='下订单年',values='销售额',aggfunc='sum')
sale_area2
sale_area2.plot(kind='bar',title='2011年-2014年各区销售额情况',figsize=(15,6),fontsize=15)
sale_area2.plot(title='2011年-2014年各区销售额情况',figsize=(15,6),fontsize=15)
4.销售淡旺季
sales_year_month = pd.pivot_table(data,index='下订单月',columns='下订单年',values='销售额',aggfunc='sum')
sales_year_month
sales_year_month.plot(figsize=(10,6),fontsize=15).legend(fontsize=15)