实战项目:餐厅订单数据分析:订单维度和时间维度
餐厅订单数据分析:订单维度和时间维度
1. 针对不同维度进行数据分析:
针对订单order_id:
- 什么菜最受欢迎
- 点菜的种类
- 点菜的数量
- 消费金额最大
- 平均消费
针对时间日期进行分析:
- 点菜量比较集中的时间
- 哪一天订餐数量最大
- 星期几就餐人数最多
2. 技术点
- 导入数据:pd.read_excel()
- 拼接数据:pd.concat([列1,…],axis=0)
- 删除空值:data.dropna(axis=1,inplace=True)
- 分组进行统计(分组求和):.groupby(by=‘str’)
- 排序,切片Top10
- 绘制柱状图走势和高度
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']='SimHei' #设置中文显示
加载数据、数据预处理
# 1.加载数据
data1 = pd.read_excel('./Data/cooking_data1/meal_order_detail.xlsx',sheet_name='meal_order_detail1')
data2 = pd.read_excel('./Data/cooking_data1/meal_order_detail.xlsx',sheet_name='meal_order_detail2')
data3 = pd.read_excel('./Data/cooking_data1/meal_order_detail.xlsx',sheet_name='meal_order_detail3')
# 2.数据预处理(合并数据,NA处理),分析数据
data = pd.concat([data1,data2,data3],axis=0) #按照行进行拼接数据;列连接axis=1
#data.head(5)
#data.info()
#这里我们需要的数据是:order_id counts amounts place_order_time
#一些空值列需要删除
data.dropna(axis=1,inplace=True) #按照列删除na列,并且修改源数据
data.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 10037 entries, 0 to 3610
Data columns (total 11 columns):# Column Non-Null Count Dtype
--- ------ -------------- ----- 0 detail_id 10037 non-null int64 1 order_id 10037 non-null int64 2 dishes_id 10037 non-null int64 3 dishes_name 10037 non-null object 4 itemis_add 10037 non-null int64 5 counts 10037 non-null int64 6 amounts 10037 non-null int64 7 place_order_time 10037 non-null datetime64[ns]8 add_inprice 10037 non-null int64 9 picture_file 10037 non-null object 10 emp_id 10037 non-null int64
dtypes: datetime64[ns](1), int64(8), object(2)
memory usage: 941.0+ KB
# 统计8月份卖出菜品的平均价格
round(data['amounts'].mean(),2) #方法一:pandas自带的mean()函数
round(np.mean(data['amounts']),2) #方法二:numpy函数处理(更快)
44.82
一、订单维度
(1)频数统计:什么菜最受欢迎? (对菜名进行频数统计:value_counts() 计数,取最大的前10名:切片)
dishes_count = data['dishes_name'].value_counts()[:10]
dishes_count
# 3.数据的可视化matplotlib——将菜名作为横轴,销量作为纵轴
dishes_count.plot(kind='line',color=['r'])
dishes_count.plot(kind='bar',fontsize=16,alpha=0.5) #设置字体大小为16
for x,y in enumerate(dishes_count):print(x,y)plt.text(x,y+2,y,ha='center',fontsize=12) #plt.text(位置,高度+偏移量,内容,横轴位置)
0 323
1 269
2 239
3 216
4 189
5 188
6 187
7 186
8 178
9 173
(2)哪个订单点菜的种类最多(非数量)
# data.groupby(by='order_id').value_counts() #前面的知识
data_group = data['order_id'].value_counts()
data_group = data['order_id'].value_counts()[:10] #取前10:订单id 种类数
data_group.plot(kind='bar',fontsize=16,color=['r','m','b','y','g'],alpha=0.5)
plt.title('订单点菜的种类Top10')
plt.xlabel('订单ID',fontsize=16)
plt.ylabel('点菜种类',fontsize=16)
for x,y in enumerate(data_group):#print(x,y)plt.text(x,y+3,y,ha='center',fontsize=12)
# 8月份餐厅订单点菜种类前10名,平均点菜25个菜品
(3)哪个订单ID点菜的数量最多Top10 (分组order_id, counts()求和, 排序, 前10) SQL也可
data['total_amounts'] = data['counts']*data['amounts'] #统计单道菜品的消费总额,给表中增加一列total_amounts
dataGroup = data[['order_id','counts','amounts','total_amounts']] #取出其中四列作为新的表dataGroup
dataGroup = dataGroup.groupby(by='order_id') #取出含有这四列的表并按order_id分组
Group_sum = dataGroup.sum( ) #分组后的数据表求和 counts、amounts、total_amounts列
sort_counts = Group_sum.sort_values(by='counts',ascending=False) #按照求和后的counts排序,降序
#sort_counts #查看数据
#sort_counts['counts'] #查看counts这一列数据(分组#排序后的)
sort_counts_10 = sort_counts['counts'][:10] #取Top10
sort_counts_10.plot(kind='bar',fontsize=16,color=['g'],alpha=0.6)
plt.title('订单ID点菜数量Top10',fontsize=12)
plt.xlabel('订单ID',fontsize=12)
plt.ylabel('点菜数量',fontsize=12)
for x,y in enumerate(sort_counts_10):plt.text(x,y+1,y)
# 八月份订单点菜数量前十名,平均30道菜
(4)哪个订单ID吃的钱最多、消费最多的ID(排序) Group_sum中已经分组求和了,只需要排序即可
sort_total_amounts = Group_sum.sort_values(by='total_amounts',ascending=False) #降序
# sort_total_amounts
sort_total_amounts_10 = sort_total_amounts['total_amounts'][:10]
sort_total_amounts_10.plot(kind='bar',fontsize=16,color=['r','g','b'],alpha=0.3)
plt.xlabel('订单ID',fontsize=12)
plt.ylabel('消费金额',fontsize=12)
plt.title('消费金额Top10',fontsize=15)
Text(0.5, 1.0, '消费金额Top10')
取中间数据,不是Top10,怎么使用索引
# 消费总额排序后,取中间第100到110之间:
sort_total_amounts_mi=sort_total_amounts['total_amounts'][100:110]
sort_total_amounts_mi
order_id
764 830
846 829
1079 829
1120 827
1125 826
777 824
716 824
833 823
783 823
728 823
Name: total_amounts, dtype: int64
(5)哪个订单ID平均消费最贵 = 消费总额/菜总数量
Group_sum['average'] = Group_sum['total_amounts']/Group_sum['counts']
# Group_sum 现在一共5列,增加了average列 在按照average进行排序,降序
Group_sum.sort_values(by='average',ascending=False)
sort_average = Group_sum.sort_values(by='average',ascending=False)
sort_average['average'] #排序后取出average列
sort_average['average'][:10]
sort_average['average'][:10].plot(kind='bar',fontsize=16,color=['r'],alpha=0.3)
plt.title('订单ID每个菜品的平均消费',fontsize=16)
plt.xlabel('订单ID')
plt.ylabel('菜品平均单价')
for x,y in enumerate(sort_average['average'][:10]):#print(x,y)plt.text(x,y+1,round(y,2),ha='center')
sort_average['average'].plot(kind='bar')
<AxesSubplot:title={'center':'订单ID每个菜品的平均消费'}, xlabel='order_id', ylabel='菜品平均单价'>
二、时间维度
(1)点菜数和小时关系图:一天当中什么时间段,点菜量比较集中(hour)
data['hourcount'] = 1 #新列,用作计数器
data['time'] = pd.to_datetime(data['place_order_time']) #将时间转换为日期类型存储
data['hour'] = data['time'].map(lambda x: x.hour)
# data #到这里一共增加了3列数据,计数列hourcount、日期类型time列、时间hour列
gp_by_hour = data.groupby(by='hour').count()['hourcount']
# gp_by_hour
gp_by_hour.plot(kind='bar',fontsize=16,alpha=0.3)
plt.title('下单数与小时的关系图')
plt.xlabel('小时',fontsize=15)
plt.ylabel('点菜数量',fontsize=15)
Text(0, 0.5, '点菜数量')
(2)哪一天订餐数量最多
data['daycount'] = 1 #新列,计数列
data['day'] = data['time'].map(lambda x:x.day) #新列,天的表示
# data
gp_by_day = data.groupby(by='day').count()['hourcount']
#gp_by_day
gp_by_day.plot(kind='bar',fontsize=15,color=['r'],alpha=0.3)
plt.xlabel('8月份日期',fontsize=14)
plt.ylabel('点菜数量',fontsize=14)
plt.title('每天的订餐数量',fontsize=14)
Text(0.5, 1.0, '每天的订餐数量')
(3)星期几人数最多? 订餐数最多? 映射数据到星期
data['weekcount'] = 1
data['weekday'] = data['time'].map(lambda x:x.weekday())
gp_by_weekday = data.groupby(by='weekday').count()['weekcount']
# gp_by_weekday
gp_by_weekday.plot(kind='bar',alpha=0.3)
plt.xlabel('星期')
plt.ylabel('订餐数')
plt.title('点菜数量与星期关系图')
Text(0.5, 1.0, '点菜数量与星期关系图')
针对不同维度进行数据分析:
针对订单order_id:
- 什么菜最受欢迎
- 点菜的种类
- 点菜的数量
- 消费金额最大
- 平均消费
针对时间日期进行分析:
- 点菜量比较集中的时间
- 哪一天订餐数量最大
- 星期几就餐人数最多
技术点
- 导入数据:pd.read_excel()
- 拼接数据:pd.concat([列1,…],axis=0)
- 删除空值:data.dropna(axis=1,inplace=True)
- 分组进行统计(分组求和):.groupby(by=‘str’)
- 排序,切片Top10
- 绘制柱状图走势和高度
实战项目:餐厅订单数据分析:订单维度和时间维度相关推荐
- python大数据实战项目_商业数据分析比赛实战,内附项目代码
如果你对商业数据分析感兴趣.想要积累更多项目经验,那么就来看看下面这项目吧. 数据竞赛平台和鲸社区最近正在举办一场数据分析大赛,不仅带来了22w奖金和30w创业基金支持,更是提供了统一的在线比赛环境, ...
- 数据分析项目实战项目一:CPC广告优化以及bilibili订单分析(下)
第一章:电商平台数据分析思路与bilibili会员购介绍 1.1互联网电商平台数据分析的一般思路 互联网电商平台数据分析的一般思路一般分为以下三步:找出问题,分析问题,解决问题.其中,找出问题包括描述 ...
- python项目--餐厅订单数据分析
导入包,加载数据 数据是网上获取的,数据见链接: 餐厅订单数据分析的数据. 通过分析之后我们要用到以下三个包,分别是numpy.pandas.matplotlib.加载数据我们采用pandas中的re ...
- Python数据分析实战 —— 天猫订单数据分析
文章目录 项目介绍 数据介绍 导入部分库 数据预处理 数据格式整理 异常值分析 数据分析 描述性统计 周趋势.日趋势分析 产品价格分析 地区分析 转化率分析 总结 项目介绍 本项目将对2020年2月份 ...
- python 京东_Python数据分析-京东订单数据分析实战
本次数据来源于京东,类目为大家电-家用电器-冰箱,抽取2020年5月25日10%数据,数据量为 70k+,在 jupyer notebook 内进行分析. 数据文件: 链接:迅雷云盘:提取码:ezQq ...
- 数据分析:餐厅订单数据分析
数据分析:餐厅订单数据分析 作者:i阿极 作者简介:Python领域新星作者.多项比赛获奖者:博主个人首页
- UNIAPP实战项目笔记45 订单页面布局完成和数据渲染
UNIAPP实战项目笔记45 订单页面布局完成和数据渲染 实际案例图片 订单页面 具体内容图片自己替换哈,随便找了个图片的做示例 具体位置见目录结构 通过 模拟数据list 来实现数据渲染 完善布局页 ...
- 在线教育数据分析实战项目案例
数据分析实战项目案例 数据分析概览 数据分析经常遇到的问题 解决思路 常规产品指标 在线教育产品指标 市场效果广告指标 搭建指标系统流程 渠道的分类 针对搜索引擎,信息流广告如何稳定提高ROI 利用M ...
- 什么是互联网大厂_仅限今天!大厂最热数据分析经典实战项目大公开!
原标题:仅限今天!大厂最热数据分析经典实战项目大公开! 如今,全球早已步入数据时代,随着行业的高速发展,相关岗位缺口已超150万,且薪资超同行业50%.未来十年,数据细分岗位将扩张5倍,各行业数据人才 ...
最新文章
- docker 安装oracle_Windows系统下安装Docker,包你满意!
- 直播回顾 | 关于Apollo 5.0控制在环仿真技术的分享
- pythonsklearn乳腺癌数据集_使用sklearn的样本数据集
- CVPR!你凭什么收录我3篇论文!?
- 微量元素重塑新生态-农业大健康·李喜贵:谋定功能性农业
- 利用Mybatis写第一个数据库操作的程序
- 当云原生遇到混合云:如何实现“求变”与“求稳”的平衡
- Open3d之非阻塞可视化
- English Resources
- 口令破解(概述、暴力破解、字典破解、Hydra)
- python星号倒金字塔结构_Python语言应用2020智慧树章节测试答案
- 免费的天气API相关编码(中国城市代码检索)
- CSAPP家庭作业答案7 8 9章
- 计算机一级单元格填充,电脑Excel表格怎么对不连续的单元格进行批量填充
- oracle expdp parallel,关于EXPDP中的PARALLEL参数
- Spring 第二篇 注解+ xml 配置 与 纯注解开发 与集成 junit测试
- mysql存储指纹_保存图片指纹(一串乱码)到mysql, 求分析
- PMOS与NMOS场效应管相关知识点
- 假设检验(显著性检验)
- 创业过程中的63个技术问题