Python程序员关键技能

在我们瞬息万变的时代,程序员需要与时俱进并不断学习新技能,才能保持需求的专家水平。

我从事Python编程已有大约两年的时间,现在是时候有意识地着手开发新技能了。为此,我决定分析职位空缺并以图表的形式介绍所需的技能。我希望看到技能将形成与不同专业相对应的集群:后端开发,数据科学等。但是现实如何呢?首先是第一件事。

数据采集


首先,您必须决定数据源。我考虑了几种选择:Habr CareerYandex WorkHeadHunter等。 HeadHunter似乎是最方便的,因为在职位空缺中列出了一些关键技能,并且有一个方便的开放API

研究了HeadHunter的API之后,我决定首先解析给定关键字的工作ID列表(在本例中为“ python”),然后解析每个工作的相应标签列表。

搜索职位空缺时,将逐页返回职位空缺,每页最多可容纳100个职位空缺。起初,我以页面答案列表的形式保存了全部结果。

为此,使用了请求模块。根据API,在“用户代理”字段中,输入了虚拟浏览器的名称,以便HH理解脚本正在访问它。他在两次请求之间稍作延迟,以免使服务器过载。

ses = requests.Session()
ses.headers = {'HH-User-Agent': "Mozilla/5.0 (X11; Linux x86_64; rv:10.0) Gecko/20100101 Firefox/10.0"}

phrase_to_search = 'python'
url = f'https://api.hh.ru/vacancies?text={phrase_to_search}&per_page=100'
res = ses.get(url)

# getting a list of all pesponses
res_all = []
for p in range(res.json()['pages']):
    print(f'scraping page {p}')
    url_p = url + f'&page={p}'
    res = ses.get(url_p)
    res_all.append(res.json())
    time.sleep(0.2)

结果,我得到了一个答案字典列表,其中每个字典对应于一页搜索结果。

事实证明,hh.ru API将最大空缺数限制为2000,即每页100个空缺,最大页面数可以为20。对于Python关键字,返回了20个空缺页面,这意味着Python中真正的空缺可能性更大所有更多。

为了获得标签列表,我做了以下工作:
  • 遍历搜索结果的每一页,
  • 遍历页面上的每个作业并获得作业ID,
  • 通过API要求提供空缺的详细信息,
  • 如果在空缺中指定了至少一个标签,则将标签列表添加到列表中。

# parcing vacancies ids, getting vacancy page and scraping tags from each vacancy
tags_list = []
for page_res_json in res_all:
    for item in page_res_json['items']:
        vac_id = item['id']
        vac_res = ses.get(f'https://api.hh.ru/vacancies/{vac_id}')
        if len(vac_res.json()["key_skills"]) > 0:  # at least one skill present
            print(vac_id)
            tags = [v for v_dict in vac_res.json()["key_skills"] for _, v in v_dict.items()]
            print(' '.join(tags))
            tags_list.append(tags)
            print()
        time.sleep(0.1)

标记列表另存为字典

res = {'phrase': phrase_to_search, 'items_number': len(tags_list), 'items': tags_list}
with open(f'./data/raw-tags_{phrase_to_search}.json', 'w') as fp:  # Serializing
    json.dump(res, fp)

有趣的是,在查看的2000个空缺中,只有1579个具有标记的空缺。

资料格式


现在,您需要处理标签并将其转换为便于显示为图形的格式,即:
  • 将所有标签都放在一个寄存器中,因此“机器学习”,“机器学习”和“机器学习”的含义相同
  • 计算节点的值作为每个标签的出现频率,
  • 将连接的值计算为标签相互联会的频率。

简化为单个寄存器,计算每个标签的出现频率,然后按节点大小进行过滤。

tags_list['items'] = [[i.lower() for i in line] for line in tags_list['items']]

# counting words occurrences
flattened_list = [i for line in tags_list for i in line]
nodes_dict_all = {i: flattened_list.count(i) for i in set(flattened_list)}
nodes_dict = {k:v for k, v in nodes_dict_all.items() if v > del_nodes_count}

成对出现的计算如下。首先我创建了一个字典,其中的键都是元组形式的所有可能的标记对,并且值均为零。然后,它遍历了标签列表,并为遇到的每对标签增加了计数器。然后我删除了所有值为零的元素。

# tags connection dict initialization
formatted_tags = {(tag1, tag2): 0 for tag1, tag2 in itertools.permutations(set(nodes_dict.keys()), 2)}

# count tags connection
for line in tags_list:
    for tag1, tag2 in itertools.permutations(line, 2):
        if (tag1, tag2) in formatted_tags.keys():
            formatted_tags[(tag1, tag2)] += 1

# filtering pairs with zero count
for k, v in formatted_tags.copy().items():
    if v == 0:
        del formatted_tags[k]

在输出中,我形成了以下形式的字典

{
'phrase': phrase searched,
'items_number': number of vacancies parced, 
'items': {
 	"nodes": [
			{
			"id": tag name, 
		 	"group": group id, 
		 	"popularity": tag count
			},
		] 
	"links": [
			{
			"source": pair[0], 
			"target": pair[1], 
			"value": pair count
			},
		]
	}
}

nodes = []
links = []
for pair, count in formatted_tags.items():
    links.append({"source": pair[0], "target": pair[1], "value": count})

max_count = max(list(nodes_dict.values()))
count_step = max_count // 7
for node, count in nodes_dict.items():
    nodes.append({"id": node, "group": count // count_step, "popularity": count})

data_to_dump = in_json.copy()
data_to_dump['items'] = {"nodes": nodes, "links": links}

Python可视化


为了使图形可视化,我使用了networkx模块。这是第一次发生而没有过滤节点的情况。



这种可视化更像是一团缠结的螺纹,而不是技能图。连接混乱并渗透到图形中,以至于无法确定节点。此外,图中的节点太多,有些节点太小以至于它们没有统计意义。

因此,我过滤掉了小于5个最小的节点,并进行了灰色链接。在这张照片中,当我尝试删除最大的Python节点以释放连接时,我还没有将这些单词带到单个寄存器中。



它变得更好了。现在,节点已分离,链接也不会阻塞可视化。可以看到基本技能,它们位于图中心的大球和小节点中。但是,该图仍有很多改进之处。

JavaScript可视化


如果那时我没有兄弟般的帮助,我可能会继续选择此代码。他积极参与了这项工作,并基于JavaScript 模块D3进行了漂亮的动态显示

原来是这样的。


动态可视化在这里可用。请注意,可以拉节点。

结果分析


如我们所见,该图证明是非常纠缠的,乍看之下无法检测到清晰定义的群集。您可以立即注意到最需要的几个大型节点:linux,sql,git,postgresql和django。也有中等受欢迎的技能,很少遇到的技能。

此外,您还应注意以下事实:技能仍然按职业形成集群,位于中心的相对两侧:

  • 左下-数据分析,
  • 底部是数据库
  • 右下-前端开发,
  • 在右边是测试
  • 右上方-网站开发,
  • 左上方-机器学习。

这些集群的描述是基于我的知识,可能包含错误,但是我希望这个想法本身很明确。

根据获得的结果,可以得出以下结论:
  • 您需要掌握与大型节点相对应的技能,它们将始终是有用的,
  • 您需要掌握适合自己兴趣的集群技能。

我希望您喜欢它,这项分析对您有用。

您可以使用以下链接查看代码或参与代码开发:GitHub项目带可视化功能的可观察笔记本电脑

掌握新视野的成功!

All Articles