Встречающиеся на практике данные обычно зашумлены. Исследователям, собственно, и платят деньги за то, чтобы очистить данные от этого шума, сделать их удобными для восприятия и выяснить содержащийся в них смысл. А значит, фильтрация данных жизненно важна для практических
приложений науки о данных. На этом шаге показано, как создать простейшую функцию для фильтрации из одной строки кода.
Для создания однострочной функции нам понадобятся лямбда-функции. Как вы помните, это анонимные функции, которые можно описать в одной строке кода:
lambda аргументы : выражение
Разделенный запятыми список аргументов играет роль входных данных. Лямбда-функция вычисляет выражение и возвращает результат.
Посмотрим, как решить поставленную задачу путем создания фильтрующей функции, описанной в виде лямбда-функции.
Рассмотрим следующую задачу, показанную в примере 3.24: создать функцию для фильтрации, принимающую на входе список книг x и их рейтинг у и возвращающую список потенциальных бестселлеров, рейтинг которых превышает заданное пороговое значение: y'>y.
## Зависимости import numpy as np ## Данные (строка = [название, рейтинг]) books = np.array([['Coffee Break NumPy', 4.6], ['Lord of the Rings', 5.0], ['Harry Potter', 4.3], ['Winnie-the-Pooh', 3.9], ['The Clown of God', 2.2], ['Coffee Break Python', 4.7]]) ## Однострочник predict_bestseller = lambda x, y: x[x[:, 1].astype(float) > y] ## Результат print(predict_bestseller(books, 3.9))
Прежде чем читать дальше, попробуйте догадаться, какие результаты даст этот код.
Наши данные состоят из двумерного массива NumPy, каждая строка которого содержит название книги и средний рейтинг ее у читателей (число с плавающей точкой от 0.0 до 5.0). В этом наборе данных - шесть книг.
Наша цель состоит в создании функции фильтрации, принимающей на входе набор данных о рейтингах книг x и пороговое значение рейтинга у и возвращающей список книг, рейтинг которых превышает это пороговое значение у. В данном случае мы установили пороговое значение равным 3.9.
Для этого мы описали анонимную лямбда-функцию, возвращающую результат следующего выражения:
x[(1)x[:, 1](2).astype(float) (3)> y]
В массиве x должно быть два столбца, как и в нашем массиве рейтингов книг books. Для доступа к потенциальным бестселлерам мы воспользовались схемой расширенного доступа по индексу, которая похожа на схему из примера 3.17.
Во-первых, мы извлекли второй столбец (1) с рейтингами книг и преобразовали его в массив значений с плавающей точкой с помощью метода astype(float) (2) массива NumPy x. Это необходимо, поскольку исходный массив x состоит из данных различных типов (значения с плавающей точкой и строковые значения).
Во-вторых, создали булев массив, содержащий значение True, если рейтинг книги в строке с соответствующим индексом превышает y (3). Обратите внимание, что значение с плавающей точкой у неявно транслируется на новый массив NumPy, поэтому формы обоих операндов булева оператора > одинаковы. Далее мы создали булев массив, элементы которого указывают для каждой книги, можно ли ее считать бестселлером: x[:,1].astype(float)> y = [ True True True False False True]. Таким образом, первые три книги и последняя - бестселлеры.
В-третьих, мы воспользовались упомянутым булевым массивом в качестве массива индексов для исходного массива рейтингов книг, чтобы извлечь все книги с рейтингом, превышающим пороговое значение. Точнее говоря, воспользовались булевым доступом по индексу x[[ True True True False False True]], чтобы получить подмассив, содержащий только четыре книги, которым соответствует значение True. И получаем следующий окончательный результат работы нашего однострочника:
## Результат print(predict_bestseller(books, 3.9)) # [['Coffee Break NumPy' '4.6'] # ['Lord of the Rings' '5.0'] # ['Harry Potter' '4.3'] # ['Coffee Break Python' '4.7']]
Резюмируя: вы научились фильтровать данные с помощью одного только булева доступа по индексу и лямбда-функций. Далее мы займемся логическими операторами и изучим полезный трюк для лаконичного написания операции логического И.
На следующем шаге мы рассмотрим создание расширенных фильтров массивов с помощью статистических показателей, а также математических и логических операций.