微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决使用 networkx 库创建级别图的函数

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

如果一个人知道 Python 技能,那么他也知道 AWS 和 Hadoop [级别 1]

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

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

this is how pairs look

这是我为级别 1 创建的标准函数

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')

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

解决方法

networkx 库可能包含解决问题所需的一切

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

我们假设相关技能是定向的(知道 Python 可能 导致了解 AWS,但反之则不然)。为此,我们将使用 有向图模型。

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

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

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,rel_skill))

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

pairs = [('Python','AWS'),('Python','Machine Learning'),'Big Data'),('AWS','Hadoop'),('C','Embedded Systems'),('Prolog','Artificial Intelligence'),('Machine Learning','Deep 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',shells[2])

带有颜色级别的输出图:

Output graph with levels colored

输出:

# 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')

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。