Python Network(一)基础入门(节点和边基本概念,网络统计量)
目录
- 1基础
- 2节点和边
- 3图创建
- test
- 4节点和边的内容
- 5向图,节点和边添加属性
- 5.1图属性
- 5.2节点属性
- 5.3边缘属性
- 6.简单实践
- 7.社会网络统计量
- 7.1 网络汇总信息
- 7.2 网络密度
- 7.3 网络直径
- 7.4 聚类系数与相邻节点
- 7.4.1 聚类系数
- 7.4.2 网络传递性
- 7.4.3 相邻接点
- 7.5 中心性
- 7.5.1 度中心性
- 7.5.2 接近中心性
- 7.5.3 中介中心性
- 7.6 最短路径计算
1基础
首先是包的导入
import networkx as nx
以下基本图形类型作为Python类提供:
图形:此类实现无向图。它忽略两个节点之间的多个边。它确实允许节点与其自身之间的自环边缘。
图:有向图,即有向边的图。有向图(图的子类)共有的操作。
多图:灵活的图类,允许在成对的节点之间存在多个无向边。附加的灵活性会导致性能降低,尽管通常并不明显。
多图:MultiGraph的有向版本。
G=nx.Graph() # 无向图
G=nx.DiGraph() # 有向图
G=nx.MultiGraph() # 多图
G=nx.MultiDiGraph()# 多图有向
所有图类均允许任何可哈希对象作为节点。可哈希对象包括字符串,元组,整数等。诸如权重和标签之类的任意边缘属性都可以与边缘相关联。
2节点和边
指定图形时,您必须做的下一个选择是使用哪种类型的节点和边。
如果您只关心网络的拓扑,则可以使用整数或字符串作为节点,并且您不必担心边缘数据。如果您已经有一个描述节点的数据结构,您可以简单地使用该结构作为节点,只要它是可哈希的即可。如果不可散列,则可以使用唯一标识符表示节点,并将数据分配为节点属性。
边缘通常具有与之关联的数据。任意数据可以与边关联作为边属性。如果数据是数字并且目的是表示加权图,则对属性使用“ weight”关键字。一些图算法,例如Dijkstra的最短路径算法,使用此属性名称来获取每个边的权重。
添加边时,可以使用关键字/值对将其他属性分配给边。您可以使用除’weight’以外的任何关键字来命名属性,然后可以通过该属性关键字轻松查询边缘数据。
一旦决定了如何对节点和边进行编码,以及是否具有带或不带多边的无向/有向图,就可以构建网络了。
3图创建
可以通过以下三种方式之一创建NetworkX图形对象:
图生成器–创建网络拓扑的标准算法。
- 从预先存在的(通常是文件)源中导入数据。
- 显式添加边缘和节点。
- 显式添加和删除节点/边缘最容易描述。每个图对象都提供了操作图的方法
import networkx as nx
G=nx.Graph()
G.add_edge(1,2) # 默认边缘数据为1
G.add_edge(2,3,weight=0.9) # 指定边缘数据
边缘属性可以是任何东西:
import math
G.add_edge('y','x',function=math.cos)
G.add_node(math.cos) # 任何可哈希可以是一个节点
您可以一次添加许多边:
elist=[('a','b',5.0),('b','c',3.0),('a','c',1.0),('c','d',7.3)]
G.add_weighted_edges_from(elist)
test
import networkx as nx
G=nx.Graph()
# 添加节点
G.add_node(1) # 添加节点可以添加一个节点,后来发现,无论数字填几,都是只出现一个点
G.add_nodes_from([4,2,3]) # 添加节点也可以添加列表
H=nx.path_graph(10) #添加任何nbunch节点,nbunch是节点的任何可迭代容器,它本身不是图中的节点。(如列表、集合、图表、文件等)
G.add_nodes_from(H) #G现在包含H的节点作为G的节点,相反,也可以将图H用作G中的节点。G.add_node(H)# 添加连线
G.add_edge(1,2) #通过一次添加一条边来生长G
e=(2,3)
G.add_edge(*e) # 打开边缘元组*
G.add_edges_from([(1,2),(1,3)]) #通过添加边列表来生长G
G.add_edges_from(H.edges()) #添加任何nbunch边# 移除边或点
G.remove_node(1)
G.remove_nodes_from(H)
G.remove_edge()
G.remove_edges_from()nx.draw(G) # 绘图
G.number_of_nodes() #查询节点数
G.number_of_edges() #查询边数
G.nodes() # 查询节点
G.edges() #查询边
G.neighbors(1) # 查询1的邻近
当然,你也可以通过G.clear()
来清理图中的内容
import networkx as nx
G=nx.Graph()
# 增加节点
G.add_node(1)
G.add_node("spam") # adds node "spam"
G.add_nodes_from("spam") # adds 4 nodes: 's', 'p', 'a', 'm'
#增加边
G.add_edge(1,2)
G.add_edges_from([(1,2),(1,3)])
#移除点或边
G.remove_nodes_from("spam")
G.remove_edge(1,3)# 通过实例化图类之一,可以指定几种格式的数据
H=nx.DiGraph(G) # 使用来自G的连接创建一个有向图
# H.edges() #查询边edgelist=[(0,1),(1,2),(2,3)]
H=nx.Graph(edgelist)nx.draw(H)
4节点和边的内容
最常见的选择是数字或字符串,但是节点可以是任何可散列的对象(无除外),并且可以使用G.add_edge(n1,n2,object = x)
将边与任何对象x关联。例如,n1和n2可以是RCSB蛋白质数据库中的蛋白质对象,x可以引用出版物的XML记录,详细记录了它们之间相互作用的实验观察结果。(有点不太懂什么意思,但是写上,该懂的时候就懂了)
5向图,节点和边添加属性
5.1图属性
#创建新图形时分配图形属性
G = nx.Graph(day="Friday")
G.graph#修改属性
G.graph['day']='Monday'
G.graph
5.2节点属性
使用add_node(),add_nodes_from()或G.node添加节点属性
G.add_node(1, time='5pm')
G.add_nodes_from([3], time='2pm')
G.node[1]
# 输出 {'time': '5pm'}
G.node[1]['room'] = 714
G.nodes(data=True)
# 输出 [(1, {'room': 714, 'time': '5pm'}), (3, {'time': '2pm'})]
# 注:将节点添加到G.node不会将其添加到图中,请使用G.add_node()添加新节点
5.3边缘属性
使用add_edge(),add_edges_from(),下标符号或G.edge添加边缘属性。
G.add_edge(1, 2, weight=4.7 )
G.add_edges_from([(3,4),(4,5)], color='red')
G.add_edges_from([(1,2,{'color':'blue'}), (2,3,{'weight':8})])
G[1][2]['weight'] = 4.7
G.edge[1][2]['weight'] = 4
# 最后一句提示AttributeError: 'Graph' object has no attribute 'edge',暂时无解
6.简单实践
实践一
import networkx as nx
# 创建空的网格
G=nx.Graph()
# 添加节点
G.add_node('JFK')
G.add_nodes_from(['SFO','LAX','ATL','FLO','DFW','HNL'])
# G.number_of_nodes() # 查看节点数,输出结果7# 添加连线
G.add_edges_from([('JFK','SFO'),('JFK','LAX'),('LAX','ATL'),('FLO','ATL'),('ATL','JFK'),('FLO','JFK'),('DFW','HNL')])
G.add_edges_from([('OKC','DFW'),('OGG','DFW'),('OGG','LAX')])
# G.number_of_edges() # 查看连线数,结果输出10# 返回节点和连线信息
# G.nodes() # 输出结果NodeView(('JFK', 'SFO', 'LAX', 'ATL', 'FLO', 'DFW', 'HNL', 'OKC', 'OGG'))
# G.edges() # 输出结果EdgeView([('JFK', 'SFO'), ('JFK', 'LAX'), ('JFK', 'ATL'), ('JFK', 'FLO'), ('LAX', 'ATL'), ('LAX', 'OGG'), ('ATL', 'FLO'), ('DFW', 'HNL'), ('DFW', 'OKC'), ('DFW', 'OGG')])# 绘制网络图
nx.draw(G,with_labels=True)
实践二
用矩阵形式构建网络图
引入Excel数据,示例如下
import pandas as pd
NXdata=pd.read_excel('file_name',index_col=0)
nf=nx.from_pandas_adjacency(NXdata) # 从外部引入数据,也可以是dataframe格式
nx.draw(nf,with_labels=True)
结果如下
实践三
数据来源于实践二,仅在绘图一行代码做更改,这里修改的是pos的参数,另网络布局相对美观一些
- circle
import pandas as pd
NXdata=pd.read_excel(r'C:\Users\qingfeng\Desktop\PyDm_data.xlsx','NXdata',index_col=0)
nf=nx.from_pandas_adjacency(NXdata) # 从外部引入数据,也可以是dataframe格式
nx.draw(nf,pos=nx.circular_layout(nf), with_labels=True)
- kamada
import pandas as pd
NXdata=pd.read_excel(r'C:\Users\qingfeng\Desktop\PyDm_data.xlsx','NXdata',index_col=0)
nf=nx.from_pandas_adjacency(NXdata) # 从外部引入数据,也可以是dataframe格式
nx.draw(nf,pos=nx.kamada_kawai_layout(nf), with_labels=True)
- random
import pandas as pd
NXdata=pd.read_excel(r'C:\Users\qingfeng\Desktop\PyDm_data.xlsx','NXdata',index_col=0)
nf=nx.from_pandas_adjacency(NXdata) # 从外部引入数据,也可以是dataframe格式
nx.draw(nf,pos=nx.random_layout(nf), with_labels=True)
- spectral
import pandas as pd
NXdata=pd.read_excel(r'C:\Users\qingfeng\Desktop\PyDm_data.xlsx','NXdata',index_col=0)
nf=nx.from_pandas_adjacency(NXdata) # 从外部引入数据,也可以是dataframe格式
nx.draw(nf,pos=nx.spectral_layout(nf), with_labels=True)
7.社会网络统计量
此处使用实践二中的数据
7.1 网络汇总信息
nx.info(nf)
# 输出 'Name: \nType: Graph\nNumber of nodes: 9\nNumber of edges: 10\nAverage degree: 2.2222'
7.2 网络密度
nx.density(nf)
# 输出 0.2777777777777778
7.3 网络直径
nx.diameter(nf)
# 输出 5
# 网络直径是指网络中任意两个节点间距离的最大值,一般用链路数来度量,人与人的六度理论同理
7.4 聚类系数与相邻节点
7.4.1 聚类系数
nx.clustering(nf)
'''输出 {'JFK': 0.3333333333333333,'SFO': 0,'LAX': 0.3333333333333333,'ATL': 0.6666666666666666,'FLO': 1.0,'DFW': 0,'HNL': 0,'OKC': 0,'OGG': 0}'''
7.4.2 网络传递性
网络传递性是表示一个图形中节点聚集程度的系数,一个网络有一个值,可以衡量网络的关联性,值越大,表示交互关系越大,网络越复杂。
nx.transitivity(nf)
#输出0.35294117647058826
7.4.3 相邻接点
list(nf.neighbors('OGG'))
# 输出 ['LAX', 'DFW']
7.5 中心性
7.5.1 度中心性
度中心性是刻画节点中心性最直接的度量指标。一个节点的度越大,意味着这个节点的度中心性越强,该节点在网络中越重要
nx.degree_centrality(nf)
'''
输出:
{'JFK': 0.5,'SFO': 0.125,'LAX': 0.375,'ATL': 0.375,'FLO': 0.25,'DFW': 0.375,'HNL': 0.125,'OKC': 0.125,'OGG': 0.25}
'''
7.5.2 接近中心性
接近中心性反映在网络中某一节点与其他节点之间的接近程度,将一个节点到其他所有节点的最短距离累加起来,其倒数表示接近中心性。。即对于一个节点,它的距离其他节点越近,那么它的接近中心性越强,接近中心性需要考量每个节点到其他节点的最短路径的平均长度,也就是说,对于一个节点而言,它距离其他节点越近,那么它的中心度越高。
nx.closeness_centrality(nf)
'''
# 输出
{'JFK': 0.47058823529411764,'SFO': 0.3333333333333333,'LAX': 0.5333333333333333,'ATL': 0.4444444444444444,'FLO': 0.34782608695652173,'DFW': 0.42105263157894735,'HNL': 0.3076923076923077,'OKC': 0.3076923076923077,'OGG': 0.5}
'''
7.5.3 中介中心性
中介中心性是以经过某个节点的最短路径数目来刻画节点重要性的指标,指一个节点充当其他两个节点之间最短路径的“桥梁”的次数,一个节点充当“中介”的次数越多,它的中介中心度就越大。
nx.betweenness_centrality(nf)
'''
# 输出
{'JFK': 0.33928571428571425,'SFO': 0.0,'LAX': 0.5714285714285714,'ATL': 0.08928571428571427,'FLO': 0.0,'DFW': 0.46428571428571425,'HNL': 0.0,'OKC': 0.0,'OGG': 0.5357142857142857}
'''
7.6 最短路径计算
选好起点与终点shortest_path
函数可以在网络中寻找并返回最短距离的路径,直接用len()函数可以得到路径的距离
nx.shortest_path(nf,"ATL","SFO") # 输出 ['ATL', 'JFK', 'SFO']
len(nx.shortest_path(nf,"ATL","SFO")) # 输出 3
部分内容参考《Python数据挖掘方法及应用》
Python Network(一)基础入门(节点和边基本概念,网络统计量)相关推荐
- python快乐编程—基础入门-从萌新到大神必读书籍 《Python快乐编程基础入门》...
2019年,全球信息化进程持续加快,IT行业繁荣发展.作为新时代IT人,不仅需要强大的理论知识,更需要过硬的技术.Python作为最受欢迎的编程语言之一,作为人工智能时代的首选语言,因其受众多.用途广 ...
- python就业方向有哪些-Python如何零基础入门?就业方向有哪些?
Python名列 IEEE2017 编程语言排行榜首位,语言环境轻松,入门体验极佳,堪称最适合初学者的编程语言; Python也是人工智能.大数据开发的基础语言,现已火爆全球,成为IT互联网就业风口, ...
- python中5种简单的数据类型,Python小白零基础入门 —— 变量及简单的数据类型
微信公众号:「Python读财」 若有问题或建议,请公众号留言 最近想着出一个Python小白零基础入门系列的文章,但愿能对入门的小伙伴有所帮助,内容会囊括简单的数据类型.列表.字典.循环以及函数的定 ...
- 跟着王进老师学开发Python篇:基础入门案例讲解-王进-专题视频课程
跟着王进老师学开发Python篇:基础入门案例讲解-166人已学习 课程介绍 共计45个项目案例+项目源码,跟着王进老师尽情玩转Python解释器! 本课程涉及Python的基础语法, ...
- 视频教程-跟着王进老师学开发Python篇:基础入门案例讲解-Python
跟着王进老师学开发Python篇:基础入门案例讲解 教学风格独特,以学员视角出发设计课程,难易适度,重点突出,架构清晰,将实战经验融合到教学中.讲授技术同时传递方法.得到广大学员的高度认可. 王进 ¥ ...
- 视频教程-Python开发零基础入门-计算机基础-Python
Python开发零基础入门-计算机基础 马哥教育Python金牌讲师,国内知名Python技术专家,在Python全栈.Python运维开发.Python数据挖掘.爬虫.人工智能等领域有深入研究,有1 ...
- Python学习1——python简介和基础入门
转载 原文Python学习之路[第一篇]-Python简介和基础入门:https://www.cnblogs.com/linupython/p/5713324.html 1.python3.7.2下 ...
- 新版思科CCNA认证1.0 零基础入门技术VTP协议解析-ielab网络实验室
新版思科CCNA认证1.0 零基础入门技术VTP协议解析-ielab网络实验室 VTP(VLAN Trunking Protocol):VLAN中继协议,是Cisco专用协议.也被称为虚拟局域网干道 ...
- 长短时记忆神经网络python代码_零基础入门深度学习(6) - 长短时记忆网络(LSTM)
无论即将到来的是大数据时代还是人工智能时代,亦或是传统行业使用人工智能在云上处理大数据的时代,作为一个有理想有追求的程序员,不懂深度学习(Deep Learning)这个超热的技术,会不会感觉马上就o ...
- Python学习-Python简介和基础入门
1.Python简介 1.1 Python是什么 相信混迹IT界的很多朋友都知道,Python是近年来最火的一个热点,没有之一.从性质上来讲它和我们熟知的C.java.php等没有什么本质的区别,也是 ...
最新文章
- 吉大c语言程序设计作业一,吉林大学历年C语言程序设计试题及答案.doc
- GridView添加自动编号列
- 关于Dapper - 能否不创建定义表对应类使用
- Sql Server之旅——终点站 nolock引发的三级事件的一些思考
- pytest测试框架(六)---使用skip和skipif跳过测试用例
- sphinx php 扩展安装
- 解决JSP文件乱码问题
- 《jdk8u源码分析》jvm.dll接口列表
- android 极光推送教程 视频教程,Android 极光推送教程
- oracle无效数字紧接着起line,shape数据类型【DOC精选】.doc
- 基于ERP的WMS系统解决方案
- 关于大数据统计大量股票开盘平均价和收盘价的简单程序程序
- java 表达式 日期加减_jdk8获取当前时间|时间加减|java8时间格式化|时间处理工具|时间比较|线程安全的时间处理方法...
- RK3399平台开发系列讲解(SPI子系统)4.36、SPI子系统驱动框架详解
- C# 简单的前方交会程序设计
- lucky-canvas轮盘抽奖demo
- 互联网时代,人类再无隐私
- 轩辕传奇服务器维护,轩辕传奇2月20日全服停服维护公告
- 机械臂运动空间的计算_机器人学导论---第八章 操作臂的机械设计(一)8.1-8.9...
- ld 和 ld.so命令
热门文章
- Linux安全原理简介
- 49. 把字符串转换成整数
- mappedBy和JoinColumn实质上指向的是同一个表即外键作为主键所在的表对应的实体
- MATLABSTM32CubeMX联合开发系列——不用手写一行代码就能实现CAN通讯
- 谷歌浏览器 无法翻译此网页问题(已解决,亲测有效
- 全网顶尖,毫不夸张的说这份斯坦福大学机器学习教程中文笔记,能让你机器学习从入门到精通
- 优秀开源项目(持续更新)
- 一个心理学教授关于“挣钱”的看法!
- python的下载安装以及两种打开方式
- 数据查询和业务流分开_基于大数据的舆情分析系统架构 - 架构篇