使用Python分析餐厅订单数据

相信很多小伙伴都多少了解过Python爬虫,如果没了解爬虫,建议你先去看我的爬虫入门,一片博客带你简单爬虫入门,但是不知道小伙伴们是否思考过我们爬取数据的目的,简单来说,我们通过网络获取大量的数据的目的其实就是为了做后续的数据分析,通过数据分析分析各行各业的行业走向,以便于帮助决策者做出正确的判断和决策。下面我将带领大家来对餐厅订单数据进行分析,另外,在文章的结尾,我分享了一段用python写的表白程序,请小伙伴们在文章结尾查收!

1.展示数据

从图中可以看出,该文件一共有三个表单,分别代表8月份的前十天(初期),中十天(中期)以及后十天(后期),然后,我们可以看到,每个表单中包含各种字段,如detail_id表示我们每条记录的id,order_id表示订单编号,dishes_name表示菜名,counts表示点菜的数量,amounts表示点菜的单价,place_order_time表示点菜的时间,而表格中为NA即表示空数据,稍后在数据预处理阶段会将空数据删除,目前我们知道这些信息即可对其进行数据分析了。
在这里插入图片描述
进行数据处理之前,我们需要思考我们能够根据上述数据得出哪些有价值的信息?
1.订单表的长度,shape,columns
2.统计菜品的平均价格
3.什么菜最受欢迎?
4.哪个订单ID点的菜最多?
5.什么时间段餐厅的销售情况最好?
以上这些结论都是我们可以根据上述数据,通过使用Python数据分析后,做出可视化图形提交上司查验即可。

2.加载数据

import pandas as pd
import matplotlib.pyplot as plt
# 加载数据
data1 = pd.read_excel('meal_order_detail.xlsx', sheet_name='meal_order_detail1')
data2 = pd.read_excel('meal_order_detail.xlsx', sheet_name='meal_order_detail2')
data3 = pd.read_excel('meal_order_detail.xlsx', sheet_name='meal_order_detail3')
# 合并数据 axis=0代表按照行拼接数据
data = pd.concat([data1, data2, data3], axis=0)
# 查看数据信息
print(data.info())

运行结果如下,可以看到数据总内存1.5MB,一共有19个字段,每一个字段都表明了数据的基本信息,从中我们可以发现大量的字段数据为空,因此我们接下来就要对数据进行预处理,例如,删除空数据,删除重复行等
在这里插入图片描述

3.数据预处理

在Python中我们使用DataFrame对象的预处理方法,下面中使用data是一个DataFrame对象,具体如下表所示:

数据预处理方法 描述
data.drop_duplicates(subset=None,keep=‘first’,inplace= False) 用于删除data中的重复行
data.dropna(axis=1,how=‘any’,inplace =True) 删除指定轴上的缺失值

根据上述API,很明显,我们直接使用dropna删除某些值全部为NA的columns,具体代码如下所示:

# inplace=True表示在原数据中修改,axis=1 表示按列删除NA,how='any'表示该列(行)只要有一个为NA则删除
data.dropna(axis=1, inplace=True, how='all')
print(data.info())

删除空值后,输出data的基本信息如下所示:
在这里插入图片描述

4.数据分析及可视化

根据上述的步骤至此,我们已经将数据处理好了,接下来我们首先统计8月份最受欢迎的5道菜,并可视化,具体代码如下所示:

plt.rcParams['font.sans-serif'] = 'SimHei' # 设置中文显示
# 频数统计,什么菜最受欢迎(对菜名进行频数统计,默认是降序排列,使用切片取最大的前5名,数据可视化操作)
dishes_count = data['dishes_name'].value_counts()[:5]
# matplotlib数据可视化
dishes_count.plot(kind='bar') #柱状图
dishes_count.plot(kind='line', color=['r']) #折线图
# 使用循环在柱状图上添加数量
for x,y in enumerate(dishes_count):
    plt.text(x, y+2, y, ha='center')
plt.xlabel('最受欢迎的菜名')
plt.ylabel('月销售量')
plt.title('8月份最受欢迎的5道菜')
plt.show()

程序运行结果如下所示:
在这里插入图片描述
接下来我们从订单ID的维度进行更深层次的分析,例如,如何求出点菜种类数最多的订单号?,具体代码如下所示:

data_group = data['order_id'].value_counts()[:5]
data_group.plot(kind='bar',color=['r','m','b','y','g'])
for x,y in enumerate(data_group):
    plt.text(x,y+1,y,ha='center')
plt.title('订单点菜种类Top5')
plt.xlabel('订单ID')
plt.ylabel('点菜种类')
plt.show()

运行结果如下所示:
在这里插入图片描述
接下来我们分析一下,订单ID点菜数量最多的前5名(Top5)。具体代码如下所示:

# 订单ID点菜数量Top5
data['total_amounts'] = data['counts']*data['amounts'] #统计单道菜的消费总额
dataGroup = data[['order_id','counts','amounts','total_amounts']].groupby(by='order_id')
group_sum = dataGroup.sum() # 分组求和
sort_counts = group_sum.sort_values(by='counts',ascending=False)
sort_counts['counts'][:5].plot(kind='bar')
plt.xlabel('订单ID')
plt.ylabel('点菜数量')
plt.title('订单ID点菜数量Top5')
plt.show()

