Uso de Python para analizar habilidades demandadas relacionadas entre desarrolladores


Hoy en la Web puede encontrar una gran cantidad de información heterogénea sobre los lenguajes de programación, bibliotecas, marcos, sistemas operativos y otras entidades más populares, llamémosles tecnologías. El número de estas tecnologías crece constantemente y queda claro que todos los que quieran seguir el camino de un desarrollador deben centrarse en estudiar algunas de las pilas más populares asociadas con cualquier tecnología clave.


Esto plantea la primera pregunta: ¿cómo se puede determinar la demanda de una tecnología en particular? Esta pregunta se puede responder, por ejemplo, de la siguiente manera: existe una demanda de tecnología cuando los empleadores la mencionan como un requisito para un solicitante de empleo al describir un trabajo. En otras palabras, si al ver 100 vacantes, la tecnología A fue mencionada 60 veces, y la tecnología B - 20 veces, podemos considerar que la tecnología A tiene más demanda que B.


La segunda pregunta es ¿qué se consideran tecnologías clave?


Basado en el gran interés en los artículos sobre el análisis de la popularidad de los lenguajes de programación, consideraremos el lenguaje de programación como la tecnología clave.


Por lo tanto, el problema puede formularse de la siguiente manera: en una variedad de vacantes, es necesario seleccionar un subconjunto asociado con la tecnología clave y, en este subconjunto, calcular la frecuencia de mención de otras tecnologías.


Como una base de datos de vacantes, utilizaremos el portal hh.ru , debido a su gran popularidad y la disponibilidad de la API HeadHunter . El lenguaje de programación es Python 3.4.


Para reducir el volumen del artículo, el aspecto técnico de la cuestión de obtener y procesar datos no se considerará en detalle, pero vale la pena detenerse en algunos puntos clave. El código fuente del proyecto está abierto y disponible en GitHub .



Obtener una lista de trabajo


Para obtener una lista de vacantes relacionadas con los programadores de Python, realice la siguiente solicitud de obtención utilizando la biblioteca de solicitudes :


import requests import json l = "Python" params = {"text": " " + l, "search_field": "name", "area": 2, "period": 30, "page": 0} r = requests.get("https://api.hh.ru/vacancies", params=params) jr = json.loads(r.text) 

Como resultado, obtenemos un diccionario con los siguientes elementos:


  • página: clase 'int'
  • clusters: clase 'NoneType'
  • per_page: clase 'int'
  • alternate_url: clase 'str'
  • encontrado: clase 'int'
  • argumentos: clase 'NoneType'
  • elementos: clase 'lista'
  • páginas: clase 'int'

Estamos interesados ​​en:


  • páginas clave, cuyo valor contiene el número de páginas con vacantes,
  • la clave de elementos, que apunta a la lista de vacantes en la página.

De cada elemento en la lista de elementos , que es un diccionario, necesitamos la clave de URL . El valor de esta clave es un enlace a una descripción detallada de la vacante. Al cambiar secuencialmente el parámetro de página , puede iterar sobre todas las vacantes a pedido y crear una lista necesaria para un análisis de enlace adicional. Para acelerar el proceso de carga de información del trabajo, se utilizan varios subprocesos paralelos de la biblioteca de subprocesos:


 from math import ceil import requests from threading import Thread import json class DownloadThread(Thread): def __init__(self, urls, number, res): Thread.__init__(self) self.number = number self.urls = urls self.res = res def run(self): for url in self.urls: resp = requests.get(url) if resp.status_code == requests.codes.ok: self.res.append(json.loads(requests.get(url).text)) else: print("Status code: " + str(resp.status_code)) print(url) def start_dl_threads(urls, th_num, res): threads = [] n = ceil(len(urls) / th_num) for i in range(th_num): t = DownloadThread(urls[i * n: (i + 1) * n], i, res) threads.append(t) t.start() for t in threads: t.join() 

Después de construir la dependencia de la velocidad de descarga del conjunto de pruebas de 274 vacantes en el número de subprocesos de descarga, se decidió usar 10 subprocesos, porque, en este caso, un número mayor de ellos prácticamente no reduce el tiempo de ejecución del script.



Creación de un vocabulario de habilidades y búsqueda de habilidades en la descripción del puesto.


