"그들의 서재에 있는 컴퓨터에서 내보낸 데이터입니다. 먼저 단서를 찾을 수 있는지 확인한 다음 질문할 사람 몇 명을 찾아 질문하겠습니다."
왕 팀이 나에게 USB 플래시를 던졌습니다. 운전해서 집다 도시락에 음식 몇 개를 담은 뒤 모자를 들고 서둘러 사무실을 나섰다.
오늘 밤 첩보를 바탕으로 MLM 소굴에 가서 체포 작전을 수행하고 십여 명 이상을 데려왔습니다.
그러나 현장에서는 중요한 증거가 발견되지 않았고 체포된 소수의 사람들은 이제 다른 굴이 있는지, 온라인 요원이 누구인지 알 수 없으며 작전은 교착상태에 이르렀습니다. .
그리고 이때 내 손에 있는 문서가 상황을 타파하는 열쇠가 될 수도 있습니다.
저는 이 사람들의 목록을 관찰하기 시작했습니다. Invitation_id 필드는 반복되지 않고 그 사람의 이름과 일대일 관계를 가져야 하며, Invitation_id는 많이 반복되어야 하며, 이는 기본적으로 다음과 같은 데이터입니다. Invitation_id에 나타났습니다.
그래서 기본적으로 이는 MLM 조직의 업라인과 다운라인 관계를 기록하는 목록이라고 유추할 수 있습니다. 수백 개의 데이터가 있어 이것이 대규모 범죄 조직임을 보여줍니다.
한 시간도 안 되어 왕팀이 돌아왔습니다.
"소용없어요, 당신은 여전히 말을 잘해요." 왕 선장은 의자에 앉아 시간을 보니 거의 12시였다. "데이터는 어떻게 진행되고 있나요? 단서를 찾았나요?"
"이곳은 총 회원 수가 수백 명에 달하는 매우 큰 조직입니다. 이제 우리는 빙산의 일각에 불과했을 것입니다.
" 당신 말이 맞습니다. , 하지만 그렇기 때문에 지금은 서둘러야 합니다." 왕팀은 내 스테이션으로 걸어갔다. "지금 우리의 임무는 그들의 상위 라인을 먼저 찾고 도둑을 먼저 잡는 것이지만 우리는 왕을 먼저 잡을 것입니다. 도착한 사람은 아무것도 알 수 없었습니다. 신원은 확인했지만 여전히 관계를 확인할 수는 없습니다. "
" 무슨 소리야? "갑자기 예전에 본 게 생각났어요. 파이썬 라이브러리 네트워크x 이번에는 제가 만난 것이 도움이 될 것 같습니다. "나에게 맡기고 5분만 기다려 주세요."
먼저 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)
“빅 보스: [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))
이 조직은 생각하면 정말 땀이 흘렀습니다.
그런 다음 쉽게 관찰할 수 있도록 레벨에 따라 노드에 색상을 지정합니다.
# 添加颜色 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인 사람은 오프라인이 두 개뿐이고 이 두 오프라인이 각각 수십 개의 다른 오프라인을 개발했다는 것을 알 수 있습니다. 그것에 대해.
"발견!" 왕팀은 사무실 문을 열며 "사람이 발견됐다. 오늘 밤 검거된 일행 중에는 그의 부하 2명도 있었다. 모두 인정했고, 현재 검토 중이다"라고 말했다. 이 목록 덕분에 실제 상황은 내 추측과 완전히 일치합니다.
"오늘 밤 정말 수고하셨어요!" 왕 선장이 다가와 내 어깨를 두드려 주었습니다. "하지만 아직 끝나지 않았습니다. 그들의 자백에 따르면 그 파일에는 조직의 모든 인사 정보가 포함되어 있습니다. 이제 그들이 가장 많이 발전시킨 사람들을 저에게 알 수 있으며 그 정보를 바탕으로 즉시 표적 체포를 준비할 것입니다."
이전과 비슷하지만 이번에는 모든 노드의 외부 차수를 순회한 다음 역순으로 정렬하고 처음 몇 개만 가져와야 합니다.
# 给下线前十的目标添加颜色 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!