zoukankan      html  css  js  c++  java
  • 用Python和用户实际地理位置,做任意区域人员流量图

    前言

    本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。

    以下文章来源于python数据分析之禅 ,作者小dull鸟

    Python爬虫、数据分析、网站开发等案例教程视频免费在线观看

    https://space.bilibili.com/523606542

    最近偶然看到了腾讯的大数据星云图,非常漂亮,如下图:

     

    这些数据代表使用腾讯定位服务的用户实际地理位置,例如微信、QQ、腾讯地图等,所以使用量还是表达的,此图可以间接显示人流量情况

    该网站还可以查看区域热力图:

     

    但是只有个别区域

    于是我萌生一个想法,用python任意区域人员流量图

    经过不懈努力,没想到还真给实现了,下面带大家一起学习一下这一过程:

    一、首先是数据获取数据获取

    腾讯其实开放了数据接口,但是只能商用:

     

    但是不用怕,我们还有其他办法获取

    进入主页:https://xingyun.map.qq.com/

    在主页抓包,获得数据接口:

     

    经过分析发现,每次请求都会发送4个post请求,每次请求的参数如下:

     

     

     

     

    rank值从1变化到4,咱也不知道是啥意思,索性就都爬了,大不了再去重

    返回数据如下:

     

    主要是locs字段,以第一组数据为例,3295代表纬度信息,11590代表经度信息,分别除100既是经纬度原始值,6代表该位置人数。

    下面我们开始写写代码获取数据:

    import requests
    import json
    header={
        'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0'}
    url = 'https://xingyun.map.qq.com/api/getXingyunPoints'
    for i in range(1,5):
        payload = {'count': i, 'rank': 0}
        response = requests.post(url, data=json.dumps(payload))
        datas=json.loads(response.text)['locs']
        datas=datas.split(',')
        datas=[int(i) for i in datas[:-1]]
        all_data=[]
        a=[]
        for n,data in enumerate(datas):
            a.append(data)
            all_data.append(a)
            if (n+1)%3==0:
                a=[]
    all_data=[[i[0]/100,i[1]/100,i[2]] for i in all_data]

    将数据转换为DataFrame格式:

    import pandas as pd
    lat=[float(i[0]) for i in all_data]
    long=[i[1] for i in all_data]
    weight=[i[2] for i in all_data]
    dataframe=pd.DataFrame({'纬度':lat,'经度':long,'人数':weight})

    对数据进行去重:

    dataframe=dataframe.drop_duplicates(keep='first')

    有了这些坐标信息,我们可以估算一个区域的人流量

    pandas小知识:

    DataFrame.drop_duplicates(subset=None, keep='first', inplace=False)

    subset用来指定特定的列,默认所有列;
    keep="first"表示删除重复项并保留第一次出现的项,此外,keep值还可以为'last':表示保留最后一次出现的值;'false':表示所有相同的数据都删除

    选定区域:

    data1=dataframe[(dataframe.纬度.between(39.26,41.03)) & (dataframe.经度.between(115.25,117.30))]

    二、用folium画热力图:

    import folium
    from folium.plugins import HeatMap
    map_data = data1[['纬度', '经度', '人数']].values.tolist()
    hmap = folium.Map(
        location=[data1['纬度'].mean(), data1['经度'].mean()],  #地图中心坐标
        control_scale=True, 
        zoom_start=13    #地图显示级别
    )
    hmap.add_child(HeatMap(map_data, radius=5, gradient={.1: 'blue',.3: 'lime', .5: 'yellow',.7:'red'}))

     

    真方!

  • 相关阅读:
    Workbooks 对象的 Open 方法参数说明
    OLDB读取excel的数据类型不匹配的解决方案
    使用OLEDB读取Excel
    C#锁定EXCEL工作表
    smple
    C# 获取当前文件、文件夹的路径及操作环境变量
    与eval()相关的技巧
    不写var的全局变量声明方式的一个副作用(Side Effects When Forgetting var)
    关于国内浏览器的userAgent识别
    for循环的效率改进写法二则
  • 原文地址:https://www.cnblogs.com/hhh188764/p/14267468.html
Copyright © 2011-2022 走看看