我是如何用python去分析某加油站订单流水

一:全文思路整理

前面写了如何用excel、SQL、Tableau去分析这个数据源,本文主要描述python怎么去实现,目的是总结一整套案例分析的思路,以便日后分析参考。本文的思路为:
在这里插入图片描述

二:数据处理流程

在这里插入图片描述
可视化部分做了一个可视化库选择的参考。(各有千秋,个人比较喜欢pyecharts和seaborn,主要是视觉上还过得去。)
在这里插入图片描述

数据导入

#导入包
import pandas as pd
import numpy as np
#可视化包
import matplotlib.pyplot as plt
import seaborn as sns

#设置seaborn的格式
sns.set(style='darkgrid')
plt.rcParams['font.family'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False

数据导入,并作出一些便于之后分析的处理(选择列、重命名列等)。

#导入数据 因为第一行有'数据查询表(2019-11-01 00:00:00 - 2019-11-30 23:59:59)',影响操作,所以选择添加参数header=1
# usecols 选择需要分析的列
df=pd.read_csv('./某油站订单流水.csv',header=1,usecols=[4,7,16,21,22,23,24,25],dtype={'油枪':'str'})
#重命名部分列
df=df.rename(columns={'打印完成':'paytime','主用户标识Openid':'id'})

数据清洗

1、空值

df.info()  #查看数据类型、是否有空值  id列只有54546 说明含有空值
# df.head()
#对于做删除空值的操作
df.dropna(how='any',inplace=True)
df.notnull.count()

在这里插入图片描述
->
在这里插入图片描述

2、重复值

#看一下有没有重复值 可以是某列,某几列,全部
df[df.duplicated()]
#没有不做处理 如果有 
# df.drop_duplicates(inplace=True)

3、异常值(基于业务场景)

在这里插入图片描述
我们这里认为实付金额<10是不符合业务逻辑的,做删除处理。
小插曲:遇见表头空格

#表头存在异常 我们先去掉空格
#处理数据时发现表头有些字段含有“ ”(空格)做替换处理
df.keys()
#运用列表生成式修改表头
df.columns = [i.strip() for i in df.keys()]
df.columns

在这里插入图片描述
-》
在这里插入图片描述

#删除实付金额小于10的
df.drop(df[df['实付金额']<10].index,inplace=True)
df.describe()

在这里插入图片描述

#分组看一下状态的分布
staus_g = df.groupby('状态',as_index=False).count()[['状态','paytime']] #count不会计数null值
staus_g = staus_g.rename(columns={"paytime":'value'})

staus_g['rate'] = (staus_g['value']/staus_g['value'].sum())
staus_g

在这里插入图片描述
下文将只对成功的订单进行分析,所以我们对退款的进行删除.

#删除不为成功的订单
df.drop(df[df['状态'] !='成功'].index,inplace=True)
df.describe()

->>在这里插入图片描述

# 查看各列格式
df.dtypes

在这里插入图片描述
进行时间的处理

#时间的处理
#导入模块
from pandas import to_datetime
#格式转化
df_dt=to_datetime(df['paytime'],format="%Y/%m/%d")
#分别取出对应的日期\星期\时间点
df['p_h']=df_dt.dt.hour #取时间
df['p_d']=df_dt.dt.date #取日期
df['p_w']=df_dt.dt.weekday #取时星期几
df.head()

在这里插入图片描述

三:实现可视化与分析

这一模块,主要展现实现代码和部分图表。(如有错误活不足,请指出。不甚感激!)
在这里插入图片描述

1.时间维度分析

#分组查看每日订单量
df_day=df.groupby('p_d',as_index=False).aggregate({'油枪':'count','交易金额':'sum','实付金额':'sum'})  
df_day=df_day.rename(columns={'油枪':'日订单数'})
df_day['cost']=df_day['交易金额']-df_day['实付金额']

df_day = pd.DataFrame(df_day)
df_day.head()

在这里插入图片描述
进行可视化

#导入可视化库
#可视化包
import matplotlib.pyplot as plt
import seaborn as sns
#线上显示
%matplotlib inline
#设置seaborn的格式
sns.set(style='darkgrid')
plt.rcParams['font.family'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
# Set up the matplotlib figure
f, (ax1, ax2, ax3) = plt.subplots(3, 1, figsize=(20, 8), sharex=True)

# Generate some sequential data
x = df_day['p_d']
y1 = df_day['日订单数']
sns.barplot(x=x, y=y1, palette="rocket", ax=ax1)
ax1.axhline(0, color="k", clip_on=False)
ax1.set_ylabel("日订单数")
plt.xticks(rotation=-45) #坐标轴倾斜

# Center the data to make it diverging
y2 = df_day['实付金额']
sns.barplot(x=x, y=y2, palette="vlag", ax=ax2)
ax2.axhline(0, color="k", clip_on=False)
ax2.set_ylabel("实付金额")

# Randomly reorder the data to make it qualitative
y3 = df_day['cost']
sns.barplot(x=x, y=y3, palette="deep", ax=ax3)
ax3.axhline(0, color="k",clip_on=False)
ax3.set_ylabel("cost")

# Finalize the plot
sns.despine(bottom=True)
plt.setp(f.axes, yticks=[])
plt.tight_layout(h_pad=2)

在这里插入图片描述
画出月实付金额和订单量走势图

#显示中文字体
plt.rcParams['font.family'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False

plt.figure(figsize=(20, 8))
plt.plot(df_day['p_d'],df_day['实付金额'], color='green', marker='o',markerfacecolor='orange',linestyle='dashed',linewidth=2, markersize=4)
plt.yticks(range(300000,460000,50000))
plt.title('实付金额月走势图')
plt.xlabel('实付日期') # x轴标签
plt.ylabel('实付金额') # y轴标签

在这里插入图片描述

plt.figure(figsize=(20, 8))
plt.plot(df_day['p_d'],df_day['日订单数'],color='peru', marker='+',markerfacecolor='white',linestyle='dashed',linewidth=2, markersize=10)
# plt.yticks(range(300000,460000,50000))
plt.title('订单数月走势图')
plt.xlabel('实付日期') # x轴标签
plt.ylabel('日订单数') # y轴标签

在这里插入图片描述
2.以不同油品类别类别分离总加油量,画出子图进行查看

df_type=df.groupby(['p_d','油品'],as_index=False).aggregate({'油枪':'count','油量':'sum','实付金额':'sum'})  
df_type=df_type.rename(columns={'油枪':'日订单数'})
df_type.head(8)

在这里插入图片描述
在这里插入图片描述
画出子图

#以不同油品来查看月成交油量的趋势 画出子图
#分组查看每日各油品成交油量
df_type=df.groupby(['p_d','油品'],as_index=False).aggregate({'油枪':'count','油量':'sum','实付金额':'sum'})  
df_type=df_type.rename(columns={'油枪':'日订单数'})


# df_type = pd.DataFrame(df_type)
df_type.head(8)
# catplot
# 分类图表的接口,通过指定kind参数
g = sns.catplot(x='p_d',
                   y='油量',
                   data=df_type,
                   hue='油品',  #不同颜色表示油品
                   col='油品',  #分离图片的依据
                   kind='swarm' #创建集群图
               )
g.set_xticklabels(rotation=-90) #旋转x轴标签

在这里插入图片描述

2.周维度分析

df_w=df.groupby('p_w',as_index=False).aggregate({'油枪':'count','实付金额':'mean'})  
df_w=df_w.rename(columns={'油枪':'订单数','实付金额':'均成交额'})
df_w['p_w']=df_w['p_w']+1  #默认从0开始算周一 所以加1
df_w
plt.figure(figsize=(20, 8))
plt.plot(df_w['p_w'],df_w['均成交额'], color='slategray', marker='o',markerfacecolor='orange',linestyle='dashed',linewidth=2, markersize=4)
plt.title('实付金额周走势图')
plt.xlabel('week_n') # x轴标签
plt.ylabel('均成交额') # y轴标签

在这里插入图片描述

3.不同油品周维度分析

#以星期几去看实付金额平均值 以及整周的情况
df_ws=df.groupby(['p_w','油品'],as_index=False).aggregate({'油枪':'count','实付金额':'mean'})  
df_ws=df_ws.rename(columns={'油枪':'订单数','实付金额':'均成交额'})
df_ws['p_w']=df_w['p_w']+1  #默认从0开始算周一 所以加1
df_ws
g = sns.catplot(x='p_w',
                   y='均成交额',
                   data=df_ws,
                   hue='油品',  #不同颜色表示油品
                   col='油品',  #分离图片的依据
                   kind='bar' #创建集群图
               )

在这里插入图片描述
建议引入周权重指数的算法,更加能体现规律,在SQL篇我们提到过,这里不继续深入了.

4.消费频次分析

#消费频次分析  看所有用户的每月订单数区间分布
df_c=df.groupby('id',as_index=False).aggregate({'油枪':'count'}) 
#排序查看
df_c=df_c.sort_values('油枪',ascending=False)
#取TOP 10
df_c_top10 = df_c[:10]
df_c_top10

在这里插入图片描述
做出可视化图

x = df_c_top10['油枪']
y= df_c_top10['id']

data = df_c_top10
sns.barplot(x, y, data=data, color="gold")
plt.xlabel('消费次数',labelpad=10,color="#70AD47",fontsize='large',fontweight='bold')
plt.ylabel('ID',labelpad=10,color="red")
for y, x in enumerate(df_c_top10['油枪'].values):
    plt.text(x+0.5, y, "%s" %x,fontsize=12,bbox=dict(facecolor='white', alpha=0.5))

在这里插入图片描述
先简单看一下分布情况

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.family'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
#构建数据
np.random.seed(0)
x = df_c['油枪']
# 使用pandas来设置x 轴标签 和y 轴标签
x = pd.Series(x, name="消费次数")

sns.distplot(x,kde=False,color='r')    
plt.xticks(np.arange(0,80,10))
plt.show()

在这里插入图片描述
分布主要集中在[1,10]的区间内,我们用matplotlib进行展示

# #对1-10进行细化分析
#分桶 方便区间查看
bins_arr = np.arange(0,11,1)

bins = pd.cut(df_c['油枪'],bins_arr)
df_g = df_c['油枪'].groupby(bins).count()
df_g.index = [ str(x.left) +"~" + str(x.right) for x in df_g.index]
import matplotlib.pyplot as plt
#导入,解决中文乱码中文
plt.rcParams['font.sans-serif']='Simhei'
#做柱形图
#设置图片大小
plt.figure(figsize=(15,8),dpi=80)
df_g.plot(kind='bar',color='#f47983')
#设置网格线
plt.grid(alpha=0.7,linestyle='--')
#设置x标签的透明度
plt.xticks(rotation=45)
plt.title('1-10次内各消费次数人数分布')
plt.xlabel('次数区间')
plt.ylabel('人数')
plt.show()

在这里插入图片描述

5.消费金额分析

#消费金额TOP10
df_m=df.groupby('id',as_index=False).aggregate({'实付金额':'sum'}) 
#排序查看
df_m=df_m.sort_values('实付金额',ascending=False)
#取TOP 10
df_m_top10 = df_m[:10]
df_m_top10

在这里插入图片描述

x = df_m['实付金额']
# 使用pandas来设置x 轴标签 和y 轴标签
x = pd.Series(x, name="实付金额")

sns.distplot(x,kde=False,color='g')    #箱子的个数,相当于步长为1
# plt.xticks(np.arange(0,80,10))
plt.show()

在这里插入图片描述

四:总结与思考

对于这个项目分析的维度还很多,但是不具体去弄了,比较我们应该去分析对业务来说有价值的东西.想业务所想,有业务之忧.
当然这篇还算不上时一篇好的数据报告.一篇好的数据报告应该参考下图.本文重在一些规律总结,以及一些业务可能关注的点.
在这里插入图片描述

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值