美文网首页数据分析专栏工作生活
数据分析之PageRank:希拉里邮件门事件,如何计算每个人物在

数据分析之PageRank:希拉里邮件门事件,如何计算每个人物在

作者: Viva_Stephen | 来源:发表于2019-07-03 18:11 被阅读53次

我们用pagerank来查看,各个点的影响力,以及用nexworkx中的graph来展示其关系。

如图ABCD代表着4个网页,其中箭头指向表示,从某网页跳转到另一个网页,那么我们来计算一下,这4个网页的影响力是多少吧!

图片解释

pagerank算法原理就是:一个网页的影响力 = 所有入链集合的页面的加权影响力之和。

如何计算,公式自己去网络上查找,我们用代码演示一遍。

import matplotlib.pyplot as plt
import networkx as nx
G = nx.DiGraph()
# 有向图之间边的关系
edges = [("A", "B"), ("A", "C"), ("A", "D"), ("B", "A"), ("B", "D"), ("C", "A"), ("D", "B"), ("D", "C")]
for edge in edges:
    G.add_edge(edge[0], edge[1])
pagerank_list = nx.pagerank(G, alpha=1)#alpha为阻尼因子,alpha=0.85表示跳转率为15%
print("pagerank 值是:", pagerank_list)
nx.set_node_attributes(G,values=pagerank_list,name='pagerank_list')

# 绘制圆环图像
positions=nx.circular_layout(G)
#绘制反射图像
# positions=nx.spring_layout(G)
# 绘制节点
nx.draw_networkx_nodes(G, positions,  alpha=0.4)
# 绘制边
nx.draw_networkx_edges(G, positions,  alpha=0.2)
# 绘制节点的 label
nx.draw_networkx_labels(G, positions, font_size=10)
plt.show()

得到的结果:


Figure_1.png

点越是大,影响力越大,当数据够大时会显现出来。

pagerank 值是: {'A': 0.33333396911621094, 'B': 0.22222201029459634, 'C': 0.22222201029459634, 'D': 0.22222201029459634}

接下来我们看下如何利用pagerank和graph来展示希拉里的邮件。
一张图显示步骤:

307055050e005ba5092028a074a5c142.png
1、提取收件名和发件名

首先我们需要将所有的文件提取出来,转化为字典模式,id对应姓名和真实身份,最后提取的emails.MetadataTo和emails.MetadataFrom要对应其真实身份。

import pandas as pd
import numpy as np
from collections import defaultdict
emails = pd.read_csv("E:/数据学习网站/PageRank-master/input/Emails.csv")
file = pd.read_csv("E:/数据学习网站/PageRank-master/input/Aliases.csv")
aliases={}
for index,row in file.iterrows():
    aliases[row['Alias']]=row['PersonId']
# print(aliases)

file = pd.read_csv("E:/数据学习网站/PageRank-master/input/Persons.csv")
persons={}
for index,row in file.iterrows():
    persons[row['Id']]=row['Name']

# 单词间的转换
def unify_name(name):
#大小写,删除标点和后缀
    name =str(name).lower()
    name=name.replace(",","").split("@")[0]
#通过key进行名字转化,提取aliases名字对应的唯一身份,中间通过相同keys连接。
#如果名字再aliases的keys中所对应的的name一样,那么返回persons中aliases,name的keys,所对应的name。返回name.
    if name in aliases.keys():
        return persons[aliases[name]]
    return name

#提取收件和发件名,apply()代表执行函数,用前面的文字代入参数
emails.MetadataTo=emails.MetadataTo.apply(unify_name)
emails.MetadataFrom=emails.MetadataFrom.apply(unify_name)

2、图像的准备函数

利用nexworkx画图:边,点和标签的大小,图像可是化

#spring_layout为放射性图像
#circular_layout为环形图像
def show_graph(graph,layout='spring_layout'):
    if layout=="circular_layout":
        position=nx.circular_layout(graph)
    else:
        position=nx.spring_layout(graph)
#node点,edge为边,lable为标签
#nodesize点大小设置,edgesize大小设置
    nodesize=[x['pagerank']*20000 for v,x in graph.node(data=True)]
    edgesize=[np.sqrt(e[2]['weight']) for e in graph.edges(data=True)]
#开始画边点和标签
    nx.draw_networkx_nodes(graph,position,node_size=nodesize,alpha=0.4)
    nx.draw_networkx_edges(graph,position,edge_size=edgesize,alpha=0.2)
    nx.draw_networkx_labels(graph,position,font_size=10)
    plt.show()
3、权重的设置与遍历

