Consideramos el salario promedio de un "científico de datos". Parsim hh.ru usando pandas / python


¿Desea saber cuál es la situación en el mercado laboral, especialmente en el campo de la ciencia de datos?
Si conoce Python y Pandas, el análisis de headhunter parece una de las formas más confiables y fáciles.
El código funciona en Python3.6 y Pandas 0.24.2
Ipython se puede descargar aquí .
Para verificar la versión de la consola Pandas (Linux / MacOS):


ipython 

Y luego en la línea de comando


 #ipython import pandas as pd pd.__version__ 

 #   () pip install pandas==0.24.2 

¿Ya has configurado todo? Vamos!


Parsim en Python


HH le permite encontrar trabajo en Rusia. Este recurso de reclutamiento tiene la mayor base de datos de vacantes. HH comparte una api conveniente.


Busqué un poco en Google y resultó que escribía un analizador.


 #   https://gist.github.com/fuwiak/9c695b51c33b2e052c5a721383705a9c #    (BASH) python3 hh_parser.py import requests import pandas as pd number_of_pages = 100 #number_of_ads = number_of_pages * per_page job_title = ["'Data Analyst' and 'data scientist'"] for job in job_title: data=[] for i in range(number_of_pages): url = 'https://api.hh.ru/vacancies' par = {'text': job, 'area':'113','per_page':'10', 'page':i} r = requests.get(url, params=par) e=r.json() data.append(e) vacancy_details = data[0]['items'][0].keys() df = pd.DataFrame(columns= list(vacancy_details)) ind = 0 for i in range(len(data)): for j in range(len(data[i]['items'])): df.loc[ind] = data[i]['items'][j] ind+=1 csv_name = job+".csv" df.to_csv(csv_name) 

Como resultado, obtuvimos un archivo csv con el nombre especificado en job_title.
En el archivo especificado con vacantes con la frase se descargará
"Analista de datos" y "científico de datos". Si desea cambiar por separado la línea a


 job_title=['Data Analyst', 'Data Scientist'] 

Luego obtienes 2 archivos con estos nombres.


Curiosamente, hay otros operadores además de "y". Con su ayuda, puede buscar coincidencias exactas. Más detalles aquí.


https://hh.ru/article/309400


Que hora es ¡Es hora de los pandas!


Los anuncios recopilados de esta manera se dividirán en grupos de acuerdo con la información contenida en ellos o una descripción de sus metadatos. Por ejemplo: ciudad; posición enchufe de pago; categoría de trabajo En este caso, un solo anuncio puede pertenecer a varias categorías.
Me ocuparé de los datos relacionados con el puesto de "científico de datos" utilizando jupyter-notebook. https://jupyter.org/



¿Qué hacer para cambiar el nombre de la columna "Sin nombre"?



La pregunta más importante: ZP


 import ast # run code from string for example ast.literal_eval("1+1") salaries = df.salary.dropna() # remove all NA's from dataframe currencies = [ast.literal_eval(salaries.iloc[i])['currency'] for i in range(len(salaries))] curr = set(currencies) #{'EUR', 'RUR', 'USD'} #divide dataframe salararies by currency rur = [ast.literal_eval(salaries.iloc[i]) for i in range(len(salaries)) if ast.literal_eval(salaries.iloc[i])['currency']=='RUR'] eur = [ast.literal_eval(salaries.iloc[i]) for i in range(len(salaries)) if ast.literal_eval(salaries.iloc[i])['currency']=='EUR'] usd = [ast.literal_eval(salaries.iloc[i]) for i in range(len(salaries)) if ast.literal_eval(salaries.iloc[i])['currency']=='USD'] 

Resultó dividir los salarios en monedas, puede intentar hacer el análisis usted mismo, por ejemplo, solo para el euro. Ahora solo me ocuparé de los salarios en rublos


 fr = [x['from'] for x in rur] # lower range of salary fr = list(filter(lambda x: x is not None, fr)) # remove NA's from lower range [0, 100, 200,...] to = [x['to'] for x in rur] #upper range of salary to = list(filter(lambda x: x is not None, to)) #remove NA's from upper range [100, 200, 300,...] import numpy as np salary_range = list(zip(fr, to)) # concatenate upper and lower range [(0,100), (100, 200), (200, 300)...] av = map(np.mean, salary_range) # convert [(0,100), (100, 200), (200, 300)...] to [50, 150, 250,...] av = round(np.mean(list(av)),1) # average value from [50, 150, 250,...] print("average salary as Data Scientist ", av, "rubles") 

Finalmente, aprendimos alrededor de 150 mil rublos, como se esperaba .


