Хочешь узнать, какая ситуация на рынке труда, особенно в области "дата-сайенс"?
Если знаешь Python и Pandas, парсинг Хедхантера это самый надежный и легкий способ.
Код работает на Python3.6 и Pandas 0.24.2
Ipython можно скачать здесь.
Чтобы проверить версию Pandas(Linux/MacOS) console:


ipython

И потом в командной строке


#ipython
import pandas as pd
pd.__version__

#Если нет подходящей версии(консоль)

pip install pandas==0.24.2

Уже все настроили? Поехали!


Парсим на Python


HH позволяет найти работу в России. Данный рекрутинговый ресурс обладает самой большой базой данных вакансий. HH делиться удобным api.


Немного погуглил и вот получилось написать парсер.


#код в ссылке 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)

В итоге мы получили файл csv с названием указанным в job_title.
В указанном будет загружен один файл с вакансиями с фразой
«Data Analyst» и «data scientist». Если хотите отдельно поменяйте строку на


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

Тогда вы получаете 2 файла с этими названиями.


Что интересно, есть и другие операторы кроме «and». С их помощью можно искать точные совпадения. Подробнее по ссылке.


https://hh.ru/article/309400


What time is it? Its Pandas Time!


Собранные таким образом объявления будут разделены на группы в соответствии с информацией содержащейся в них или описанием их метаданных. Например: город; позиция; вилка зарплаты; категория вакансии. В этом случае одно объявление может принадлежать нескольким категориям.
Сейчас займусь данным, которые связанны с позицией "data scientist", используя jupyter-notebook. https://jupyter.org/



Что делать чтобы поменять название колонки “Unnamed”?



Самый главный вопрос — ЗП


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']

Получилось разделить зарплаты на валюты, самостоятельно сможете попробовать сделать анализ например только для евро. Я займусь сейчас только рублевыми зарплатами


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

Наконец-то узнали, около 150 тыс рублей, как ожидаемо.


Для средней зарплаты у меня были такие условия:


  • не считал вакансии, в которых нет указанной зарплаты (df.salary.dropna)
  • взял только зарплаты в рублях
  • если была вилка, тогда взял среднее значение (например, вилка от 10000 rub до 20000 rub > 15000 rub).

Троллям, слабоумным и любителям искать тайный смысл скажу следующее: я не являюсь сотрудником компании hh.ru; эта статья не является рекламой; я не получил за неё ни копейки. Всем удачи.


Бонус


Как востребованы в области "Data Science" джуны?


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)

Комментарии (15)


  1. RubyRoid07
    23.08.2019 19:22

    Много картинок, мало текста, при этом масса опечаток. Довольно шизофренично.


    1. fuwiak Автор
      23.08.2019 19:26

      Что Вы точно имеете ввиду в «Довольно шизофренично»?


      1. RubyRoid07
        23.08.2019 19:29

        Вашу манеру изложения.


        1. fuwiak Автор
          23.08.2019 19:36

          Я новый автор и я решил писать не очень серезно. Уточните где в тексту «шизофрения»? Мне очень интересно.


          1. Tarson
            23.08.2019 20:08

            (красный цвет добавил в GIMP, уже рассказывал кем считает меня бабушка?
            )

            навскидку


  1. Larymar
    23.08.2019 20:11

    мои мелкие заметки обычно выходят в +
    так что попробую дать пару советов от продолжающего начинающему
    1) больше пояснений кода, я не знаком с питоном и не очень понятно почему это выглядит так
    2) не выкладывайте код скринами, это неудобно и не нужно

    Cosole.WriteLine("Так лучше")

    3) не выкладывате ссылки как юрлы, лучше вот так
    4) приложите вконце ссылку на полный репозиторий гита, так куда удобнее будет пользоваться
    5) откажитесь от м*терных заголовков, если не деляете что-то очень яркое, обычно ожидания рушатся, если подкат не соответсвует столь дерзкому кату


    1. fuwiak Автор
      23.08.2019 20:27

      Спасибо за фидбек, постараюсь исправить ошибки.


      1. Larymar
        24.08.2019 13:45

        надеюсь вы не перестанете писать после этого выстрела в свою ногу
        и вот ознакомьтесь
        habr.com/ru/company/habr/blog/456358


        1. fuwiak Автор
          24.08.2019 14:39

          Спасибо за ссылку. Не перестану.
          В общем не был уверен ли моя манера изложения понравиться остальным. Хотел это проверить. Более того русский это не мой родной язык и много фраз казалось мне грамотными. В итоге я читал комментарии и на их основе поменял форму стации на более адекватную. Удачи Вам!


  1. fedor2612
    23.08.2019 23:58

    Дата-саентолога? С PyTorch-одитингом? :)


    1. Cerberuser
      24.08.2019 11:12

      Да ещё и зарплату считают только по средам ("средную")...


    1. fuwiak Автор
      24.08.2019 12:38

      «дата-саентолога» — вы знаете что это стёб?


  1. wrapper228
    24.08.2019 20:57

    Репрезентативность выборки не доказана. Почему не берете в учет вакансии из банковского сектора, например, где даже для джунов зарплата с учетом премий доходит до 200к? Может, потому что их нет на hh? Тогда с чего "парсинг Хедхантера это самый надежный и легкий способ" узнать ситуацию на рынке труда?


    1. fuwiak Автор
      24.08.2019 21:13

      Потому что это стация про этом как скачать и обработать данные с HH с помощью python, доказательство репрезентативности выборки оставляю другим. Наверное вы уже заметили что тоже не определил вакансии по городом ли областям etc. Это стация сможет становить базу для полноценного анализа. Сможете сделать статью по вашим запросом, с радостью ознакомлюсь, удачи!


  1. fuwiak Автор
    24.08.2019 21:45

    Кстати, если у вас есть лучшие источники чем HH, то напишите в личку или оставите здесь, многим понадобиться.