来源:可以叫我才哥
前段时间小团建去吃了海底捞,最近又看新闻说海底捞要关闭300
家店,300
家店是什么概念呢?那让我们先来看看海底捞全国有多少家店吧!
目录:
1. 数据采集
2. 地图绘制
2.1. 坐标转换
2.2. 地图绘制
3. 店面分布
1. 数据采集
直接打开海底捞官网,拖到首页最下面我们可以看到全球各国家与地区门店选择,点击中国即可进入到中国门店列表,在开发者模式找到源数据地址。
![2d23dca6021d4c1fb0221f6d0909a681.png](https://i-blog.csdnimg.cn/blog_migrate/a3b80a0242621ab8963ac5fbcc286758.png)
可以看到请求到的数据格式很整洁,我们可以非常方便的处理,看代码:
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)
数据预览:
![74cbecf400db34b95273bde3f98ae9f6.png](https://i-blog.csdnimg.cn/blog_migrate/7b39170e129e577837173f92b392d798.png)
一共1404家门店
2. 地图绘制
在采集到的数据中我们可以看到有经纬度坐标(百度地图),这里我的目标是将店地址绘制到地图上,采用的是folium
绘图库。由于这个库没有百度地图,有高德地图,因此我需要先将经纬度坐标从百度转为高德,再进行地图绘制。
2.1. 坐标转换
在高迪开平找到坐标转换的接口,然后直接转换即可。
https://lbs.amap.com/api/webservice/guide/api/convert
![c89d12d592a550a2f7c34ef8d91b3967.png](https://i-blog.csdnimg.cn/blog_migrate/28990bddd4b0644a15d67d61bb8f6b9a.png)
# 用于存储转换后的坐标列表
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='')
输出结果:
![3e1584bc74d2e420059d76a26cb3c0ca.png](https://i-blog.csdnimg.cn/blog_migrate/5dd11f49eba06899adcbb49aa4e52601.png)
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形式保存到本地
输出结果对比:
左侧是绘制的,右侧是官网的
![6f25605d986b4956535bf4122cdcc8c5.png](https://i-blog.csdnimg.cn/blog_migrate/404ccff9d7778f204dce1d7f29a0dc74.png)
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()
![bdee71e332be8b2f8da3d277d2a19e7d.png](https://i-blog.csdnimg.cn/blog_migrate/2d25efb17288f676959e7f9ed1528c79.png)
省 | 数量 |
---|---|
广东 | 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
插件进行绘制,效果如下:
![8d8b0b2ce7e86b5fb34a4aa4364240de.png](https://i-blog.csdnimg.cn/blog_migrate/bf6cbdb8855eff2225ee6a89f8e14862.png)
咱们今天就简单介绍到这里吧!
-------- End --------
![54f733a056d87ee9c34e9c8a37bad252.png](https://i-blog.csdnimg.cn/blog_migrate/2c28f075e8b3b4c3653ac65e9fb5d102.png)
精选资料
回复关键词,获取对应的资料:
关键词 | 资料名称 |
---|---|
600 | 《Python知识手册》 |
md | 《Markdown速查表》 |
time | 《Python时间使用指南》 |
str | 《Python字符串速查表》 |
pip | 《Python:Pip速查表》 |
style | 《Pandas表格样式配置指南》 |
mat | 《Matplotlib入门100个案例》 |
px | 《Plotly Express可视化指南》 |
精选视频
可视化: Plotly Express
财经: Plotly在投资领域的应用 | 绘制K线图表
排序算法: 冒泡排序 | 选择排序 | 快速排序 | 归并排序 | 堆排序 | 插入排序 | 希尔排序 | 计数排序 | 桶排序
![b882169bcdd147ec016d329ffa37cfd8.png](https://i-blog.csdnimg.cn/blog_migrate/0213d13471cf059d563466bf13f7c694.png)