Nous considérons le salaire moyen d'un «data scientologist». Parsim hh.ru en utilisant pandas / python


Vous souhaitez connaître la situation sur le marché du travail, notamment dans le domaine de la science des données?
Si vous connaissez Python et Pandas, l'analyse du chasseur de têtes semble être l'un des moyens les plus fiables et les plus faciles.
Le code fonctionne sur Python3.6 et Pandas 0.24.2
Ipython peut être téléchargé ici .
Pour vérifier la version de la console Pandas (Linux / MacOS):


ipython 

Et puis sur la ligne de commande


 #ipython import pandas as pd pd.__version__ 

 #   () pip install pandas==0.24.2 

Vous avez déjà tout configuré? C'est parti!


Parsim en Python


HH vous permet de trouver du travail en Russie. Cette ressource de recrutement possède la plus grande base de données d'offres d'emploi. HH partage une API pratique.


Googlé un peu et il s'est avéré écrire un analyseur.


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

En conséquence, nous avons obtenu un fichier csv avec le nom spécifié dans job_title.
Dans le fichier spécifié avec les postes vacants avec la phrase sera téléchargé
«Data Analyst» et «data scientist». Si vous souhaitez modifier séparément la ligne en


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

Ensuite, vous obtenez 2 fichiers avec ces noms.


Fait intéressant, il existe d'autres opérateurs que "et". Avec leur aide, vous pouvez rechercher des correspondances exactes. Plus de détails ici.


https://hh.ru/article/309400


Quelle heure est-il? C'est l'heure des pandas!


Les annonces ainsi collectées seront divisées en groupes en fonction des informations qu'elles contiennent ou d'une description de leurs métadonnées. Par exemple: ville; position fiche de paiement; catégorie d'emploi. Dans ce cas, une seule annonce peut appartenir à plusieurs catégories.
Je m'occuperai des données liées au poste de "data scientist" à l'aide de jupyter-notebook. https://jupyter.org/



Que faire pour changer le nom de la colonne «Sans nom»?



La question la plus 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'] 

Il s'est avéré que les salaires étaient divisés en devises, vous pouvez essayer de faire l'analyse vous-même, par exemple, uniquement pour l'euro. Je ne traiterai que des salaires en roubles maintenant


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

Enfin, nous avons appris environ 150 000 roubles, comme prévu .


Pour le salaire moyen, j'avais les conditions suivantes:


  • n'a pas pris en compte les postes vacants dans lesquels il n'y a pas de salaire spécifié (df.salary.dropna)
  • n'a pris que des salaires en roubles
  • s'il y avait un bouchon, a alors pris une valeur moyenne (par exemple, un bouchon de 10 000 roubles à 20 000 roubles → 15 000 roubles).

Je dirai ce qui suit aux trolls, aux faibles d'esprit et aux amateurs de chercher un sens secret: je ne suis pas un employé de hh.ru; Cet article n'est pas une publicité; Je n'ai pas reçu un sou pour elle. Bonne chance à tous.


Bonus


Quelle est la demande en juin dans le domaine de la science des données?


 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 )


MODIFIER:
Version utilisateur Zoldaten
Analyseur hh
Le code n'est pas protégé par le droit d'auteur, à l'exception de certaines béquilles.


 # !/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/fr464823/


All Articles