你知道全国有多少家海底捞吗?Python让你一目了然
前段时间去公司楼下吃了顿海底捞,排队人不多。后来没多久看到新闻说海底捞要关闭300
家店,300
家店是什么概念?海底捞全国一共又有多少家门店?都分布在哪些城市?
不如我们拿Python来直观看一看吧!
目录:
1. 数据采集
2. 地图绘制
2.1. 坐标转换
2.2. 地图绘制
3. 店面分布
1. 数据采集
直接打开海底捞官网 haidilao.com,拖到首页最下面我们可以看到全球各国家与地区门店选择,点击中国即可进入到中国门店列表,在开发者模式找到源数据地址。
可以看到请求到的数据格式很整洁,我们可以非常方便的处理,看代码:
import requests
import pandas as pd
# 接口地址
url = 'https://www.haidilao.com/eportal/store/listObjByPosition?country=CN&language=zh'
# 请求头
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36",
"accept": "application/json, text/plain, */*"
}
r = requests.get(url, headers=headers)
# 门店数据信息
data = r.json()
# 转化为DataFrame类型
df = pd.DataFrame(data['value'])
# 存储本地
df.to_excel('海底捞.xlsx',index=False)
数据预览:
一共1404家门店
2. 地图绘制
在采集到的数据中我们可以看到有经纬度坐标(百度地图),这里我的目标是将店地址绘制到地图上,采用的是folium
绘图库。由于这个库没有百度地图,有高德地图,因此我需要先将经纬度坐标从百度转为高德,再进行地图绘制。
2.1. 坐标转换
在高迪开平找到坐标转换的接口,然后直接转换即可。
https://lbs.amap.com/api/webservice/guide/api/convert
# 用于存储转换后的坐标列表
ss1 = []
for i , location in enumerate(df[['longitude','latitude']].values):
location = str(location[0])+','+str(location[1])
url = 'https://restapi.amap.com/v3/assistant/coordinate/convert?'
parames = {
'locations':location,
'coordsys':'baidu',
'key':'你的key',
}
r = eval(requests.get(url, params=parames).json()['locations'])
ss = [r[1],r[0]]
ss1.append(ss)
print(f'\r{i+1}',end='')
输出结果:
2.2. 地图绘制
基于经纬度坐标点+店铺名称数据用于绘制,代码如下:
from folium import plugins
import folium
m = folium.Map([39.904989, 116.405285], # 北京中心区域经纬度
zoom_start=10,
tiles='http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}', # 高德街道图
# tiles='https://mt.google.com/vt/lyrs=h&x={x}&y={y}&z={z}', # google 地图
# tiles='Stamen Toner',
attr='高德')
# 绘制店标记
groups = folium.FeatureGroup('')
for l,label in zip(ss1,df['storeName'].to_list()):
groups.add_child(
folium.CircleMarker(
location=l,
radius=7,
color='yellow',
fill=True,
fill_color='red',
fill_opacity=0.4,
popup=folium.Popup(html=label,max_width=100),
)
)
m.add_child(groups)
m.add_child(folium.LatLngPopup())
# 区域密度
marker_cluster = plugins.MarkerCluster().add_to(m)
for l,label in zip(ss1,df['storeName'].to_list()):
# 添加marker到地图
folium.Marker(
location = l,
icon=None,
# popup=folium.Popup(html=label,max_width=100),
).add_to(marker_cluster)
m.add_child(marker_cluster)
m.save('海底捞.html') # 将结果以HTML形式保存到本地
输出结果对比:
左侧是绘制的,右侧是官网的
3. 店面分布
同样的,在高德地图开放平台也有经纬度坐标转化位置信息的接口,我们通过店铺经纬度信息找到其所在省市(原始数据中地址信息格式不统一,比较难解析)。
citys = []
provinces = []
for i , location in enumerate(df[['longitude','latitude']].values):
location = str(location[0])+','+str(location[1])
url = 'https://restapi.amap.com/v3/geocode/regeo?'
params = {
'location':location,
'key':'4e3f878e4f74ad3b522d10830e54cfa2',
'extensions':'base',
'batch':'false',
'roadlevel':0,
}
r = requests.get(url, params=params)
data = r.json()['regeocode']
city = data['addressComponent']['city']
province = data['addressComponent']['province']
if len(city)==0:
city = province
citys.append(city)
provinces.append(province)
print(f'\r{i+1}',end='')
df['城市'] = citys
获取城市信息后,就可以直接分组统计不同城市的海底捞店铺数了。
df.groupby('城市')['storeId'].nunique().sort_values(ascending=False).head(10)
城市 | 店铺数 |
---|---|
上海市 | 81 |
北京市 | 78 |
深圳市 | 52 |
西安市 | 52 |
广州市 | 47 |
武汉市 | 42 |
郑州市 | 41 |
杭州市 | 40 |
成都市 | 33 |
南京市 | 32 |
海底捞在全国242个城市有店面,其中在营店面数最多的城市是上海共81家店,其次是北京有78家店。
from pyecharts import options as opts
from pyecharts.charts import Map
from pyecharts.faker import Faker
from pyecharts.globals import CurrentConfig, NotebookType
CurrentConfig.NOTEBOOK_TYPE = NotebookType.JUPYTER_LAB
df = pd.read_clipboard()
c = (
Map()
.add("海底捞店面数", [list(z) for z in zip(df.省, df.数量)], "china")
.set_global_opts(
title_opts=opts.TitleOpts(title="海底捞全国各省店面数分布"),
visualmap_opts=opts.VisualMapOpts(max_=200),
)
)
c.load_javascript()
c.render_notebook()
省 | 数量 |
---|---|
广东 | 185 |
江苏 | 148 |
浙江 | 120 |
上海 | 81 |
北京 | 78 |
山东 | 78 |
河南 | 75 |
陕西 | 71 |
湖北 | 64 |
福建 | 59 |
安徽 | 55 |
河北 | 49 |
四川 | 48 |
湖南 | 44 |
天津 | 30 |
江西 | 27 |
广西 | 24 |
辽宁 | 22 |
重庆 | 22 |
山西 | 18 |
云南 | 16 |
甘肃 | 15 |
内蒙古 | 15 |
吉林 | 14 |
海南 | 11 |
贵州 | 11 |
黑龙江 | 10 |
宁夏 | 9 |
青海 | 5 |
也可以用Excel
的EasyShu
插件进行绘制,效果如下:
以上就是我们对海底捞门店分布进行的可视化处理。这种方法在地点相关的数据可视化分析中非常常用,比如停车场分布,房源分布等,感兴趣的小伙伴可以找一些类似的数据进行练习。
如果文章对你有帮助,欢迎转发/点赞/收藏~
作者:道才
_往期文章推荐_