使用Python分析餐厅订单数据

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

1.展示数据

从图中可以看出,该文件一共有三个表单,分别代表8月份的前十天(初期),中十天(中期)以及后十天(后期),然后,我们可以看到,每个表单中包含各种字段,如detail_id表示我们每条记录的id,order_id表示订单编号,dishes_name表示菜名,counts表示点菜的数量,amounts表示点菜的单价,place_order_time表示点菜的时间,而表格中为NA即表示空数据,稍后在数据预处理阶段会将空数据删除,目前我们知道这些信息即可对其进行数据分析了。

使用Python分析餐厅订单数据
进行数据处理之前,我们需要思考我们能够根据上述数据得出哪些有价值的信息?
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')

data = pd.concat([data1, data2, data3], axis=0)

print(data.info())

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

使用Python分析餐厅订单数据

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,具体代码如下所示:


data.dropna(axis=1, inplace=True, how='all')
print(data.info())

删除空值后,输出data的基本信息如下所示:

使用Python分析餐厅订单数据

4.数据分析及可视化

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

plt.rcParams['font.sans-serif'] = 'SimHei'

dishes_count = data['dishes_name'].value_counts()[:5]

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()

程序运行结果如下所示:

使用Python分析餐厅订单数据
接下来我们从订单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()

运行结果如下所示:

使用Python分析餐厅订单数据
接下来我们分析一下, 订单ID点菜数量最多的前5名(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()

运行结果如下所示:

使用Python分析餐厅订单数据
紧接着我们继续 统计哪一个订单ID的消费总额最多的前5名(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()

运行结果如下所示:

使用Python分析餐厅订单数据
然后,我们继续求哪个订单ID平均消费最贵?具体代码如下所示:

group_sum['average'] = group_sum['total_amounts']/group_sum['counts']

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()

具体运行结果如下图所示:

使用Python分析餐厅订单数据
从订单ID的维度分析完后,我们最后在从时间的维度进行分析,例如 分析出一天当中什么时候段的点菜量比较集中呢? 具体代码如下图所示:

data['hourcount'] = 1
data['time'] = pd.to_datetime(data['place_order_time'])
data['hour'] = data['time'].map(lambda x: x.hour)
gp_by_hour = data.groupby(by='hour').count()['hourcount']
gp_by_hour.plot(kind='bar')
plt.xlabel('小时')
plt.ylabel('点菜下单数量')
plt.title('下单数与小时的关系图')
plt.show()

运行结果如下图所示:

使用Python分析餐厅订单数据
接下来我们继续 分析8月份哪一天的点菜数量最多? 具体代码如下所示:
data['time'] = pd.to_datetime(data['place_order_time'])
data['daycount'] = 1
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()

运行结果如下图所示:

使用Python分析餐厅订单数据
最后,我们分析星期几的人数最多,订餐数最多?具体代码如下所示:
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分析餐厅订单数据
至此,基于时间维度的分析也已经结束!
如果你已经看到了这里,那么相信你已经对基本的数据分析技能已经掌握,作为奖励,我将分享一段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)
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()

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()

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)

turtle.hideturtle()
turtle.up()
turtle.goto(-265, -133)
turtle.down()
turtle.showturtle()
turtle.goto(-305, 80)
turtle.circle(40)

turtle.hideturtle()
turtle.up()
turtle.goto(-137, -133)
turtle.down()
turtle.showturtle()
turtle.goto(-167, 0)
turtle.circle(35)

turtle.hideturtle()
turtle.up()
turtle.goto(-137, -133)
turtle.down()
turtle.showturtle()
turtle.goto(-117, 80)
turtle.circle(40)

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()

运行效果如下所示

使用Python分析餐厅订单数据

Original: https://blog.csdn.net/qq_51447436/article/details/125850340
Author: 散一世繁华,颠半世琉璃
Title: 使用Python分析餐厅订单数据

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/674347/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球