「這是從他們窩點電腦裡導出的一份數據,你先看看能不能找出什麼端倪,我再去找幾個人問問話。」
王隊丟給我一個u盤,拿起飯盒胡亂塞了幾口飯,便拎起帽子快步走出了辦公室。
今晚我們根據情報,前往一處傳銷窩點實施了抓捕行動,帶回來了十幾個人。
但現場沒有發現什麼重要證據,抓到的幾個人也都緘口不言,現在沒法知道他們是否還有其他的窩點,也不知道他們的上線是誰人在哪裡,行動一時陷入了僵局。
而此時我手中的這份文件,可能會成為破局的關鍵。
我開始觀察這份人員名單:invite_id欄位是不重複的,應該和人名是一對一的關係;而invited_id重複的很多,而且基本上都是在invite_id出現過的資料。
所以我們基本上可以推斷出,這是一份記錄傳銷組織上下線關係的名單。數據足有數百條之多,可見這是一個不小的犯罪組織。
不到一小時的功夫,王隊回來了。
「沒用,還是死鴨子嘴硬。」王隊一屁股坐在椅子上,看了一眼時間,已經快到十二點了。 「那份數據看的怎麼樣了,有沒有找到什麼線索?」
「這是一個很大的組織,總成員數有好幾百,我們現在可能只抓到了冰山一角啊。 」
「你說的沒錯,但正因如此,我們現在必須抓緊時間。」王隊走到我的工位前,「我們現在的任務是先找到他們的上線,擒賊先擒王。但今晚抓到的這群人都審不出東西來,雖然能確定他們的身份,暫時也還是確定不了他們之間的關係啊。」
「你說他們之間的關係?」我突然想起前段時間看到的networkx這個python函式庫,這次說不定能派上用場。 「交給我了,給我五分鐘時間。」
先用pandas導入文件中的數據,並篩選出我們需要的部分:
df = pd.read_excel('./doc/1_evidence.xls') df = df.loc[:, ['id','name','invite_id','invited_id']] df.columns = ['id','title','to', 'from']
然後調用networkx庫,生成層級關係圖並導出:
G = nx.from_pandas_edgelist(df, 'from', 'to', create_using=nx.DiGraph()) nt = net.Network('960px', '1280px', directed=True) nt.from_nx(G) nt.show('1_evidence.html')
這樣我就得到了這份文件對應的層級關係圖,上下線關係瞬間一目了然了:
一瞬間王隊面露喜色,但立刻又恢復了嚴肅:「你這個是不是有點華而不實啊,雖然看著挺直觀,但你能從裡面找到誰是這個組織的最上級嗎?」
#這當然難不倒我,最上級也就是圖中網路的根節點,必然是沒有其他的點指向它的,所以我們只要遍歷所有節點,找到入度為0的點就可以了。
# 找到根节点 top_node = [] for node, degrees in G.in_degree(): if degrees == 0: top_node.append(node) print('Big Boss:', top_node)
「Big Boss: [100000]」 螢幕上出現了這樣的輸出。 「100000這個編號在表中沒有對應的人,但100000下只有一個編號162385的下線,他應該就是這個組織的頭頭了。」
「不錯,要的就是這個!我去讓其他同事找這個人的信息,你繼續研究數據,把和這個人走的近的人全部找出來!」
這想必也不是難題,既然根節點已經找到了,我們便可以得到所有節點各自所在的層數。
# 设置所有节点级别 l = nx.shortest_path_length(G, 100000) nx.set_node_attributes(G, l, 'level') # 计算每级人员数目 data = {} for node, level in l.items(): if level in data.keys(): data[level].append(node) else: data[level] = [node] for level, nodes in data.items(): print(level, len(nodes))
這個組織竟然已經足足發展了36層,想想真是讓人直冒冷汗,還好我的同事及時發現了。
然後根據層級給節點標註顏色,方便觀察:
# 添加颜色 for node in G.nodes: G.nodes[node]['title'] = str(node) level = G.nodes[node]['level'] if level == 0: G.nodes[node]['color'] = 'red' elif level == 1: G.nodes[node]['color'] = 'orange' elif level == 2: G.nodes[node]['color'] = 'yellow'
可以看到這個編號162385的人,自己只有兩個下線,而這兩個下線每人各自另外發展了幾十個下線,想想還蠻有意思。
「找到了!」王隊撞開辦公室的門,「那個人找到了,就在今晚逮捕的這群人裡面,還有兩個他的下線也在裡面。他們也都承認了,現在正在重點審。」看來實際情況和我的推測完全相符,多虧了這份名單。
「你今晚立了件大功啊!」王隊走過來拍了拍我的肩膀。 「不過現在還沒完,根據他們的口供,文件裡的就是他們組織的全部人員資訊了。你現在把他們發展下線最多的幾個人給我找出來,我們根據訊息,立刻安排定點抓捕行動。 」
跟前面的差不多,不過這次我需要遍歷所有節點的出度數,然後按倒序排序,取前幾項就可以了。
# 给下线前十的目标添加颜色 degrees = G.out_degree() top_nodes = sorted(degrees, key=lambda x: x[1], reverse=True)[:10] print(top_nodes) for node in top_nodes: G.nodes[node[0]]['color'] = 'green'
然后给目标节点加上颜色,方便观察,最终得到了这样的关系图:
“干得不错,只要再把这几个人抓到,就相当于切断了这个组织的大动脉,后面的慢慢收尾就可以了。”王队把文件合上,笑着对我说。“没想到你还有这本事,真是后生可畏啊!”
“今天抓到的那三条大鱼,现在审出什么结果了?”相对于其他,我还是对案情本身更感兴趣。
“别提了,都快笑死我了。这仨人看见证据直接慌了神,开始互相推卸责任,老大说同伙全是另外两个人拉来的他都没参与,另外俩人说骗局全是老大策划的他们就是手下打工的,现在估计还吵着呢...”
以上是多虧學了這個Python庫,一晚就端掉了一個傳銷團夥...的詳細內容。更多資訊請關注PHP中文網其他相關文章!