正文
上海是全国咖啡消费需求最大的城市,我们看看星巴克门店在上海的分布情况。
整体上星巴克门店集中在上海市区内环范围,往外以点线式分散,郊区五大新城、浦东机场、虹桥枢纽也是较为集中的区域。
瑞幸上海分布热力图
瑞幸在上海市区内环的集中度没有星巴克那么明显,整体数量上也少很多。
Python数据分析
下面再深入分析星巴
克和瑞幸门店的关联关系,我们知
道瑞幸咖啡是后起之秀,据说很多门店的选址依据主要看周边是否有星巴克。
那全国范围每个星巴克门店周边平均有多少个瑞幸门店呢?这次从方圆500米范围看看瑞幸在星巴克周边的聚集情况。
我们使用Python和其第三方库shapely来进行处理数据,shapely主要用来处理地理坐标数据。
第一步:导入所需要的库
# 导入相关库 import pandas as pdimport requestsimport time from shapely.geometry import Pointfrom shapely.geometry.polygon import Polygon
第二步:从API中抽取数据
# 抽取星巴克和瑞幸门店数据,通过下秒机器人API调用 # 抽取星巴克门店数据 headers = { "x-token" : "tk7a2980431688455e8976e4bad4d13d6a" } starbucks_list = []for i in range(1 ,10 ): response_1 = requests.get("http://app.chafer.nexadata.cn/openapi/v1/sheet/sht22nId5uouP2/records?size=500&page={0}" .format(i), headers = headers) starbucks = response_1.json()['data' ]['list' ] starbucks = pd.DataFrame(starbucks) time.sleep(1 ) starbucks_list.append(starbucks) starbucks = pd.concat(starbucks_list)# 抽取瑞幸门店数据 luckin_list =[]for j in range(1 ,9 ): response_2 = requests.get("http://app.chafer.nexadata.cn/openapi/v1/sheet/sht22nIeomVmYy/records?size=500&page={0}" .format(j), headers = headers) luckin = response_2.json()['data' ]['list' ] luckin = pd.DataFrame(luckin ) luckin_list.append(luckin) time.sleep(1 ) luckin = pd.concat(luckin_list)
第三步:判断星巴克门店方圆500米范围内的瑞幸门店数
# 根据星巴克咖啡店坐标绘制半径为XX米的地理区域 def circle (data,radius) : # radius 表示区域半径 # 给定地理坐标 center_latitude = float(data['维度' ]) center_longitude = float(data['经度' ]) # 创建圆形区域 center_point = Point(center_longitude, center_latitude) circle = center_point.buffer(radius/111300 ) # 创建多边形区域 polygon = Polygon(circle.exterior) return polygon# 根据经纬度构建坐标点 def point (data) : # 给定地理坐标 center_latitude = float(data['维度' ]) center_longitude = float(data['经度' ]) # 创建坐标点 center_point = Point(center_longitude, center_latitude) return center_point# 判断瑞幸咖啡店是否在星巴克方圆500m范围内 def is_inside (data) : polygon = data['Polygon' ] # 判断坐标是否在区域内 n = 0 luckin_city = luckin[luckin['城市' ]==data['城市' ]] for point in luckin_city['Point' ]: is_inside = polygon.contains(point) # 打印判断结果 if is_inside: n = n + 1 return n# 根据星巴克门店坐标位置绘制方圆半径为500米的地理区域 starbucks['Polygon' ] = starbucks.apply(circle,axis=1 ,args=(500 ,))# 根据瑞幸门店经纬度构建坐标点 luckin['Point' ] = luckin.apply(point, axis=1 )# 判断瑞幸门店是否在星巴克门店方圆500米范围内 starbucks['Luckin_numbers' ] = starbucks.apply(is_inside, axis=1 )
数据处理后如下:
第四步:分析数据
方圆500米范围内,全国平均每个星巴克门店周边有0.6个瑞幸门店