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