From 5d676e58aafd6ed44429d13914ffb850a8e978be Mon Sep 17 00:00:00 2001 From: Mekhty <98921340+Mekhty111@users.noreply.github.com> Date: Fri, 15 Aug 2025 09:24:04 +0400 Subject: [PATCH] Add files via upload --- hh_ru_main.ipynb | 278835 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 278835 insertions(+) create mode 100644 hh_ru_main.ipynb diff --git a/hh_ru_main.ipynb b/hh_ru_main.ipynb new file mode 100644 index 00000000..6561b231 --- /dev/null +++ b/hh_ru_main.ipynb @@ -0,0 +1,278835 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "42289889-bd57-434e-9637-d3e354756316", + "metadata": {}, + "source": [ + "
"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "829cb75b-f14e-4ba8-9195-7ba929a7d656",
+ "metadata": {
+ "tags": []
+ },
+ "source": [
+ "# | \n", + " | Пол, возраст | \n", + "ЗП | \n", + "Ищет работу на должность: | \n", + "Город, переезд, командировки | \n", + "Занятость | \n", + "График | \n", + "Опыт работы | \n", + "Последнее/нынешнее место работы | \n", + "Последняя/нынешняя должность | \n", + "Образование и ВУЗ | \n", + "Обновление резюме | \n", + "Авто | \n", + "
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | \n", + "Мужчина , 39 лет , родился 27 ноября 1979 | \n", + "29000 руб. | \n", + "Системный администратор | \n", + "Советск (Калининградская область) , не готов к... | \n", + "частичная занятость, проектная работа, полная ... | \n", + "гибкий график, полный день, сменный график, ва... | \n", + "Опыт работы 16 лет 10 месяцев Август 2010 — п... | \n", + "МАОУ \"СОШ № 1 г.Немана\" | \n", + "Системный администратор | \n", + "Неоконченное высшее образование 2000 Балтийск... | \n", + "16.04.2019 15:59 | \n", + "Имеется собственный автомобиль | \n", + "
| 1 | \n", + "Мужчина , 60 лет , родился 20 марта 1959 | \n", + "40000 руб. | \n", + "Технический писатель | \n", + "Королев , не готов к переезду , готов к редким... | \n", + "частичная занятость, проектная работа, полная ... | \n", + "гибкий график, полный день, сменный график, уд... | \n", + "Опыт работы 19 лет 5 месяцев Январь 2000 — по... | \n", + "Временный трудовой коллектив | \n", + "Менеджер проекта, Аналитик, Технический писатель | \n", + "Высшее образование 1981 Военно-космическая ак... | \n", + "12.04.2019 08:42 | \n", + "Не указано | \n", + "
| 2 | \n", + "Женщина , 36 лет , родилась 12 августа 1982 | \n", + "20000 руб. | \n", + "Оператор | \n", + "Тверь , не готова к переезду , не готова к ком... | \n", + "полная занятость | \n", + "полный день | \n", + "Опыт работы 10 лет 3 месяца Октябрь 2004 — Де... | \n", + "ПАО Сбербанк | \n", + "Кассир-операционист | \n", + "Среднее специальное образование 2002 Профессио... | \n", + "16.04.2019 08:35 | \n", + "Не указано | \n", + "
| 3 | \n", + "Мужчина , 38 лет , родился 25 июня 1980 | \n", + "100000 руб. | \n", + "Веб-разработчик (HTML / CSS / JS / PHP / базы ... | \n", + "Саратов , не готов к переезду , готов к редким... | \n", + "частичная занятость, проектная работа, полная ... | \n", + "гибкий график, удаленная работа | \n", + "Опыт работы 18 лет 9 месяцев Август 2017 — Ап... | \n", + "OpenSoft | \n", + "Инженер-программист | \n", + "Высшее образование 2002 Саратовский государст... | \n", + "08.04.2019 14:23 | \n", + "Не указано | \n", + "
| 4 | \n", + "Женщина , 26 лет , родилась 3 марта 1993 | \n", + "140000 руб. | \n", + "Региональный менеджер по продажам | \n", + "Москва , не готова к переезду , готова к коман... | \n", + "полная занятость | \n", + "полный день | \n", + "Опыт работы 5 лет 7 месяцев Региональный мене... | \n", + "Мармелад | \n", + "Менеджер по продажам | \n", + "Высшее образование 2015 Кгу Психологии и педаг... | \n", + "22.04.2019 10:32 | \n", + "Не указано | \n", + "
| \n", + " | Пол, возраст | \n", + "ЗП | \n", + "Ищет работу на должность: | \n", + "Город, переезд, командировки | \n", + "Занятость | \n", + "График | \n", + "Опыт работы | \n", + "Последнее/нынешнее место работы | \n", + "Последняя/нынешняя должность | \n", + "Образование и ВУЗ | \n", + "Обновление резюме | \n", + "Авто | \n", + "
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| count | \n", + "44744 | \n", + "44744 | \n", + "44744 | \n", + "44744 | \n", + "44744 | \n", + "44744 | \n", + "44576 | \n", + "44743 | \n", + "44742 | \n", + "44744 | \n", + "44744 | \n", + "44744 | \n", + "
| unique | \n", + "16003 | \n", + "690 | \n", + "14929 | \n", + "10063 | \n", + "38 | \n", + "47 | \n", + "44413 | \n", + "30214 | \n", + "16927 | \n", + "40148 | \n", + "18838 | \n", + "2 | \n", + "
| top | \n", + "Мужчина , 32 года , родился 17 сентября 1986 | \n", + "50000 руб. | \n", + "Системный администратор | \n", + "Москва , не готов к переезду , не готов к кома... | \n", + "полная занятость | \n", + "полный день | \n", + "Опыт работы 10 лет 8 месяцев Апрель 2018 — по... | \n", + "Индивидуальное предпринимательство / частная п... | \n", + "Системный администратор | \n", + "Высшее образование 1987 Военный инженерный Кра... | \n", + "07.05.2019 09:50 | \n", + "Не указано | \n", + "
| freq | \n", + "18 | \n", + "4064 | \n", + "3099 | \n", + "1261 | \n", + "30026 | \n", + "22727 | \n", + "3 | \n", + "935 | \n", + "2062 | \n", + "4 | \n", + "25 | \n", + "32268 | \n", + "
million_cities = ['Новосибирск', 'Екатеринбург','Нижний Новгород','Казань', 'Челябинск','Омск', 'Самара', 'Ростов-на-Дону', 'Уфа', 'Красноярск', 'Пермь', 'Воронеж','Волгоград']\n",
+ " \n",
+ " Инфорация о метро, рядом с которым проживает соискатель нас не интересует.\n",
+ "* Признак **\"Готовность к переезду\"** должен иметь два возможных варианта: True или False. Обратите внимание, что возможны несколько вариантов описания готовности к переезду в признаке \"Город, переезд, командировки\". Например:\n",
+ " * … , готов к переезду , …\n",
+ " * … , не готова к переезду , …\n",
+ " * … , готова к переезду (Москва, Санкт-Петербург, Ростов-на-Дону)\n",
+ " * … , хочу переехать (США) , …\n",
+ " \n",
+ " Нас интересует только сам факт возможности или желания переезда.\n",
+ "* Признак **\"Готовность к командировкам\"** должен иметь два возможных варианта: True или False. Обратите внимание, что возможны несколько вариантов описания готовности к командировкам в признаке \"Город, переезд, командировки\". Например:\n",
+ " * … , готов к командировкам , … \n",
+ " * … , готова к редким командировкам , …\n",
+ " * … , не готов к командировкам , …\n",
+ " \n",
+ " Нас интересует только сам факт готовности к командировке.\n",
+ " \n",
+ " Еще один важный факт: при выгрузки данных у некоторых соискателей \"потерялась\" информация о готовности к командировкам. Давайте по умолчанию будем считать, что такие соискатели не готовы к командировкам.\n",
+ " \n",
+ "Выполните преобразования и удалите столбец **\"Город, переезд, командировки\"** из таблицы.\n",
+ "\n",
+ "*Совет: обратите внимание на то, что структура текста может меняться в зависимости от указания ближайшего метро. Учите это, если будете использовать порядок слов в своей программе.*\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 69,
+ "id": "1ea710ec-871b-431e-9462-c7d0fd87011b",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def city_rem_trip(col):\n",
+ " million_cities = ['Новосибирск', 'Екатеринбург','Нижний Новгород','Казань', 'Челябинск','Омск', 'Самара', 'Ростов-на-Дону', 'Уфа', 'Красноярск', 'Пермь', 'Воронеж','Волгоград']\n",
+ " \n",
+ " # такая конструкция в связи с тем, что простой split(\" , \") выдает ошибку\n",
+ " col_str = [word.strip() for word in col.split(', ', maxsplit=2)]\n",
+ " if col_str[0] == 'Москва':\n",
+ " city = 'Москва'\n",
+ " elif col_str[0] == 'Санкт-Петербург':\n",
+ " city = 'Санкт-Петербург'\n",
+ " elif col_str[0] in million_cities:\n",
+ " city = 'город-миллионник'\n",
+ " else:\n",
+ " city = 'другие'\n",
+ " \n",
+ " if ('не готов к переезду' in col) or ('не готова к переезду' in col):\n",
+ " removel = False\n",
+ " elif 'хочу' in col:\n",
+ " removel = True\n",
+ " else:\n",
+ " removel = True \n",
+ " \n",
+ " if ('командировка' in col):\n",
+ " if ('не готов к командировкам' in col) or('не готова к командировкам' in col):\n",
+ " trip = False\n",
+ " else: \n",
+ " trip = True\n",
+ " else:\n",
+ " trip = True\n",
+ "\n",
+ " return city, removel, trip\n",
+ "\n",
+ "df['Город'] = df['Город, переезд, командировки'].apply(lambda x: city_rem_trip(x)[0])\n",
+ "df['Готовность к переезду'] = df['Город, переезд, командировки'].apply(lambda x: city_rem_trip(x)[1])\n",
+ "df['Готовность к командировкам'] = df['Город, переезд, командировки'].apply(lambda x: city_rem_trip(x)[2])\n",
+ "\n",
+ "df = df.drop('Город, переезд, командировки', axis=1)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0136ffee-0ead-4a6b-b608-61d1c753a438",
+ "metadata": {},
+ "source": [
+ "5. Рассмотрим поближе признаки **\"Занятость\"** и **\"График\"**. Сейчас признаки представляют собой набор категорий желаемой занятости (полная занятость, частичная занятость, проектная работа, волонтерство, стажировка) и желаемого графика работы (полный день, сменный график, гибкий график, удаленная работа, вахтовый метод).\n",
+ "На сайте hh.ru соискатель может указывать различные комбинации данных категорий, например:\n",
+ "* полная занятость, частичная занятость\n",
+ "* частичная занятость, проектная работа, волонтерство\n",
+ "* полный день, удаленная работа\n",
+ "* вахтовый метод, гибкий график, удаленная работа, полная занятость\n",
+ "\n",
+ "Такой вариант признаков имеет множество различных комбинаций, а значит множество уникальных значений, что мешает анализу. Нужно это исправить!\n",
+ "\n",
+ "Давайте создадим признаки-мигалки для каждой категории: если категория присутствует в списке желаемых соискателем, то в столбце на месте строки рассматриваемого соискателя ставится True, иначе - False.\n",
+ "\n",
+ "Такой метод преобразования категориальных признаков называется One Hot Encoding и его схема представлена на рисунке ниже:\n",
+ "
\n",
+ "Выполните данное преобразование для признаков \"Занятость\" и \"График\", ответьте на контрольные вопросы, после чего удалите их из таблицы"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 70,
+ "id": "5b3a8e79-f7ab-4008-b767-12aea3a205ea",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# вначале найдем все возможные варианты\n",
+ "busyness_values = list()\n",
+ "schedule_values = list()\n",
+ "\n",
+ "# upd: к сожалению такой вариант не сработал по итогу, хотя ошибок не выдает, но и не работает,\n",
+ "# а хотелось оба признака одной функцией пропустить \n",
+ "\n",
+ "# def adding_values_to_list(col, lst):\n",
+ "# global busyness_values, schedule_values\n",
+ "# col_str = [word.strip() for word in col.split(',')]\n",
+ "# for i in col_str:\n",
+ "# lst.append(i)\n",
+ "# lst = list(set(lst))\n",
+ "# df['Занятость'].apply(adding_values_to_list, args=(busyness_values, ))\n",
+ "# df['График'].apply(adding_values_to_list, args=(schedule_values, ))\n",
+ "\n",
+ "def busyness_values_func(col):\n",
+ " global busyness_values\n",
+ " col_str = [word.strip() for word in col.split(',')]\n",
+ " for i in col_str:\n",
+ " busyness_values.append(i)\n",
+ " busyness_values = list(set(busyness_values))\n",
+ "df['Занятость'].apply(busyness_values_func)\n",
+ "\n",
+ "\n",
+ "def schedule_values_func(col):\n",
+ " global schedule_values\n",
+ " col_str = [word.strip() for word in col.split(',')]\n",
+ " for i in col_str:\n",
+ " schedule_values.append(i)\n",
+ " schedule_values = list(set(schedule_values))\n",
+ "df['График'].apply(schedule_values_func)\n",
+ "\n",
+ "def busyness_migalka(col):\n",
+ " col_str = [word.strip() for word in col.split(',')]\n",
+ " value_dic = {word: word in col_str for word in busyness_values}\n",
+ " return value_dic\n",
+ "for col in busyness_values:\n",
+ " df[col] = df['Занятость'].apply(lambda x: busyness_migalka(x)[col])\n",
+ " \n",
+ "def schedule_migalka(col):\n",
+ " col_str = [word.strip() for word in col.split(',')]\n",
+ " value_dic = {word: word in col_str for word in schedule_values}\n",
+ " return value_dic\n",
+ "for col in schedule_values:\n",
+ " df[col] = df['График'].apply(lambda x: schedule_migalka(x)[col])\n",
+ " \n",
+ "# display(df[['График', *schedule_values]])\n",
+ "\n",
+ "df = df.drop(['График', 'Занятость'], axis=1)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "344f123c-b63b-43dd-a8a4-809c1f1bb443",
+ "metadata": {},
+ "source": [
+ "6. (2 балла) Наконец, мы добрались до самого главного и самого важного - признака заработной платы **\"ЗП\"**. \n",
+ "В чем наша беда? В том, что помимо желаемой заработной платы соискатель указывает валюту, в которой он бы хотел ее получать, например:\n",
+ "* 30000 руб.\n",
+ "* 50000 грн.\n",
+ "* 550 USD\n",
+ "\n",
+ "Нам бы хотелось видеть заработную плату в единой валюте, например, в рублях. Возникает вопрос, а где взять курс валют по отношению к рублю?\n",
+ "\n",
+ "На самом деле язык Python имеет в арсенале огромное количество возможностей получения данной информации, от обращения к API Центробанка, до использования специальных библиотек, например pycbrf. Однако, это не тема нашего проекта.\n",
+ "\n",
+ "Поэтому мы пойдем в лоб: обратимся к специальным интернет-ресурсам для получения данных о курсе в виде текстовых файлов. Например, MDF.RU, данный ресурс позволяет удобно экспортировать данные о курсах различных валют и акций за указанные периоды в виде csv файлов. Мы уже сделали выгрузку курсов валют, которые встречаются в наших данных за период с 29.12.2017 по 05.12.2019. Скачать ее вы можете **на платформе**\n",
+ "\n",
+ "Создайте новый DataFrame из полученного файла. В полученной таблице нас будут интересовать столбцы:\n",
+ "* \"currency\" - наименование валюты в ISO кодировке,\n",
+ "* \"date\" - дата, \n",
+ "* \"proportion\" - пропорция, \n",
+ "* \"close\" - цена закрытия (последний зафиксированный курс валюты на указанный день).\n",
+ "\n",
+ "\n",
+ "Перед вами таблица соответствия наименований иностранных валют в наших данных и их общепринятых сокращений, которые представлены в нашем файле с курсами валют. Пропорция - это число, за сколько единиц валюты указан курс в таблице с курсами. Например, для казахстанского тенге курс на 20.08.2019 составляет 17.197 руб. за 100 тенге, тогда итоговый курс равен - 17.197 / 100 = 0.17197 руб за 1 тенге.\n",
+ "Воспользуйтесь этой информацией в ваших преобразованиях.\n",
+ "\n",
+ "
\n",
+ "\n",
+ "\n",
+ "Осталось только понять, откуда брать дату, по которой определяется курс? А вот же она - в признаке **\"Обновление резюме\"**, в нем содержится дата и время, когда соискатель выложил текущий вариант своего резюме. Нас интересует только дата, по ней бы и будем сопоставлять курсы валют.\n",
+ "\n",
+ "Теперь у нас есть вся необходимая информация для того, чтобы создать признак \"ЗП (руб)\" - заработная плата в рублях.\n",
+ "\n",
+ "После ответа на контрольные вопросы удалите исходный столбец заработной платы \"ЗП\" и все промежуточные столбцы, если вы их создавали."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6d794257-61f5-4124-956b-67b92b9391a7",
+ "metadata": {
+ "tags": []
+ },
+ "source": [
+ "Итак, давайте обсудим возможный алгоритм преобразования: \n",
+ "1. Перевести признак \"Обновление резюме\" из таблицы с резюме в формат datetime и достать из него дату. В тот же формат привести признак \"date\" из таблицы с валютами.\n",
+ "2. Выделить из столбца \"ЗП\" сумму желаемой заработной платы и наименование валюты, в которой она исчисляется. Наименование валюты перевести в стандарт ISO согласно с таблицей выше.\n",
+ "3. Присоединить к таблице с резюме таблицу с курсами по столбцам с датой и названием валюты (подумайте, какой тип объединения надо выбрать, чтобы в таблице с резюме сохранились данные о заработной плате, изначально представленной в рублях). Значение close для рубля заполнить единицей 1 (курс рубля самого к себе)\n",
+ "4. Умножить сумму желаемой заработной платы на присоединенный курс валюты (close) и разделить на пропорцию (обратите внимание на пропуски после объединения в этих столбцах), результат занести в новый столбец \"ЗП (руб)\".\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 71,
+ "id": "e91f87ed-e25c-4f96-9f92-b642e8c0b4fa",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/var/folders/vc/zgch74_n23sckf5dm03_fq380000gn/T/ipykernel_1042/1308697190.py:3: UserWarning:\n",
+ "\n",
+ "Parsing dates in %d.%m.%Y %H:%M format when dayfirst=False (the default) was specified. Pass `dayfirst=True` or specify a format to silence this warning.\n",
+ "\n",
+ "/var/folders/vc/zgch74_n23sckf5dm03_fq380000gn/T/ipykernel_1042/1308697190.py:4: UserWarning:\n",
+ "\n",
+ "Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "currency_df = pd.read_csv('data/ExchangeRates.csv')\n",
+ "\n",
+ "df['Обновление резюме'] = pd.to_datetime(pd.to_datetime(df['Обновление резюме']).dt.date)\n",
+ "currency_df['date'] = pd.to_datetime(currency_df['date'])\n",
+ "\n",
+ "df['значение'] = df['ЗП'].apply(lambda x: x.split()[0])\n",
+ "df['валюта'] = df['ЗП'].apply(lambda x: x.split()[1])\n",
+ "\n",
+ "\n",
+ "df.loc[df['валюта'] == 'бел.руб.', 'валюта'] = 'BYN'\n",
+ "df.loc[df['валюта'] == 'грн.', 'валюта'] = 'UAH'\n",
+ "df.loc[df['валюта'] == 'сум', 'валюта'] = 'UZS'\n",
+ "\n",
+ "df = df.merge(currency_df[['currency', 'close', 'date', 'proportion']], left_on=['валюта', 'Обновление резюме'], right_on=['currency', 'date'], how='left')\n",
+ "\n",
+ "df.loc[df['валюта'] == 'руб.' , ['close', 'proportion']] = 1\n",
+ "df['значение'] = df['значение'].astype('float')\n",
+ "df['close'] = df['close'].astype('float')\n",
+ "df['proportion'] = df['proportion'].astype('int')\n",
+ "\n",
+ "df['ЗП (руб)'] = df['значение'] * (df['close']) / df['proportion']\n",
+ "\n",
+ "df = df.drop(['close', 'proportion', 'ЗП', 'валюта', 'значение', 'currency', 'date'], axis=1)\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7ea20ab6-04a7-40a0-adec-443a0e5a42c3",
+ "metadata": {},
+ "source": [
+ "# Исследование зависимостей в данных"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "968aed80-74ef-4ffb-b5bf-c65b84e9caea",
+ "metadata": {},
+ "source": [
+ "1. Постройте распределение признака **\"Возраст\"**. Опишите распределение, отвечая на следующие вопросы: чему равна мода распределения, каковы предельные значения признака, в каком примерном интервале находится возраст большинства соискателей? Есть ли аномалии для признака возраста, какие значения вы бы причислили к их числу?\n",
+ "*Совет: постройте гистограмму и коробчатую диаграмму рядом.*"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "f2d62796-d400-4ec1-a675-88112739a50e",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0 30\n",
+ "Name: Возраст, dtype: int64"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/plain": [
+ "5597 77\n",
+ "15419 76\n",
+ "10907 73\n",
+ "19628 73\n",
+ "Name: Возраст, dtype: int64"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.plotly.v1+json": {
+ "config": {
+ "plotlyServerURL": "https://plot.ly"
+ },
+ "data": [
+ {
+ "alignmentgroup": "True",
+ "bingroup": "x",
+ "hovertemplate": "Возраст=%{x}| \n", + " | Ищет работу на должность: | \n", + "Последнее/нынешнее место работы | \n", + "Последняя/нынешняя должность | \n", + "Обновление резюме | \n", + "Авто | \n", + "Образование | \n", + "Пол | \n", + "Возраст | \n", + "Опыт работы (месяц) | \n", + "Город | \n", + "... | \n", + "проектная работа | \n", + "волонтерство | \n", + "частичная занятость | \n", + "полная занятость | \n", + "вахтовый метод | \n", + "гибкий график | \n", + "полный день | \n", + "сменный график | \n", + "удаленная работа | \n", + "ЗП (руб) | \n", + "
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 31137 | \n", + "Менеджер по работе с клиентами | \n", + "ООО \"ФёрстКэшКомпани\" | \n", + "Менеджер по работе с клиентами | \n", + "2019-04-06 | \n", + "Не указано | \n", + "Среднее | \n", + "М | \n", + "15 | \n", + "2.0 | \n", + "Санкт-Петербург | \n", + "... | \n", + "False | \n", + "False | \n", + "True | \n", + "False | \n", + "False | \n", + "True | \n", + "False | \n", + "True | \n", + "True | \n", + "10000.0 | \n", + "
| 32950 | \n", + "Тестировщик игр | \n", + "OOO ЖМЫХ | \n", + "Тестировщик ПО | \n", + "2019-04-09 | \n", + "Не указано | \n", + "Среднее специальное | \n", + "М | \n", + "15 | \n", + "3.0 | \n", + "другие | \n", + "... | \n", + "False | \n", + "False | \n", + "False | \n", + "True | \n", + "False | \n", + "False | \n", + "True | \n", + "False | \n", + "False | \n", + "2000.0 | \n", + "
| 33654 | \n", + "Frontend-разработчик | \n", + "Freelance | \n", + "Frontend-разработчик | \n", + "2019-04-19 | \n", + "Не указано | \n", + "Среднее специальное | \n", + "М | \n", + "100 | \n", + "30.0 | \n", + "Санкт-Петербург | \n", + "... | \n", + "True | \n", + "False | \n", + "True | \n", + "True | \n", + "False | \n", + "True | \n", + "True | \n", + "False | \n", + "True | \n", + "60000.0 | \n", + "
3 rows × 23 columns
\n", + "