你用 Python 做過什麼有趣的數據挖掘/分析項目?
(註:本文部分回答來源於你是通過什麼渠道獲取一般人不知道的知識和信息的? - 何明科的回答 以及 能利用爬蟲技術做到哪些很酷很有趣很有用的事情? - 何明科的回答)從文中,大家也可以看到一個創業小團隊艱辛的摸索過程。從一開始的一個想法,希望通過技術和科學改變世界,到碰巧能賺錢,到因為賺錢快而迷失了方向,到最後回歸初心,做自己最喜歡的事情。
第零步:原點,大數據與價值
大概一年多以前,和幾個小夥伴均認同一個趨勢:覺得通過技術手段獲取網上越來越豐富的數據,並基於這些數據做分析及可視化,必能產生有價值的結果,幫助大家改善生活。(大數據被叫爛了,所以用低調的方式來解釋我們的初心)第一步:開工,為基金服務恰巧和幾個基金的朋友(包括對沖基金和VC/PE基金)聊到這個趨勢,他們非常認同這個觀點並願意付費,認為可以用這種實時且定量的方式來跟蹤一些上市公司或者私有公司旗下的產品,來確定誰是有價值的投資目標。於是立馬獲得訂單並促使我們開干,因為考慮到Python靈活及各類爬蟲庫的優勢,最終選用Python來做數據獲取的主體架構;也有新潮的小夥伴使用Go,同時用Go搭建了一個很酷的框架來製造分散式的智能爬蟲,應對各種反爬策略。抓取數據主要來自於如下網站:
- 各應用商店:獲取App的下載量及評論
- 大眾點評及美團網:餐飲及各類線下門店消費及評價情況
- 汽車之家及易車:汽車的相關數據
- 58及搜房;房屋租售數據
- 新浪微博:用戶的各種發言及輿論
- 財經數據:雪球及各類財經網站
- 宏觀數據網站:天氣、12306火車、機票網站
最初的產品純粹是為基金服務。下圖是在各個維度找出最有價值的App,各種量級範圍內在30天/7天增長最快及評價最好榜單。(順便吹一下牛,我們這個榜單很早就發現小紅書App的快速增長趨勢以及在年輕人中的極佳口碑)
下圖是對某個App的下載量跟蹤,幫著基金做盡職調查。下圖是某上市公司的門店變化情況,幫著基金跟蹤TA的增長情況。下圖是國內各個機場的實時流量,幫著基金跟蹤國內出行的實時情況,或許能從一個側面反映經濟是否正在走入下行通道。 第二步:擴展思路,開源和分享
為基金服務,雖然給錢爽快,但是也讓方向越走越窄。首先,基金希望信息是獨享的和封閉的,投資就是投資人之間的零和博弈,公開的信息就迅速會一錢不值,基金最在乎的就是信息的獨享及提前量,所以各個基金都希望我們呈現的數據及分析結果能夠獨家。這樣迅速讓我們的方向收窄以及工作的趣味性降低,其次,畢竟對於基金而言,能分析的投資對象及方向是非常有限的。而且現階段,大部分對沖基金裡面的分析員的數據分析能力其實很弱:這些分析員裡面能用VBA或者能在Excel裡面使用矩陣及向量乘法的人幾乎可以驚為天人;能寫offset函數的人,就應該直接提拔了;大部分人停留在一個個數網頁找數據的階段。所以和他們起來十分費勁,除了提供一些粗暴的數據,並不能產生太有價值的結果。在這段迷茫期,本來充滿激情的數據分析工作,讓大家味如爵蠟,感覺自己變成了一個外包公司。不過互聯網大法好,做技術做互聯網的核心思路是分享和開源,我們很快回歸到這一點。並且這一點最終讓我們做出了改變。有些分析雖然基金不買單,但是對一般的老百姓、對一般的媒體是有價值的,於是我們試著把這些數據分析及結果寫出來,發布到知乎上供大家參考。
知乎是個好平台,堅持創作好內容遲早就會被發掘出來。很快一篇用數據分析黃燜雞米飯為什麼火遍全國的回答(黃燜雞米飯是怎麼火起來的? - 何明科的回答)被知乎日報採用了。這次被「寵幸」讓團隊興奮不已,從而堅定了決心,徹底調整了整個思路,回到初心:不以解決基金關注的問題為核心,而以解決用戶最關注的生活問題為核心。堅持以數據說話的套路,創作了許多點贊很多的文章並多次被知乎日報採用(所答內容被「知乎日報」選用是什麼感覺? - 何明科的回答),並專註在如下的領域:
- 汽車。比如:一年當中買車的最佳時間為何時? - 何明科的回答,什麼樣的車可以被稱為神車? - 何明科的回答
- 餐飲。比如:為什麼麥當勞和肯德基都開始注重現磨咖啡的推廣,其優勢與星巴克等傳統咖啡行業相比在哪裡? - 何明科的回答
- 消費品。比如:口罩(http://zhuanlan.zhihu.com/hemingke/20391296),尿不濕(http://zhuanlan.zhihu.com/hemingke/20385894)
- 招聘。比如:互聯網人士年底怎麼找工作(http://zhuanlan.zhihu.com/hemingke/20450600)
- 房地產,這個虐心的行業。比如:深圳的房地產走勢(http://zhuanlan.zhihu.com/hemingke/20135185)
- 投融資。比如:用Python抓取投資條款的數據並做NLP以及數據分析:http://zhuanlan.zhihu.com/hemingke/20514731
還共享了一些和屌絲青年生活最相關的分析及數據。下圖是深圳市早晨高峰時段某類人群出行的熱點圖,通過熱點分析,試圖找出這類人群的居住和上班的聚集區。
下圖反映了在各時間段在深圳科技園附近下車的人群密度。 寫這些報告,團隊沒有掙到一分錢,但是整個成就感和滿意度大大上升。同時,在Python及各種技術上的積累也提高頗多,數據量級的積累也越發豐富,數據相關的各項技術也在不斷加強。同時,順勢擴大了數據源:京東、淘寶等數據也納入囊中。
第三步:擴展客戶
在知乎上寫這些報告,除了收穫知名度,還收穫意外之喜,一些知名品牌的消費品公司、汽車公司及互聯網公司,主動找我們做一些數據抓取及分析。整個團隊沒有一個BD,也從來不請客戶吃飯。於是我們順勢做了如下的網站以及一個成熟的Dashboard框架(開發數據監控的Dashboard超有效率),目前主要監控和分析母嬰、白酒、汽車及房地產四大行業,都是一些願意花錢進行深度了解用戶以及行業趨勢的公司。收入自動上門,很開心!
下圖是抓取汽車之家的數據,做出BBA(賓士寶馬奧迪)這三大豪華品牌的交叉關注度,幫助品牌及4A公司了解他們用戶的忠誠度以及品牌之間遷移的難度。下圖是抓取新浪微博的數據,分析廣東白酒的消費場所 下圖是抓取新浪微博的數據,分析廣東白酒和各類食品的相關度。除去為以上的品牌合作,我們數據風的文章也越來越受歡迎,曾經一周上了四次知乎日報(不知道 @周源@黃繼新 兩位大大是否考慮給我們頒發個知乎日報大獎)。另外也有越來越多的知名媒體及出版社找到我們,雖然告知他們我們不寫軟文而只堅持按照數據結果來發表文章,他們依然表示歡迎。原來非五毛獨立立場的數據風也能被媒體喜歡。自此,我們不斷成為易車首頁經常推薦的專欄。 第四步:嘗試功能化平台化產品
降低與高大上基金的合作強度,轉而與更接地氣的各類品牌合作,讓我們團隊更貼近客戶、更貼近真實需求。於是基於這些需求,我們開始嘗試將之前在數據方面的積累給產品化,特別是能做出一些平台級的產品,於是我們開發出兩款產品:第一款:選址應用
選址是現在許多公司頭疼的難題,以前完全是拍腦袋。因此我們開發出這樣一套工具,幫助公司能夠更理性更多維度得選址。
下圖,我們抓取多個數據源並完成拼接,根據用戶的快遞地址,勾畫出某時尚品牌用戶的住址,幫助其選址在北京開門店。
下圖,我們抓取多個數據源並完成拼接,根據大型超市及便利店與某類型餐館在廣州地區的重合情況,幫助某飲料品牌選定最應該進入的零售店面。第二款:數據可視化
我們在工作中也深刻覺得以前製作圖表和展示數據的方式太low、太繁瑣,我們希望去改變這個現狀,於是開發了一套基於Web來製作圖表的工具文圖。遠有Excel/Powerpoint對標,近有Tableau對標。下圖是文圖豐富的案例庫及模板庫。下圖是簡單的使用界面及豐富的圖表類型。下一步的工作:
- 與微信的整合,一鍵生成適合於微信傳播的截圖以及公眾號格式文章,便於在社交媒體的傳播
- 收集更多數據,目前已經覆蓋40多家網站,涵蓋衣食住行等多個方面
- 將數據SaaS化和開源,便於各類公司及用戶使用。(諮詢投行等Professional Service人士一定會懂的,你們每年不知道要重複多少遍更新各類宏觀微觀的經濟和行業數據,現在只需要調用KPI)
最後,希望有一天它能部分替代已經在江湖上混跡二三十年的PowerPoint及Excel。
第五步:……
不可知的未來才是最有趣的。借用並篡改我們投資人的一句話:technology is fun, data is cool and science is sexy。初心未變,希望用數據用技術幫助更多的人生活得更美好。—————————————————————————————————————更多文章及分享請關注我的專欄,數據冰山:http://zhuanlan.zhihu.com/hemingke對《還珠格格》進行詞頻統計
對《還珠格格》的詞頻統計生成詞雲標籤
將《2016年中國政府工作報告》變成詞雲是這樣的然後是《小時代》以小燕子照片為詞雲背景
對《射鵰英雄傳》進行詞頻統計並以郭靖劇照作為詞雲背景
有沒有滿滿的即視感?一個Web端的電影資料庫交互可以了解整個香港電影史,從早期合拍上海片,到胡金栓的武俠片,到李小龍時代,然後是成龍,接著周星馳對職責要求的詞頻分析,提煉出必需技能用爬蟲爬下上萬知乎女神照片
對於關注我的童鞋,謝謝你,代碼拿去詞頻統計和詞雲的代碼
from wordcloud import WordCloud
import jieba
import PIL
import matplotlib.pyplot as plt
import numpy as npdef wordcloudplot(txt):
path="d:/jieba/msyh.ttf"
path=unicode(path, "utf8").encode("gb18030")
alice_mask = np.array(PIL.Image.open("d:/jieba/she.jpg"))
wordcloud = WordCloud(font_path=path,
background_color="white",
margin=5, width=1800, height=800,mask=alice_mask,max_words=2000,max_font_size=60,random_state=42)
wordcloud = wordcloud.generate(txt)
wordcloud.to_file("d:/jieba/she2.jpg")
plt.imshow(wordcloud)
plt.axis("off")
plt.show()def main():
a=[]
f=open(r"d:jiebaookshe.txt","r").read()
words=list(jieba.cut(f))
for word in words:
if len(word)&>1:
a.append(word)
txt=r" ".join(a)
wordcloudplot(txt)if __name__=="__main__":
爬知乎女神的代碼
main()
import requests
import urllib
import re
import random
from time import sleepdef main():
url="xxx"
headers={xxx}
i=925
for x in xrange(1020,2000,20):
data={"start":"1000",
"offset":str(x),
"_xsrf":"a128464ef225a69348cef94c38f4e428"}
content=requests.post(url,headers=headers,data=data,timeout=10).text
imgs=re.findall("&巴西世界盃,為了找到一個高效的賭球方法,用python寫了蒙特卡洛方法的賭球模擬實驗,驗證各種策略下的賭球盈利水平。
最終結果是在沒有先驗知識的情況下,無論何種賭球策略,在賭球次數足夠多的情況下都不可能盈利。
不甘心,想通過各大博彩公司的博彩賠率差值來盈利,又用scrapy寫了爬蟲實時把各大博彩公司的即時賠率爬下來,一個簡單的貪心就能求出利潤的最大值,發現只要你能夠在這些博彩公司開戶,就完全有可能利用賠率的差值盈利!
項目地址:wzhe06/soccerbet · GitHub
關鍵是你沒法開戶啊。。國內參與博彩也是要被查水表的呀。
轉載請聯繫我微信!樓下答案里埋伏著各種大神!但是樓主既然是剛開始學習,我覺得還是接觸一些相對簡單的實踐案例最好,同樣是新手所以把最近寫的一篇發布在微信公號的文章貼出來,希望對你有幫助! 大神們一定輕拍:)#先預熱下#
許許多多的人都非常容易愛上Python這門語言。自從1991年誕生以來,Python現在已經成為最受歡迎的動態編程語言之一,尤其進入21世紀以來,Python在行業應用和學術研究中進行科學計算的勢頭也越來越迅猛。
——《Python for Data Analysis》(Wes Mckinney)
Python不僅在編程方面有強大的實力,而且由於不斷改進的第三方庫,Python在數據處理方面也越來越突出;近年來,非常火爆的機器學習(Machine
Learning)以及前沿的自然語言處理(Natural Language Processing)也選擇Python作為基礎工具。所以要想在數據科學領域有所進步的話,了解學習Python看來還是有所必要的。本文通過簡單案例,分享Python在數據處理方面的實際應用,屬於基礎學習範疇,希望剛剛接觸Python學習的新手們能通過應用去解決實際問題從而鞏固掌握Python操作,在這裡與大家相互學習,也希望大神們輕拍:)
Without further ado,lets get
started!#進入正題#
本文使用Python2.7版本,操作在集成開發壞境Spyder中進行;選擇的數據集,是大名鼎鼎的鳶尾花數據集iris.csv,數據集網上公開請自行下載!
1.
數據集截圖如下圖1:該數據集包含數據有150行*5列。前4列分別是:花萼的長度、寬度,花瓣的長度、寬度;最後一列是花的分類,總共分3類。
圖1.iris數據集截圖
2. 讀入數據,代碼如下:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import * #機器學習庫
np.random.seed(123) #設置隨機數種子iris=pd.read_csv("C:\Users\Administrator\Desktop\iris.csv",header=False)
#操作請注意:輸入文件實際路徑
print iris.shape #輸出數據維度
print iris.head() #查看前5行
輸出結果如下:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import * #機器學習庫
np.random.seed(123) #設置隨機數種子iris=pd.read_csv("C:\Users\Administrator\Desktop\iris.csv",header=False)
#操作請注意:輸入文件實際路徑
print iris.shape #輸出數據維度
print iris.head() #查看前5行
(150, 5)
SepalLength SepalWidth PetalLength PetalWidth Name
0 5.1 3.5 1.4 0.2 Iris-setosa
1 4.9 3.0 1.4 0.2 Iris-setosa
2 4.7 3.2 1.3 0.2 Iris-setosa
3 4.6 3.1 1.5 0.2 Iris-setosa
4 5.0 3.6 1.4 0.2 Iris-setosa
Python通過pandas庫,讀入數據,注意讀取時文件路徑的填寫,需用「\」或者「/」符號。同時,Python面向對象編程,shape及head函數建立在iris數據框對象之上,這與R語言不同,R語言更加「函數化」,dim及head等函數都是內置函數。
3. 描述性統計,代碼如下:
print iris.describe().T #描述性統計
輸出結果如下:
print iris.describe().T #描述性統計
count mean std min 25% 50% 75% max
SepalLength 150 5.843333 0.828066 4.3 5.1 5.80 6.4 7.9
SepalWidth 150 3.054000 0.433594 2.0 2.8 3.00 3.3 4.4
PetalLength 150 3.758667 1.764420 1.0 1.6 4.35 5.1 6.9
PetalWidth 150 1.198667 0.763161 0.1 0.3 1.30 1.8 2.5
從輸出結果中可以看到每列數據的平均值等統計數值,較簡單不多說。
4. 聚類分析,代碼如下:
irisK3=cluster.KMeans(n_clusters=3,random_state=1) #分為3類
irisFeatures=iris.ix[:,1:4] #去掉Name列
#print irisFeatures.head()
irisK3.fit(irisFeatures)
print irisK3.labels_ #輸出聚類結果
輸出結果如下:
irisK3=cluster.KMeans(n_clusters=3,random_state=1) #分為3類
irisFeatures=iris.ix[:,1:4] #去掉Name列
#print irisFeatures.head()
irisK3.fit(irisFeatures)
print irisK3.labels_ #輸出聚類結果
[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 0 2 2 2 2
2 2 2 2 2 2 2 2 0 2 2 2 0 2 2 0 2 2 2 2 2 2 2 2 2 2 2 0 2 2 2 2 2 2 2 2 2
2 2]
在Python中利用sklearn庫中的cluster.Kmeans對irisFeatures進行聚類分析,並輸出聚類結果。
5.決策樹模型,代碼如下:
target=iris["Name"] #目標變數
data=iris.ix[:,1:4] #自變數
train_data,test_data,train_target,test_target=cross_validation.train_test_split(data,
target,test_size=0.24,random_state=0) #分成訓練集、測試集(佔0.24)
clf=tree.DecisionTreeClassifier(criterion="gini", max_depth=6,
min_samples_split=5) #CART演算法
clf_fit=clf.fit(train_data, train_target) #開始fit
#print clf_fit
train_est=clf.predict(train_data) #預測訓練集
test_est=clf.predict(test_data) #預測測試集
sum=0
for i in range(36):
if test_est[i]==test_target[i]:
sum=sum+1
print "test_accuracy=","%.2f%%"%(sum*1.0/36*100) #測試集預測正確率sum=0
for i in range(114):
if train_est[i]==train_target[i]:
sum=sum+1
print "tarin_accuracy=","%.2f%%"%(sum*1.0/114*100) #訓練集預測正確率
輸出結果:
target=iris["Name"] #目標變數
data=iris.ix[:,1:4] #自變數
train_data,test_data,train_target,test_target=cross_validation.train_test_split(data,
target,test_size=0.24,random_state=0) #分成訓練集、測試集(佔0.24)
clf=tree.DecisionTreeClassifier(criterion="gini", max_depth=6,
min_samples_split=5) #CART演算法
clf_fit=clf.fit(train_data, train_target) #開始fit
#print clf_fit
train_est=clf.predict(train_data) #預測訓練集
test_est=clf.predict(test_data) #預測測試集
sum=0
for i in range(36):
if test_est[i]==test_target[i]:
sum=sum+1print "test_accuracy=","%.2f%%"%(sum*1.0/36*100) #測試集預測正確率
sum=0
for i in range(114):
if train_est[i]==train_target[i]:
sum=sum+1print "tarin_accuracy=","%.2f%%"%(sum*1.0/114*100) #訓練集預測正確率
test_accuracy= 97.22%
tarin_accuracy= 98.25%
利用CART演算法對iris數據集建立模型,並預測結果,同時輸出訓練集測試集的預測正確率。相關說明及代碼含義均在代碼中已注釋。
最後:以上僅為小例子,實際問題要比這個複雜的多:數據清洗、模型選擇、調參等等!因為網上教程給出完整數據、代碼及結果的資料不多,所以把自己的淺薄經驗分享給大家希望對你有幫助!
碼字也挺不容易的,求各位點個贊吧= ̄ω ̄=
END
有兩個建議吧。
- 完成《building machine learning systems with python》書上的所有projects,這本書除了封面其他裡面的內容還是挺實用的。中文書名為 《機器學習系統設計》
- 完成kaggle playground和 101上的所有比賽,具體tutorial可以戳
- Getting Started With Python For Data Science https://www.kaggle.com/wiki/GettingStartedWithPythonForDataScience
- Getting Started With Python II Getting Started with Pandas: Kaggle"s Titanic Competition https://www.kaggle.com/c/titanic-gettingStarted/details/getting-started-with-python-ii
- 另外補充一個用scikitlearn構建文本挖掘系統的教程,個人覺得寫的很好,基本上做一遍大概的流程就很清晰了:scikit-learn文本挖掘系統學習(已完成)
另外可以看這篇blog: 大數據競賽平台——Kaggle 入門
---------------------------------分割線補充:我做過的比較好玩的應該是下載了豆瓣某一個爆照組的所有照片,然後結合發布者ID在其主頁上找尋相關信息,然後按照地域進行統計算分布,然後在google map上畫了出來... 不過這個就沒什麼含金量了,現在在水推薦系統。ps:我也在入門中,歡迎一起探討^_^通過拉勾網的招聘數據,我得到了一些信息:
互聯網公司人數及比例:互聯網公司的融資情況:地域分布:互聯網公司的整體標籤云:前6位互聯網公司聚集地的互聯網公司發展水平:這六個城市的薪水分布:不同職位的需求比例:不同職位的工資整體分布:不同學歷的需求比例:不同學歷的工資整體分布:工作經驗與工資:公司發展階段與工資:原本大多數都不是以圖片而是svg形式呈現的,不過由於知乎專欄暫時只能插入圖片,所以不得已替換成了截圖。如果要看到完整的帶有交互效果的數據展現,可以跳轉到我的博客瀏覽,鏈接:從拉勾招聘看互聯網行業看到有廣泛報道都說有女性CEO在高管的公司一般比沒有的公司表現要好,而且中國女性高管領先亞洲:今年3月8日國際婦女節前夕,國際招聘專家瀚納仕在其《2015年瀚納仕亞洲薪酬指南》中指出,儘管情況有所改善,但性別多元性仍是企業面對的一個嚴峻問題。在職場性別多元性方面,中國仍領先亞洲。中國擔任高級管理職位的女性佔比要高於亞洲其他國家。縱觀整個亞洲,瀚納仕發現,在中國36%的管理職位由女性擔任。該數字與去年同期相比沒有變化,與29%的亞洲平均水平相比佔據明顯優勢。緊隨中國的分別是馬來西亞(34%,較去年的29%有所上升)、中國香港(31%,較去年的33%有所下降)以及新加坡(27%,與去年同期持平)。
一般這類問題都會引導人們去思考:如果我們去投資這些女性作為核心高管主導的公司,我們會獲得更高的收益嗎?
第一個挑戰是找到合適的數據源。最理想的是我可以找到一個時不時可以保持更新的數據源,最後我們找到了wind並且寫了一個爬蟲爬下來了所有公司的高管以及其性別。從中我們挑選出來了一部分有代表性的是以女性為一把手(具體職位是法定代表人+總經理/總裁)的公司的股票:
說明:0為上市公司上報自己職位的最高順位,也是篩選的依據之一。XSHG為滬市股票,XSHE為深市股票。很遺憾的是我們無法找到每一位女性總經理的入職時間,否則可以繼續分析女性CEO的每年增加情況。
下一步是什麼?不如我們開始分析一下單獨一家上述公司的情況,這樣子也可以更簡單的開始研究並且讓我們對數據有一個初步的了解。我選取了非常出名的董明珠女士的格力電器,以格力的股價為例,並且我們從網上爬取了關於董明珠女士的新聞加在一起,使用Ricequant的IPython Notebook研究平台,用幾行Python pandas代碼+matplotlib出來的結果:
說明:Ricequant的數據最早始於2005年,晚於董明珠最早上任業務一把手的時間。親們有空可以看看董女士的故事,挺勵志的。她帶領格力不斷走向新的高度,收穫無數讚譽和肯定。
之後我們將這個列表中的股票代碼整合成一個列表傳入最新上線的ricequant python SDK中,寫了一個簡單的python交易策略進行回測。
買入的具體邏輯:2010年基本全體同權重買入構建投資組合,還沒上市的股票,在IPO當天任性買入(如果不漲停的話),因為策略默認該21隻股票大名單(不是踢足球的國家隊那個)是值得考驗的股票。2010年這個年份是綜合考慮高管任期時長和一把手名單大部分上市公司的上市時間的結果。
在www.ricequant.com上在線策略回測截圖如下:
回測結果分析:回測的結果貌似一直壓著基準收益誒。。收益方面一直壓制基準策略,表明這比長期買入滬深300機智得多。當然,由於是買入長期持有,自然是會有一個很高的Beta,最大回撤(MaxDrawDown)也是挺大的。在整理的過程中,印象最深的是女性高管已經有1000+人,應該能佔到10%,而且從05年(米筐最早的回測年份)開始,女性進入高管的人數也有增長,可惜的是,由於暫時沒有整理完整的女性任職高管的數據(比如具體的任職日期),所以並不能完全清晰地展現這個趨勢。
也好奇到底這份投資組合的女性高管的公司都是哪些板塊的,以造成比較強悍的表現,依然使用pandas和matplotlib畫圖:
由圖可知,消費者(6+2)版塊表現搶眼,工業、原材料也表現不俗,都為5人。在目前這個系列的探討中,我們已經獲得了基本完整的A股上市公司高管名單數據,包括年齡、學歷、公司職位、性別,也歡迎對社會學及女性主義有興趣的童鞋私信一起來研究。我們只是做了一個最初步的研究,還是有很多地方可以更加改進和討論。
---- 硬廣時間開始 ----And Welcome to www.ricequant.com ,擁抱雲端的量化分析和交易。---- 硬廣時間結束 ----
還有什麼比寫個交易策略給自己賺錢更有意思呢?推薦入門可以看
- 量化分析師的Python日記【第1天:誰來給我講講Python?】
- 量化分析師的Python日記【第2天:再接著介紹一下Python唄】
- 量化分析師的Python日記【第3天:一大波金融Library來襲之numpy篇】
- 量化分析師的Python日記【第4天:一大波金融Library來襲之scipy篇】
- 量化分析師的Python日記【第5天:數據處理的瑞士軍刀pandas】
然後可以在社區克隆一個別人的策略研究一下,對照《building machine learning systems with python》做一個自己的股市情感分析模型
用python在知乎上爬了400萬答案,用numpy做數據分析,發現對高贊同答案貢獻最大的話題是 脂溢性皮炎 維持關係 和 寢室神器。所以我機智地提了個問題:想要和室友維持關係,有什麼寢室神器可以治療脂溢性皮炎? - 數據挖掘 三個話題都佔全一定超多人關注!!
然後問題立馬被關閉了。媽蛋。
=========嚴肅的分割線===========
好吧換了個靠譜的演算法,現在發現放在問題里最有利於吸引關注的知乎話題是:程序員,搞笑,平面設計,英語,和個人成長。而關注的人最多的話題是:電影,生活,音樂,互聯網和創業。感覺二者並不交叉有點意料之外情理之中。。大家聲稱對什麼感興趣並不代表他們真的感興趣。。阿里云云課堂邀請專家開設免費課程,如何用Python構建一個可視化大數據交互查詢平台做深入的實踐分享,讓您對大數據的分析平台和場景能馬上在工作中應用起來。
學習地址:雲棲Techday6 數據化運營 --搭建大數據平台以及在計算廣告的應用實踐
謝邀。
Document retrieval。我用Latent semantic indexing,現在在想怎樣用LDA(這方面知乎的高人很多,不獻醜了。)。——————答案更新,我把原先比賽做pre的視頻上傳了歡迎觀摩拍磚!————
b站視頻傳送門:自製機器學習系統-MMpython演示
————————————————以下是原答案———————————————
僅僅就題主的題目,說一說我自己的一個故事:話說大二下那年,懷著對ML和DM的神往開始學習機器學習和數據挖掘,我身為一個數學渣敏銳得覺察到吳恩達大牛的公開課對我是一個坑,還是個神坑, 轉而投入《機器學習實戰》這一類不太需要過硬數學基礎的機器學習和數據挖掘書籍中,於是開始學習Python+Matplotlib+Numpy了。
大三上適逢學校申報大學生創新項目,抱著當炮灰的心態交了一個關於強化學習演算法驗證的申報書,沒想到過了,開始做項目的時候,指導老師對我說「你這個,要用matlab啊,不然就用Octave呀,會用不??」然後我就老老實實回去查matlab和Octave的資料。。。。。。。不出所料,幾個通信的同學都說matlab是個神坑,迅速瀏覽了官網和文檔之後,我也覺得是神坑,遂棄而不學(其實是太懶了)。
然後又學長給我說可以用Weka來做這個項目的實驗,我接著去google weka是個神馬東西,一看尼瑪是用Java寫的,遂逃。。。。(我也是醉了)。
為什麼不用正在學的Matplotlib+Numpy呢?因為我當時覺得Matplotlib+Numpy沒有一個成熟的可用的現成系統給我用,每一次都要我自己寫腳本,尼瑪好麻煩。
於是我就坑了指導老師有半年時間,到了中期檢查的時候我覺得deadline快要到了,感覺慌得褲子都著火了,一氣之下就想,「既然matlab是個坑,老子就寫一個縮小版的matlab自己用就夠咯」
前期的懶惰直接給自己開了一個新坑,那一個月的目標就是用Python寫一個有圖形界面的數據挖掘工具出來。一個月之後,下圖這個什麼鬼就誕生了:
當然,最初版本的界面沒有這麼好看,這個界面完全是致(jie)敬(jian)weka做的,我沒有看過weka的源碼,也不知道它的實現邏輯。然後經過很多次的修改和重寫,這個工具可以分類,聚類,關聯,處理的數據類型主要是數值型,當然可以通過導入與處理函數把字元型化歸為數值型,這個工具可以導入演算法,比如我給你一個分類演算法統一遵循的」參數表範式「,只要你按照參數規則用Python寫你的分類演算法,這個工具就可以識別出來。忘了說,這個工具用Numpy實現數學運算(矩陣運算),用Matplotlib實現可視化,可視化就是下面這個樣子:沒錯,上面這個圖就是對UCI IRIS數據集的分類結果,演算法用的是樸素的KNN。然後到了今年,這個項目已經結題了,因為這個工具越寫越大越寫越豐富,到最後倒成了這個項目的主要成果。這個工具主要是用:
Numpy做矩陣運算輸出matplotlib做繪圖wxPython寫的界面今年六月份被學校徵用去參加挑戰杯省賽了,作為一個即將畢業成為校友的我明明就是一個去交流經驗的,沒想到還得了一等獎進入了國賽審查階段。本來無心插柳的一件事,沒想到後來還會得到一些不錯的發展。
總的說來,其實生活中處處都有ML和DM的用武之地,比如說我在挑戰杯評審的時候給評委演示的就是」通過近十年中國男足比賽情況看中國男足屬於世界幾流球隊?「這種激(mei)動(you)人(jie)心(cao)的問題。在學校里呢我沒事就幫生科的幾個孩紙錄錄數據。
學習scipy和numpy這些庫並不代表你以後只能用它寫腳本來做數據科學的任務了,C/Java/php這些坑裡面都有可以調用和接入Python的門,所以不僅只是局限於Python,其他的工具和技術也可以和Python結合使得ML和DM更加得心應手。
以上,如有紕漏請各位大牛指正,希望對題主有幫助。
占坑學習machine learning in action 與 programming collective intelligence 中, 這兩本都是用python寫的,有些有趣的小項目, 等我搞點什麼回來答~
本科的時候用python把全校學生的證件照爬了下來,加入自己的人臉資料庫。通過人工標定初始的幾個樣本,利用有監督的機器學習方法,開發了一套顏值評分系統,為全校所有人的顏值都打了分。有那麼一款叫做稀有圈的App,現在改名叫做Nico了。
它的用途嘛。。。咳咳。具體不說了。。。
它的一個很「有用」的功能是可以看到附近一定距離以內的「圈裡人」。由於提供的是一個精確位置,所以,它存在一個LBS應用廣泛存在的安全隱患——可以採樣幾個數據然後推斷出具體位置。
先用Fiddler抓包!發現這個數據介面連沒登錄的人都是可以使用的。。
然後可以這一個爬蟲,爬取固定地點的「附近的人」數據。
記錄下不同位置與某個用戶之間的距離。
最後就可以精確定位到這個用戶在哪兒了。
當然,用戶的位置可能本身就並不准。但是只要是nico上存儲的位置,我們都能這樣搞下來。
也就是說,你可以通過這個套路,知道周邊所有「圈裡人」的具體位置了~
——聯繫過官方,說過有這個bug,不過官方好像並沒有封堵它的意思 ——好吧其實這好像並不算什麼數據挖掘和數據分析的項目
先佔個樓,東西還沒有完成,半個月後更新, 20150327。-------2015-04-12更新更新的時間比預計的時間晚了兩天。(1)網頁抓取工作以來,我一直希望工作中可以有搞爬蟲的機會,奈何一直沒有等到。有一天突然在知乎上看到一個問題,說如何找到知乎中簡潔精闢的回復,感覺很有意思,於是就自己做了一下。通過scrapy抓取了一下知乎的精華問題的每一個答案,然後通過簡單的策略過濾出來了一些精簡的答案。網頁查看抓取結果:戳我查看抓取結果(2)app開發抓取了之後,發現android平台有人專門針對知乎的精短回復做了一個app。由於我剛好最近在自學iOS開發,所以就順便做了一個app,還沒有放到AppStore,先放張圖上來。題主所提出的問題,可以理解為「已具備基礎技能知識,需要項目實踐,構建學習閉環」
即回答「如何完成項目實踐」「如何構建學習閉環」(後者暫時不在此展開)
關於「如何完成項目實踐」
1.數據集
首先,可以搜尋一些自己感興趣領域內公開的數據資源,選取數據資源時應對數據集的「數據結構」進行判斷,盡量找到有數據說明、結構完整、缺失值少的數據集。
數據集資源Tips:
科賽網上有非常多我們挑選整理的開源數據集,包含了各個領域,並且每一份都有詳細的數據說明,都能直接下載或在線使用,非常方便。
當然您也可以參考數據分析和挖掘有哪些公開的數據來源?知友們的回復。
2.數據分析工具
工欲善其事,必先利其器。大家可以選擇在本地用anaconda搭建Python的數據科學環境,然後每次啟動jupyter notebook做項目。然而,Python一些有關數據分析挖掘的庫對Python2和Python3的兼容性問題屬實讓人頭疼,並且在Windows系統上面設置環境遠不及MacOS方便。
有什麼好的解決辦法呢?
可以來科賽網使用我們的在線數據分析協作工具K-Lab。它涵蓋了Python、R等主流語言,完成了90%以上數據分析挖掘相關庫的部署(如題主所提到的pandas, numpy, matplotlib),免去了本地搭建環境的煩惱,實現了即刻線上動手做分析項目。
如果在社區里看到感興趣的項目,也可以Fork過來直接在K-Lab上運行、借鑒學習。
3.難度適宜趣味性強的項目
前段時間我們在官網發布了超全的NBA數據集(所有球員球隊的常規賽、季後賽,教練執教、球員各賽季薪金的數據),N位網友在線根據自己的興趣,發布了數據分析項目,切入點很多樣,也很有意思。如,NBA史上最強奪冠陣容[增加梅西評分模型]、喬科詹庫之全方位分析……
這裡PO其中一份原創作品@大野人007 ,也可戳 原帖鏈接 查看。
4.具體項目分享:倫納德和詹姆斯兩人的差距體現在哪?
1)數據維度
- 球員基本信息(姓名/所屬球隊/球員年齡)
- 比賽信息(參賽球隊/場地/比賽分差)
- 球員表現(比賽時間/得分效率/得分類型)
2)數據處理
!ls ../input/NBAdata
導入必要的包.
# 導入必要的包.
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
import numpy as np
import pylab%matplotlib inline
warnings.filterwarnings("ignore")
讀取球員場均數據
player_avg = pd.read_csv("avg.csv") player_avg.head()
展示要分析的數據
pd.set_option("display.max_columns",30)
player_avg[(player_avg["姓名"] == "Kawhi Leonard") (player_avg["賽季"] == "16--17")]
pd.set_option("display.max_columns",50)
L_1617_avg = player_avg[(player_avg["姓名"] == "LeBron James") (player_avg["賽季"] == "16--17")]
L_1617_avg
對比分析及數據可視化
class Radar(object):
n = 1
angles =None
def __init__(self, fig, titles, labels, rect=None):
if rect is None:
rect = [0.05, 0.05, 0.95, 0.95]self.n = len(titles)
self.angles = np.arange(90, 90+360, 360.0/self.n)
self.axes = [fig.add_axes(rect, projection="polar", label="axes%d" % i)
for i in range(self.n)]self.ax = self.axes[0]
self.ax.set_thetagrids(self.angles, labels=titles, fontsize=14)for ax in self.axes[1:]:
ax.patch.set_visible(False)
ax.grid("off")
ax.xaxis.set_visible(False)for ax, angle, label in zip(self.axes, self.angles, labels):
ax.set_rgrids(range(1, 6), angle=angle, labels=label)
ax.spines["polar"].set_visible(False)
ax.set_ylim(0, 5)def angle(self, values, *args, **kw):
return np.deg2rad(np.r_[self.angles]),np.r_[values],valuesdef plot(self, values, *args, **kw):
angle = np.deg2rad(np.r_[self.angles, self.angles[0]])
values = np.r_[values, values[0]]
self.ax.plot(angle, values, *args, **kw)
titles_ = ["score","shoot","rebound","assist","three","penalty","steal","block"]
titles = ["得分","投籃","籃板","助攻","三分","罰球","搶斷","蓋帽"]
# titles = list("ABCDE")
我們發現:
贏
- 詹姆斯突破得分能力更強。兩人出手次數差不多,詹命中率高了5個百分點左右
- 詹姆斯的組織能力更強。詹助攻數場均多5.2個
- 詹姆斯的籃板能力稍勝一籌。相同出場次數,詹均多2.8個籃板球
輸
- 倫納德的投籃能力更好。罰球能力一樣,但詹命中率差了20個百分點
- 倫納德搶斷能力更加出色。倫的場均搶斷數要高0.5個
以上分析較宏觀,不能反映事物的本質。下面從微觀角度(每場比賽的數據)進行分析。
角度1:基於籃板球
# data_statistics函數主要是方便categoricl型的數據的統計顯示,方便後續繪圖使用
def data_statistics(Kawhi_season1617, Lebron_season1617, name):
Kawhi_season1617_ = pd.DataFrame(Kawhi_season1617.groupby(name)["球員"].count())
Kawhi_season1617_.columns = ["K_次數"]
Kawhi_season1617_.reset_index(inplace=True)Lebron_season1617_ = pd.DataFrame(Lebron_season1617.groupby(name)["球員"].count())
Lebron_season1617_.columns = ["L_次數"]
Lebron_season1617_.reset_index(inplace=True)data = pd.merge(Lebron_season1617_,Kawhi_season1617_,on = name , how ="outer")
data = data.fillna(0)
data = data.sort_values(name)
return data
用seaborn做柱狀圖可視化
rebounds["K_次數"] = rebounds["K_次數"] * -1
plt.figure(figsize=[16,6])
sns.barplot(x = "籃板", y = "L_次數", data = rebounds, color="red")
sns.barplot(x = "籃板",y = "K_次數", data = rebounds, color ="blue")
紅色:詹姆斯,藍色:倫納德
橫軸:籃板數,縱軸:發生次數可以看出:
- 詹姆斯的籃板球能力遠超倫納德。
- 詹姆斯在數據層面比倫納德高個檔次。
角度2:基於得分
score["K_次數"] = score["K_次數"] * -1
plt.figure(figsize=[16,6])
sns.barplot(x = "得分", y = "L_次數", data = score, color="red")
sns.barplot(x = "得分",y = "K_次數", data = score, color ="blue")
紅色:詹姆斯,藍色:倫納德
橫軸:得分數,縱軸:發生次數用seaborn做violin圖可視化
plt.figure(figsize= [12,5])
total = pd.concat([Kawhi_season1617,Lebron_season1617])
total["Is_Kawhi"] = 0
total.loc[total["球員"] == "Kawhi Leonard","Is_Kawhi"] = 1
total["A"] = 0
sns.violinplot(x= "A" , y = "得分", hue = "Is_Kawhi", data = total, split=True)
綠色:倫納德,藍色:詹姆斯
可以看出:
- 詹姆斯的得分較穩,倫納德的得分分布更廣,但總體兩人差異不大。因此將分數劃為幾檔,再來看:
0 - 15分 定為檔1
15 - 19 定為檔2 20 - 24 定為檔3 25 - 29 定為檔4 30 - 定為檔5紅色:詹姆斯,藍色:倫納德
橫軸:得分層次,縱軸:發生次數可以看出:
- 詹姆斯的得分更穩定,基本在25分附近。
- 倫納德的得分分布範圍更廣,得分的爆發力更好。從檔5來看,倫納德更佔優勢,不過這也從側面反映了一點外線投籃好的職業選手的優勢。手感來了分分鐘爆表,而手感差的話也會出現很多檔1檔2的情況。
角度3:基於投籃命中率
shoot = data_statistics(Kawhi_season1617, Lebron_season1617, "投籃")
shoot
# sns.distplot(Kawhi_season1617.groupby("得分")["球員"].count(),color="b")
# sns.distplot(Lebron_season1617.groupby("得分")["球員"].count(),color="r")Kawhi_season1617.groupby("得分")["球員"].count().plot(figsize=(12,6),color="b",marker="*")
Lebron_season1617.groupby("得分")["球員"].count().plot(figsize=(12,6),color = "r", marker="o")
紅色:詹姆斯,藍色:倫納德
橫軸:分數,縱軸:發生次數用柱狀圖進行對比分析
可以看出:
- 詹姆斯果然是老司機,穩!其高命中率的場次遠高於倫納德。
角度4:基於搶斷和蓋帽的分析
steal = data_statistics(Kawhi_season1617, Lebron_season1617, "搶斷")
steal
steal["K_次數"] = steal["K_次數"] * -1
plt.figure(figsize=[16,6])
sns.barplot(x = "搶斷", y = "L_次數", data = steal, color="red")
sns.barplot(x = "搶斷",y = "K_次數", data = steal, color ="blue")
紅色是詹姆斯,藍色表示倫納德
橫軸表示搶斷,縱軸表示發生次數
block = data_statistics(Kawhi_season1617, Lebron_season1617, "蓋帽")
blockblock["K_次數"] = block["K_次數"] * -1
plt.figure(figsize=[16,6])
sns.barplot(x = "蓋帽", y = "L_次數", data = block, color="red")
sns.barplot(x = "蓋帽",y = "K_次數", data = block, color ="blue")
紅色是詹姆斯,藍色表示倫納德.
橫軸表示蓋帽次數,縱軸表示發生次數可以得到:
- 倫納德幾乎完爆了詹姆斯。
- 蓋帽上,兩人在常規賽平方秋色。
角度5:基於失誤次數的分析
fault_num = data_statistics(Kawhi_season1617, Lebron_season1617, "失誤")
fault_num
fault_num["K_次數"] = fault_num["K_次數"] * -1
plt.figure(figsize=[16,6])
sns.barplot(x = "失誤", y = "L_次數", data = fault_num, color="red")
sns.barplot(x = "失誤",y = "K_次數", data = fault_num, color ="blue")
紅色是詹姆斯,藍色表示倫納德。
橫軸表示失誤次數,縱軸表示發生次數。可以得到:
- 詹姆斯的失誤偏高,這也不難理解,倫納德在波波老爺子手下,失誤兩個就被換下,詹姆斯沒有波波這種教練的限制,另外詹姆斯常常打控衛角色,所以從這一角度來看的話,詹姆斯失誤率高也可以理解,不過僅從數據角度來看,不管是自己還是教練的幫忙,倫納德勝出.
3)最終結論
詹姆斯贏倫納德:突破能力、組織能力、功能性的差距、穩定性的差距。
詹姆斯輸倫納德:遠投能力的差距。
對於這個問題,安安我有話說。豈安科技的程序員GG用Python工具對風險數據作簡單分析,主要是分析蜜罐日誌數據,來看看一般大家都使用代理ip幹了一些啥事(提前劇透,趕集網躺槍)。
以下,GO~
啥是蜜罐?網上一些黑客或技術人員經常做一些"事情"的時候,需要隱藏自己身份,這樣他們會使用代理IP來辦事。而蜜罐(Honeypot)是一種新型的主動防禦的安全技術,它是一個專門為了被攻擊或入侵而設置的欺騙系統——既可以用於保護產品系統,又可用於搜集黑客信息,是一種配置靈活、形式多樣的網路安全技術。
說得通俗一點就是:提供大量代理IP,引誘一些不法分子來使用代理這些代理ip,從而搜集他們的信息。
數據分析工具介紹
工欲善其事,必先利其器,我介紹兩個Python數據分析的「神兵利器「。
- Python中著名的數據分析庫Panda
Pandas庫是基於NumPy 的一種工具,該工具是為了解決數據分析任務而創建,也是圍繞著 Series 和 DataFrame 兩個核心數據結構展開的,其中Series 和 DataFrame 分別對應於一維的序列和二維的表結構。
Pandas提供了大量能使我們快速便捷地處理數據的函數和方法。這個庫優點很多,簡單易用,介面抽象得非常好,而且文檔支持實在感人。你很快就會發現,它是使Python成為強大而高效的數據分析環境的重要因素之一。
- 數據可視化採用Python上最常用的Matplotlib庫
Matplotlib是一個Python的圖形框架,也是Python最著名的繪圖庫,它提供了一整套和Matlab相似的命令API,十分適合互動式地進行製圖。
有了這些「神兵利器「在手,再用Python這些工具對蜜罐代理數據作一個走馬觀花式的分析介紹。
1.引入工具–載入數據分析包
啟動IPython notebook,載入運行環境:
%matplotlib inline
import pandas as pd
from datetime import timedelta, datetime
import matplotlib.pyplot as plt
import numpy as np
2.數據準備
俗話說: 巧婦難為無米之炊。我分析的數據主要是用戶使用代理IP訪問日誌記錄信息,要分析的原始數據以CSV的形式存儲。這裡首先要介紹到pandas.read_csv這個常用的方法,它將數據讀入DataFrame。
analysis_data = pd.read_csv("./honeypot_data.csv")
對的, 一行代碼就可以將全部數據讀到一個二維的表結構DataFrame變數,感覺很簡單有木有啊!!!當然了用Pandas提供的IO工具你也可以將大文件分塊讀取,再此我測試了一下性能,完整載入約21530000萬條數據也大概只需要90秒左右,性能還是相當不錯。
3.數據管窺
一般來講,分析數據之前我們首先要對數據有一個大體上的了解,比如數據總量有多少,數據有哪些變數,數據變數的分布情況,數據重複情況,數據缺失情況,數據中異常值初步觀測等等。下面小安帶小夥伴們一起來管窺管窺這些數據。
使用shape方法查看數據行數及列數
analysis_data.shape
Out: (21524530, 22) #這是有22個維度,共計21524530條數據記的DataFrame
使用head()方法默認查看前5行數據,另外還有tail()方法是默認查看後5行,當然可以輸入參數來查看自定義行數
analysis_data.head(10)
這裡可以了解到我們數據記錄有用戶使用代理IP日期,代理header信息,代理訪問域名,代理方法,源ip以及蜜罐節點信息等等。在此小安一定一定要告訴你,小安每次做數據分析時必定使用的方法–describe方法。pandas的describe()函數能對數據進行快速統計匯總:
對於數值類型數據,它會計算出每個變數:
總個數,平均值,最大值,最小值,標準差,50%分位數等等;
非數值類型數據,該方法會給出變數的:
非空值數量、unique數量(等同於資料庫中distinct方法)、最大頻數變數和最大頻數。
由head()方法我們可以發現數據中包含了數值變數、非數值變數,我們首先可以利用dtypes方法查看DataFrame中各列的數據類型,用select_dtypes方法將數據按數據類型進行分類。然後,利用describe方法返回的統計值對數據有個初步的了解:
df.select_dtypes(include=["O"]).describe()
df.select_dtypes(include=["float64"]).describe()
簡單的觀察上面變數每一維度統計結果,我們可以了解到大家獲取代理數據的長度平均1670個位元組左右。同時,也能發現欄位scan_os_sub_fp,scan_scan_mode等存在空值等等信息。這樣我們能對數據整體上有了一個大概了解。
4.數據清洗
由於源數據通常包含一些空值甚至空列,會影響數據分析的時間和效率,在預覽了數據摘要後,需要對這些無效數據進行處理。
一般來說,移除一些空值數據可以使用dropna方法, 當你使用該方法後,檢查時發現 dropna() 之後幾乎移除了所有行的數據,一查Pandas用戶手冊,原來不加參數的情況下, dropna() 會移除所有包含空值的行。
如果你只想移除全部為空值的列,需要加上 axis 和 how 兩個參數:
analysis_data.dropna(axis=1, how="all")
另外,也可以通過dropna的參數subset移除指定列為空的數據,和設置thresh值取移除每非None數據個數小於thresh的行。
analysis_data.dropna(subset=["proxy_host", "srcip"])
#移除proxy_host欄位或srcip欄位沒有值的行
analysis_data.dropna(thresh=10)
#移除所有行欄位中有值屬性小於10的行
5.統計分析
再對數據中的一些信息有了初步了解過後,原始數據有22個變數。從分析目的出發,我將從原始數據中挑選出局部變數進行分析。這裡就要給大家介紹pandas的數據切片方法loc。
loc([start_row_index:end_row_index,[『timestampe』, 『proxy_host』, 『srcip』]])是pandas重要的切片方法,逗號前面是對行進行切片;逗號後的為列切片,也就是挑選要分析的變數。
如下,我這裡選出日期,host和源IP欄位——
analysis_data = analysis_data.loc([:, [『timestampe』, "proxy_host", "srcip"]])
首先讓我們來看看蜜罐代理每日使用數據量,我們將數據按日統計,了解每日數據量PV,並將結果畫出趨勢圖。
daily_proxy_data = analysis_data[analysis_data.module=="proxy"]
daily_proxy_visited_count = daily_proxy_data.timestamp.value_counts().sort_index()
daily_proxy_visited_count.plot()
對數據列的丟棄,除無效值和需求規定之外,一些表自身的冗餘列也需要在這個環節清理,比如說DataFrame中的index號、類型描述等,通過對這些數據的丟棄,從而生成新的數據,能使數據容量得到有效的縮減,進而提高計算效率。
由上圖分析可知蜜罐代理使用量在6月5號,19-22號和25號這幾天呈爆炸式增長。那麼這幾天數據有情況,不正常,具體是神馬情況,不急,後面小安帶大家一起來慢慢揪出來到底是那些人(源ip) 幹了什麼「壞事」。
進一步分析, 數據有異常後,再讓我們來看看每天去重IP數據後量及其增長量。可以按天groupby後通過nunique()方法直接算出來每日去重IP數據量。
daily_proxy_data = analysis_data[analysis_data.module=="proxy"]
daily_proxy_visited_count = daily_proxy_data.groupby(["proxy_host"]).srcip.nunique()
daily_proxy_visited_count.plot()
究竟大部分人(源ip)在干神馬?干神馬?干神馬?讓我們來看看被訪問次數最多host的哪些,即同一個host關聯的IP個數,為了方便我們只查看前10名熱門host。
先選出host和ip欄位,能過groupby方法來group 每個域名(host),再對每個域名的ip訪問里unique統計。
host_associate_ip = proxy_data.loc[:, ["proxy_host", "srcip"]]
grouped_host_ip = host_associate_ip.groupby(["proxy_host"]).srcip.nunique()
print(grouped_host_ip.sort_values(ascending=False).head(10))
由上表可知, 趕集網躺槍啊,有那麼多人使用代理來收集趕集網信息。再細細去看大家到底做了啥——查看日誌數據發現原來在收集像二手車價格,工人招聘等等信息。從熱門host來看,總體來說:
大家使用代理主要還是獲取百度,qq,Google,Bing這類婦孺皆知網站的信息。
下面再讓我們來看看是誰用代理IP「幹事」最多,也就是看看誰的IP訪問不同host的個數最多。
host_associate_ip = proxy_data.loc[:, ["proxy_host", "srcip"]]
grouped_host_ip = host_associate_ip.groupby(["srcip"_host"]).proxy_host.nunique()
print(grouped_host_ip.sort_values(ascending=False).head(10))
哦,發現目標IP為123.**.***.155的小夥子有大量訪問記錄, 進而查看日誌,原來他在大量收集酒店信息。 好了,這樣我們就大概能知道誰在幹什麼了,再讓我們來看看他們使用proxy持續時長,誰在長時間裡使用proxy。
代碼如下——
這裡不給大家細說代碼了,只給出如下偽代碼。
date_ip = analysis_data.loc[:,["timestamp","srcip"]]
grouped_date_ip = date_ip.groupby(["timestamp", "srcip"])
#計算每個源ip(srcip)的訪問日期
all_srcip_duration_times = ...
#算出最長連續日期天數
duration_date_cnt = count_date(all_srcip_duration_times)
好了,到此我也就初略的知道那些人做什麼,誰用代理時長最長等等問題額。取出ip = 80.82.78.38的用戶使用代理ip訪問數據日誌,發現原來這個小夥子在長時間獲取搜狐images。
蜜罐在全國各地部署多個節點,再讓我們來看看每個源ip掃描蜜罐節點總個數,了解IP掃描節點覆蓋率。結果見如下:
# 每個IP掃描的IP掃描節點總個數
node = df[df.module=="scan"]
node = node.loc[:,["srcip","origin_details"]]
grouped_node_count = node.groupby(["srcip"]).count()
print grouped_node_count.sort_values(["origin_details"], ascending=False).head(10)
由上述兩表初步可知,一些結論:如源ip為182.**.**.205的用戶長時間對蜜罐節點進行掃描,mark危險用戶等等。
在自學練習《building machine learning systems with python》裡面的項目時,妹子說我認真的樣子好帥,然後接下來的事情都很有趣。
不含個人觀點,純粹數據解讀
一、Scrapy爬取新浪微博 20萬+ 評論中
二、爬取結果
三、評論內容詞頻分析
- 詞語出現次數排名(取前25)
- 繪製詞語出現次數前300的文字雲
除去【出軌】【喜歡】【白百合】之外可以看到最多的幾項是【女人】【孩子】【明星】【離婚】等
四、評論者所在地區分布
人數排名和地區的發展程度以及人口總集數有很大關係,總過除以地區總人口,可以得出那個地區八卦程度色彩比較濃烈
五、評論者性別分布
評論者的性別女性較多一些,大概女:男(1.2:1)
此處應該加上各個地區的男女性別分布,時間有限,周一要工作,時間有限,有空更新
六、評論者年齡分布
年齡除去2010年以後不正確的,基本上的年齡段是1985——2003年,其中1995年佔比最多,由於時間原因,未計算比例
如果有時間會更新相同地區年齡、性別分布;相同年齡地區、性別分布等。
七、代碼
Python那些事 - 知乎專欄
推薦閱讀:
※python程序員路線圖?
※用 Python 可以建網站嗎?
※為什麼在python3里b=a=1是合理表達式,而print(a=1)卻不是。a=1為什麼沒有返回值?
※新手該學SQL還是Python?
※tornado cgi wsgi uwsgi之間的關係?