一、准备
需要下载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.使用了中文符号