數據分析:互聯網、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,數據格式已經符合要求,選擇想要的圖類,然後就可以進行分析了
爲了保護隱私,具體的圖就不放了
應該容易做

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章