不同维度进行数据分析
针对订单order ID:
什么菜最受欢迎
点菜种类
点菜数量
消费金额最大
平均消费
针对时间日期进行分析:
点菜量比较集中的时间
哪一天订餐量最大
星期几就餐人数最多
技术点
拼接数据:pd.concat([列1,...])
分组进行统计(分组求和)
排序,切片Top10
绘制柱状图走势和高度
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from IPython.core.interactiveshell import InteractiveShell
import openpyxl
InteractiveShell.ast_node_interactivity = "all"
pd.options.display.max_columns = 1000
pd.options.display.max_rows = 30
pd.set_option('display.float_format', lambda x: '%5f' % x)
%matplotlib inline
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
%config Inlinebackend.config_format = 'svg'
# 1.加载数据
data1 = pd.read_excel('1.xlsx', sheet_name='detail1')
data2 = pd.read_excel('1.xlsx', sheet_name='detail2')
data3 = pd.read_excel('1.xlsx', sheet_name='detail3')
# 2.数据预处理(合并数据,NA等处理),分析数据
data = pd.concat([data1, data2, data3], axis=0) #按照行进行拼接数据
#data.head(5)
data.dropna(axis=1, inplace=True) #按照列删除NA列,并且修改源数据。inplace=True是在原数据上修改。
data.info() #获取 DataFrame 的简要摘要
#统计卖出菜品的平均价格
round(date['amounts'].mean(), 2) #方法一:pandas自带函数
round(np.mean(data['amounts'], 2)) #方法二:numpy函数处理
#频数统计,什么菜最受欢迎 (对菜名进行频数统计,取最大前10名)
dishes_count = data['dishes_name'].value_counts()[:10]
print(dishes_count)
# 3.数据可视化matplotlib
dishes_count.plot(kind='line', color=['r']) #折线图
dishes_count.plot(kind='bar', fontsize=16) #柱状图
for x, y in enumerate(dishes_count):
print(x, y)
plt.text(x, y + 2, y, ha='center', fontsize=12) #text(水平位置,高的位置,数值,字水平位置)
# 订单点菜的种类最多
data_group = data['order_id'].value_counts()[:10]
data_group.plot(kind='bar', fontsize=16, colors=['r', 'm', 'b', 'g', 'y'])
plt.title('订单点菜的种类Top10')
plt.xlabel('订单ID', fontsize=16)
plt.ylabel('点菜种类', fontsize=16)
# 8月份餐厅订单点菜种类前10名
# 订单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_counts(by='counts', ascending=False)
sort_counts['counts'][:10].plot(kind='bar', fontsize=16)
plt.xlabel('订单ID')
plt.ylabel('点菜数量')
plt.title('订单ID点菜数量Top10')
#八月份餐厅订单点菜数量前10名
#哪个订单ID消费最多Top10
sort_total_counts = Group_sum.sort_counts(by='total_amounts', ascending=False)
sort_total_counts['total_amount'][:10].plot(kind='bar', fontsize=16)
plt.xlabel('订单ID')
plt.ylabel('消费金额')
plt.title('订单ID消费金额Top10')
#八月份餐厅订单消费金额前10名
#哪个订单ID平均消费最贵
Group_sum['average'] = Group_sum['total_amounts']/Group_sum['counts']
sort_average = Group_sum.sort_values(by'average',ascending=False)
sort_average['average'][:10].plot(kind='bar')
plt.xlabel('订单ID')
plt.ylabel('平均消费单价')
plt.title('订单ID平均消费单价Top10')
#八月份餐厅订单平均消费单价前10名
# 一天当中什么时间段,点菜量比较集中(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('点菜与小时的关系图')
# 哪一天订单数量最多
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('点菜数量与日期的关系图')
# 查看星期几的人数最多,订餐数最多,映射数据到星期
data['weekcount'] = 1
data['weekday'] = data['time'].map(lambda x: x.weekday()) #解析出星期
gp_by_day = data.groupby(by='weekday').count()['weekcount']
gp_by_day.plot(kind='bar')
plt.xlabel('星期')
plt.ylabel('点菜数量')
plt.title('点菜数量与星期关系图')
网友评论