Домашняя работа №9

In [1]:
import numpy as np
import pandas as pd

Правила игры:

Мы составили для вас несложные задачи, которые, как нам кажется, списывать было бы совсем стыдно.

Вам разрешается пользоваться любыми источниками информации (Python Docs, StackOverflow, etc.), кроме ваших коллег.

Если домашние задания будут идеально совпадать, то они могут быть аннулированы на усмотрение преподавателя.

Дедлайн:

Домашнее задание по NumPy нужно отправить на почту pddrandomshuffle@gmail.com до 23:59:59 28 апреля 2020.

Проектное домашнее задание по Pandas нужно отправить на почту pddrandomshuffle@gmail.com до 23:59:59 19 мая 2020.

Рекомендуется отправлять задания вместе, но вы можете прислать отдельно часть по NumPy, и отдельно - по Pandas.

Тема письма должна быть "Фамилия Имя - ДЗ-9".

К письму нужно прикрепить эту Jupyter-тетрадь с названием "Family_Name_hw9.ipynb" и (для части Pandas) ваш файл с датасетом с тем же названием, как вы используете в коде. Файлы должны лежать в zip-архиве в папке "Family_Name". Пример:

Alexey_Popov.zip
|-- Alexey_Popov
    |-- Alexey_Popov_hw9.ipynb
    |-- titanic_train.csv
    |-- titanic_test.csv        # не нужен, если не используется в коде

Задание 1. (0.5 балла)

В переменной shape указан размер массива, а в переменной filler указано некоторое (не обязательно числовое) значение. В одну строку кода создайте массив numpy.array размера shape, состоящего из значений filler. Массив поместите в переменную data.

In [2]:
shape = (2, 8, 4)
filler = 19
In [3]:
# your code goes here

[проверка]

In [4]:
data
Out[4]:
array([[[19, 19, 19, 19],
        [19, 19, 19, 19],
        [19, 19, 19, 19],
        [19, 19, 19, 19],
        [19, 19, 19, 19],
        [19, 19, 19, 19],
        [19, 19, 19, 19],
        [19, 19, 19, 19]],

       [[19, 19, 19, 19],
        [19, 19, 19, 19],
        [19, 19, 19, 19],
        [19, 19, 19, 19],
        [19, 19, 19, 19],
        [19, 19, 19, 19],
        [19, 19, 19, 19],
        [19, 19, 19, 19]]])

Задание 2. (0.5 балла)

Буратино закопал золотые монеты на Поле Чудес, и решил отметить закопанные места в переменной field типа numpy.array. К несчастью, будучи самому себе Буратино, он записал места в одномерном массиве. Преобразуйте этот массив в массив истинности my_map для Поля (двухмерную карту), если вы знаете, что на Поле Чудес a грядок (рядов).

In [5]:
np.random.seed(777)
field = np.random.randint(0, 2, size=(42,))
a = 7
In [6]:
# your code goes here

[проверка]

In [7]:
my_map
Out[7]:
array([[ True,  True,  True, False,  True,  True],
       [ True,  True,  True, False,  True,  True],
       [False, False, False,  True, False,  True],
       [False, False,  True,  True, False, False],
       [ True,  True,  True,  True,  True,  True],
       [False, False, False, False,  True,  True],
       [False, False, False, False, False, False]])

Задание 3. (1 балл)

Васе необходимо произвести матричное умножение двумерных NumPy-массивов a и b. К несчастью, Вася случайно изменил размер массива b так, что он не обладает корректными размерами (и, возможно, размерностью) для выполнения умножения. Измените размер (shape) массива b и выполните матричное умножение за Васю; результат выведите на экран.

In [8]:
np.random.seed(777)
a = np.random.randint(-10, 10, (13, 28))
b = np.random.randint(-5, 5, 224)
In [9]:
# your code goes here
[[  77  125   53  -11  -72   59  240  120]
 [ 113   81   32 -221  -58   99    6    2]
 [  44   40  114  -80   16  -47 -111  192]
 [ -47   97    1   43   37  157   37    2]
 [-158   44   37  113   65  116 -109  -74]
 [ -64  125  148  -42 -144  -62  -29  126]
 [  79   94  -27   89 -145  185    1 -133]
 [-136 -106  -78  -35   14   76  -86 -193]
 [  89   36   29  109   61  -20  -90    4]
 [ -65   19  -13  -16   96  244   12  -95]
 [-143  100  -33  109   66  110   65   25]
 [ -17   41  -73   63  179  233  104 -228]
 [ 144  -28  -56   47   96  -52  147  -86]]

[проверка]

[[  77  125   53  -11  -72   59  240  120]
 [ 113   81   32 -221  -58   99    6    2]
 [  44   40  114  -80   16  -47 -111  192]
 [ -47   97    1   43   37  157   37    2]
 [-158   44   37  113   65  116 -109  -74]
 [ -64  125  148  -42 -144  -62  -29  126]
 [  79   94  -27   89 -145  185    1 -133]
 [-136 -106  -78  -35   14   76  -86 -193]
 [  89   36   29  109   61  -20  -90    4]
 [ -65   19  -13  -16   96  244   12  -95]
 [-143  100  -33  109   66  110   65   25]
 [ -17   41  -73   63  179  233  104 -228]
 [ 144  -28  -56   47   96  -52  147  -86]]

