餐厅订单分析学习记录

一、准备

需要下载git bash(对比cmd:几乎接近linux命令)及jupyter lab(jupyter notebook升级版)

1)jupyterlab

搜索jupyterlab下载,按理来说应当在cmd 输入安装命令: pip install jupyterlab,但输入后显示一串红码(安装时出现Retrying(Retry(total=4, connect=None, read=None, redirect=None, status=None))…),cmd安装失败

解决:

A. upgrade pip 

结果:失败,安装结果如旧

B. 搜索问题后,从博客https://blog.csdn.net/horsee/article/details/109637565 得知需要先行下载node.js

结果:下载并配置好后cmd命令安装后不再显示红色代码,IDLE Shell中输入import jupyterlab后未显示错误,但在pycharm中的add package添加失败,运行import jupyterlab显示错误

C. add package重新执行等待约半小时后安装成功

2)git bash安装

直接在官网上安装很慢,下载了一晚上进度条过半,结果第二天早上无法接着下载;重新下载多次也显示失败。经过多个小时的重试放弃从官网下载,查询后从此链接下载:https://blog.csdn.net/weixin_44198965/article/details/99686507

参数配置参考https://blog.csdn.net/qq_18941713/article/details/84770864

二、开始

1、观察数据

看数据思考可以得出什么信息

最受欢迎的菜;订单表的长度;各菜的平均价格;平均消费;消费金额较大的客户;点菜的种类;哪个客户的消费量大

2、准备数据 

import matplotlib.pyplot as plt

import pandas as pd

import numpy as np

plt.rcParams['font.sans-serif']='SimHei'#设置中文显示(后面柱状图要中文,这时候加的)

%matplotlib inline # 使用%matplotlib命令可以将matplotlib的图表直接嵌入到Notebook之中,或者使用指定的界面库显示图表,它有一个参数指定matplotlib图表的显示方式。inline表示将图表嵌入到Notebook中。这是IPython的内置magic函数,那么在Pycharm中是不会支持

遇到问题:无法调用第三方库matplotlib,且找不到在jupyterlab中安装库的方法;在pycharm中可正常调用matplotlib及matplotlib.pyplot,但在IDLE Shell中也无法调用(为什么会这样?)

解决:cmd重新pip install matplotlib

data1=pd.read_excel('meal_order_detail-Copy1.xlsx',sheet_name='meal_order_detail1')

data2=pd.read_excel('meal_order_detail-Copy1.xlsx',sheet_name='meal_order_detail2')

data3=pd.read_excel('meal_order_detail-Copy1.xlsx',sheet_name='meal_order_detail3')

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

# data.head(5)

data.dropna(axis=1,inplace=True)

data.info()

#整合数据,显示数据信息

运行结果:

<class 'pandas.core.frame.DataFrame'>

Index: 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

这里可以看出全为空值的字段已经被删除,excel文件占用的内存也减小到了941kb

3、针对订单order_id进行分析:

# 统计平均价格(44.82)

round(data['amounts'].mean(),2)#数据量多时用np.mean('amounts'),比pandas快

运行结果:44.82

# 频数统计并取最大值:最受欢迎的菜

dishes_count=data['dishes_name'].value_counts()[:10]#取前十名

print(dishes_count)

# 可视化

dishes_count.plot(kind='bar',fontsize=10)

dishes_count.plot(kind='line',color=['r'])

plt.xlabel("dishes_name")

plt.ylabel("count")

for x,y in enumerate(dishes_count):

    print(x,y)#enumerate()将可遍历对象设置索引序列

    plt.text(x,y+2,y,ha='center',fontsize=12)

    '''

plt.text(x,  y,  string,  fontsize=15, ha="right", va="top", rotation=45 ) 



x,y:表示坐标值上的值

string:表示说明文字

fontsize:表示字体大小

ha:水平对齐方式 ,参数:[ ‘center’ | ‘right’ | ‘left’ ]

va:垂直对齐方式 ,参数:[ ‘center’ | ‘top’ | ‘bottom’ | ‘baseline’ ]

rotation:旋转角度

'''

