首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用networkx库创建级别图的函数

使用networkx库创建级别图的函数
EN

Stack Overflow用户
提问于 2021-07-31 19:21:09
回答 1查看 102关注 0票数 2

我想创建一个函数,它将根据我提到的使用networkx库创建图形的级别循环两到三次。

如果一个人知道skill Python,那么他知道AWS和Hadoop的级别为1

然后我想搜索与AWS和Hadoop level 2相关的技能。

请帮助我创建一个具有异常处理的函数,其中相关技能可能在数据中没有相关技能。

this is how pairs look

这是我为level 1创建的标准函数。

代码语言:javascript
复制
def network(pair, skill):
  skil=[]
  related_skil=[]
  for line in pair[:306444]:
    s, r = line[0], line[1]
    #print(s)
    if (s == skill):
      skil.append(s)
      related_skil.append(r)
      
  skill=pd.DataFrame(columns=["skills"],data=skil)
  relat_skil=pd.DataFrame(columns=["related_skills"],data=related_skil)

  df=pd.concat([skill,relat_skil],axis=1)
  
  G=nx.Graph()
  G=nx.from_pandas_edgelist(df,'skills','related_skills')

  figure(figsize=(12,10))
  a = nx.draw(G,node_color='red',with_labels=True)

  return a

network(pair=pairs, skill='Python')

其中pairs=list是技能和相关技能的列表压缩文件( zip (skill,related skill))

EN

回答 1

Stack Overflow用户

发布于 2021-08-01 16:17:44

networkx库可能包含了解决该问题所需的全部内容

给定技能A,技能B是相关技能吗?

我们将假设相关技能是有方向性的(了解Python可能会导致了解AWS,但反之亦然)。为此,我们将使用有向图模型。

我们还可以使用最短路径长度来建模相关性级别,并使用它来对输出图形进行着色和分层。

在下面的程序中,删除了不相关的技能以简化图表: Prolog与Python无关(箭头方向错误),C和嵌入式系统没有连接到Python技能图表。

代码语言:javascript
复制
import itertools
import matplotlib.pyplot as plt
import networkx as nx

def skill_rel(skill, rel_skill):
    if skill not in G:
        print(f"{skill} skill no longer in graph")
        return
    if rel_skill not in G:
        print(f"{rel_skill} skill no longer in graph")
        return
    related = nx.has_path(G, skill, rel_skill)
    print(f"{skill} skill and relation to {rel_skill}",
          related, end=' ')
    if related:
        print('level',
              nx.shortest_path_length(G, skill, rel_skill))

def level_rel(skill, rel_skill):
    related = nx.has_path(G, skill, rel_skill)
    if related:
        return nx.shortest_path_length(G, skill, rel_skill)
    else:
        return 999

pairs = [('Python', 'AWS'),
         ('Python', 'Machine Learning'),
         ('Python', 'Big Data'),
         ('AWS', 'Hadoop'),
         ('C', 'Embedded Systems'),
         ('Prolog', 'Artificial Intelligence'),
         ('Machine Learning', 'Deep Learning'),
         ('Machine Learning', 'Artificial Intelligence')]
skill = 'Python'
G = nx.DiGraph()
G.add_edges_from(pairs)
# Remove unrelated skills (>= level 5)
unrelatedness = 5
unrelated = [node for node in G if level_rel(skill, node) >= unrelatedness]
G.remove_nodes_from(unrelated)
# Group/color nodes based on relatedness to use shell graph drawing
nlevel = [(node, level_rel(skill, node)) for node in G]
g1 = itertools.groupby(sorted(nlevel, key=lambda x: x[1]), key=lambda x: x[1])
shells = tuple(tuple(x[0] for x in g) for _,g in g1)
pos = nx.shell_layout(G, nlist=shells)
colors = [lvl[1] for lvl in nlevel]
nx.draw_networkx(G, pos, node_color=colors, with_labels=True)
plt.show()
skill_rel(skill, 'Hadoop')
skill_rel('Prolog', 'Hadoop')
print('Level 2 related skills from', skill, shells[2])

带颜色的级别输出图:

输出:

代码语言:javascript
复制
# Python skill and relation to Hadoop True level 2
# Prolog skill no longer in graph
# Level 2 related skills from Python
# ('Hadoop', 'Artificial Intelligence', 'Deep Learning')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68605200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档