Один из главных прикладных навыков data science — умение работать с библиотеками вроде Pandas и NumPy. Собрали для вас несколько задач по этим библиотекам.
35К открытий38К показов
Вместе с факультетом Data Science GeekUniversity собрали для вас задачи для практики по самым популярным Python-библиотекам в Data Science: pandas, NumPy и DataTable. Решать задачи можно в любом порядке.
Обратите внимание, что у любой задачи может быть несколько способов решения. Чтобы посмотреть добавленный нами вариант решения, кликните по соответствующей кнопке. Все приведённые варианты написаны на Python 3.
Задачи по pandas
Задача 1
Как найти евклидово расстояние между двумя Series (точками) a и b, не используя встроенную формулу?
Ввод:
a = pd.Series([2, 4, 6, 8])
b = pd.Series([1, 3, 5, 7])
Ожидаемый вывод:
2.0
Вариант решения
# Ввод
a = pd.Series([2, 4, 6, 8]
b = pd.Series([1, 3, 5, 7])
# Решение
sum((a - b)**2)**.5
# Решение (с использованием функции из NumPy)
np.linalg.norm(a-b)
Задача 2
Как найти максимально возможное абсолютное значение корреляции каждого столбца с другими столбцами в df?
Как создать новый столбец, который содержит номера ближайших по евклидовому расстоянию столбцов?
Ввод:
df = pd.DataFrame(np.random.randint(1, 100, 16).reshape(4, 4), columns=list('efgh'), index=list('abcd'))
df
# e f g h
# a 51 57 11 15
# b 63 5 81 48
# c 7 63 98 88
# d 6 31 29 37
Ожидаемый вывод:
df
# e f g h nearest_row dist
# a 51 57 11 15 c 122.0
# b 63 5 81 48 a 94.0
# c 7 63 98 88 a 122.0
# d 6 31 29 37 c 92.0
Вариант решения
# Ввод
df = pd.DataFrame(np.random.randint(1, 100, 16).reshape(4, 4), columns=list('efgh'), index=list('abcd'))
import numpy as np
# Инициализация выводов
nearest_rows = []
nearest_distance = []
# Проход по строкам
for i, row in df.iterrows():
curr = row
rest = df.drop(i)
dists = {} # инициализируем словарь для евклидовых расстояния для текущей строки
# проходим по оставшимся строкам текущей строки
for j, contestant in rest.iterrows():
# вычисляем евклидово расстояние и обновляем dists
dists.update({j: round(np.linalg.norm(curr.values - contestant.values))})
# приравниваем текущую строку к ближайшей и записываем значение расстояния=
nearest_rows.append(max(dists, key=dists.get))
nearest_distance.append(max(dists.values()))
df['nearest_row'] = nearest_rows
df['dist'] = nearest_distance
Задачи по NumPy
Задача 7
Как поменять местами две строки в двумерном массиве NumPy? Поменяйте местами строки 1 и 3 массива a.
Ввод:
a = np.arange(9).reshape(3,3)
Вариант решения
# Ввод
a = np.arange(9).reshape(3,3)
# Решение
a[[2, 1, 0], :]
Вывод:
array([[6, 7, 8],
[3, 4, 5],
[0, 1, 2]])
Задача 8
Как найти количество уникальных значений в массиве NumPy? Найдите уникальные значения и их количество в столбце species таблицы iris.
# Ввод
url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data'
iris = np.genfromtxt(url, delimiter=',', dtype='object')
# Решение
# Извлекаем столбец species как массив
species = np.array([row.tolist()[4] for row in iris])
# Получаем уникальные значения и их количество
np.unique(species, return_counts=True)
Как найти второе максимальное значение в массиве, который сгруппирован по другому массиву? Найдите значение второго самого длинного petallength вида setosa в таблице iris.
# Ввод
url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data'
iris = np.genfromtxt(url, delimiter=',', dtype='object')
# Решение
# Извлекаем столбцы вида и длины лепестков
setosa_petal_len = iris[iris[:, 4] == b'Iris-setosa', [2]].astype('float')
# Получаем второе значение с конца
np.unique(np.sort(setosa_petal_len))[-2]
# Ввод
a = np.random.randint(100, size=10)
# Решение
print(a.argsort().argsort())
Задача 11
Как найти результат деления минимального значения на максимальное в каждой строке двумерного массива?
Ввод:
np.random.seed(10)
a = np.random.randint(1, 10, [3, 3])
a
# array([[5, 1, 2],
# [1, 2, 9],
# [1, 9, 7]])
Вариант решения
# Ввод
np.random.seed(10)
a = np.random.randint(1, 10, [3, 3])
# Решение
np.apply_along_axis(lambda x: np.min(x) / np.max(x), arr=a, axis=1)
Вывод:
array([0.2, 0.11111111, 0.11111111])
Задача 12
Как найти повторяющиеся значения в массиве NumPy? Найдите повторяющиеся значения (начиная со второго вхождения) в заданном массиве и отметьте их как True. Первое вхождение отмечайте как False.
import datatable as dt
df = dt.fread('https://raw.githubusercontent.com/selva86/datasets/master/BostonHousing.csv')
for i in range(len(df.names)):
print(df.names[i], ':', df.stypes[i])
В статье рассказываем, как подготовиться к разметке данных и провести оценку качества. А при неимении специалистов — кому её поручить. Бонусом в конце статьи чек-лист.