Inicialmente, se suponía que debía crear un diccionario de habilidades clave manualmente. Sin embargo, después de analizar la estructura de la descripción del trabajo, quedó claro que el proceso puede automatizarse de muchas maneras. Para hacer esto, necesitamos una lista accesible con key_skills que contenga las habilidades clave de esta vacante. Desafortunadamente, pocas vacantes contienen información sobre habilidades clave. Además, esta información puede diferir de la descripción principal. Por lo tanto, procesar solo estos datos no daría una imagen completa.


Todas las habilidades clave únicas para vacantes con los nombres "Programador" + ("Java", "JavaScript", "1C", "Python", "C", "C ++", "C #", "Objective-C", "Perl", "Ruby", "PHP"), y usado - los primeros 150 más comunes.


 os.makedirs("data", exist_ok=True) langs = ("Java", "JavaScript", "1", "Python", "C", "C++", "C#", "Objective-C", "Perl", "Ruby", "PHP") par = {"text": "", "search_field": "name", "area": 2, "period": 30} o = {"skills": 1, "urls": 0, "vacs": 0} for l in langs: par["text"] = " " + l with open("data\data_" + par["text"] + str(datetime.date.today()) + ".json", "w") as f: json.dump(get_info_from_hh(par, 10, o), f, indent=4, ensure_ascii=False) data = Counter() for fn in os.listdir("data"): if os.path.isfile("data/" + fn): with open("data/" + fn, "r") as rf: data += Counter(json.load(rf)["skills"]) for item in data.most_common(150): print(item) jsdict = {item[0]: item[0] for item in data.most_common(150)} with open("kw.json", "w") as wf: json.dump(jsdict, wf, indent=4, ensure_ascii=False, sort_keys=True) 

La búsqueda de palabras clave en las descripciones de trabajo se realizó utilizando una expresión regular del formulario:


 pattern = r"(?i)[^--a-zA-Z0-9_|^]%s[^--a-zA-Z0-9_|$]" % kw[item] 

Dado que algunas tecnologías son una generalización de varias más privadas, al calcular mediante la clave sql , por ejemplo, se utilizó un valor del formulario:


 "sql": "sql|mysql|postgresql|ms sql" 

Además, para tener en cuenta varios nombres relacionados con la misma tecnología, se utilizaron expresiones de la forma:


 " ": ".+|.+|design patterns", " ": ".+?|english", " ": ".+?.+?|.+?.+?|neural" 

El archivo final de palabras clave se puede encontrar en el repositorio de GitHub .


Al elegir las tecnologías clave, se utilizó una lista de los 20 idiomas principales por el número de vacantes (mencionado en el título) . Al mismo tiempo, solo quedan esos idiomas que junto con la palabra "Programador" en el título dan más de 20 vacantes en San Petersburgo.



Resultados


El resultado de procesar un concepto tan abstracto como "programador" refleja bien el panorama general de las vacantes de la industria. En primer lugar, está claro que cada segundo empleador quiere obtener conocimiento sql e inglés de un programador. Cada tercer empleador quiere que un programador sea dueño de un sistema de control de versiones git . Debido a la orientación del desarrollo en la web, html y css son las tecnologías demandadas. Esto es especialmente importante para JavaScript y PHP . Algo inesperado, pero el programador probablemente tendrá que trabajar en equipo .


Entre las tecnologías comunes incluidas en el vigésimo primero, hay programación orientada a objetos , bases de datos , algoritmos y patrones de diseño .


Como sistema operativo, se debe preferir Linux .


Al considerar idiomas específicos, puede ver que al lado de la primera línea está el marco o biblioteca más popular. Para Java, estos son Spring e Hibernate , para C # - .net y asp.net , el programador de Python probablemente necesitará Django , y JavaScript necesitará React .

Especial y el menos exigente es el complejo doméstico 1C . Muchos empleadores solo tendrán suficiente conocimiento de esta plataforma (no tengo idea de cuánto o poco). Las habilidades útiles serán: trabajo en equipo , comprensión de los procesos de prueba y la capacidad de trabajar con bases de datos .


Debido a las peculiaridades del motor de búsqueda hh, a petición del "Programador C" se emitieron muchos resultados con tecnología 1C. Por lo tanto, los resultados en este idioma resultaron ser incorrectos.


Los resultados obtenidos en San Petersburgo, los doy a continuación.









Source: https://habr.com/ru/post/es423745/


All Articles