{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "HcF9My_FhLuk" }, "source": [ "## Машинное обучение 1, ПМИ ФКН ВШЭ\n", "\n", "## Практическое домашнее задание 1\n", "\n", "### Общая информация\n", "\n", "Дата выдачи: 09.09.2022\n", "\n", "Мягкий дедлайн: 23:59MSK 22.09.2022\n", "\n", "Жесткий дедлайн: 23:59MSK 29.09.2022" ] }, { "cell_type": "markdown", "metadata": { "id": "G64TptyJhLuo" }, "source": [ "### О задании\n", "\n", "Задание состоит из двух разделов, посвященных работе с табличными данными с помощью библиотеки pandas и визуализации с помощью matplotlib. В первом разделе вам предстоит выполнить базовые задания с помощью вышеуказанных библиотек, а во втором распределить студентов по курсам. Баллы даются за выполнение отдельных пунктов. Задачи в рамках одного раздела рекомендуется решать в том порядке, в котором они даны в задании.\n", "\n", "Задание направлено на освоение jupyter notebook (будет использоваться в дальнейших заданиях), библиотек pandas и matplotlib.\n", "\n", "### Оценивание и штрафы\n", "Каждая из задач имеет определенную «стоимость» (указана в скобках около задачи). Максимально допустимая оценка за работу — 10 баллов.\n", "\n", "Сдавать задание после жёсткого дедлайна нельзя. При выставлении неполного балла за задание в связи с наличием ошибок на усмотрение проверяющего предусмотрена возможность исправить работу на указанных в ответном письме условиях.\n", "\n", "Задание выполняется самостоятельно. «Похожие» решения считаются плагиатом и все задействованные студенты (в том числе те, у кого списали) не могут получить за него больше 0 баллов (подробнее о плагиате см. на странице курса). Если вы нашли решение какого-то из заданий (или его часть) в открытом источнике, необходимо указать ссылку на этот источник (скорее всего вы будете не единственным, кто это нашел, поэтому чтобы исключить подозрение в плагиате, необходима ссылка на источник).\n", "\n", "### Формат сдачи\n", "Задания сдаются через систему Anytask. Инвайт можно получить у семинариста или ассистента. Присылать необходимо ноутбук с выполненным заданием. Сам ноутбук называйте в формате homework-practice-01-pandas-Username.ipynb, где Username — ваша фамилия.\n", "\n", "Для удобства проверки самостоятельно посчитайте свою максимальную оценку (исходя из набора решенных задач) и укажите ниже.\n", "\n", "Оценка: xx." ] }, { "cell_type": "markdown", "metadata": { "id": "BaXlfHE_hLup" }, "source": [ "## 0. Введение" ] }, { "cell_type": "markdown", "metadata": { "id": "wirAvJNxhLup" }, "source": [ "Сейчас мы находимся в jupyter-ноутбуке (или ipython-ноутбуке). Это удобная среда для написания кода, проведения экспериментов, изучения данных, построения визуализаций и других нужд, не связанных с написанием production-кода. \n", "\n", "Ноутбук состоит из ячеек, каждая из которых может быть либо ячейкой с кодом, либо ячейкой с текстом размеченным и неразмеченным. Текст поддерживает markdown-разметку и формулы в Latex.\n", "\n", "Для работы с содержимым ячейки используется *режим редактирования* (*Edit mode*, включается нажатием клавиши **Enter** после выбора ячейки), а для навигации между ячейками искользуется *командный режим* (*Command mode*, включается нажатием клавиши **Esc**). Тип ячейки можно задать в командном режиме либо с помощью горячих клавиш (**y** to code, **m** to markdown, **r** to edit raw text), либо в меню *Cell -> Cell type*. \n", "\n", "После заполнения ячейки нужно нажать *Shift + Enter*, эта команда обработает содержимое ячейки: проинтерпретирует код или сверстает размеченный текст." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "aQ2_j3nkhLuq" }, "outputs": [], "source": [ "# ячейка с кодом, при выполнении которой появится output\n", "2 + 2" ] }, { "cell_type": "markdown", "metadata": { "id": "ZlulCwVKhLur" }, "source": [ "Ячейка с неразмеченным текстом." ] }, { "cell_type": "markdown", "metadata": { "id": "A4wkVlIehLur" }, "source": [ "Попробуйте создать свои ячейки, написать какой-нибудь код и текст какой-нибудь формулой." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "BIuaYSvqhLus" }, "outputs": [], "source": [ "# your code" ] }, { "cell_type": "markdown", "metadata": { "id": "iWs6ljrIhLus" }, "source": [ "[Здесь](https://athena.brynmawr.edu/jupyter/hub/dblank/public/Jupyter%20Notebook%20Users%20Manual.ipynb) находится небольшая заметка о используемом языке разметки Markdown. Он позволяет:\n", "\n", "0. Составлять упорядоченные списки\n", "1. Выделять *текст* при **необходимости**\n", "2. Добавлять [ссылки](http://imgs.xkcd.com/comics/the_universal_label.png)\n", "\n", "\n", "* Составлять неупорядоченные списки\n", "\n", "Делать вставки с помощью LaTex:\n", " \n", "$\n", "\\left\\{\n", "\\begin{array}{ll}\n", "x = 16 \\sin^3 (t) \\\\ \n", "y = 13 \\cos (t) - 5 \\cos (2t) - 2 \\cos (3t) - \\cos (4t) \\\\\n", "t \\in [0, 2 \\pi]\n", "\\end{array}\n", "\\right.$" ] }, { "cell_type": "markdown", "metadata": { "id": "6fmTGcXOhLus" }, "source": [ "А ещё можно вставлять картинки, или гифки, или что захотите:\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": { "id": "J_toGw7DhLut" }, "source": [ "### Google Colab" ] }, { "cell_type": "markdown", "metadata": { "id": "jpkbCVjGhLut" }, "source": [ "Что за колаб? \n", "\n", "**Google Colab (Colaboratory)** это **Jupyter Notebook + Cloud + Google Drive.**\n", "\n", "Компания Google предоставляет возможность бесплатно запускать ноутбуки (предварительно загрузив их на свой гугл-диск) прямо в облаке. При этом вам не требуется установка никаких пакетов на свою машину, а работать можно прямиком из браузера. Вот ссылка:" ] }, { "cell_type": "markdown", "metadata": { "id": "06MQog3yhLut" }, "source": [ "https://colab.research.google.com" ] }, { "cell_type": "markdown", "metadata": { "id": "5_hfWXKPhLut" }, "source": [ "При использовании вы увидете много сходств с jupyter ноутбуком. Одним из преимуществ является доступность GPU, соответствующую опцию можно активировать в настройках сервиса. При желании вы сможете найти в интернете много туториалов по использованию или разобраться самостоятельно =)" ] }, { "cell_type": "markdown", "metadata": { "id": "sUe2vnFGhLuu" }, "source": [ "## 1. Табличные данные и Pandas" ] }, { "cell_type": "markdown", "metadata": { "id": "DJQzjjqJhLuu" }, "source": [ "Pandas — удобная библиотека для работы с табличными данными в Python, если данных не слишком много и они помещаются в оперативную память вашего компьютера. Несмотря на неэффективность реализации и некоторые проблемы, библиотека стала стандартом в анализе данных.\n", "\n", "Основной объект в pandas — это DataFrame, представляющий собой таблицу с именованными колонками различных типов, индексом (может быть многоуровневым). DataFrame можно создавать, считывая таблицу из файла или задавая вручную из других объектов.\n", "\n", "В этой части потребуется выполнить несколько небольших заданий. Можно пойти двумя путями: сначала изучить материалы, а потом приступить к заданиям, или же разбираться \"по ходу\". Выбирайте сами.\n", "\n", "Материалы:\n", "1. [Pandas за 10 минут из официального руководства](http://pandas.pydata.org/pandas-docs/stable/10min.html)\n", "2. [Документация](http://pandas.pydata.org/pandas-docs/stable/index.html) (стоит обращаться, если не понятно, как вызывать конкретный метод)\n", "3. [Примеры использования функционала](http://nbviewer.jupyter.org/github/justmarkham/pandas-videos/blob/master/pandas.ipynb)\n", "\n", "Многие из заданий можно выполнить несколькими способами. Не существуют единственно верного, но попробуйте максимально задействовать арсенал pandas и ориентируйтесь на простоту и понятность вашего кода. Мы не будем подсказывать, что нужно использовать для решения конкретной задачи, попробуйте находить необходимый функционал сами (название метода чаще всего очевидно). В помощь вам документация, поиск и stackoverflow." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "26zbFY25hLuv", "outputId": "404c22c6-2696-48ab-c71e-7a3ffbc36b18" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Populating the interactive namespace from numpy and matplotlib\n" ] } ], "source": [ "%pylab inline\n", "import pandas as pd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Перед выполнением задания необходимо ознакомиться с первым семинаром (seminars/sem01-pandas.ipynb) .\n", "\n", "Это поможет вам получить общее понимание происходяшего и успешнее справиться с заданием.\n", "\n", "Также успешному выполнению способствует внимательное чтение текста задания от начала до конца.\n", "\n", "Удачи!" ] }, { "cell_type": "markdown", "metadata": { "id": "dneJl9TyhLuv" }, "source": [ "Скачаем подготовленные на семинаре данные:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "rj_I0RslhLuw" }, "outputs": [], "source": [ "!wget -O 'end_seminar.xlsx' -q 'https://www.dropbox.com/s/f4rm8sjc3v99p0m/_end_seminar.xlsx?dl=0'" ] }, { "cell_type": "markdown", "metadata": { "id": "5hp7bn_ThLuw" }, "source": [ "Для пользователей Windows: скачайте файл самостоятельно и поместите его в папку с тетрадкой. Или попробуйте один из следующих вариантов:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "4h4_BaX8hLuw" }, "outputs": [], "source": [ "# !powershell iwr -outf somefile https://somesite/somefile" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "7bHroLGChLuw" }, "outputs": [], "source": [ "# !pip install wget\n", "# import wget \n", "# wget.download('https://dropbox.com/s/f4rm8sjc3v99p0m/_end_seminar.xlsx?dl=1', 'end_seminar.xlsx')" ] }, { "cell_type": "markdown", "metadata": { "id": "VFs_6IythLux" }, "source": [ "##### В первой части задания (до раздела \"Распределение студентов по курсам\") использование циклов запрещается и повлечет за собой снижение оценки. Использование vectorize и apply, apply_along_axis крайне нежелательно." ] }, { "cell_type": "markdown", "metadata": { "id": "shFkfJkohLux" }, "source": [ "Для каждой задачи из этого раздела вы должны написать код для получения ответа, а также дать текстовый ответ, если он предполагается.\n", "\n", "На некоторые вопросы вы можете получить путём пристального взгляда на таблицу, но это не будет засчитываться. Вы в любом случае должны получить ответ с помощью кода." ] }, { "cell_type": "markdown", "metadata": { "id": "gDD85M7bhLux" }, "source": [ "#### 1. [0 баллов] Откройте файл с таблицей (не забудьте про её формат). Выведите последние 10 строк.\n", "\n", "Посмотрите на данные и скажите, что они из себя представляют, сколько в таблице строк, какие столбцы? (на это не надо отвечать, просто подумайте об этом)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "PKulur3LhLuy" }, "outputs": [], "source": [ "# your code" ] }, { "cell_type": "markdown", "metadata": { "id": "jPiMwyqHhLuy" }, "source": [ "#### 2. [0.5 балла] Есть ли в данных пропуски? В каких колонках? Сколько их в каждой из этих колонок?" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "edY1RrSOhLuy" }, "outputs": [], "source": [ "# your code" ] }, { "cell_type": "markdown", "metadata": { "id": "B5ORhP2uhLuz" }, "source": [ "Заполните пропуски пустой строкой для строковых колонок и нулём для числовых (постарайтесь избежать перечисления названий всех столбцов)." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "TlF_JJ2ghLuz" }, "outputs": [], "source": [ "# your code" ] }, { "cell_type": "markdown", "metadata": { "id": "w5ELhkT1hLuz" }, "source": [ "#### 3. [0.5 балла] Посмотрите повнимательнее на колонку 'is_first_time'. \n", "\n", "Есть ли в ней ответы \"Нет\"? Сколько их?\n", "\n", "Если вы найдете повторные обращения студентов, оставьте только самую позднюю версию. В дальнейших заданиях используйте версию данных без повторов.\n", "\n", "Обращения со значением \"Нет\" в 'is_first_time' могут быть как повторными, так и первичными, поскольку поле заполняли сами студенты." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "id": "VEfiNsyQhLuz" }, "outputs": [], "source": [ "# your code" ] }, { "cell_type": "markdown", "metadata": { "id": "Jhk3tVpVhLuy" }, "source": [ "#### 4. [0.5 балла] Ответьте на вопросы:\n", "1. Сколько было заявок из групп 18-го года набора, а сколько из групп 17-го года?\n", "2. Есть ли студенты с равными перцентилями (среди объединенных данных, ведь конкурс на каждый курс общий)?" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "bsn4vn8RhLuy" }, "outputs": [], "source": [ "# your code" ] }, { "cell_type": "markdown", "metadata": { "id": "IlzHp3HVhLuz" }, "source": [ "#### 5. [0.5 балла] Какие blended-курсы для четверокурсников существуют? На какой blended-курс записалось наибольшее количество студентов? На каком из blended-курсов собрались студенты с самым высоким средним рейтингом (выведите этот курс и количество студентов на нем)? " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "j_BRWerHhLu0" }, "outputs": [], "source": [ "# your code" ] }, { "cell_type": "markdown", "metadata": { "id": "IU_FLt8HhLu0" }, "source": [ "#### 6. [1 балл] Выясните, есть ли студенты с абсолютно одинаковыми предпочтениями по всем курсам.\n", "\n", "Для этого сформируйте таблицу, где для каждого возможного набора курсов посчитано количество студентов, выбравших такой набор, и оставьте только строки где это количество больше 1.\n", "\n", "В данном случае набор курсов задается упорядоченным множеством ('fall_1', 'fall_2', 'fall_3', 'spring_1', 'spring_2', 'spring_3', 'blended'). Элемент blended будет нулевым для 3-го курса." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "BBDlR1mFhLu0" }, "outputs": [], "source": [ "# your code" ] }, { "cell_type": "markdown", "metadata": { "id": "spu3r3vchLu0" }, "source": [ "#### 7. [0.5 балла] Найдите курсы по выбору, на которые записывались как студенты 18-го года набора, так и студенты 17-го года." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "t21fWi8ShLu0" }, "outputs": [], "source": [ "# your code" ] }, { "cell_type": "markdown", "metadata": { "id": "PYfX-Dr5hLu0" }, "source": [ "Методом исключения найдите курсы, которые предлагались только студентам 18-го года и только студентам 17-го года." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "G9SWBOpehLu1" }, "outputs": [], "source": [ "# your code" ] }, { "cell_type": "markdown", "metadata": { "id": "uL45Tg5fhLu1" }, "source": [ "### Визуализации и matplotlib" ] }, { "cell_type": "markdown", "metadata": { "id": "MY9lKmP2hLu1" }, "source": [ "При работе с данными часто неудобно делать какие-то выводы, если смотреть на таблицу и числа в частности, поэтому важно уметь визуализировать данные. Здесь будут описаны ключевые правила оформления графиков для **всех** домашних заданий.\n", "\n", "У matplotlib, конечно же, есть [документация](https://matplotlib.org/users/index.html) с большим количеством [примеров](https://matplotlib.org/examples/), но для начала достаточно знать про несколько основных типов графиков:\n", "- plot — обычный поточечный график, которым можно изображать кривые или отдельные точки;\n", "- hist — гистограмма, показывающая распределение некоторой величины;\n", "- scatter — график, показывающий взаимосвязь двух величин;\n", "- bar — столбцовый график, показывающий взаимосвязь количественной величины от категориальной.\n", "\n", "В этом задании вы попробуете построить один из них. Не забывайте про базовые принципы построения приличных графиков:\n", "- оси должны быть подписаны, причём не слишком мелко;\n", "- у графика должно быть название;\n", "- если изображено несколько графиков, то необходима поясняющая легенда;\n", "- все линии на графиках должны быть чётко видны (нет похожих цветов или цветов, сливающихся с фоном);\n", "- если отображена величина, имеющая очевидный диапазон значений (например, проценты могут быть от 0 до 100), то желательно масштабировать ось на весь диапазон значений (исключением является случай, когда вам необходимо показать малое отличие, которое незаметно в таких масштабах);\n", "- сетка на графике помогает оценить значения в точках на глаз, это обычно полезно, поэтому лучше ее отрисовывать;\n", "- если распределение на гистограмме имеет тяжёлые хвосты, лучше использовать логарифмическую шкалу.\n", "\n", "Еще одна билиотека для визуализации: [seaborn](https://jakevdp.github.io/PythonDataScienceHandbook/04.14-visualization-with-seaborn.html) (обычно сокращается до sns). Это настройка над matplotlib, иногда удобнее и красивее делать визуализации через неё. \n", "\n", "**5 пунктов после которых ваши графики не будут прежними:**\n", "- для красивой картинки %config InlineBackend.figure_format = 'retina'\n", "- задаем размер (почти) всех графиков (можно выбрать другие значения) plt.rcParams['figure.figsize'] = 8, 5\n", "- размер шрифта подписей графиков plt.rcParams['font.size'] = 12\n", "- формат в котором сохраняется изображение mpl.rcParams['savefig.format'] = 'pdf'\n", "- sns – seaborn, добавляет решетку sns.set_style('darkgrid')\n", "\n", "Добавьте эти функции в ячейку ниже. Каждый график все равно придется настраивать отдельно, но указанные строчки позволят значительно упростить процесс. " ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "id": "na9doUOFhLu1" }, "outputs": [], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "\n", "# your code" ] }, { "cell_type": "markdown", "metadata": { "id": "kikwLpxfhLu1" }, "source": [ "#### 8. [0.5 балла] Постройте график средних рейтингов по дням получения ответов (bar plot)." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "UTPLVeQvhLu2" }, "outputs": [], "source": [ "# your code" ] }, { "cell_type": "markdown", "metadata": { "id": "AmsQg9_xhLu2" }, "source": [ "Сохраните график в формате pdf (так он останется векторизованным)." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "vKZNSwWghLu2" }, "outputs": [], "source": [ "# your code" ] }, { "cell_type": "markdown", "metadata": { "id": "sCgWwjl0hLu2" }, "source": [ "### 2. Распределение студентов по курсам." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "!!!ВНИМАТЕЛЬНО ИЗУЧИТЕ ТЕКСТ НИЖЕ!!!.\n", "\n", "Если во время выполнения заданий у вас вознинут вопросы -- еще раз перечитайте текст целиком, скорее всего ответы уже содержатся в нем." ] }, { "cell_type": "markdown", "metadata": { "id": "VNqXUpr4hLu3" }, "source": [ "Теперь вам нужно распределить студентов по осенним курсам по выбору, учитывая их предпочтения." ] }, { "cell_type": "markdown", "metadata": { "id": "5cAR2FgphLu3" }, "source": [ "Алгоритм распределения студентов по курсам:\n", "1. По умолчанию на каждой дисциплине по выбору у 3 и 4 курсов может учиться 1 группа (до 30 студентов). Исключения описаны ниже. На blended-дисциплинах для четверокурсников количество мест не ограничено.\n", "2. Проводится первая волна отбора. Для каждой дисциплины формируется список тех, кто указал её первым приоритетом (если студент должен выбрать два курса по выбору, то для него дисциплины, которые он указал первым и вторым приоритетом, рассматриваются как дисциплины первого приоритета). Если желающих больше, чем мест, то выбирается топ по перцентилю рейтинга.\n", "3. На дисциплинах, где остались места после первой волны, формируются списки тех, кто выбрал их вторым приоритетом и еще не прошел на необходимое количество курсов. Места заполняются лучшими по перцентилю рейтинга студентами. После этого проводится такая же процедура для дисциплин третьего приоритета.\n", "4. Если студент не попал на необходимое количество курсов по итогам трёх волн, с ним связывается учебный офис и решает вопрос в индивидуальном порядке." ] }, { "cell_type": "markdown", "metadata": { "id": "BiNKVwS6hLu3" }, "source": [ "Обращаем ваше внимание на следующие детали:\n", "- Конкурс на каждый курс общий для 3-го и 4-го курса\n", "\n", "- По умолчанию студент выбирает один осенний и один весенний курс по выбору, а также четверокурсники выбирают один blended-курс. Студенты групп 17-го года специализаций МОП и ТИ выбирают по 2 осенних и 2 весенних курса по выбору, также студенты групп 18' специализации МИ выбирают 2 осенних курса. Для студентов, которые выбирают 2 курса (например, осенних) первый приоритет — fall_1 и fall_2, второй приоритет — fall_3. Такие студенты участвуют только в двух волнах отбора.\n", "\n", "- Студенты специализации МОП не могут выбрать весенним курсом по выбору Машинное обучение 2. **Если студент специализации МОП выбрал Машинное обучение 2, то его приоритеты сдвигаются.** Из-за совпадений первого и второго курса по выбору двигать приоритеты не надо.\n", "\n", "- Blended-курсы не трогайте, по ним не надо распределять, на другие курсы они никак не влияют.\n", "\n", "- Заведомо известно, что в процессе распределения не возникнет ситуации, когда на одно место претендуют студенты с одинаковым перцентилем.\n", "\n", "- Постарайтесь воздержаться от использования циклов там, где это возможно. Допустимо итерироваться по курсам, на которые проводится отбор, и по волнам отбора. Если вы придумаете, как обойтись и без этих циклов, то на усмотрение проверяющего могут быть добавлены бонусные баллы. Дублирование кода не признается успешным избавлением от циклов\n", "\n", "- На выходе ожидается файл res_fall.csv с результатами распределения на осенние курсы по выбору. Файл должен быть следующего формата:\n", "\n", " * Три колонки: ID, course1, course2\n", " \n", " * Если студент не попал на курс, но должен был, то вместо названия курса в ячейке должна быть строка \"???\"\n", " \n", " * Если студент должен выбрать только один курс, то в колонке course2 для него должна стоять строка \"-\"\n", " \n", " * Если студент должен выбрать два курса по выбору, то порядок в колонках course1 и course2 не важен.\n", " \n", " * hint: для сохранения воспользуйтесь df.to_csv('solution.csv', index=None)\n", " \n", "\n", "Для работы вам могут понадобиться следующие данные:\n", "\n", "- Результаты опроса (вы уже использовали этот файл в первой части задания, но на всякий случай ссылка: https://www.dropbox.com/s/f4rm8sjc3v99p0m/_end_seminar.xlsx?dl=0)\n", "\n", "- Соответствие номеров групп специализациям:\n", "\n", " * 171, 172 - МОП; 173 - ТИ; 174 — АДИС; 175, 176 — РС; 177 — АПР\n", " \n", " * У студентов 18-го года номера групп соответствуют номерам до распределения по специализациям. Это означает, что по номеру группы 18* нельзя однозначно определить специализацию студента. При этом в рамках распределения важно знать информацию только о двух из них: МОП и МИ. Эти знание можно получить из колонок 'is_ml_student\n", "' и 'is_mi' соответственно.\n", "\n", "- Ограничения по количеству мест на курсах по выбору:\n", "\n", " * Осенние: везде 30 мест, кроме Statistical Learning Theory (60 мест), Высокопроизводительных вычислений (60 мест), Анализа неструктурированных данных ($\\infty$ мест)\n", "\n", " * Весенние: везде 30 мест, кроме Обучения с подкреплением (60 мест), Анализа данных в бизнесе (60 мест).\n", "\n", "\n", "Кстати, убедитесь, что в данных больше нет пропусков и повторных записей." ] }, { "cell_type": "markdown", "metadata": { "id": "o5t55IcQhLu4" }, "source": [ "#### 0. Проверка\n", "\n", "Для начала давайте убедимся, что вы успешно выполнили задания первой части и проверим ваши данные на наличие пропусков и повторов:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "34HWEdVdhLu4" }, "outputs": [], "source": [ "assert df.shape[0] == 347, 'В таблице остались повторы или потеряны данные'\n", "\n", "assert df.isna().sum().sum() == 0, 'В таблице остались пропуски'" ] }, { "cell_type": "markdown", "metadata": { "id": "_ImUFyG3hLu4" }, "source": [ "Если вы не получили AssertionError, то можете продолжать." ] }, { "cell_type": "markdown", "metadata": { "id": "LTGSwwvAhLu4" }, "source": [ "#### 1. [1 балл] Создайте новый признак, обозначающий, сколько осенних курсов должен выбрать студент\n", "\n", "В этом вам может помочь информация о специализации и группе стундента." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "ouxo0kHFhLu4" }, "outputs": [], "source": [ "# ( ̄^ ̄)ゞ" ] }, { "cell_type": "markdown", "metadata": { "id": "S47aq1sQhLu4" }, "source": [ "Проверка:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "OlOgzDKDhLu5" }, "outputs": [], "source": [ "col_name = # insert your new column name as str\n", "\n", "assert(df[df['id'] == '2662600c2c37e11e62f6ee0b88452f22'][col_name] == 2).all()\n", "assert(df[df['id'] == 'd555d2805e1d93d4f023e57dc4c8f403'][col_name] == 2).all()\n", "assert(df[df['id'] == '8fe79f84f36e3a5d2d6745621321302c'][col_name] == 1).all()\n", "assert(df[df['id'] == 'e4caca755ee0bdd711e18fb8084958b5'][col_name] == 1).all()" ] }, { "cell_type": "markdown", "metadata": { "id": "VtQYhwuPhLu5" }, "source": [ "#### 2. [2 балла] Распределите студентов в соответствии с первым приоритетом" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "6gWfT3vqhLu5" }, "outputs": [], "source": [ "# ( ̄^ ̄)ゞ" ] }, { "cell_type": "markdown", "metadata": { "id": "vc5zXP5hhLu5" }, "source": [ "Здесь для проверки приведена таблица, в которой есть 2 дополнительные колонки:\n", " \n", " 1) is_first_place - является ли студент лучшим по перцентили хотя бы на одном из курсов, куда он был зачислен \n", " (True / NaN)\n", " \n", " 2) is_last_place - является ли студент худшим по перцентили хотя бы на одном из курсов, куда он был зачислен (True / NaN)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "uZTkGEq5hLu5" }, "outputs": [], "source": [ "!wget -O '2_task_check.csv' -q 'https://www.dropbox.com/s/v8o2zzq3iz5gc9w/_2_task_check.csv?dl=0'\n", "check_df = pd.read_csv('2_task_check.csv')" ] }, { "cell_type": "markdown", "metadata": { "id": "E_fbyB9qhLu5" }, "source": [ "После распределения студентов в соответствии с первым приоритетом добавьте в свой датафрейм аналогичные признаки и запустите проверку:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "GOAzQeYehLu6" }, "outputs": [], "source": [ "fir_col_name = # insert name of your new column with is_first_place as str\n", "last_col_name = # insert name of your new column with is_last_place as str\n", "\n", "\n", "assert((df[df[fir_col_name].isna() == False][['id']].sort_values('id').reset_index(drop=True)\n", " ==\n", " check_df[check_df['is_first_place'].isna() == False][['id']].sort_values('id').reset_index(drop=True)\n", " ).id.values).all()\n", "\n", "\n", "assert((df[df[last_col_name].isna() == False][['id']].sort_values('id').reset_index(drop=True)\n", " == \n", " check_df[check_df['is_last_place'].isna() == False][['id']].sort_values('id').reset_index(drop=True)\n", " ).id.values).all()" ] }, { "cell_type": "markdown", "metadata": { "id": "RO6DwNNFhLu6" }, "source": [ "#### 3. [3 балла] Проведите все три волны отбора студентов на курсы по выбору" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "jn2OOrLjhLu6" }, "outputs": [], "source": [ "# ( ̄^ ̄)ゞ" ] }, { "cell_type": "markdown", "metadata": { "id": "1xQjV9BuhLu6" }, "source": [ "**Отправьте свой файл res_fall.csv в контест (https://contest.yandex.ru/contest/40211/problems/A/) и прикрепите/укажите ниже ваш никнейм и ссылку на успешную посылку.**" ] }, { "cell_type": "markdown", "metadata": { "id": "QRTbPrgbhLu6" }, "source": [ "*Дисклеймер:*\n", "\n", "Успешная посылка в контесте является **обязательным** условием получения полного балла за этот (и следующий) пункт. Если добиться успешной посылки не удастся, баллы будут выставляться на усмотрение проверяюшего. \n", "\n", "При этом ОК в контесте не гарантирует полный балл. Оценка всё равно может быть снижена в случае обнаружения неэффективностей или ошибок в коде. Если вы сдадите в AnyTask очевидно неработающий код или ноутбук без кода, но при этом в контест будет сдан корректный файл, то это будет расцениваться как плагиат." ] }, { "cell_type": "markdown", "metadata": { "id": "1IkQa_gdhLu6" }, "source": [ "На всякий случай просим вас сдать вместе с ноутбуком файл res_fall.csv в anytask" ] }, { "cell_type": "markdown", "metadata": { "id": "k8d711qGhLu7" }, "source": [ "**Дополнительное задание. [2 бонусных балла] Распределите таким же образом студентов еще и на весенние курсы по выбору.**\n", "\n", "Если ваш код был хорошо структурирован, то это не составит проблем. \n", "\n", "Если вы выполнили это задание, сдайте среди прочего файл res_spring.csv в таком же формате, как и res_fall.csv." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "hwmusOGThLu7" }, "outputs": [], "source": [ "# ( ̄^' ̄)ゞ" ] }, { "cell_type": "markdown", "metadata": { "id": "It7QQZLYhLu7" }, "source": [ "**Отправьте свой файл res_spring.csv в контест (https://contest.yandex.ru/contest/40211/problems/B/) и прикрепите/укажите ниже ваш никнейм и ссылку на успешную посылку.**" ] }, { "cell_type": "markdown", "metadata": { "id": "1YcouVTihLu7" }, "source": [ "На всякий случай просим вас сдать вместе с ноутбуком файл res_spring.csv в anytask" ] }, { "cell_type": "markdown", "metadata": { "id": "uY_OY6inhLu7" }, "source": [ "Вставьте картинку, описывающую ваш опыт выполнения этого задания:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "R9_7CnSFhLu7" }, "outputs": [], "source": [] } ], "metadata": { "colab": { "name": "homework-practice-01-pandas.ipynb", "provenance": [] }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.4" }, "varInspector": { "cols": { "lenName": 16, "lenType": 16, "lenVar": 40 }, "kernels_config": { "python": { "delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())" }, "r": { "delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) " } }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false }, "vscode": { "interpreter": { "hash": "e7370f93d1d0cde622a1f8e1c04877d8463912d04d973331ad4851f04de6915a" } } }, "nbformat": 4, "nbformat_minor": 1 }