Задание 4. (2 балла)

В вашем распоряжении массив A - двумерный numpy.array со абсолютными значениями экспрессии генов (штуки ридов) в различных тканях. По колонкам записаны секвенирования, по строкам - гены.

Ваша задача - для каждого секвенирования найти максимальный log10 CPM (log10 read count per million) гена при условии, что каждому риду был присвоен ровно один ген.

В ответе необходимо вывести на экран одномерный массив максимальных log10 CPM.

Указание: чтобы посчитать log10 CPM, необходимо разделить количество ридов на общее количество в секвенировании, умножить на миллион и взять от этого логарифм по основанию 10.

In [10]:
np.random.seed(777)
A = np.random.randint(1, 180, (100, 15))
In [11]:
# your code goes here
[4.27678423 4.33529501 4.27503026 4.31370524 4.27590935 4.29846578
 4.31450987 4.32934996 4.29381164 4.28982116 4.28084022 4.29586866
 4.28917056 4.31112273 4.26914307]

[проверка]

[4.27678423 4.33529501 4.27503026 4.31370524 4.27590935 4.29846578
 4.31450987 4.32934996 4.29381164 4.28982116 4.28084022 4.29586866
 4.28917056 4.31112273 4.26914307]

Задание 5. (1 балл)

В университете Вова плохо учил статистику и покупает лотерейные билеты. Несмотря на это, Вова хорошо знает программирование, поэтому он записал все купленные им билеты в массив numpy.array lottery. В этом массиве в строках перечислены числа в билете (их всегда одинаковое количество).

Найдите на экран номера всех билетов, в которых отмечено несчастливое для Вовы число 13. Номера должны идти по возрастанию через запятую с пробелом. Нумерация билетов начинается с 1.

In [12]:
np.random.seed(777)
lottery = np.random.choice(90, size=(50, 30))
In [13]:
# your code goes here
1, 7, 8, 13, 26, 27, 30, 31, 32, 34, 39, 48

[проверка]

1, 7, 8, 13, 26, 27, 30, 31, 32, 34, 39, 48

Задание 6. (до 20 баллов, минимум 4)

Творческое задание на навыки работы с библиотекой Pandas.

Что необходимо сделать:

  1. Зайдите на сайт https://www.kaggle.com/ или другой ресурс и скачайте там какой-либо понравившийся вам датасет. Вы также можете взять собственные данные, если дадите их подробное описание. Отметьте выбранный вами датасет в таблице: https://docs.google.com/spreadsheets/d/171z55AMZtcNZ9_JhFI4dHFoAiNOUdIYY2-DJSoD1eKo/edit#gid=0. Не выбирайте датасет, который уже кем-то выбран! Помните, что часто данные делятся на train и test, вам обычно нужна только часть train. Данные должны удовлетворять следующим условиям:
    • В датасете присутствует как минимум 1000 записей,
    • Для записей присутствует как минимум один категориальный признак (желательно два или три),
    • Как минимум три числовых признака,
    • Данные имеют понятный смысл (это не должны быть данные с БАК со странными буквенными кодами, понятные только специалистам).
  2. Выбрав датасет, загрузите его и проведите EDA (exploratory data analysis). За проведение красивого анализа данных (возможно, даже с графиками) будут начислены дополнительные баллы.
  3. Если вы не знаете, что делать, вот определенный минимум информации, которую нужно будет извлечь:
    1. Посмотрите на параметры распределений числовых признаков - их средние, максимумы, минимумы, медианы, дисперсии и т.д. Также можно построить графики (какие?) наиболее интересных распределений (необязательно).
    2. Посмотрите на наиболее крупные/мелкие/значительные/редкие/и т.п. записи по какому-либо из критериев (не увлекайтесь).
    3. Посмотрите на параметры этих распределений в группировке по категориальным переменным.
    4. Если в вашем датасете есть несколько категориальных признаков, составьте наиболее осмысленную сводную таблицу по двум из них.
    5. * Примените какой-либо разумный фильтр по одному из признаков в виде функции и проведите анализ отфильтрованных данных.
    6. *** Задание для интересующихся: Для многих датасетов часто присутствует часть test. В этой части не указан один или несколько признаков (обычно категориальных или числовых). Попробуйте предсказать значения этого пропущенного признака по другой части датасета (train) с помощью математической модели. Помните, что выполнение этого задания потребует больших временных затрат! Библиотека моделей для обучения называется scikit-learn.
    7. * Сформулируйте какую-либо разумную статистическую гипотезу и подтвердите/отклоните ее (посчитайте P-value, воспользовавшись модулем scipy).

Пункты, помеченные астериском, необязательные. Естественно, некоторые "обязательные" пункты из этого минимума, возможно, не будут иметь смысла для ваших данных, а другие могут, наоборот, быть очень познавательными. Сделайте все, что посчитаете нужным, и если у вас получится хоть сколько-нибудь внятный анализ, то задание будет зачтено. Дополнительные баллы будут ставиться за осмысленный анализ и демонстрацию хорошего владения модулями, в том числе сторонними.

Если вы решили выполнять пункт 3.F., можете обращаться к преподавателям за советом по поводу выбора модели для ваших данных.

In [14]:
# your code goes here