# 用这句怎么把x轴数据标签旋转?plt.gca().set_xticklabels(dishes_name,rotation=45,ha="center")会报错

for tick in plt.gca().get_xticklabels():

tick.set_rotation(45)

遇到问题:plt.gca().set_xticklabels(dishes_name,rotation=45,ha="center")无法旋转x轴数据标签,显示第一个参数错误

解决:尝试多种方法不行后进行搜索,在网页【matplotlib】对x轴标签进行旋转的方法小结_xticks label 90 度_胡侃有料的博客-CSDN博客找到答案,第一种plt.xticks(rotation=90),第二种for tick in plt.gca().get_xticklabels():tick.set_rotation(90)

运行结果:

dishes_name

白饭/大碗        323

凉拌菠菜         269

谷稻小庄         239

麻辣小龙虾        216

辣炒鱿鱼         189

芝士烩波士顿龙虾     188

五色糯米饭(七色)    187

白饭/小碗        186

香酥两吃大虾       178

焖猪手          173

Name: count, dtype: int64

0 323

1 269

2 239

3 216

4 189

5 188

6 187

7 186

8 178

9 173

# 一个订单点菜的种类最多有多少(约25)

data_group=data['order_id'].value_counts()[:10]

data_group.plot(kind='bar',fontsize=16,color=['r','y'],alpha=0.5)

plt.title('订单中点菜的种类top10')

plt.xlabel("订单1d",fontsize=16)

plt.ylabel("点菜种类",fontsize=16)

#8月份餐厅订单点菜种类前10名平均点菜25个菜品

plt.show

运行结果:

<function matplotlib.pyplot.show(close=None, block=None)>

# 订单id点菜数量最多(约30)

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('点菜数量前十名')

Text(0.5, 1.0, '点菜数量前十名')

运行结果:

#订单id消费最大(约1200)

sort_tatal_amounts=group_sum.sort_values(by='total_amounts',ascending=False)

sort_tatal_amounts['total_amounts'][:10].plot(kind='bar')

plt.xlabel('订单id')

plt.ylabel('消费金额')

plt.title('消费金额前十名')

运行结果:


# 哪个id平均消费最高?

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

sort_average=group_sum.sort_values(by='average',ascending=False)

sort_average['average'][:].plot(kind='bar')

plt.xlabel('订单id')

plt.ylabel('消费金额')

plt.title('平均消费金额')

4、针对时间日期进行分析

# 一天中点菜量集中的时段?(晚上18-21点)

data['hourcount']=1

data['time']=pd.to_datetime(data['place_order_time'])

data['hour']=data['time'].map(lambda x:x.hour)#map是对数据进行逐行处理,不管是利用字典还是函数进行映射,都是把对应的数据逐个当作参数传入到字典或函数中,得到映射后的值

gp_by_hour=data.groupby(by='hour').count()['hourcount']

gp_by_hour.plot(kind='bar')

plt.xlabel('hour')

plt.ylabel('下单数量')

plt.title('下单量与时间的关系图')

Text(0.5, 1.0, '下单量与时间的关系图')

运行结果:

#哪天订餐数量最多

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('下单量与日期的关系图')

#疑似在周末销量更大

运行结果:

#查看周几人数最多,订餐数最多

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('点菜量与星期的关系图')

运行结果:

三、总结

1、不同维度进行数据分析:

针对订单order_id:

    什么菜最受欢迎

    点菜的种类

    点菜的数量

    消费金额最大

    平均消费

针对时间日期进行分析:

    点菜量比较集中的时间

    哪一天订餐量最大

    星期几就餐人数最多

2、技术点:

    拼接数据:pd.concat([列1,...])

    分组进行统计(分组求和)

    排序,切片Top10

    绘制柱状图走势和高度

3、经验

(1)重新使用jupyterlab,直接在后边开始写代码,运行会报错,后来鼓捣着发现前边已完成的代码需要全部重新运行一次后边才能接的上;

(2)写代码过程中容易出现的错误:A.单词写错了 B.函数后面少加了括号 C.使用了中文符号

4、文件:http://localhost:8888/lab/tree/cooking.ipynb

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值