运行结果如下所示:
在这里插入图片描述
紧接着我们继续统计哪一个订单ID的消费总额最多的前5名(Top5),具体代码如下所示:

# 消费金额最大的Top5
sort_total_amounts = group_sum.sort_values(by='total_amounts',ascending=False)
sort_total_amounts['total_amounts'][:5].plot(kind='bar')
plt.xlabel('订单ID')
plt.ylabel('消费金额')
plt.title('消费金融Top5')
plt.show()

运行结果如下所示:
在这里插入图片描述
然后,我们继续求**哪个订单ID平均消费最贵?**具体代码如下所示:

#哪个订单ID平均消费最贵
group_sum['average'] = group_sum['total_amounts']/group_sum['counts']
# 按照average列降序排列
sort_average = group_sum.sort_values(by='average', ascending=False)
sort_average['average'][:5].plot(kind='bar')
plt.xlabel('订单ID')
plt.ylabel('消费单价')
plt.title('订单单价消费Top5')
plt.show()

具体运行结果如下图所示:
在这里插入图片描述
从订单ID的维度分析完后,我们最后在从时间的维度进行分析,例如分析出一天当中什么时候段的点菜量比较集中呢? 具体代码如下图所示:


# 一天当中什么时间,点菜量比较集中(hour)
data['hourcount'] = 1 # 用作计数 记录小时数
data['time'] = pd.to_datetime(data['place_order_time']) #将place_order_time列的数据转换成日期类型存储
data['hour'] = data['time'].map(lambda x: x.hour) # 取出时间中的小时存放到hour列中
gp_by_hour = data.groupby(by='hour').count()['hourcount']
gp_by_hour.plot(kind='bar')
plt.xlabel('小时')
plt.ylabel('点菜下单数量')
plt.title('下单数与小时的关系图')
plt.show()

运行结果如下图所示:
在这里插入图片描述
接下来我们继续分析8月份哪一天的点菜数量最多? 具体代码如下所示:

data['time'] = pd.to_datetime(data['place_order_time']) #将place_order_time列的数据转换成日期类型存储
data['daycount'] = 1 #创建daycount列用来对day计数
data['day'] = data['time'].map(lambda x: x.day)
gp_by_day = data.groupby(by='day').count()['daycount']
# 数据可视化
gp_by_day.plot(kind='bar')
plt.xlabel('8月份日期')
plt.ylabel('点菜的数量')
plt.title('点菜数量与日期的关系图')
plt.show()

运行结果如下图所示:
在这里插入图片描述
最后,我们**分析星期几的人数最多,订餐数最多?**具体代码如下所示:

data['weekcount'] = 1
data['weekday'] = data['time'].map(lambda x: x.weekday())
gp_by_weekday = data.groupby(by='weekday').count()['weekcount']
gp_by_weekday.plot(kind='bar')
plt.xlabel('8月份星期')
plt.ylabel('点菜数量')
plt.title('星期与点菜数量的关系图')
plt.show()

运行结果如下图所示:
在这里插入图片描述
至此,基于时间维度的分析也已经结束!
如果你已经看到了这里,那么相信你已经对基本的数据分析技能已经掌握,作为奖励,我将分享一段python表白程序给你,具体如下所示:

import turtle
str = 'i like you'
turtle.speed(10)  # 画笔速度
turtle.setup(1800, 700, 70, 70)
turtle.color('black', 'pink')  # 画笔颜色
turtle.pensize(3)  # 画笔粗细
turtle.hideturtle()  # 隐藏画笔(先)
turtle.up()  # 提笔
turtle.goto(-655, -255)  # 移动画笔到指定起始坐标(窗口中心为0,0)
turtle.down()  # 下笔
turtle.showturtle()  # 显示画笔
# 画左边的小人
turtle.goto(-600, -200)
turtle.goto(-600, -120)
turtle.circle(35)
turtle.goto(-600, -200)
turtle.forward(40)
turtle.right(90)
turtle.forward(60)
turtle.hideturtle()
turtle.up()
turtle.goto(-600, -160)
turtle.down()
turtle.showturtle()
turtle.left(90)
turtle.forward(55)
turtle.right(45)
turtle.forward(20)
turtle.hideturtle()
turtle.up()
turtle.goto(-600, -145)
turtle.down()
turtle.showturtle()
turtle.goto(-545, -145)
turtle.left(90)
turtle.forward(20)

# 画第一个爱心
turtle.color('pink', 'pink')
turtle.begin_fill()
turtle.hideturtle()
turtle.up()
turtle.goto(-500, -153)
turtle.down()
turtle.showturtle()
turtle.right(90)
turtle.forward(30)
turtle.left(90)
turtle.forward(30)
turtle.left(45)
turtle.circle(10.6, 180)
turtle.left(180)
turtle.circle(10.6, 180)
turtle.end_fill()
# 下一个大爱心
turtle.color('pink', 'pink')
turtle.begin_fill()
turtle.hideturtle()
turtle.up()
turtle.goto(-430, -143)
turtle.down()
turtle.showturtle()
turtle.left(135)
turtle.right(90)
turtle.forward(50)
turtle.left(90)
turtle.forward(50)
turtle.left(45)
turtle.circle(17.67, 180)
turtle.left(180)
turtle.circle(17.67, 180)
turtle.end_fill()

