数据简介
在当下互联网迅速发展的今天,每时每刻都会产生大量数据
在常见的应用场景中,最常见莫过于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,数据格式已经符合要求,选择想要的图类,然后就可以进行分析了
为了保护隐私,具体的图就不放了
应该容易做