标签:... 10 python df 美食 口碑 2016 ID abby
In [1]:
import warnings
warnings.filterwarnings('ignore')
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
数据导入和清洗部分¶
商家数据shop_info.txt 的处理¶
In [16]:
# 导入商家数据 shop_info.txt。添加列名
columns=['商家ID','城市','所在位置编号','人均消费','评分','评论数','门店等级','一级分类','二级分类','三级分类']
df_shop = pd.read_table('./datasets/alibaba_dataset/shop_info.txt',sep=',',names=columns)
In [17]:
# 对数据的框架做初步检查: head(),shape(),info()等
df_shop.head()
Out[17]:
|
商家ID |
城市 |
所在位置编号 |
人均消费 |
评分 |
评论数 |
门店等级 |
一级分类 |
二级分类 |
三级分类 |
0 |
1 |
湖州 |
885 |
8 |
4.0 |
12.0 |
2 |
美食 |
休闲茶饮 |
饮品/甜点 |
1 |
2 |
哈尔滨 |
64 |
19 |
NaN |
NaN |
1 |
超市便利店 |
超市 |
NaN |
2 |
3 |
南昌 |
774 |
5 |
3.0 |
2.0 |
0 |
美食 |
休闲茶饮 |
奶茶 |
3 |
4 |
天津 |
380 |
18 |
NaN |
NaN |
1 |
超市便利店 |
超市 |
NaN |
4 |
5 |
杭州 |
263 |
2 |
2.0 |
2.0 |
0 |
美食 |
休闲食品 |
生鲜水果 |
In [19]:
df_shop.shape
Out[19]:
(2000, 10)
In [20]:
df_shop.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2000 entries, 0 to 1999
Data columns (total 10 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 商家ID 2000 non-null int64
1 城市 2000 non-null object
2 所在位置编号 2000 non-null int64
3 人均消费 2000 non-null int64
4 评分 1709 non-null float64
5 评论数 1709 non-null float64
6 门店等级 2000 non-null int64
7 一级分类 2000 non-null object
8 二级分类 2000 non-null object
9 三级分类 1415 non-null object
dtypes: float64(2), int64(4), object(4)
memory usage: 156.4+ KB
缺失值¶
In [18]:
# 检查哪些列有缺失值,有多少
df_shop.isnull().sum()
Out[18]:
商家ID 0
城市 0
所在位置编号 0
人均消费 0
评分 291
评论数 291
门店等级 0
一级分类 0
二级分类 0
三级分类 585
dtype: int64
In [9]:
# 统计缺失值的占比
for col in df_shop.columns:
null_count = df_shop[col].isnull().sum()
if null_count > 0:
p = null_count / df_shop.shape[0] * 100
print(col,'列存在空值的占比为:',p)
评分 列存在空值的占比为: 14.549999999999999
评论数 列存在空值的占比为: 14.549999999999999
三级分类名称 列存在空值的占比为: 29.25
In [31]:
# 填充 三级分类,用二级分类名称
df_shop['三级分类'] = df_shop['三级分类'].fillna(df_shop['二级分类'])
In [37]:
# 填充 评论数和评分. 检查 评分 和 评论数 的平均值是否有意义
df_shop.describe()
Out[37]:
|
商家ID |
所在位置编号 |
人均消费 |
评分 |
评论数 |
门店等级 |
count |
2000.000000 |
2000.000000 |
2000.000000 |
1709.000000 |
1709.000000 |
2000.000000 |
mean |
1000.500000 |
583.083000 |
10.479000 |
2.677004 |
3.130486 |
0.814500 |
std |
577.494589 |
335.763357 |
5.762479 |
1.024211 |
3.499072 |
0.855836 |
min |
1.000000 |
1.000000 |
1.000000 |
0.000000 |
0.000000 |
0.000000 |
25% |
500.750000 |
287.750000 |
5.000000 |
2.000000 |
1.000000 |
0.000000 |
50% |
1000.500000 |
577.500000 |
10.000000 |
3.000000 |
2.000000 |
1.000000 |
75% |
1500.250000 |
877.250000 |
15.000000 |
3.000000 |
4.000000 |
2.000000 |
max |
2000.000000 |
1159.000000 |
20.000000 |
4.000000 |
20.000000 |
2.000000 |
In [38]:
# 标准差(std) / 平均值(mean),如果小于 0.5,说明平均值有代表意义
1.02/2.67, 3.5/3.13
Out[38]:
(0.38202247191011235, 1.1182108626198084)
In [43]:
# 填充评分.用均值
df_shop['评分'] = df_shop['评分'].fillna(df_shop['评分'].mean())
In [48]:
df_shop['评论数'].value_counts()
Out[48]:
0.0 363
1.0 333
2.0 269
3.0 201
4.0 126
5.0 98
6.0 84
7.0 59
9.0 41
8.0 39
10.0 22
11.0 18
13.0 11
20.0 10
12.0 9
14.0 9
18.0 6
15.0 5
17.0 4
19.0 2
Name: 评论数, dtype: int64
In [49]:
# 填充评论数,用众数
df_shop['评论数'] = df_shop['评论数'].fillna(0)
In [50]:
df_shop.isnull().sum()
Out[50]:
商家ID 0
城市 0
所在位置编号 0
人均消费 0
评分 0
评论数 0
门店等级 0
一级分类 0
二级分类 0
三级分类 0
dtype: int64
重复值¶
In [54]:
df_shop.duplicated().sum()
Out[54]:
0
In [80]:
# 把清洗后的数据导出
df_shop.to_csv('./datasets/new_alibaba/df_shop.csv',index=False) #加index = False,消除Unnamed: 0
In [68]:
# 保存H5 文件
df_shop.to_hdf('./datasets/new_alibaba/df_shop_h5',key='df_shop')
In [ ]:
user_view 用户浏览数据的处理¶
In [59]:
#导入用户浏览数据
columns=['用户ID','商家ID','浏览时间']
df_view = pd.read_table('./datasets/alibaba_dataset/user_view.txt',sep=',',names=columns)
In [61]:
df_view.info(null_counts=True)
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5556715 entries, 0 to 5556714
Data columns (total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 用户ID 5556715 non-null int64
1 商家ID 5556715 non-null int64
2 浏览时间 5556715 non-null object
dtypes: int64(2), object(1)
memory usage: 127.2+ MB
In [62]:
# 重复值
df_view.duplicated().sum()
Out[62]:
757364
In [63]:
# 删除重复值
df_view.drop_duplicates(inplace=True)
In [65]:
# 数据类型转换:把浏览时间 字段类型由 object 改为 时间类型
df_view['浏览时间'] = pd.to_datetime(df_view['浏览时间'])
In [66]:
df_view.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 4799351 entries, 0 to 5556714
Data columns (total 3 columns):
# Column Dtype
--- ------ -----
0 用户ID int64
1 商家ID int64
2 浏览时间 datetime64[ns]
dtypes: datetime64[ns](1), int64(2)
memory usage: 146.5 MB
In [81]:
# 把清洗后的数据导出
df_view.to_csv('./datasets/new_alibaba/df_view.csv',index=False) #加index = False,消除Unnamed: 0
In [69]:
# 保存H5 文件
df_view.to_hdf('./datasets/new_alibaba/df_view_h5',key='df_view')
用户支付数据 user_pay 的处理¶
In [70]:
#导入用户支付数据
columns=['用户ID','商家ID','支付时间']
df_pay = pd.read_table('./datasets/alibaba_dataset/user_pay.txt',sep=',',names=columns)
In [71]:
df_pay.shape
Out[71]:
(69674110, 3)
In [72]:
df_pay.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 69674110 entries, 0 to 69674109
Data columns (total 3 columns):
# Column Dtype
--- ------ -----
0 用户ID int64
1 商家ID int64
2 支付时间 object
dtypes: int64(2), object(1)
memory usage: 1.6+ GB
In [73]:
# 重复值
df_pay.duplicated().sum()
Out[73]:
2517084
In [75]:
# 删除重复值
df_pay.drop_duplicates(inplace=True)
In [76]:
# 数据类型转换:把支付时间 字段类型由 object 改为 时间类型
df_pay['支付时间'] = pd.to_datetime(df_pay['支付时间'])
In [77]:
df_pay.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 67157026 entries, 0 to 69674108
Data columns (total 3 columns):
# Column Dtype
--- ------ -----
0 用户ID int64
1 商家ID int64
2 支付时间 datetime64[ns]
dtypes: datetime64[ns](1), int64(2)
memory usage: 2.0 GB
In [79]:
# 把清洗后的数据导出
df_pay.to_csv('./datasets/new_alibaba/df_pay.csv',index=False) #加index = False,消除Unnamed: 0
In [78]:
# 保存H5 文件
df_pay.to_hdf('./datasets/new_alibaba/df_pay_h5',key='df_pay')
数据分析部分¶
1、以城市为单位,统计每个城市总体消费金额 (饼状图)¶
In [84]:
# 总体消费额 = 人均 * 消费人数
# 先计算user_pay表中 消费人数
df1 = df_pay.groupby('商家ID').agg({'用户ID':'nunique'}).rename(columns={'用户ID':'消费人数'})
In [86]:
# 合并 df_shop 与 df1,根据商家ID
df_shop_pay = pd.merge(df_shop,df1,on='商家ID')
df_shop_pay
Out[86]:
|
商家ID |
城市 |
所在位置编号 |
人均消费 |
评分 |
评论数 |
门店等级 |
一级分类 |
二级分类 |
三级分类 |
消费人数 |
0 |
1 |
湖州 |
885 |
8 |
4.000000 |
12.0 |
2 |
美食 |
休闲茶饮 |
饮品/甜点 |
29838 |
1 |
2 |
哈尔滨 |
64 |
19 |
2.677004 |
0.0 |
1 |
超市便利店 |
超市 |
超市 |
12863 |
2 |
3 |
南昌 |
774 |
5 |
3.000000 |
2.0 |
0 |
美食 |
休闲茶饮 |
奶茶 |
7234 |
3 |
4 |
天津 |
380 |
18 |
2.677004 |
0.0 |
1 |
超市便利店 |
超市 |
超市 |
5145 |
4 |
5 |
杭州 |
263 |
2 |
2.000000 |
2.0 |
0 |
美食 |
休闲食品 |
生鲜水果 |
8558 |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
1995 |
1996 |
南宁 |
248 |
6 |
3.000000 |
1.0 |
0 |
美食 |
快餐 |
中式快餐 |
3820 |
1996 |
1997 |
上海 |
924 |
10 |
1.000000 |
2.0 |
0 |
美食 |
快餐 |
中式快餐 |
8544 |
1997 |
1998 |
南通 |
1090 |
1 |
2.000000 |
2.0 |
0 |
美食 |
小吃 |
面点 |
4616 |
1998 |
1999 |
成都 |
1134 |
19 |
2.677004 |
0.0 |
1 |
超市便利店 |
超市 |
超市 |
31795 |
1999 |
2000 |
杭州 |
378 |
7 |
3.000000 |
2.0 |
0 |
美食 |
小吃 |
面点 |
10162 |
2000 rows × 11 columns
In [87]:
# 计算每个商家的总消费额
df_shop_pay['总消费额'] = df_shop_pay['人均消费'] * df_shop_pay['消费人数']
df_shop_pay
Out[87]:
|
商家ID |
城市 |
所在位置编号 |
人均消费 |
评分 |
评论数 |
门店等级 |
一级分类 |
二级分类 |
三级分类 |
消费人数 |
总消费额 |
0 |
1 |
湖州 |
885 |
8 |
4.000000 |
12.0 |
2 |
美食 |
休闲茶饮 |
饮品/甜点 |
29838 |
238704 |
1 |
2 |
哈尔滨 |
64 |
19 |
2.677004 |
0.0 |
1 |
超市便利店 |
超市 |
超市 |
12863 |
244397 |
2 |
3 |
南昌 |
774 |
5 |
3.000000 |
2.0 |
0 |
美食 |
休闲茶饮 |
奶茶 |
7234 |
36170 |
3 |
4 |
天津 |
380 |
18 |
2.677004 |
0.0 |
1 |
超市便利店 |
超市 |
超市 |
5145 |
92610 |
4 |
5 |
杭州 |
263 |
2 |
2.000000 |
2.0 |
0 |
美食 |
休闲食品 |
生鲜水果 |
8558 |
17116 |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
1995 |
1996 |
南宁 |
248 |
6 |
3.000000 |
1.0 |
0 |
美食 |
快餐 |
中式快餐 |
3820 |
22920 |
1996 |
1997 |
上海 |
924 |
10 |
1.000000 |
2.0 |
0 |
美食 |
快餐 |
中式快餐 |
8544 |
85440 |
1997 |
1998 |
南通 |
1090 |
1 |
2.000000 |
2.0 |
0 |
美食 |
小吃 |
面点 |
4616 |
4616 |
1998 |
1999 |
成都 |
1134 |
19 |
2.677004 |
0.0 |
1 |
超市便利店 |
超市 |
超市 |
31795 |
604105 |
1999 |
2000 |
杭州 |
378 |
7 |
3.000000 |
2.0 |
0 |
美食 |
小吃 |
面点 |
10162 |
71134 |
2000 rows × 12 columns
In [88]:
# 计算每个城市的总体消费额
df_pay_sum = df_shop_pay.groupby('城市')['总消费额'].sum().sort_values(ascending=False).to_frame().reset_index()
df_pay_sum
Out[88]:
|
城市 |
总消费额 |
0 |
上海 |
50699615 |
1 |
杭州 |
43664682 |
2 |
北京 |
22541013 |
3 |
南京 |
21259202 |
4 |
广州 |
19358633 |
... |
... |
... |
117 |
龙岩 |
60740 |
118 |
梧州 |
53544 |
119 |
张家口 |
47139 |
120 |
淮北 |
23675 |
121 |
廊坊 |
20808 |
122 rows × 2 columns
In [89]:
# 把top10以外的城市,换成:其它城市
df_pay_sum.iloc[10:122]['城市'] = '其它城市'
df_pay_sum
Out[89]:
|
城市 |
总消费额 |
0 |
上海 |
50699615 |
1 |
杭州 |
43664682 |
2 |
北京 |
22541013 |
3 |
南京 |
21259202 |
4 |
广州 |
19358633 |
... |
... |
... |
117 |
其它城市 |
60740 |
118 |
其它城市 |
53544 |
119 |
其它城市 |
47139 |
120 |
其它城市 |
23675 |
121 |
其它城市 |
20808 |
122 rows × 2 columns
In [90]:
# 准备数据,画饼图
df_pie = df_pay_sum.groupby('城市')['总消费额'].sum().sort_values(ascending = False).to_frame().reset_index()
df_pie
Out[90]:
|
城市 |
总消费额 |
0 |
其它城市 |
109483445 |
1 |
上海 |
50699615 |
2 |
杭州 |
43664682 |
3 |
北京 |
22541013 |
4 |
南京 |
21259202 |
5 |
广州 |
19358633 |
6 |
武汉 |
18225215 |
7 |
苏州 |
16031142 |
8 |
深圳 |
11645203 |
9 |
宁波 |
8509201 |
10 |
温州 |
6875104 |
In [91]:
# 同时显示占比和数值
def make_autopct(x):
def my_autopct(pct):
total = sum(x)
val = int(round(pct*total/100.0))
return '{p:.2f}% \n{v:d}'.format(p=pct,v=val)
return my_autopct
plt.figure(figsize=(15,8))
# 画饼图:每个城市的总消费额
plt.pie(x = df_pie['总消费额'],
labels=df_pie['城市'], #为饼图添加标签说明
labeldistance=1.05, #labels与圆圈边界的距离,默认为1.1
autopct=make_autopct(df_pie['总消费额']),
pctdistance=0.8,#百分比与圆心的距离,默认是0.6
startangle=180, #倾斜角度
counterclock=False, #顺时针
textprops={
'fontsize':14,
'fontfamily':'FangSong'
})
plt.title(label='每个城市总体消费金额(单位:元)',fontsize=18)
plt.axis('equal')#保证是一个圆形
plt.savefig('./datasets/new_alibaba/1_每个城市总体消费金额.png')
plt.show()
2. 以天为单位,统计所有商家交易发生次数和被用户浏览次数 (曲线图)¶
In [93]:
df_view.head(2)
Out[93]:
|
用户ID |
商家ID |
浏览时间 |
0 |
13201967 |
1197 |
2016-10-21 18:00:00 |
1 |
19461365 |
1197 |
2016-06-28 23:00:00 |
In [94]:
df_pay.head(2)
Out[94]:
|
用户ID |
商家ID |
支付时间 |
0 |
22127870 |
1862 |
2015-12-25 17:00:00 |
1 |
3434231 |
1862 |
2016-10-05 11:00:00 |
In [100]:
# 新增一列 浏览日期,以天为单位
df_view['浏览日期'] = df_view['浏览时间'].astype('datetime64[D]')
In [101]:
# 新增一列 支付日期,以天为单位
df_pay['支付日期'] = df_pay['支付时间'].astype('datetime64[D]')
In [107]:
# 统计浏览次数,按天
view_num = df_view[['浏览日期','浏览时间']].groupby('浏览日期').agg('count').rename(columns={'浏览时间':'浏览次数'})
view_num
Out[107]:
|
浏览次数 |
浏览日期 |
|
2016-06-22 |
35730 |
2016-06-23 |
55170 |
2016-06-24 |
62860 |
2016-06-25 |
98234 |
2016-06-26 |
44285 |
... |
... |
2016-10-27 |
28401 |
2016-10-28 |
27500 |
2016-10-29 |
31976 |
2016-10-30 |
30709 |
2016-10-31 |
27055 |
130 rows × 1 columns
In [108]:
# 统计支付次数,按天
pay_num = df_pay[['支付日期','支付时间']].groupby('支付日期').agg('count').rename(columns={'支付时间':'支付次数'})
pay_num
Out[108]:
|
支付次数 |
支付日期 |
|
2015-06-26 |
63 |
2015-06-27 |
100 |
2015-06-28 |
126 |
2015-06-29 |
462 |
2015-06-30 |
577 |
... |
... |
2016-10-27 |
268715 |
2016-10-28 |
290495 |
2016-10-29 |
308201 |
2016-10-30 |
305081 |
2016-10-31 |
261771 |
493 rows × 1 columns
In [109]:
# 合并浏览和支付,根据日期
df_pay_view = pd.merge(left=view_num,right=pay_num,left_on=view_num.index,right_on=pay_num.index,how='outer')
df_pay_view
Out[109]:
|
key_0 |
浏览次数 |
支付次数 |
0 |
2016-06-22 |
35730.0 |
208712 |
1 |
2016-06-23 |
55170.0 |
222973 |
2 |
2016-06-24 |
62860.0 |
237014 |
3 |
2016-06-25 |
98234.0 |
263007 |
4 |
2016-06-26 |
44285.0 |
235750 |
... |
... |
... |
... |
488 |
2016-06-19 |
NaN |
211245 |
489 |
2016-06-20 |
NaN |
194630 |
490 |
2016-06-21 |
NaN |
205581 |
491 |
2016-07-22 |
NaN |
248860 |
492 |
2016-07-25 |
NaN |
234366 |
493 rows × 3 columns
In [116]:
# 画折线图
plt.figure(figsize=(10,8))
plt.plot(df_pay_view['key_0'],
df_pay_view['支付次数'],
color='r')
plt.plot(df_pay_view['key_0'],
df_pay_view['浏览次数'],
color='b')
plt.title('所有商家交易数和浏览数(以天为单位)',fontsize=20)
plt.xlabel('日期')
plt.legend(['交易数','浏览数'])
plt.savefig('./datasets/new_alibaba/2_所有商家交易数和浏览数(以天为单位).png')
plt.show()
3. 统计最受欢迎的前 10 类商品(按照二级分类统计),并输出他们的人均消费(选择合适图表对其可视化,类似排行榜)¶
In [121]:
df_score = df_shop.groupby('二级分类').agg({'评分':'mean','人均消费':'mean'}).sort_values(by ='评分',ascending=False)
In [123]:
df_score = df_score.iloc[0:10]
In [127]:
df_score
Out[127]:
|
评分 |
人均消费 |
二级分类 |
|
|
本地购物 |
4.000000 |
20.000000 |
休闲茶饮 |
3.316384 |
6.401130 |
烘焙糕点 |
3.032787 |
9.737705 |
汤/粥/煲/砂锅/炖菜 |
3.000000 |
8.000000 |
美容美发 |
3.000000 |
20.000000 |
网吧网咖 |
3.000000 |
13.000000 |
便利店 |
2.954919 |
3.932039 |
超市 |
2.807244 |
15.806452 |
休闲食品 |
2.793333 |
8.680000 |
火锅 |
2.787879 |
16.242424 |
In [126]:
# 画图
plt.figure(figsize=(15,7))
plt.barh(df_score.sort_values(by='评分').index,
width=df_score['人均消费'],
height=0.4,
label='人均消费',
edgecolor='black')
plt.barh(
df_score.index,
width=df_score['评分'],
height=0.15,
label='评分',
edgecolor='black')
plt.legend(loc=1,fontsize=14)
plt.ylabel('商品的二级分类',fontsize=18)
plt.xlabel('评分和人均消费',fontsize=18)
plt.title('最受欢迎top10商品人均消费',fontsize=25)
plt.savefig('./datasets/new_alibaba/3_最受欢迎top10商品人均消费.png')
plt.show()
4. 平均日交易额最大的前 10 个商家,并输出他们各自的交易额,并选择合适的图表对结果进行可视化¶
In [ ]:
# 平均日交易额 = 人均消费 * 人数(去重) / 天数
# 这里的天数,怎么算? 是有交易记录的天数 还是按交易周期算?
In [128]:
# 1、先计算商家的去重用户数和天数
df_users_days = df_pay.groupby('商家ID').agg({'用户ID':'nunique','支付日期':'nunique'}).rename(columns={'用户ID':'用户数','支付日期':'天数'})
df_users_days
In [131]:
# 和商家信息合并
df1 = pd.merge(df_users_days,df_shop,left_on=df_users_days.index,right_on=df_shop['商家ID'],how='outer')
df1
Out[131]:
|
key_0 |
用户数 |
天数 |
商家ID |
城市 |
所在位置编号 |
人均消费 |
评分 |
评论数 |
门店等级 |
一级分类 |
二级分类 |
三级分类 |
0 |
1 |
29838 |
387 |
1 |
湖州 |
885 |
8 |
4.000000 |
12.0 |
2 |
美食 |
休闲茶饮 |
饮品/甜点 |
1 |
2 |
12863 |
329 |
2 |
哈尔滨 |
64 |
19 |
2.677004 |
0.0 |
1 |
超市便利店 |
超市 |
超市 |
2 |
3 |
7234 |
136 |
3 |
南昌 |
774 |
5 |
3.000000 |
2.0 |
0 |
美食 |
休闲茶饮 |
奶茶 |
3 |
4 |
5145 |
105 |
4 |
天津 |
380 |
18 |
2.677004 |
0.0 |
1 |
超市便利店 |
超市 |
超市 |
4 |
5 |
8558 |
202 |
5 |
杭州 |
263 |
2 |
2.000000 |
2.0 |
0 |
美食 |
休闲食品 |
生鲜水果 |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
1995 |
1996 |
3820 |
104 |
1996 |
南宁 |
248 |
6 |
3.000000 |
1.0 |
0 |
美食 |
快餐 |
中式快餐 |
1996 |
1997 |
8544 |
330 |
1997 |
上海 |
924 |
10 |
1.000000 |
2.0 |
0 |
美食 |
快餐 |
中式快餐 |
1997 |
1998 |
4616 |
266 |
1998 |
南通 |
1090 |
1 |
2.000000 |
2.0 |
0 |
美食 |
小吃 |
面点 |
1998 |
1999 |
31795 |
331 |
1999 |
成都 |
1134 |
19 |
2.677004 |
0.0 |
1 |
超市便利店 |
超市 |
超市 |
1999 |
2000 |
10162 |
175 |
2000 |
杭州 |
378 |
7 |
3.000000 |
2.0 |
0 |
美食 |
小吃 |
面点 |
2000 rows × 13 columns
In [134]:
# 计算平均日交易额
df1['平均日交易额'] = (df1['用户数'] * df1['人均消费']) /df1['天数']
df1
Out[134]:
|
key_0 |
用户数 |
天数 |
商家ID |
城市 |
所在位置编号 |
人均消费 |
评分 |
评论数 |
门店等级 |
一级分类 |
二级分类 |
三级分类 |
平均日交易额 |
0 |
1 |
29838 |
387 |
1 |
湖州 |
885 |
8 |
4.000000 |
12.0 |
2 |
美食 |
休闲茶饮 |
饮品/甜点 |
616.806202 |
1 |
2 |
12863 |
329 |
2 |
哈尔滨 |
64 |
19 |
2.677004 |
0.0 |
1 |
超市便利店 |
超市 |
超市 |
742.848024 |
2 |
3 |
7234 |
136 |
3 |
南昌 |
774 |
5 |
3.000000 |
2.0 |
0 |
美食 |
休闲茶饮 |
奶茶 |
265.955882 |
3 |
4 |
5145 |
105 |
4 |
天津 |
380 |
18 |
2.677004 |
0.0 |
1 |
超市便利店 |
超市 |
超市 |
882.000000 |
4 |
5 |
8558 |
202 |
5 |
杭州 |
263 |
2 |
2.000000 |
2.0 |
0 |
美食 |
休闲食品 |
生鲜水果 |
84.732673 |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
1995 |
1996 |
3820 |
104 |
1996 |
南宁 |
248 |
6 |
3.000000 |
1.0 |
0 |
美食 |
快餐 |
中式快餐 |
220.384615 |
1996 |
1997 |
8544 |
330 |
1997 |
上海 |
924 |
10 |
1.000000 |
2.0 |
0 |
美食 |
快餐 |
中式快餐 |
258.909091 |
1997 |
1998 |
4616 |
266 |
1998 |
南通 |
1090 |
1 |
2.000000 |
2.0 |
0 |
美食 |
小吃 |
面点 |
17.353383 |
1998 |
1999 |
31795 |
331 |
1999 |
成都 |
1134 |
19 |
2.677004 |
0.0 |
1 |
超市便利店 |
超市 |
超市 |
1825.090634 |
1999 |
2000 |
10162 |
175 |
2000 |
杭州 |
378 |
7 |
3.000000 |
2.0 |
0 |
美食 |
小吃 |
面点 |
406.480000 |
2000 rows × 14 columns
In [141]:
# 按照日交易额排序,并且取出前10个
df2 = df1[['商家ID','平均日交易额']].sort_values(by='平均日交易额',ascending = False).iloc[0:10]
df2
Out[141]:
|
商家ID |
平均日交易额 |
1628 |
1629 |
12289.292308 |
1927 |
1928 |
9903.918367 |
516 |
517 |
9443.319149 |
57 |
58 |
6340.408719 |
1345 |
1346 |
5506.428571 |
1900 |
1901 |
4357.135417 |
1820 |
1821 |
4070.501538 |
727 |
728 |
4017.666667 |
1984 |
1985 |
4010.524691 |
1534 |
1535 |
3993.099698 |
In [143]:
# 重置DF 的索引,作为条形图的 x
df = df2.reset_index()
df
Out[143]:
|
index |
商家ID |
平均日交易额 |
0 |
1628 |
1629 |
12289.292308 |
1 |
1927 |
1928 |
9903.918367 |
2 |
516 |
517 |
9443.319149 |
3 |
57 |
58 |
6340.408719 |
4 |
1345 |
1346 |
5506.428571 |
5 |
1900 |
1901 |
4357.135417 |
6 |
1820 |
1821 |
4070.501538 |
7 |
727 |
728 |
4017.666667 |
8 |
1984 |
1985 |
4010.524691 |
9 |
1534 |
1535 |
3993.099698 |
In [145]:
# 画图
plt.figure(figsize=(15,7))
x = df.index
height = df['平均日交易额']
plt.bar(x,
height=height,
width=0.4,
edgecolor='black',
label='平均日交易额'
)
plt.legend(loc=1,fontsize=14)
# 修改x轴的值
plt.xticks(x,df['商家ID'])
plt.ylabel('平均日交易额',fontsize=18)
plt.xlabel('商家ID',fontsize=18)
plt.title('平均日交易额top10商家',fontsize=25)
# 在指定的位置,显示值
for i,j in zip(x,height):
plt.text(i,j+150,'%d'%j,horizontalalignment='center')
plt.savefig('./datasets/new_alibaba/4_平均日交易额最大的前10商家.png')
plt.show()
5. 输出北京、上海、广州和深圳四个城市最受欢迎的 5 家奶茶商店和中式快餐编号(最受欢迎是指以下得分最高:0.7 ✖(平均评分/5) + 0.3 ✖ (平均消费金额/最高消费金额),注:最高消费金额和平均消费金额是从所有消费记录统计出来的)¶
In [147]:
# 4个城市的奶茶店
df1 = df_shop[(df_shop['城市'].isin(['北京', '上海','广州','深圳'])) & (df_shop['三级分类']== '奶茶')]
df1
Out[147]:
|
商家ID |
城市 |
所在位置编号 |
人均消费 |
评分 |
评论数 |
门店等级 |
一级分类 |
二级分类 |
三级分类 |
134 |
135 |
上海 |
828 |
7 |
4.0 |
4.0 |
0 |
美食 |
休闲茶饮 |
奶茶 |
143 |
144 |
上海 |
1054 |
5 |
4.0 |
2.0 |
0 |
美食 |
休闲茶饮 |
奶茶 |
193 |
194 |
上海 |
1032 |
5 |
3.0 |
1.0 |
0 |
美食 |
休闲茶饮 |
奶茶 |
214 |
215 |
北京 |
77 |
4 |
3.0 |
7.0 |
0 |
美食 |
休闲茶饮 |
奶茶 |
243 |
244 |
广州 |
44 |
2 |
3.0 |
2.0 |
0 |
美食 |
休闲茶饮 |
奶茶 |
389 |
390 |
北京 |
534 |
4 |
3.0 |
3.0 |
0 |
美食 |
休闲茶饮 |
奶茶 |
662 |
663 |
上海 |
709 |
4 |
3.0 |
3.0 |
2 |
美食 |
休闲茶饮 |
奶茶 |
751 |
752 |
深圳 |
991 |
15 |
4.0 |
2.0 |
0 |
美食 |
休闲茶饮 |
奶茶 |
758 |
759 |
上海 |
882 |
5 |
4.0 |
2.0 |
0 |
美食 |
休闲茶饮 |
奶茶 |
795 |
796 |
广州 |
36 |
9 |
3.0 |
2.0 |
0 |
美食 |
休闲茶饮 |
奶茶 |
799 |
800 |
上海 |
545 |
6 |
4.0 |
5.0 |
0 |
美食 |
休闲茶饮 |
奶茶 |
909 |
910 |
上海 |
1032 |
6 |
4.0 |
6.0 |
0 |
美食 |
休闲茶饮 |
奶茶 |
912 |
913 |
广州 |
552 |
8 |
3.0 |
3.0 |
0 |
美食 |
休闲茶饮 |
奶茶 |
1055 |
1056 |
上海 |
709 |
4 |
3.0 |
4.0 |
2 |
美食 |
休闲茶饮 |
奶茶 |
1181 |
1182 |
深圳 |
531 |
8 |
3.0 |
2.0 |
0 |
美食 |
休闲茶饮 |
奶茶 |
1192 |
1193 |
上海 |
642 |
7 |
4.0 |
1.0 |
0 |
美食 |
休闲茶饮 |
奶茶 |
1202 |
1203 |
上海 |
153 |
5 |
3.0 |
4.0 |
2 |
美食 |
休闲茶饮 |
奶茶 |
1240 |
1241 |
上海 |
1054 |
6 |
4.0 |
2.0 |
0 |
美食 |
休闲茶饮 |
奶茶 |
1588 |
1589 |
上海 |
1003 |
6 |
4.0 |
3.0 |
0 |
美食 |
休闲茶饮 |
奶茶 |
1618 |
1619 |
上海 |
501 |
6 |
3.0 |
4.0 |
0 |
美食 |
休闲茶饮 |
奶茶 |
1696 |
1697 |
上海 |
921 |
5 |
3.0 |
3.0 |
0 |
美食 |
休闲茶饮 |
奶茶 |
1704 |
1705 |
上海 |
545 |
4 |
4.0 |
2.0 |
0 |
美食 |
休闲茶饮 |
奶茶 |
1827 |
1828 |
广州 |
392 |
5 |
3.0 |
3.0 |
0 |
美食 |
休闲茶饮 |
奶茶 |
1859 |
1860 |
上海 |
697 |
5 |
3.0 |
3.0 |
2 |
美食 |
休闲茶饮 |
奶茶 |
1886 |
1887 |
上海 |
694 |
5 |
3.0 |
5.0 |
2 |
美食 |
休闲茶饮 |
奶茶 |
1970 |
1971 |
上海 |
642 |
6 |
4.0 |
4.0 |
0 |
美食 |
休闲茶饮 |
奶茶 |
1973 |
1974 |
上海 |
1127 |
6 |
4.0 |
3.0 |
0 |
美食 |
休闲茶饮 |
奶茶 |
In [148]:
# 4个城市 得分最高的5家奶茶店
df1['最终得分'] = 0.7 * (df1['评分'] / 5) + 0.3 * (df1['人均消费'] / max(df1['人均消费']))
df11 = df1.sort_values(by = '最终得分',ascending = False).iloc[0:5]
df11
Out[148]:
|
商家ID |
城市 |
所在位置编号 |
人均消费 |
评分 |
评论数 |
门店等级 |
一级分类 |
二级分类 |
三级分类 |
最终得分 |
751 |
752 |
深圳 |
991 |
15 |
4.0 |
2.0 |
0 |
美食 |
休闲茶饮 |
奶茶 |
0.86 |
134 |
135 |
上海 |
828 |
7 |
4.0 |
4.0 |
0 |
美食 |
休闲茶饮 |
奶茶 |
0.70 |
1192 |
1193 |
上海 |
642 |
7 |
4.0 |
1.0 |
0 |
美食 |
休闲茶饮 |
奶茶 |
0.70 |
799 |
800 |
上海 |
545 |
6 |
4.0 |
5.0 |
0 |
美食 |
休闲茶饮 |
奶茶 |
0.68 |
1970 |
1971 |
上海 |
642 |
6 |
4.0 |
4.0 |
0 |
美食 |
休闲茶饮 |
奶茶 |
0.68 |
In [150]:
# 4个城市的快餐店
df2 = df_shop[(df_shop['城市'].isin(['北京', '上海','广州','深圳'])) & (df_shop['三级分类']== '中式快餐')]
df2
Out[150]:
|
商家ID |
城市 |
所在位置编号 |
人均消费 |
评分 |
评论数 |
门店等级 |
一级分类 |
二级分类 |
三级分类 |
13 |
14 |
深圳 |
862 |
7 |
1.0 |
4.0 |
2 |
美食 |
快餐 |
中式快餐 |
50 |
51 |
北京 |
659 |
12 |
2.0 |
3.0 |
2 |
美食 |
快餐 |
中式快餐 |
77 |
78 |
上海 |
699 |
8 |
1.0 |
1.0 |
0 |
美食 |
快餐 |
中式快餐 |
78 |
79 |
上海 |
1033 |
15 |
2.0 |
3.0 |
1 |
美食 |
快餐 |
中式快餐 |
92 |
93 |
深圳 |
813 |
5 |
0.0 |
1.0 |
0 |
美食 |
快餐 |
中式快餐 |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
1888 |
1889 |
北京 |
916 |
5 |
3.0 |
0.0 |
0 |
美食 |
快餐 |
中式快餐 |
1914 |
1915 |
北京 |
322 |
10 |
3.0 |
3.0 |
0 |
美食 |
快餐 |
中式快餐 |
1929 |
1930 |
上海 |
993 |
7 |
2.0 |
2.0 |
2 |
美食 |
快餐 |
中式快餐 |
1930 |
1931 |
深圳 |
1109 |
4 |
0.0 |
4.0 |
0 |
美食 |
快餐 |
中式快餐 |
1996 |
1997 |
上海 |
924 |
10 |
1.0 |
2.0 |
0 |
美食 |
快餐 |
中式快餐 |
104 rows × 10 columns
In [151]:
# 4个城市 得分最高的5家快餐店
df2['最终得分'] = 0.7 * (df2['评分'] / 5) + 0.3 * (df2['人均消费'] / max(df2['人均消费']))
df22 = df2.sort_values(by = '最终得分',ascending = False).iloc[0:5]
df22
Out[151]:
|
商家ID |
城市 |
所在位置编号 |
人均消费 |
评分 |
评论数 |
门店等级 |
一级分类 |
二级分类 |
三级分类 |
最终得分 |
1370 |
1371 |
北京 |
916 |
17 |
4.0 |
3.0 |
1 |
美食 |
快餐 |
中式快餐 |
0.815 |
872 |
873 |
上海 |
358 |
11 |
4.0 |
1.0 |
0 |
美食 |
快餐 |
中式快餐 |
0.725 |
1532 |
1533 |
北京 |
319 |
18 |
3.0 |
10.0 |
2 |
美食 |
快餐 |
中式快餐 |
0.690 |
823 |
824 |
上海 |
1065 |
18 |
3.0 |
1.0 |
0 |
美食 |
快餐 |
中式快餐 |
0.690 |
894 |
895 |
上海 |
924 |
16 |
3.0 |
1.0 |
0 |
美食 |
快餐 |
中式快餐 |
0.660 |
In [187]:
# 输出
pd.merge(df11[['商家ID','三级分类','城市','最终得分']],(df22[['商家ID','三级分类','城市','最终得分']]),how='outer')
Out[187]:
|
商家ID |
三级分类 |
城市 |
最终得分 |
0 |
752 |
奶茶 |
深圳 |
0.860 |
1 |
135 |
奶茶 |
上海 |
0.700 |
2 |
1193 |
奶茶 |
上海 |
0.700 |
3 |
800 |
奶茶 |
上海 |
0.680 |
4 |
1971 |
奶茶 |
上海 |
0.680 |
5 |
1371 |
中式快餐 |
北京 |
0.815 |
6 |
873 |
中式快餐 |
上海 |
0.725 |
7 |
1533 |
中式快餐 |
北京 |
0.690 |
8 |
824 |
中式快餐 |
上海 |
0.690 |
9 |
895 |
中式快餐 |
上海 |
0.660 |
6. 留存分析¶
(对于平均日交易额最 大的前 3 个 商家,对他们进行漏斗分析,以浏览行为作为分析目标,输出 2016.10.01~2016.10.31 共 31 天的留存率,输出为类似以下矩阵(注意表中数 值不一定准确,仅用作示例说明), 请选择合适的图表进行可视化:(注:第 0 天留存率表示当天活跃的用户比例 (一定 是 100%,比如有 1000 人浏 览),第 1 天留存率表示第 0 天活跃的用户在第一天 也活跃的比例(比如前面 1000 人中第 1 天也活跃的用户有 820 人,则留存率为 82%),第 2 天留存率表示第 0 天活跃的用户在第 2 天也活跃的比例(比如前面 1000 人中第 2 天也活跃的用户有 600 人,则留存率为 60%),以此类推….)
In [ ]:
# 前面第4题已经有了平均日交易额最大的前10个商家,直接用即可。
# 1929、1928、517
In [158]:
# 取出商家id= 1629,1928,517,2016年10月的浏览数据
df_view_top3 = df_view[(df_view['商家ID'].isin([1629,1928,517])) & (df_view['浏览日期'].dt.month == 10) & (df_view['浏览日期'].dt.year == 2016)]
df_view_top3
Out[158]:
|
用户ID |
商家ID |
浏览时间 |
浏览日期 |
2275032 |
10071392 |
517 |
2016-10-22 21:00:00 |
2016-10-22 |
2275043 |
9541932 |
517 |
2016-10-18 21:00:00 |
2016-10-18 |
2275050 |
8584386 |
517 |
2016-10-13 12:00:00 |
2016-10-13 |
2275059 |
19453077 |
517 |
2016-10-21 10:00:00 |
2016-10-21 |
2275061 |
19926664 |
517 |
2016-10-29 20:00:00 |
2016-10-29 |
... |
... |
... |
... |
... |
3610317 |
22565138 |
1629 |
2016-10-10 22:00:00 |
2016-10-10 |
3610324 |
12194265 |
1629 |
2016-10-20 14:00:00 |
2016-10-20 |
3610331 |
376707 |
1629 |
2016-10-06 19:00:00 |
2016-10-06 |
3610341 |
21686088 |
1629 |
2016-10-02 20:00:00 |
2016-10-02 |
3610357 |
17863648 |
1629 |
2016-10-23 23:00:00 |
2016-10-23 |
5356 rows × 4 columns
In [160]:
# 把 浏览时间(日) 变成 index
df_view_top3.set_index('浏览日期',inplace=True)
In [184]:
# 按照日期 索引进行排序,并且取出用户ID
df = df_view_top3.sort_index()[['用户ID']]
df
Out[184]:
|
用户ID |
浏览日期 |
|
2016-10-01 |
17832138 |
2016-10-01 |
7999628 |
2016-10-01 |
15779039 |
2016-10-01 |
3837194 |
2016-10-01 |
2253587 |
... |
... |
2016-10-31 |
20293092 |
2016-10-31 |
21985171 |
2016-10-31 |
4683583 |
2016-10-31 |
11180310 |
2016-10-31 |
11070560 |
5356 rows × 1 columns
In [185]:
# 用来存放结果
result_df = pd.DataFrame(index = df.index.unique(),columns=df.index.unique())
result_df
for i in result_df.index:
base_user = df.loc[i,]['用户ID'].nunique()
for j in result_df.columns:
if j == i:
result_df.loc[i,j] = base_user
elif j>=i:
current_users = pd.merge(df.loc[i,][['用户ID']],df.loc[j,][['用户ID']])
current_user_num = current_users['用户ID'].count()
result_df.loc[i,j] = current_user_num
else:
result_df.loc[i,j] = ''
In [186]:
result_df.index.name=None
result_df
Out[186]:
浏览日期 |
2016-10-01 |
2016-10-02 |
2016-10-03 |
2016-10-04 |
2016-10-05 |
2016-10-06 |
2016-10-07 |
2016-10-08 |
2016-10-09 |
2016-10-10 |
... |
2016-10-22 |
2016-10-23 |
2016-10-24 |
2016-10-25 |
2016-10-26 |
2016-10-27 |
2016-10-28 |
2016-10-29 |
2016-10-30 |
2016-10-31 |
2016-10-01 |
291 |
2 |
1 |
3 |
0 |
1 |
0 |
1 |
0 |
4 |
... |
0 |
2 |
1 |
1 |
0 |
5 |
0 |
0 |
0 |
0 |
2016-10-02 |
|
226 |
1 |
2 |
1 |
1 |
2 |
0 |
0 |
0 |
... |
0 |
0 |
0 |
2 |
0 |
0 |
0 |
1 |
0 |
0 |
2016-10-03 |
|
|
174 |
3 |
0 |
1 |
0 |
1 |
1 |
0 |
... |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
2016-10-04 |
|
|
|
180 |
2 |
0 |
0 |
1 |
1 |
0 |
... |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
2016-10-05 |
|
|
|
|
173 |
0 |
2 |
0 |
1 |
0 |
... |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
2016-10-06 |
|
|
|
|
|
188 |
3 |
0 |
3 |
0 |
... |
0 |
2 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
2016-10-07 |
|
|
|
|
|
|
252 |
2 |
2 |
2 |
... |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
2016-10-08 |
|
|
|
|
|
|
|
212 |
5 |
0 |
... |
0 |
2 |
1 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
2016-10-09 |
|
|
|
|
|
|
|
|
212 |
2 |
... |
1 |
2 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
2016-10-10 |
|
|
|
|
|
|
|
|
|
195 |
... |
0 |
0 |
0 |
0 |
0 |
2 |
1 |
0 |
2 |
0 |
2016-10-11 |
|
|
|
|
|
|
|
|
|
|
... |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
1 |
2016-10-12 |
|
|
|
|
|
|
|
|
|
|
... |
0 |
1 |
2 |
0 |
0 |
2 |
0 |
0 |
0 |
1 |
2016-10-13 |
|
|
|
|
|
|
|
|
|
|
... |
0 |
3 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
2016-10-14 |
|
|
|
|
|
|
|
|
|
|
... |
2 |
1 |
0 |
0 |
3 |
1 |
4 |
0 |
0 |
0 |
2016-10-15 |
|
|
|
|
|
|
|
|
|
|
... |
3 |
2 |
2 |
0 |
0 |
0 |
0 |
1 |
2 |
0 |
2016-10-16 |
|
|
|
|
|
|
|
|
|
|
... |
1 |
3 |
0 |
0 |
0 |
0 |
3 |
2 |
0 |
0 |
2016-10-17 |
|
|
|
|
|
|
|
|
|
|
... |
3 |
1 |
0 |
1 |
0 |
1 |
0 |
0 |
2 |
0 |
2016-10-18 |
|
|
|
|
|
|
|
|
|
|
... |
0 |
0 |
0 |
0 |
1 |
4 |
0 |
0 |
0 |
0 |
2016-10-19 |
|
|
|
|
|
|
|
|
|
|
... |
2 |
1 |
2 |
1 |
0 |
0 |
0 |
0 |
0 |
1 |
2016-10-20 |
|
|
|
|
|
|
|
|
|
|
... |
1 |
1 |
1 |
1 |
1 |
0 |
1 |
1 |
0 |
0 |
2016-10-21 |
|
|
|
|
|
|
|
|
|
|
... |
0 |
1 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
0 |
2016-10-22 |
|
|
|
|
|
|
|
|
|
|
... |
210 |
3 |
1 |
1 |
2 |
1 |
2 |
1 |
2 |
0 |
2016-10-23 |
|
|
|
|
|
|
|
|
|
|
... |
|
166 |
1 |
0 |
1 |
2 |
1 |
1 |
2 |
0 |
2016-10-24 |
|
|
|
|
|
|
|
|
|
|
... |
|
|
96 |
2 |
1 |
0 |
0 |
3 |
0 |
0 |
2016-10-25 |
|
|
|
|
|
|
|
|
|
|
... |
|
|
|
97 |
0 |
0 |
0 |
1 |
0 |
0 |
2016-10-26 |
|
|
|
|
|
|
|
|
|
|
... |
|
|
|
|
98 |
4 |
1 |
0 |
0 |
0 |
2016-10-27 |
|
|
|
|
|
|
|
|
|
|
... |
|
|
|
|
|
131 |
1 |
3 |
0 |
0 |
2016-10-28 |
|
|
|
|
|
|
|
|
|
|
... |
|
|
|
|
|
|
178 |
0 |
0 |
0 |
2016-10-29 |
|
|
|
|
|
|
|
|
|
|
... |
|
|
|
|
|
|
|
166 |
1 |
2 |
2016-10-30 |
|
|
|
|
|
|
|
|
|
|
... |
|
|
|
|
|
|
|
|
159 |
2 |
2016-10-31 |
|
|
|
|
|
|
|
|
|
|
... |
|
|
|
|
|
|
|
|
|
135 |
31 rows × 31 columns
In [179]:
7. 找到被浏览次数最多的 50 个商家,并输出他们的城市以及人均消费,并选择合适的图表对结果进行可视化¶
In [165]:
# 浏览次数top 50的商家ID
view_num = df_view.groupby('商家ID')['浏览时间'].count().to_frame().sort_values(by='浏览时间',ascending=False)
view_num= view_num.iloc[0:50,].index.to_frame()
view_num
Out[165]:
|
商家ID |
商家ID |
|
1911 |
1911 |
1677 |
1677 |
1539 |
1539 |
1670 |
1670 |
799 |
799 |
44 |
44 |
1823 |
1823 |
885 |
885 |
1322 |
1322 |
195 |
195 |
852 |
852 |
647 |
647 |
887 |
887 |
675 |
675 |
431 |
431 |
1108 |
1108 |
1629 |
1629 |
1935 |
1935 |
1883 |
1883 |
1692 |
1692 |
1992 |
1992 |
1202 |
1202 |
1017 |
1017 |
451 |
451 |
58 |
58 |
1221 |
1221 |
1362 |
1362 |
347 |
347 |
522 |
522 |
1142 |
1142 |
187 |
187 |
577 |
577 |
425 |
425 |
570 |
570 |
364 |
364 |
671 |
671 |
737 |
737 |
283 |
283 |
891 |
891 |
844 |
844 |
155 |
155 |
1478 |
1478 |
298 |
298 |
1311 |
1311 |
1553 |
1553 |
1646 |
1646 |
30 |
30 |
408 |
408 |
256 |
256 |
1821 |
1821 |
In [166]:
# 连接
df_7 = pd.merge(view_num,df_shop,left_on = view_num.index,right_on = df_shop['商家ID'],how='left')
df_7
Out[166]:
|
key_0 |
商家ID_x |
商家ID_y |
城市 |
所在位置编号 |
人均消费 |
评分 |
评论数 |
门店等级 |
一级分类 |
二级分类 |
三级分类 |
0 |
1911 |
1911 |
1911 |
天津 |
625 |
20 |
4.000000 |
8.0 |
2 |
美食 |
火锅 |
川味/重庆火锅 |
1 |
1677 |
1677 |
1677 |
济南 |
23 |
20 |
4.000000 |
7.0 |
2 |
美食 |
火锅 |
川味/重庆火锅 |
2 |
1539 |
1539 |
1539 |
宁波 |
245 |
20 |
4.000000 |
6.0 |
2 |
美食 |
火锅 |
川味/重庆火锅 |
3 |
1670 |
1670 |
1670 |
南京 |
680 |
20 |
4.000000 |
10.0 |
2 |
美食 |
火锅 |
川味/重庆火锅 |
4 |
799 |
799 |
799 |
苏州 |
790 |
20 |
4.000000 |
6.0 |
2 |
美食 |
火锅 |
川味/重庆火锅 |
5 |
44 |
44 |
44 |
郑州 |
1088 |
20 |
4.000000 |
5.0 |
2 |
美食 |
火锅 |
川味/重庆火锅 |
6 |
1823 |
1823 |
1823 |
广州 |
36 |
20 |
4.000000 |
8.0 |
2 |
美食 |
火锅 |
川味/重庆火锅 |
7 |
885 |
885 |
885 |
武汉 |
65 |
20 |
4.000000 |
9.0 |
2 |
美食 |
火锅 |
川味/重庆火锅 |
8 |
1322 |
1322 |
1322 |
杭州 |
1093 |
20 |
4.000000 |
8.0 |
2 |
美食 |
火锅 |
川味/重庆火锅 |
9 |
195 |
195 |
195 |
孝感 |
98 |
19 |
1.000000 |
4.0 |
2 |
美食 |
其他美食 |
西餐 |
10 |
852 |
852 |
852 |
武汉 |
605 |
20 |
2.000000 |
11.0 |
1 |
美食 |
其他美食 |
西餐 |
11 |
647 |
647 |
647 |
达州 |
518 |
19 |
2.677004 |
0.0 |
1 |
超市便利店 |
超市 |
超市 |
12 |
887 |
887 |
887 |
武汉 |
435 |
20 |
1.000000 |
6.0 |
2 |
美食 |
其他美食 |
西餐 |
13 |
675 |
675 |
675 |
梧州 |
164 |
4 |
3.000000 |
6.0 |
2 |
美食 |
快餐 |
西式快餐 |
14 |
431 |
431 |
431 |
东莞 |
913 |
9 |
2.000000 |
5.0 |
2 |
美食 |
快餐 |
西式快餐 |
15 |
1108 |
1108 |
1108 |
南京 |
1126 |
20 |
4.000000 |
6.0 |
2 |
美食 |
火锅 |
川味/重庆火锅 |
16 |
1629 |
1629 |
1629 |
苏州 |
1147 |
20 |
3.000000 |
2.0 |
1 |
超市便利店 |
超市 |
超市 |
17 |
1935 |
1935 |
1935 |
嘉兴 |
393 |
2 |
3.000000 |
3.0 |
0 |
美食 |
休闲食品 |
生鲜水果 |
18 |
1883 |
1883 |
1883 |
苏州 |
63 |
20 |
4.000000 |
3.0 |
2 |
美食 |
火锅 |
川味/重庆火锅 |
19 |
1692 |
1692 |
1692 |
东莞 |
184 |
20 |
2.677004 |
0.0 |
1 |
超市便利店 |
超市 |
超市 |
20 |
1992 |
1992 |
1992 |
安康 |
118 |
19 |
2.677004 |
0.0 |
1 |
超市便利店 |
超市 |
超市 |
21 |
1202 |
1202 |
1202 |
江门 |
1016 |
6 |
2.000000 |
3.0 |
2 |
美食 |
快餐 |
西式快餐 |
22 |
1017 |
1017 |
1017 |
邢台 |
1077 |
18 |
2.677004 |
0.0 |
1 |
超市便利店 |
超市 |
超市 |
23 |
451 |
451 |
451 |
杭州 |
405 |
20 |
4.000000 |
6.0 |
2 |
美食 |
火锅 |
川味/重庆火锅 |
24 |
58 |
58 |
58 |
杭州 |
1093 |
19 |
3.000000 |
2.0 |
1 |
超市便利店 |
超市 |
超市 |
25 |
1221 |
1221 |
1221 |
合肥 |
814 |
5 |
4.000000 |
7.0 |
0 |
美食 |
休闲茶饮 |
奶茶 |
26 |
1362 |
1362 |
1362 |
长治 |
224 |
15 |
3.000000 |
6.0 |
2 |
美食 |
快餐 |
西式快餐 |
27 |
347 |
347 |
347 |
邯郸 |
604 |
7 |
3.000000 |
3.0 |
2 |
美食 |
快餐 |
西式快餐 |
28 |
522 |
522 |
522 |
深圳 |
991 |
20 |
2.000000 |
6.0 |
2 |
美食 |
中餐 |
江浙菜 |
29 |
1142 |
1142 |
1142 |
石家庄 |
703 |
19 |
3.000000 |
2.0 |
0 |
美食 |
中餐 |
其它地方菜 |
30 |
187 |
187 |
187 |
惠州 |
83 |
8 |
2.000000 |
5.0 |
2 |
美食 |
快餐 |
西式快餐 |
31 |
577 |
577 |
577 |
金华 |
437 |
20 |
2.677004 |
0.0 |
1 |
超市便利店 |
超市 |
超市 |
32 |
425 |
425 |
425 |
上海 |
809 |
19 |
3.000000 |
4.0 |
0 |
美食 |
中餐 |
西北菜 |
33 |
570 |
570 |
570 |
湖州 |
899 |
6 |
3.000000 |
12.0 |
2 |
美食 |
快餐 |
西式快餐 |
34 |
364 |
364 |
364 |
佛山 |
82 |
20 |
0.000000 |
4.0 |
0 |
美食 |
中餐 |
江浙菜 |
35 |
671 |
671 |
671 |
成都 |
446 |
19 |
4.000000 |
0.0 |
1 |
超市便利店 |
超市 |
超市 |
36 |
737 |
737 |
737 |
广州 |
132 |
9 |
2.000000 |
17.0 |
2 |
美食 |
快餐 |
西式快餐 |
37 |
283 |
283 |
283 |
大连 |
227 |
20 |
4.000000 |
9.0 |
0 |
美食 |
中餐 |
海鲜 |
38 |
891 |
891 |
891 |
杭州 |
264 |
9 |
3.000000 |
20.0 |
2 |
美食 |
快餐 |
西式快餐 |
39 |
844 |
844 |
844 |
武汉 |
653 |
19 |
2.000000 |
6.0 |
1 |
美食 |
其他美食 |
西餐 |
40 |
155 |
155 |
155 |
江门 |
635 |
7 |
3.000000 |
7.0 |
2 |
美食 |
快餐 |
西式快餐 |
41 |
1478 |
1478 |
1478 |
绍兴 |
912 |
1 |
4.000000 |
7.0 |
1 |
美食 |
休闲茶饮 |
奶茶 |
42 |
298 |
298 |
298 |
西安 |
1020 |
19 |
2.677004 |
0.0 |
1 |
超市便利店 |
超市 |
超市 |
43 |
1311 |
1311 |
1311 |
广州 |
488 |
20 |
2.000000 |
5.0 |
2 |
美食 |
其他美食 |
西餐 |
44 |
1553 |
1553 |
1553 |
南宁 |
793 |
13 |
3.000000 |
9.0 |
2 |
美食 |
快餐 |
西式快餐 |
45 |
1646 |
1646 |
1646 |
玉林 |
1089 |
15 |
2.000000 |
7.0 |
2 |
美食 |
快餐 |
西式快餐 |
46 |
30 |
30 |
30 |
中山 |
498 |
7 |
2.000000 |
2.0 |
2 |
美食 |
快餐 |
西式快餐 |
47 |
408 |
408 |
408 |
贵阳 |
666 |
20 |
2.677004 |
0.0 |
1 |
超市便利店 |
超市 |
超市 |
48 |
256 |
256 |
256 |
南宁 |
76 |
18 |
3.000000 |
0.0 |
1 |
超市便利店 |
超市 |
超市 |
49 |
1821 |
1821 |
1821 |
无锡 |
177 |
19 |
3.000000 |
0.0 |
1 |
超市便利店 |
超市 |
超市 |
In [169]:
# 输出城市和人均消费
df7 = df_7[['商家ID_x','城市','人均消费']]
df7
Out[169]:
|
商家ID_x |
城市 |
人均消费 |
0 |
1911 |
天津 |
20 |
1 |
1677 |
济南 |
20 |
2 |
1539 |
宁波 |
20 |
3 |
1670 |
南京 |
20 |
4 |
799 |
苏州 |
20 |
5 |
44 |
郑州 |
20 |
6 |
1823 |
广州 |
20 |
7 |
885 |
武汉 |
20 |
8 |
1322 |
杭州 |
20 |
9 |
195 |
孝感 |
19 |
10 |
852 |
武汉 |
20 |
11 |
647 |
达州 |
19 |
12 |
887 |
武汉 |
20 |
13 |
675 |
梧州 |
4 |
14 |
431 |
东莞 |
9 |
15 |
1108 |
南京 |
20 |
16 |
1629 |
苏州 |
20 |
17 |
1935 |
嘉兴 |
2 |
18 |
1883 |
苏州 |
20 |
19 |
1692 |
东莞 |
20 |
20 |
1992 |
安康 |
19 |
21 |
1202 |
江门 |
6 |
22 |
1017 |
邢台 |
18 |
23 |
451 |
杭州 |
20 |
24 |
58 |
杭州 |
19 |
25 |
1221 |
合肥 |
5 |
26 |
1362 |
长治 |
15 |
27 |
347 |
邯郸 |
7 |
28 |
522 |
深圳 |
20 |
29 |
1142 |
石家庄 |
19 |
30 |
187 |
惠州 |
8 |
31 |
577 |
金华 |
20 |
32 |
425 |
上海 |
19 |
33 |
570 |
湖州 |
6 |
34 |
364 |
佛山 |
20 |
35 |
671 |
成都 |
19 |
36 |
737 |
广州 |
9 |
37 |
283 |
大连 |
20 |
38 |
891 |
杭州 |
9 |
39 |
844 |
武汉 |
19 |
40 |
155 |
江门 |
7 |
41 |
1478 |
绍兴 |
1 |
42 |
298 |
西安 |
19 |
43 |
1311 |
广州 |
20 |
44 |
1553 |
南宁 |
13 |
45 |
1646 |
玉林 |
15 |
46 |
30 |
中山 |
7 |
47 |
408 |
贵阳 |
20 |
48 |
256 |
南宁 |
18 |
49 |
1821 |
无锡 |
19 |
In [177]:
# 导出到tableau画地图
df7.to_csv('./datasets/new_alibaba/浏览次数最多的50个商家.csv',index=False) #加index = False,消除Unnamed: 0
In [170]:
# 看人均消费
plt.plot(df['人均消费'])
plt.title('浏览次数最多的TOP50商家 人均消费')
plt.show()
In [171]:
df7.index
Out[171]:
Int64Index([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49],
dtype='int64')
In [176]:
# 看城市分布
In [178]:
df7['城市']
Out[178]:
0 天津
1 济南
2 宁波
3 南京
4 苏州
5 郑州
6 广州
7 武汉
8 杭州
9 孝感
10 武汉
11 达州
12 武汉
13 梧州
14 东莞
15 南京
16 苏州
17 嘉兴
18 苏州
19 东莞
20 安康
21 江门
22 邢台
23 杭州
24 杭州
25 合肥
26 长治
27 邯郸
28 深圳
29 石家庄
30 惠州
31 金华
32 上海
33 湖州
34 佛山
35 成都
36 广州
37 大连
38 杭州
39 武汉
40 江门
41 绍兴
42 西安
43 广州
44 南宁
45 玉林
46 中山
47 贵阳
48 南宁
49 无锡
Name: 城市, dtype: object
In [ ]:
标签:...,
10,
python,
df,
美食,
口碑,
2016,
ID,
abby
From: https://www.cnblogs.com/wuxiaoyan/p/16963924.html