# 第三个爱心
turtle.color('pink', 'pink')
turtle.begin_fill()
turtle.hideturtle()
turtle.up()
turtle.goto(-315, -133)
turtle.down()
turtle.showturtle()
turtle.left(135)
turtle.right(90)
turtle.forward(70)
turtle.left(90)
turtle.forward(70)
turtle.left(45)
turtle.circle(24.74, 180)
turtle.left(180)
turtle.circle(24.74, 180)
turtle.end_fill()

# 第四个爱心
turtle.color('pink', 'pink')
turtle.begin_fill()
turtle.hideturtle()
turtle.up()
turtle.goto(-187, -133)
turtle.down()
turtle.showturtle()
turtle.left(135)
turtle.right(90)
turtle.forward(70)
turtle.left(90)
turtle.forward(70)
turtle.left(45)
turtle.circle(24.74, 180)
turtle.left(180)
turtle.circle(24.74, 180)
turtle.end_fill()

# 第5个爱心
turtle.color('pink', 'pink')
turtle.begin_fill()
turtle.hideturtle()
turtle.up()
turtle.goto(-43.7, -143)
turtle.down()
turtle.showturtle()
turtle.left(135)
turtle.right(90)
turtle.forward(50)
turtle.left(90)
turtle.forward(50)
turtle.left(45)
turtle.circle(17.67, 180)
turtle.left(180)
turtle.circle(17.67, 180)
turtle.end_fill()

# 第6个爱心
turtle.color('pink', 'pink')
turtle.begin_fill()
turtle.hideturtle()
turtle.up()
turtle.goto(53.88, -153)
turtle.down()
turtle.showturtle()
turtle.right(90)
turtle.right(225)
turtle.forward(30)
turtle.left(90)
turtle.forward(30)
turtle.left(45)
turtle.circle(10.6, 180)
turtle.left(180)
turtle.circle(10.6, 180)
turtle.end_fill()

# 画右边的小人
turtle.hideturtle()
turtle.up()
turtle.goto(251.28, -255)
turtle.down()
turtle.showturtle()
turtle.goto(196.28, -200)
turtle.goto(196.28, -120)
turtle.left(90)
turtle.circle(35)
turtle.goto(196.28, -200)
turtle.left(180)
turtle.forward(40)
turtle.left(90)
turtle.forward(60)
turtle.hideturtle()
turtle.up()
turtle.goto(196.28, -160)
turtle.down()
turtle.showturtle()
turtle.right(90)
turtle.forward(55)
turtle.left(45)
turtle.forward(20)
turtle.hideturtle()
turtle.up()
turtle.goto(196.28, -145)
turtle.down()
turtle.showturtle()
turtle.right(45)
turtle.forward(55)
turtle.right(45)
turtle.forward(20)

# 画气球线和气球
# 第一个气球
turtle.hideturtle()
turtle.up()
turtle.goto(-265, -133)
turtle.down()
turtle.showturtle()
turtle.goto(-245, 0)
turtle.right(135)
turtle.circle(35)
# 第2个气球
turtle.hideturtle()
turtle.up()
turtle.goto(-265, -133)
turtle.down()
turtle.showturtle()
turtle.goto(-305, 80)
turtle.circle(40)
# 第3个气球
turtle.hideturtle()
turtle.up()
turtle.goto(-137, -133)
turtle.down()
turtle.showturtle()
turtle.goto(-167, 0)
turtle.circle(35)
# 第4一个气球
turtle.hideturtle()
turtle.up()
turtle.goto(-137, -133)
turtle.down()
turtle.showturtle()
turtle.goto(-117, 80)
turtle.circle(40)
# 写字LOVE
turtle.pencolor("GREEN")
turtle.penup()
turtle.goto(-245, 10)
turtle.write("O", move=False, align='center', font=("微软雅黑", 30, 'normal'))


turtle.pencolor("PURPLE")
turtle.penup()
turtle.goto(-305, 90)
turtle.write("L", move=False, align='center', font=("微软雅黑", 30, 'normal'))

turtle.pencolor("YELLOW")
turtle.penup()
turtle.goto(-167, 10)
turtle.write("V", move=False, align='center', font=("微软雅黑", 30, 'normal'))

turtle.pencolor("ORANGE")
turtle.penup()
turtle.goto(-117, 90)
turtle.write("E", move=False, align='center', font=("微软雅黑", 30, 'normal'))


# 写送给谁
turtle.pencolor("PINK")
turtle.penup()
turtle.goto(300, 200)
turtle.write(str, move=False, align='center', font=("方正舒体", 30, 'normal'))
turtle.done()

运行效果如下所示
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_51447436/article/details/125850340#comments_30638189