使用 PageRank 对全球机场进行排序、
人工分类----文本分类----
6指的就是图中所有的节点
再说一个包
数据保存在./dataset/out.opsahl-openflights.csv
中
networkx
中的 read_edgelist
函数
作用:从边列表中读出一个图。
参数含义:create_using
为创建的图的类型(有向图,无向图等)
由于我们处理的是有向网络,所以需要将 create_using
参数设置为 nx.DiGraph()
。
使用 nx.draw
函数,将网络进行可视化。
# 导入数据
import pandas as pd
#分隔符sep设置为 空格
flights = pd.read_csv('./dataset/out.opsahl-openflights.csv',header=None,sep=' ')
# 读取数据
## 读取数据
import networkx as nx
flights_network = nx.read_edgelist("./dataset/out.opsahlopenflights.csv",create_using=nx.DiGraph())
## 观察样本类别分布
print("航班数:" + str(len(flights_network.nodes))) # 读取节点
print("航线数:" + str(len(flights_network.edges))) # 读取边
## len() 计算数量
## 网络可视化
## 网络绘制
import matplotlib.pyplot as plt
%matplotlib inline
fig, ax = plt.subplots(figsize=(24, 16))
pos_flights = nx.kamada_kawai_layout(flights_network) #网络布局
ax.axis('off') #不显示坐标轴
plt.box(False) #不显示四个边框
nx.draw(flights_network, node_size=30,node_color = "green", edge_color = "#D8D8D8",
width=.3, pos = pos_flights,ax=ax)
得出的图 发现不是连通图
从图中可以看出,这个网络不是一个连通图所以我们需要从航线网络中提取出最大连通子图进行下一步分析。 对于有向网络, nx.weakly_connected_component_subgraphs()
函数可以返回网络中的连通子图列表。我们只提取最大连通子图。
largest_component = max(nx.weakly_connected_component_subgraphs(flights_network),
key=len)#找出最大连通子图
## 输出最大连通子图的类别数
print("航班数:" + str(len(largest_component.nodes)))
print("航线数:" + str(len(largest_component.edges)))
# 得到航班数和航线数
再次进行网络可视化
fig, ax = plt.subplots(figsize=(24, 16))
pos_flights2 = nx.kamada_kawai_layout(largest_component) #设置网络布局
ax.axis("off") #不显示坐标轴
plt.box(False) #不显示四个边框
nx.draw(largest_component, node_size=30,node_color = "green", edge_color = "#D8D8D8",
width=.3,pos = pos_flights2, ax=ax)
## 调用PageRank算法计算值
pr_dict = nx.pagerank(largest_component) # 用字典存储
# 将计算出来的PageRank值列出来
import pandas as pd
pr_df = pd.DataFrame.from_dict(pr_dict,orient="index")
pr_df.columns = ["pr_value"]
pr_df.sort_values(by = "pr_value").head(20) # .head(20)表示查看前20行
设置一个函数 get_nodesize_pagerank
,将网络中节点的 PageRank 值,映射为网络中节点的大小。参数pagerank为pr_dict。
def get_nodesize_pagerank(pagerank, min_size, max_size): ## 定义一个函数
nodesize_list = [] ## 建一个节点大小的空列表
pr_max = max(pagerank.values())
for node, pr in pagerank.items():
nodesize = (max_size-min_size)*pr/pr_max + min_size ## 将映射出来的节点大小存储在列表中
nodesize_list.append(nodesize)
return nodesize_list
fig, ax = plt.subplots(figsize=(24, 16))
pos_flights2 = nx.kamada_kawai_layout(largest_component) #网络布局
ax.axis('off') #不显示坐标轴
plt.box(False) #不显示四个边框
nx.draw(largest_component, node_size = get_nodesize_pagerank(pr_dict,1,100),
node_color = "green", edge_color = "#D8D8D8",width=.3,pos = pos_flights2,
ax=ax)
总结:
首先先对数据集进行了简单介绍,其次介绍了利用networkx
中的read_edgelist
函数,加载网络的方法,然后学习了利用nx.draw()
将网络进行可视化,然后我们通过networkx
中的 weakly_connected_component_subgraphs
函数,提取最大连通子图。最后我们计算每个节点的PageRank 值,将节点大小与 PageRank 值关联并可视化。