数据分析:互联网、APP中用户IP数据的地理可视化

数据简介

在当下互联网迅速发展的今天,每时每刻都会产生大量数据
在常见的应用场景中,最常见莫过于IP数据了
IP数据有利于我们统计用户的来源,使我们更好的进行业务,细分应用场景等
在互联网背景下这些用户数据有着重要的价值
那么我们怎么样来处理这些IP数据呢?

IP地址的解析

不多说了,笔者写了相关的文章,详见
数据挖掘:使用python+requests结合高德+百度+腾讯地图API处理IP数据,获得IP地理位置信息
基于IP的地理位置定位其实还是有不足的,有一些移动号码,他们的IP显示的是开户地的IP,但实际上他们早就不在开户地,也还有些运营商如联通,其网络链路令人难于琢磨
不过基本上,这还是有一定参考价值的

导入与观察数据

假设我们的学习数据是‘8.1.xls’
取第二行做表头,第一列做索引

data=pd.read_excel('8.1.xls',header=1,index_col=0)

我们可以看到数据的基本结构

data.head(10)

其中的第6行就是我们的IP地址

处理数据

其实在本文开头所引用的IP地址定位文章中就已经简单提到如何是用了,笔者以某APP用户数据为例,来解释具体怎么用
当然这些用户数据都是匿名的,我也不会在本文体现出数据
首先当然是我们的处理函数(详见文章)

def ipapi(ip):
    url1="https://restapi.amap.com/v4/ip?key=你的key"
    data={}
    back={}
    data["ip"]=ip
    api1=rq.get(url1,params=data)
    api1=json.loads(api1.text)
    if api1['errcode']==0:
        back['province']=api1['data']['pcd']['province']
        back['city']=api1['data']['pcd']['city']
        back['county']=api1['data']['pcd']['county']
        back['lng']=api1['data']['lng']
        back['lat']=api1['data']['lat']
        back['code']='Gaode'
        return back
    url2="http://api.map.baidu.com/location/ip?ak=你的key&coor=你的编码方式"
    data={}
    back={}
    data["ip"]=ip
    api2=rq.get(url2,params=data)
    api2=json.loads(api2.text)
    if api2['status']==0:
        back['province']=api2['content']['address_detail']['province']
        back['city']=api2['content']['address_detail']['city']
        back['county']='NULL'
        back['lng']=api2['content']['point']['x']
        back['lat']=api2['content']['point']['y']
        back['code']='Baidu'
        return back
    url3="https://apis.map.qq.com/ws/location/v1/ip?key=你的key"
    data={}
    back={}
    data["ip"]=ip
    api3=rq.get(url3,params=data)
    api3=json.loads(api3.text)
    if api3['status']==0:
        back['province']=api3['result']['ad_info']['province']
        back['city']=api3['result']['ad_info']['city']
        back['county']='NULL'
        back['lng']=api3['result']['location']['lng']
        back['lat']=api3['result']['location']['lat']
        back['code']='Tencent'
        return back
    qsz={'province': 'NULL',
    'city': 'NULL',
    'county': 'NULL',
    'lng': 'NULL',
    'lat': 'NULL',
    'code': 'NULL'}
    return qsz

这会返回一个字典,我们可以用他们做一个字典列表,并转换为DataFrame,与我们原来的数据连接
值得注意的是,有些IP强到3家服务api都分类不了,这时返回一个空字典,便于以后处理
为了观察的方便,我们每隔100输出一下ip转换进行到哪一步了
假设我们有cols行,IP数据大致在第6列

ips=[]
for i in range(cols):
    str=data.iloc[i,5]
    ips.append(ipapi(str))
    if i%100==0:
        print(str)
        print(i)

得到字典列表之后,我们将字典转换为DataFrame

data2=pd,DataFrame(ips)

处理完之后,你就得到了一份匿名的经纬度数据
你也可以将其与原数据连接,如

data3= pd.concat([data,data2],axis=1)

但为了保护隐私,我们主要是采用匿名化的数据
为了其能被高德所识别,我们需要将其转化为标准格式
用一个函数,将经纬度连接并用逗号分隔

def to_stdc(x):
    try:
        if len(x)!=6 or x['lng']=='NULL':
            return 'NUll'
        st=str(x['lng'])+','+str(x['lat'])
        return st
    except:
        return 'NULL'
  
mapt=data2.apply(to_stdc,axis=1)
mapp = pd.concat([data2,mapt],axis=1)

将数据保存,然后进入高德Map Lab将其可视化

mapp.to_excel('map8.1.xls')

数据分析

这个时候导入高德Map Lab,数据格式已经符合要求,选择想要的图类,然后就可以进行分析了
为了保护隐私,具体的图就不放了
应该容易做

你可能感兴趣的:(数据科学与人工智能笔记)