В этом домашнем задании вам предстоит закрепить навыки работы с важнейшими для datascience-библиотеками — numpy, pandas и matplotlib.
Внимание! Часть заданий необходимо сдать в Яндекс.контест
import numpy as np
Задания 1-10 оцениваются в 0.4 баллов.
Задание 1. Создайте несколько одномерных массивов размера $10^n$ для n от 1 до 6. из случайных чисел при помощи модуля np.random
. Заполните их независимыми случайными величинами из нормального распределения с матожиданием 5 и дисперсией 10.
### YOUR CODE
В заданиях 2-10 запрещается использование циклов for
и while
в сдаваемом вами коде.
Задание 2. Сгенерируйте случайный вектор (одномерный массив) из нормального распределения со средним в нуле и произвольной дисперсией. С помощью np.where
замените в созданном массиве все отрицательные элементы на нули.
### YOUR CODE
Задание 3. Дан массив 10х3, который будет использован как массив с цветами RGB (каждый канал обозначается целым числом от 0 до 255), однако вследствие порчи данных при передаче значения массива вышли за границы заданного диапазона. Напишите функцию clip_values
, которая вышедшие за границу диапазона значения превращает в ближашие границы диапазона.
Хинт: это можно сделать, дважды используя np.where
, но вообще есть специальная функция np.clip
ровно на такой случай.
def clip_values(image: np.ndarray) -> np.ndarray:
### YOUR CODE
pass
Задание 4. Сгенерируйте случайный вектор из нормального распределения со средним в нуле и произвольной дисперсией. С помощью np.insert
в встаьте в него на четные индексы нули.
### YOUR CODE
Задание 5. Создайте случайный массиив размера 4х4 из нормального распределения со средним в нуле и произвольной дисперсией и верните индексы положительных элементов (np.argwhere
)
### YOUR CODE
Задание 6. Создайте матрицу случайных целых чисел от в интервале от 1 до 10 размера 5х5 и посчитайте следующее (сабмодуль np.linalg
):
### YOUR CODE
Задания 7-10 необходимо сдать в Яндекс.контест и прикрепить ссылку на решение в формате https://contest.yandex.ru/contest/xxxxx/run-report/xxxxx/
. Сдавайте задания строго в соответствии с написанной сигнатурой и возвращаемыми типами. Для сдачи необходимо отправить в соответствующую задачу файл, содержащий функции и необходимые импорты. Обратите внимание, что вам доступен только numpy
. При сдаче выберите компилятор make2. При отсутствии ссылки на решение задание засчитано не будет!
Задание 7. Напишите функцию, которая находит сумму квадратов положительных элементов одномерного массива. https://contest.yandex.ru/contest/16930/problems/A/
Ссылка на посылку в контесте:
def get_squares(a: np.ndarray) -> float:
### YOUR CODE
pass
assert get_squares(np.array([1,-2,3])) == 10
Задание 8. Коля — мастер покера и умеет выигрывать только целые суммы денег от 0 до $n - 1$. Коля решил сыграть на турнире. На вход подаётся массив p
размера $n$, где p[i]
-- вероятность, что Коля выиграет на турнире $i$ рублей ($\sum_{i=1}^{n}p_i =1$, $p_i \geqslant 0, \forall i$). Посчитайте математическое ожидание выигрыша Коли на турнире.
https://contest.yandex.ru/contest/16930/problems/B/
Ссылка на посылку в контесте:
def expected_reward(p: np.ndarray) -> float:
### YOUR CODE
pass
assert expected_reward(np.array([0.4, 0.5, 0.1])) == 0.7
Задание 9. Дана квадратная матрица A
. Посчитайте произведение диагональных элементов матрицы, строго превосходящих среднее значение элементов всей матрицы.
https://contest.yandex.ru/contest/16930/problems/C/
Хинт: взять диагональ матрицы — np.diag()
, произведение элементов массива — np.prod()
, среднее значение в массиве — np.mean()
.
Ссылка на посылку в контесте:
def prod_upper_avg_diagonal(a: np.ndarray) -> float:
# YOUR CODE
assert prod_upper_avg_diagonal(np.array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])) == 150
Задание 10. Дано число $n$. Создайте матрицу $A$ размера $n \times n$ такую, что $A[i][j] = i \cdot j$. Нумерация строк и столбцов начинается с нуля.
https://contest.yandex.ru/contest/16930/problems/D/
Ссылка на посылку в контесте:
def create_ij(n: int) -> np.ndarray:
### YOUR CODE
assert np.all(create_ij(5) == np.array([[ 0, 0, 0, 0, 0],
[ 0, 1, 2, 3, 4],
[ 0, 2, 4, 6, 8],
[ 0, 3, 6, 9, 12],
[ 0, 4, 8, 12, 16]]))
Задание 11. (1 балл) Выберите 5 функций из заданий 3 и 7-10 и имплементируйте их, но без использования сторонних библиотек (считайте, что вам доступны только стандартные библиотеки языка Питон и на вход вместо массивов подаются питоновские списки).
### YOUR CODE
Задание 12. (3 балла) Сравните время работы векторизованных функций с обычными. Для этого постройте графики зависимости времени исполнения функции от размера входного массива. Перебирайте значения от 1 до $10^6$ по логарифмической шкале. Сделайте выводы.
Графики должны быть опрятными!. Подписывайте оси, и единицы измерения, указывайте легенду и название графика. Оценка за задание с неопрятными графиками может быть снижена! Сравнение плохого и хорошего графиков:
Хинт: воспользуйтесь библиотекой time
или мэджиком %timeit
.
# YOUR CODE
Вывод:
Задания 13-22 оцениваются в 0.4 баллов. В заданиях 13-22 запрещается пользоваться циклами for
и while
в сдаваемом вами коде. Задания 13-15 также сдаются в контест с компилятором python3.6+numpy+pandas. В конце сдаваемого вами файла должны быть строки
import sys
exec(sys.stdin.read())
import pandas as pd
Задание 13, Дан датафрейм, в котором существует колонка 'email'
(строка, длиной не более 255). Напишите функцию, которая в заданном датафрейме заменяет все невалидные email'ы на "unknown@unknown.com". Валидным сичтается емэйл, выглядящий как [name]@[subdomain].[domain]
, где [name]
-- строка, содержащая латинские буквы, цифры, точки и знаки -
и _
, [subdomain]
и [domain]
-- строки, содержащие только латинские буквы и цифры. Длина строки [domain]
-- не больше 8 символов.
https://contest.yandex.ru/contest/16930/problems/E/
Хинт. Вопспользуйтесь методом .apply()
, в который передайте функцию для обрабоки одного email'a. Подробнее см. здесь. Можно использовать регулярные выражения, хотя можно обойтись и без них.
Ссылка на посылку в контесте:
def reset_emails(df: pd.DataFrame) -> pd.DataFrame:
### YOUR CODE
pass
import sys
exec(sys.stdin.read())
from pandas.testing import assert_frame_equal
import pandas as pd
assert_frame_equal(
reset_emails(
pd.DataFrame(
dict(
email=["ab12@cd.example", "ab@ab@ab", "hello", "this@is.mynewcooldomain"],
name=["Alice", "Bob", "Claudia", "Dan"],
)
)
),
pd.DataFrame(
dict(
email=[
"ab12@cd.example",
"unknown@unknown.com",
"unknown@unknown.com",
"unknown@unknown.com",
],
name=["Alice", "Bob", "Claudia", "Dan"],
)
),
)
Задание 14. Дан датафрейм, в котором существуют колонки 'age'
(возраст в годах, целое число) и 'income'
(число с плавающей точкой). Напишите функцию, которая вернёт средний заработок людей младше 18 лет.
https://contest.yandex.ru/contest/16930/problems/F/
Ссылка на посылку в контесте:
def get_mean_income(df: pd.DataFrame) -> float:
### YOUR CODE
pass
Задание 15. Дан датафрейм, в котором существуют колонки 'id'
(идентификатор пользователя, целое положительное число), 'age'
(возвраст в годах, целое число), 'sex'
(пол пользователя, строка, равная либо "Male"
, либо "Female"
, либо "Other"
), "favorite_color"
(любимый цвет пользователя, строка длиной не более 255). Найдите число различных любимых цветов у женщин младше 18 лет.
https://contest.yandex.ru/contest/16930/problems/G/
Ссылка на посылку в контесте:
def get_fav_color(df: pd.DataFrame) -> int:
### YOUR CODE
pass
В этом задании предлагается сделать разведочный анализ данных в датафрейме.
Мы будем работать с датасетом русскоязычных твитов. Скачайте данные по ссылке: https://www.dropbox.com/s/ou55qwyhbj1pdav/tweets.csv?dl=1
Корпус состоит из 12 столбцов:
id
: уникальный номер сообщения в системе twitter;tdate
: дата публикации сообщения (твита);tmane
: имя пользователя, опубликовавшего сообщение;ttext
: текст сообщения (твита);ttype
: тональность твита (положительная (1) или отрицательная (-1));trep
: количество реплаев к данному сообщению. В настоящий момент API твиттера не отдает эту информацию;tfav
: число сколько раз данное сообщение было добавлено в избранное другими пользователями;tstcount
: число всех сообщений пользователя в сети twitter;tfol
: количество фолловеров пользователя (тех людей, которые читают пользователя);tfrien
: количество друзей пользователя (те люди, которых читает пользователь);listcount
: количество листов-подписок в которые добавлен твиттер-пользователь.# For linux/google colab users -- download directly from the notebook
! wget -O tweets.csv "https://www.dropbox.com/s/ou55qwyhbj1pdav/tweets.csv?dl=1"
df = pd.read_csv("./tweets.csv")
df.head()
Задание 16. Создайте колонку 'tdif'
, равную разнице числа друзей и числа фолловеров у пользователя.
### YOUR CODE
Задание 16. Создайте датафрейм, в котором остались только строки с чётными номерами, и пронумеруйте их начиная с 0.
### YOUR CODE
Задание 17. Создайте датафрейм, в котором остались лишь твиты положительной тональности.
### YOUR CODE
Задание 18. Посчитайте число уникальных пользователей (пользователей с различными tmane
).
Хинт: воспользуйтесь np.unique
.
### YOUR CODE
Задание 19. Посчитайте основные статистики по числу подписчиков (фолловеров) при помощи метода .describe()
. Постройте гистограмму значений признака.
### YOUR CODE
Задание 20. Посчитайте число ретвитов в датасете (твитов, начинающихся с "RT @").
### YOUR CODE
Задание 21. Назовём длинными такой твит, что все более короткие твиты составляют по меньшей мере 80% от всего датасета. Найдите число длинных твитов.
### YOUR CODE
Задание 22. Постройте столбчатую диаграмму (или гистограмму) распределения числа твитов по месяцам. В какой месяц какого года было опубликовано больше всего твитов?
Хинт: Время в колонке tdate
— это Unix time, и оно отображает то, сколько секунд прошло с 00:00:00 1 января 1970 года. Для конвертации этого времени в удобный формат воспользуйтесь библиотекой datetime
.
### YOUR CODE
Задание 998. Вставьте ниже смешную картинку, желательно про машинное обучение.
Задание 999. Напишите ниже, чего вы ждёте от курса, какой формат лекций и семинаров вам более интересен, а также произвольные пожелания и предложения. Мы постараемся всё это учесть.