Para el salario promedio, tenía las siguientes condiciones:


  • no consideró vacantes en las cuales no hay un salario específico (df.salary.dropna)
  • tomó solo salarios en rublos
  • si había un tapón, entonces tomó un valor promedio (por ejemplo, un tapón de 10,000 rub a 20,000 rub → 15,000 rub).

Diré lo siguiente a los trolls, personas débiles y aficionados para que busquen un significado secreto: no soy un empleado de hh.ru; Este artículo no es un anuncio publicitario; No conseguí un centavo por ella. Buena suerte a todos.


Bono


¿Cómo es la demanda de junio en el campo de la ciencia de datos?


 from collections import Counter vacancy_names = df.name # change here to change source of data/words etc cloud = Counter(vacancy_names) from wordcloud import WordCloud, STOPWORDS stopwords = set(STOPWORDS) cloud = '' for x in list(vacancy_names): cloud+=x+' ' wordcloud = WordCloud(width = 800, height = 800, stopwords = stopwords, min_font_size = 8,background_color='white' ).generate(cloud) import matplotlib.pylab as plt plt.figure(figsize = (16, 16)) plt.imshow(wordcloud) plt.savefig('vacancy_cloud.png') 

[REPO] ( https://github.com/fuwiak/HH )


EDITAR:
Versión de usuario de Zoldaten
Analizador hh
El código no es copyright, a excepción de algunas muletas.


 # !/usr/bin/python3 # -*- coding: utf-8 -*- import sys import xlsxwriter # pip install XlsxWriter import requests # pip install requests from bs4 import BeautifulSoup as bs # pip install beautifulsoup4 headers = {'accept': '*/*', 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'} vacancy = input('  : ') base_url = f'https://hh.ru/search/vacancy?area=1&search_period=30&text={vacancy}&page=' # area=1 - , search_period=3 -  30   pages = int(input(' -   : ')) #+ jobs =[] def hh_parse(base_url, headers): zero = 0 while pages > zero: zero = str(zero) session = requests.Session() request = session.get(base_url + zero, headers = headers) if request.status_code == 200: soup = bs(request.content, 'html.parser') divs = soup.find_all('div', attrs = {'data-qa': 'vacancy-serp__vacancy'}) for div in divs: title = div.find('a', attrs = {'data-qa': 'vacancy-serp__vacancy-title'}).text compensation = div.find('div', attrs={'data-qa': 'vacancy-serp__vacancy-compensation'}) if compensation == None: #     compensation = 'None' else: compensation = div.find('div', attrs={'data-qa': 'vacancy-serp__vacancy-compensation'}).text href = div.find('a', attrs = {'data-qa': 'vacancy-serp__vacancy-title'})['href'] try: company = div.find('a', attrs = {'data-qa': 'vacancy-serp__vacancy-employer'}).text except: company = 'None' text1 = div.find('div', attrs = {'data-qa': 'vacancy-serp__vacancy_snippet_responsibility'}).text text2 = div.find('div', attrs = {'data-qa': 'vacancy-serp__vacancy_snippet_requirement'}).text content = text1 + ' ' + text2 all_txt = [title, compensation, company, content, href] jobs.append(all_txt) zero = int(zero) zero += 1 else: print('error') #   Excel  workbook = xlsxwriter.Workbook('Vacancy.xlsx') worksheet = workbook.add_worksheet() #    bold = workbook.add_format({'bold': 1}) bold.set_align('center') center_H_V = workbook.add_format() center_H_V.set_align('center') center_H_V.set_align('vcenter') center_V = workbook.add_format() center_V.set_align('vcenter') cell_wrap = workbook.add_format() cell_wrap.set_text_wrap() #    worksheet.set_column(0, 0, 35) # A https://xlsxwriter.readthedocs.io/worksheet.html#set_column worksheet.set_column(1, 1, 20) # B worksheet.set_column(2, 2, 40) # C worksheet.set_column(3, 3, 135) # D worksheet.set_column(4, 4, 45) # E worksheet.write('A1', '', bold) worksheet.write('B1', '', bold) worksheet.write('C1', '', bold) worksheet.write('D1', '', bold) worksheet.write('E1', '', bold) row = 1 col = 0 for i in jobs: worksheet.write_string (row, col, i[0], center_V) worksheet.write_string (row, col + 1, i[1], center_H_V) worksheet.write_string (row, col + 2, i[2], center_H_V) worksheet.write_string (row, col + 3, i[3], cell_wrap) # worksheet.write_url (row, col + 4, i[4], center_H_V) worksheet.write_url (row, col + 4, i[4]) row += 1 print('OK') workbook.close() hh_parse(base_url, headers) 

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


All Articles