數據簡介
在當下互聯網迅速發展的今天,每時每刻都會產生大量數據
在常見的應用場景中,最常見莫過於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,數據格式已經符合要求,選擇想要的圖類,然後就可以進行分析了
爲了保護隱私,具體的圖就不放了
應該容易做