我想创建一个函数,它将根据我提到的使用networkx库创建图形的级别循环两到三次。
如果一个人知道skill Python,那么他知道AWS和Hadoop的级别为1
然后我想搜索与AWS和Hadoop level 2相关的技能。
请帮助我创建一个具有异常处理的函数,其中相关技能可能在数据中没有相关技能。
这是我为level 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')其中pairs=list是技能和相关技能的列表压缩文件( zip (skill,related skill))
发布于 2021-08-01 16:17:44
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, 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])带颜色的级别输出图:

输出:
# 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')https://stackoverflow.com/questions/68605200
复制相似问题