⭐⭐ ⭐ 个人笔记用来记录一下练习使用Python数据分析的情况
数据导入
data1 = pd.read_excel("meal_order_detail.xlsx",sheet_name="meal_order_detail1")
data2 = pd.read_excel("meal_order_detail.xlsx",sheet_name="meal_order_detail2")
data3 = pd.read_excel("meal_order_detail.xlsx",sheet_name="meal_order_detail3")
数据预处理(shell表格的拼接+缺失值删除)
data = pd.concat([data1,data2,data3],axis=0)#数据拼接
data.dropna(axis=1,inplace=True)#缺失值在原data上删除
data.info
统计出一些特征,比如(餐厅哪个菜卖的好,哪个菜贵,餐厅每道菜平均价格,每道菜的销量等等)
1.统计卖出菜品的平均价格
round(data['amounts'].mean(),2)#方法一,使用pandas库的mean
round(np.mean(data["amounts"]),2)#方法二,使用numpy库的mean(更高效)
#44.82
2.菜品销量前8
思路:直接用value_counts()即可
dishes_count = data["dishes_name"].value_counts()[:8]
print(dishes_count)
用柱状图可视化出销量前8的结果
dishes_count.plot(kind="bar")
for x,y in enumerate(dishes_count):
plt.text(x,y+2,y,ha="center")
3.每个订单菜的种类数
order_s = data["order_id"].value_counts()[:10]
order_s.plot(kind="bar")
plt.title("每个订单菜的种类数Top10")
plt.xlabel("订单ID")
plt.ylabel("点菜种类数")
4.哪10个订单点菜数最多(X轴为订单,Y轴为点菜数)
思路:
订单为:order_id;点菜数为:counts
按order_id 分组,分组之后sum()["count"]即可
#先按照order_id分组,求和
dataGroup=data[["order_id","counts"]].groupby("order_id").sum()
#按counts大小排序
sort_data = dataGroup.sort_values(by="counts",ascending=False)
sort_data["counts"][:10].plot(kind = "bar")
plt.title("订单ID点菜数量Top10")
plt.xlabel("订单ID")
plt.ylabel("点菜数量")
5. 一天中哪个时间点菜数最多
思路:
单独抽出place_order_time中的solo_hour,之后加一列全为1的数据,之后groupby("solo_hour")并求和sum(),绘制出即可
#先查看日期那一列是不是datatime类型
print(data.dtypes)
#发现是datatime类型,进行之后的工作:
data["num_counts"] = 1
data["solo_hour"] = data["place_order_time"].map(lambda x:x.hour)
gp_by_hour = data.groupby["solo_hour"].sum()["num_counts"]
gp_by_hour.plot(kind = "bar")
发现报错了:'method' object is not subscriptable
将 gp_by_hour = data.groupby["solo_hour"].sum()["num_counts"] 改为 gp_by_hour = data.groupby("solo_hour").sum()["num_counts"]即可,就是本来要使用()结果使用了[]。
6. 可视化出点菜数量最大的前5天
data["num_counts"] = 1
data["solo_day"] = data["place_order_time"].map(lambda x:x.day)
gp_by_day = data.groupby("solo_day").sum()
a=gp_by_day.sort_values(by = "num_counts",ascending=False)
a["num_counts"][:5].plot(kind = 'bar')