你知道全国有多少家海底捞吗?Python让你一目了然

共 4546字,需浏览 10分钟

 ·

2021-11-27 10:01

大家好,欢迎来到 Crossin的编程教室 !

前段时间去公司楼下吃了顿海底捞,排队人不多。后来没多久看到新闻说海底捞要关闭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.904989116.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

也可以用ExcelEasyShu插件进行绘制,效果如下:

以上就是我们对海底捞门店分布进行的可视化处理。这种方法在地点相关的数据可视化分析中非常常用,比如停车场分布,房源分布等,感兴趣的小伙伴可以找一些类似的数据进行练习。

如果文章对你有帮助,欢迎转发/点赞/收藏~

作者:道才

来源:可以叫我才哥


_往期文章推荐_

爬取上海3601个停车场位置,并进行可视化展示




如需了解付费精品课程教学答疑服务
请在Crossin的编程教室内回复: 666

浏览 43
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报