1.项目流程分析:
1.什么菜最受欢迎
1.先导入数据,对数据进行预处理:使用concat将三个表对行进行合并,在将有空值的列除,写%matplotlib inline是为了以后不需要写plt.show()。最后输出数据检查一下
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# 解决中文乱码问题
plt.rcParams['font.sans-serif']='SimHei'
%matplotlib inline
# 加载数据
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)
data.dropna(axis=1,inplace=True)
round(data['amounts'].mean(),2) # 第一种方法,pandas自带的
round(np.mean(data['amounts']),2) # 第二种方法,numpy的方法,这种方法的速度比较快
print(data)
data.info()
2.统计前十个最受欢迎的菜品,使用values_count()函数统计各个菜品的总和,用切片方式取前十个菜品,在用plot方法绘制图像,函数值kind是指定绘制那种图像,line是折线图,bar是柱状图,color是指定颜色。如果想要柱状图上面显示数据:先循环得到柱状图的坐标,在使用plt.text方法在画布上添加数据。ylabel是为y轴标记数据集,xlabel是为x轴标记数据集
# 统计钱十名菜品的名字
dishes_count=data['dishes_name'].value_counts()[:10]
# dishes_count
# 3.数据可视化(将数据转化为图表,更加直观)
dishes_count.plot(kind='line',color='r')
dishes_count.plot(kind='bar',color='b',fontsize=12)
for index,val in enumerate(dishes_count):
plt.text(index,val+5,val,ha='center',va='center',fontsize=12)
plt.ylabel('订单数')
plt.xlabel('食品名字')
plt.title('食品榜单前十')
2.点菜的种类
分析各个订单id点菜最多的前十名操作和上面差不多
# 分析订单点菜最多
data_group=data['order_id'].value_counts()[:10]
data_group.plot(kind='bar',color=['r','b','g','y'])
plt.title('订单点菜菜品前十名')
plt.ylabel('订单数量')
plt.xlabel('订单id')
for x,y in enumerate(data_group):
plt.text(x,y+1,y,ha='center',va='center')
3.点菜的数量
订单id点菜的数量:在原数据的基础上新增一列total_amounts来记录单道菜的价格,订单id点菜的总价格等于点菜的数量乘上菜品单价,在对id,counts,amounts,total_amounts一起提出来进行分组求和,在对菜品的总量(前面已经分组求和过了,所以是总量)进行排序,后面的操作就和前面的差不多了
# 订单id点菜数量top10(分组order_id,counts求和,排序,前十)
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'][:10].plot(kind='bar',fontsize=16)
plt.xlabel('订单id')
plt.ylabel('点菜数量')
plt.title('订单点菜数量前十')
for x,y in enumerate(sort_counts['counts'][:10]):
plt.text(x,y+1,y,ha='center',va='center')
4.消费金额最大
统计消费最多的id前十名
#统计消费最多的id前十名
sort_total_amounts = Group_sum.sort_values(by='total_amounts',ascending=False)
sort_total_amounts['total_amounts'][:10].plot(kind='bar')
plt.xlabel('订单id')
plt.ylabel('订单id的消费总额')
plt.title('订单id消费前十名')
for x,y in enumerate(sort_total_amounts['total_amounts'][:10]):
plt.text(x,y+20,y,ha='center',va='center')
5.平均消费
哪个订单id平均消费最高,新建一个平均值的列average记得将小数点保留道2位或者三位,在对average列降序排序,因为数据量挺大的,所以我都是取前十个,后面的就和前面的差不多了
# 哪个订单id平均消费最高
Group_sum['average']=round(Group_sum['total_amounts']/Group_sum['counts'],2)
sort_average=Group_sum.sort_values(by='average',ascending=False)
sort_average['average'][:10].plot(kind='bar')
plt.xlabel('订单id')
plt.ylabel('订单id的消费平均值')
plt.title('订单id消费平均值前十名')
for x,y in enumerate(sort_average['average'][:10]):
plt.text(x,y+5,y,ha='center',va='center')
6.针对时间日期进行分析:
一天当中什么时间段(这里用的是小时)点菜数量比较集中
因为表中的数据是时间格式的,所以我们新建一个列hourcount来对每一个小时计数,将数据中的日期格式转成时间类型,再新建一个列hour来保存各个订单在这一天中的那个时间消费的,对time列使用map函数取出小时数保存道hour列。在对小时分组求和就得到这个小时所点的菜的数量。
# 一天当中什么时间段点菜数量比较集中(hour)
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('各个时间段的消费情况')
for x,y in enumerate(gp_by_hour):
plt.text(x,y+20,y,ha='center',va='center')
7.哪一天订餐量最大
像上面对时间进行分析的一样,新建一个对天计数的列daycount来对天计数,新建一个day列将time中的天数提取出来保存道day列中。数据量少,就没有取前十了
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('天数')
plt.ylabel('点菜数量')
plt.title('每一天的消费明细表')
for x,y in enumerate(gp_by_day):
plt.text(x,y+10,y,ha='center',va='center')
8.星期几就餐人数最多
这个就和上面差不多了
# 查看星期几的瑞舒最多,订餐数最多,映射数据道星期
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('天数')
plt.ylabel('点菜数量')
plt.title('每一天的消费明细表')
for x,y in enumerate(gp_by_weekday):
plt.text(x,y+20,y,ha='center',va='center')
9.技术点:
拼接数据:pd.concat([列1,...])
分组进行统计(分组求和)
排序,切片Top10
绘制柱状图走势和高度
10.资料链接:
链接:https://pan.baidu.com/s/1Oqt3vMMfoj1LvEbT5a0eBw?pwd=1234
提取码:1234