十分感谢DataWhale的开源分享!!!!
项目GitHub地址:https://github.com/datawhalechina/team-learning-data-mining/tree/master/AcademicTrends
DataWhale数据分析|Task5
任务介绍:
任务要求:
作者关联(数据建模任务),对论文作者关系进行建模,统计最常出现的作者关系
任务流程:
- 下载kaggle数据集 【Task1已完成】
- 安装所需package:seaborn(数据可视化),BeautifulSoup4(爬虫相关,用于爬取数据),requests(网络通信),json(json格式数据读取),pandas(大数据分析),matploblib(绘图)【Task1已完成】 新增package: networkx
- 构建作者关系图
- 绘制最大联通子图
任务详解
1. 构建作者关系图
import networkx as nx
# 创建无向图
G = nx.Graph()
# 只用五篇论文进行构建
for row in data.iloc[:5].itertuples():
authors = row[2]
authors = [' '.join(x[:-1]) for x in authors]
# 第一个作者 与 其他作者链接
for author in authors[1:]:
G.add_edge(authors[0],author) # 添加节点2,3并链接23节点
# 将作者关系图进行绘制:
nx.draw(G, with_labels=True)
try:
print(nx.dijkstra_path(G, 'Balázs C.', 'Ziambaras Eleni'))
except:
print('No path')
通过networkx包构建无向图,利用文章的署名作者与第一作者建立关系。可以利用dijkstra_path
方法搜索两个作者之间的单源最短路。
dijkstra_path(G, source, target, weight='weight')#求最短路径
dijkstra_path_length(G, source, target, weight='weight')#求最短距离
参数表:
参数 | 含义 |
---|---|
G | 网络图 |
source(node) | 路径源点 |
target(node) | 路径终点 |
weight(string, optional(default=’weight’)) | 对应边的权重 |
实验结果
2. 绘制最大联通子图
degree_sequence = sorted([d for n, d in G.degree()], reverse=True)
dmax = max(degree_sequence)
plt.loglog(degree_sequence, "b-", marker="o")
plt.title("Degree rank plot")
plt.ylabel("degree")
plt.xlabel("rank")
# draw graph in inset
plt.axes([0.45, 0.45, 0.45, 0.45])
Gcc = G.subgraph(sorted(nx.connected_components(G), key=len, reverse=True)[0])
pos = nx.spring_layout(Gcc)
plt.axis("off")
nx.draw_networkx_nodes(Gcc, pos, node_size=20)
nx.draw_networkx_edges(Gcc, pos, alpha=0.4)
plt.show()
G.subgraph(sorted(nx.connected_components(G), key=len, reverse=True)[0])
通过connected_components
计算联通分量,对联通分量进行排序,选取最大的联通子图。
spring_layout:
用Fruchterman-Reingold算法排列节点
实验结果
参考文献:
[1]. python包NetworkX学习——最短路径dijkstra_path和dijkstra_path_length
[2]. Networkx使用指南