ITPub博客

首页 > 数据库 > 数据库开发技术 > 你知道海底捞在全国有多少家店吗?

你知道海底捞在全国有多少家店吗?

原创 数据库开发技术 作者:可以叫我才哥 时间:2021-11-16 09:29:48 0 删除 编辑

大家好,我是才哥。

前段时间小团建去吃了海底捞,最近又看新闻说海底捞要关闭300家店,300家店是什么概念呢?那让我们先来看看海底捞全国有多少家店吧!

目录:

  • 1. 数据采集

  • 2. 地图绘制

    • 2.1. 坐标转换

    • 2.2. 地图绘制

  • 3. 店面分布


1. 数据采集

直接打开海底捞官网,拖到首页最下面我们可以看到全球各国家与地区门店选择,点击中国即可进入到中国门店列表,在开发者模式找到源数据地址。

可以看到请求到的数据格式很整洁,我们可以非常方便的处理,看代码:

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插件进行绘制,效果如下:

咱们今天就简单介绍到这里吧!

如果你对此感兴趣,或者有自己的想法想和更多朋友一起交流,欢迎添加小编好友,回复 加群,我将拉你进咱们的技术交流群哈!

以上,感谢!


阅读更多


最近群里出现的3个数据处理需求,如何用Pandas简单实现一下

2021-11-14

粉丝破万,和你一起聊一聊学习与公众号写作的一些事儿~

2021-11-12

用Python读写Word文档入门

2021-11-05

原文作者:可以叫我才哥;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2020-03-18

  • 博文量
    161
  • 访问量
    69024