设置dges_weights
1、用for遍历emails.MetadataTo,emails.MetadataFrom,得到temp名字('a','b')
2、将用if not in条件句,将temp导入edges_weights_temp成为defaultdict(<class 'list'>, {('a', 'b'): 1,('c','d'),2……}将所有temp生存随机字典。
3、将字典的items,dict_items([(('Jake Sullivan', 'Hillary Clinton'), 815),……,利用[key[0],key[1],val转化为[('Jake Sullivan', 'Hillary Clinton', 815)……list模式

dges_weights_temp=defaultdict()
for row in zip(emails.MetadataTo,emails.MetadataFrom,emails.RawText):
    temp=(row[0],row[1])
    if temp not in edges_weights_temp:
        edges_weights_temp[temp]=1
    else:
        edges_weights_temp[temp]=edges_weights_temp[temp]+1

edges_weight=[(key[0],key[1],val) for key,val in edges_weights_temp.items()]

4、最后利用pagerank和graph设置

先用graph=nx.DiGraph(),再用add代入权重
接着代入nx.pagerank
用nx.set设置参数
运行画图函数

graph=nx.DiGraph()
graph.add_weighted_edges_from(edges_weight)
pagerank=nx.pagerank(graph)
nx.set_node_attributes(graph,name='pagerank',values=pagerank)
show_graph(graph)

数据资料:链接:https://pan.baidu.com/s/14edTkp4TH9EtkWt5KYhrrg
提取码:ui5t
复制这段内容后打开百度网盘手机App,操作更方便哦!

最后是完整代码:

import pandas as pd
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt
from collections import defaultdict

emails = pd.read_csv("E:/数据学习网站/PageRank-master/input/Emails.csv")
file = pd.read_csv("E:/数据学习网站/PageRank-master/input/Aliases.csv")
aliases={}
for index,row in file.iterrows():
    aliases[row['Alias']]=row['PersonId']
# print(aliases)

file = pd.read_csv("E:/数据学习网站/PageRank-master/input/Persons.csv")
persons={}
for index,row in file.iterrows():
    persons[row['Id']]=row['Name']

# 单词间的转换
def unify_name(name):
    name =str(name).lower()
    name=name.replace(",","").split("@")[0]
    if name in aliases.keys():
        return persons[aliases[name]]
    return name

def show_graph(graph,layout='spring_layout'):
    if layout=="circular_layout":
        position=nx.circular_layout(graph)
    else:
        position=nx.spring_layout(graph)
    nodesize=[x['pagerank']*20000 for v,x in graph.node(data=True)]
    edgesize=[np.sqrt(e[2]['weight']) for e in graph.edges(data=True)]
    nx.draw_networkx_nodes(graph,position,node_size=nodesize,alpha=0.4)
    nx.draw_networkx_edges(graph,position,edge_size=edgesize,alpha=0.2)
    nx.draw_networkx_labels(graph,position,font_size=10)
    plt.show()

emails.MetadataTo=emails.MetadataTo.apply(unify_name)
emails.MetadataFrom=emails.MetadataFrom.apply(unify_name)

edges_weights_temp=defaultdict()
for row in zip(emails.MetadataTo,emails.MetadataFrom,emails.RawText):
    temp=(row[0],row[1])
    if temp not in edges_weights_temp:
        edges_weights_temp[temp]=1
    else:
        edges_weights_temp[temp]=edges_weights_temp[temp]+1

edges_weight=[(key[0],key[1],val) for key,val in edges_weights_temp.items()]

graph=nx.DiGraph()
graph.add_weighted_edges_from(edges_weight)
pagerank=nx.pagerank(graph)
nx.set_node_attributes(graph,name='pagerank',values=pagerank)
show_graph(graph)

pagerank_threshold=0.005
small_graph=graph.copy()
for n,p_rank in graph.node(data=True):
    if p_rank["pagerank"]<pagerank_threshold:
        small_graph.remove_node(n)
show_graph(small_graph,"circular_layout")
结果: 看不懂?

美事我们设置阀值,节点PR值,将小于0.005的值全部删除,这样我们就得到了一张更加清晰的图。


邮件门关系图

这位叫nan的伙计,你是干什么的?为什么天天给美国大美女希拉里天天发邮件?

总结:
1、这里运用到了,nexworkx包,G=nx.DiGraph()来画图,用add_weighted_edges_from()添加信息为[('A', 'B', 1),('c','d',2)]格式的数据。
然后,nex.pagerank()添加权重信息,最后set进G里。

2、数据清洗,占据了整个代码中的一半时间。我们要知道如何利用字典的方式把名字统一在一起,x1=x2—{'a':x1}—{'b':x2},我们要做到输入A找到B。
最后,从字典中取出数据转化成[('A', 'B', 1),('c','d',2)]格式。

相关文章

网友评论

    本文标题:数据分析之PageRank:希拉里邮件门事件,如何计算每个人物在

    本文链接:https://www.haomeiwen.com/subject/bifqhctx.html