菜品数据分析绘图
当今世间,数据为先,知数据者,得天下也!
所谓知,又可分为:得、析、洗、理、存!方可算是独有数据!
所以我们接下来要做的就是做一个菜品的数据挖掘:
1.得到数据: 先得到一张菜品数据表。
2.分析内容: 它是由一个表格有三张表组成,但是每张表的结构都相同,但是有很多空数据,我们就需要把它们删除掉,方便我们解读数据、操作数据。
3.清洗数据: 把没用的不需要的数据删掉,通通删掉!
4.整理数据: 根据我们自己需要,整理好我们想要的结果。
5保存数据: 最终我们保存我们得到的结果数据,进行下一步工作。
接下来我们就开始按部就班的工作吧:
先打开jupyter lab,然后把我要处理的表格拖进来!然后直接上代码分析:
jupyter导包
import pandas as pd #导入pandas用于表格操作
import xlrd #导入xlrd用于获取一个表格里多个sheet
from matplotlib import pyplot as plt#导入pyplot用于绘图
解决中文乱码问题
#sans-serif就是无衬线字体,是一种通用字体族。
#常见的无衬线字体有 Trebuchet MS, Tahoma, Verdana, Arial, Helvetica, 中文的幼圆、隶书等等。
import matplotlib as mpl
mpl.rcParams['font.sans-serif']=['SimHei'] #指定默认字体 SimHei为黑体
mpl.rcParams['axes.unicode_minus']=False #用来正常显示负号
读取表格合并sheet第一种方法(当知道sheet名时
table1=pd.read_excel('meal_order_detail.xlsx',sheet_name='meal_order_detail1')
table2=pd.read_excel('meal_order_detail.xlsx',sheet_name='meal_order_detail2')
table3=pd.read_excel('meal_order_detail.xlsx',sheet_name='meal_order_detail3')
foodData=pd.concat([table1,table2,table3],axis=0,sort=False)
foodData
读取表格合并sheet第二种方法(当不知道sheet名时)
打开表格对象
excel_name = 'meal_order_detail.xlsx' #定义一个要读取的表格
wb = xlrd.open_workbook(excel_name) #xlrd读取要打开的文件
print(wb) #得到一个对象
结果: <xlrd.book.Book object at 0x000001A9FD62B128>
获取表格sheet名称
sheets = wb.sheet_names() # 获取workbook中所有的表格
print(sheets) #得到一个列表
结果: [‘meal_order_detail1’, ‘meal_order_detail2’, ‘meal_order_detail3’]
合并sheet表格,并处理空数据
#循环遍历所有sheet,进行读取合并
list=[] #用于把操作后的表格添加到新列表进行合并
for i in range(len(sheets)): #遍历出索引
df = pd.read_excel(excel_name, sheet_name=i, skiprows=0, index=False, encoding='utf8')
# skiprows=0 忽略行数为0,从第一行开始;sheet_name=i,第i张作为DataFrame
tab = pd.DataFrame().append(df) #得到每一个sheet表
list.append(tab) #添加进去每一个sheet表
foodData=pd.concat(list,axis=0,sort=False) #合并行,不排序标签,True排序标签
foodData.dropna(axis=1,inplace=True) #删除掉所有空值的列
foodData
最受欢迎的前十道菜
计算菜品平均价格
foodData[‘dishes_name’]=foodData[‘dishes_name’].apply(lambda x:x.strip()) #去除空格,因为有些同名菜有的有空格有的没空格,先统一才方便处理
foodData1=foodData.drop_duplicates([‘dishes_name’]) #删除掉所有重复的名字的行
price=foodData1[‘amounts’].mean().round(decimals=2) #然后求出所有菜品的平均值
print(‘所有菜品的平均价格为{}’.format(price)) #打印所有菜品平均值
结果: 所有菜品的平均价格为43.45
取出菜品数量和菜品
mounts=foodData['dishes_name'].value_counts() #求出所有菜品的名称及所对应的的数量
Y=mounts.values[0:10].tolist() #取出数量,并转成list。
X=mounts.index[0:10] #取出菜品
print(Y)
print(X)
结果:Y= [323, 269 ,239 ,216 ,189, 188 ,187 ,186 ,178 ,173]
X=Index([‘白饭/大碗’, ‘凉拌菠菜’, '谷稻小庄 ', ‘麻辣小龙虾’, ‘辣炒鱿鱼’, ‘芝士烩波士顿龙虾’, ‘五色糯米饭(七色)’, ‘白饭/小碗’, ‘香酥两吃大虾’, ‘焖猪手’],dtype=‘object’)
转换数据类型
X1=tuple(X) #把list的类型的菜品数据转换成元祖
print(X1)
结果:Y1= [323, 269, 239, 216, 189, 188, 187, 186, 178, 173]
X1=(‘白饭/大碗’, ‘凉拌菠菜’, '谷稻小庄 ', ‘麻辣小龙虾’, ‘辣炒鱿鱼’, ‘芝士烩波士顿龙虾’, ‘五色糯米饭(七色)’, ‘白饭/小碗’, ‘香酥两吃大虾’, ‘焖猪手’)
展示图
plt.title('最受欢迎的前十道菜')
plt.xticks(np.arange(10),X,rotation=60) #定义xticks
plt.bar(X,Y) #柱状图x,y归属
plt.show() #展示
保存数据
data2=pd.DataFrame([Y1],columns=X1) #左边为DataFrame类型,右边设为字段
data2.to_csv('food.csv',encoding='utf-8',header=True,index=None)