Шаг 46.
Однострочники Python. Наука о данных. Фильтрация массивов с помощью лямбда-функций и булева доступа по индексу

    Встречающиеся на практике данные обычно зашумлены. Исследователям, собственно, и платят деньги за то, чтобы очистить данные от этого шума, сделать их удобными для восприятия и выяснить содержащийся в них смысл. А значит, фильтрация данных жизненно важна для практических приложений науки о данных. На этом шаге показано, как создать простейшую функцию для фильтрации из одной строки кода.

Общее описание

    Для создания однострочной функции нам понадобятся лямбда-функции. Как вы помните, это анонимные функции, которые можно описать в одной строке кода:

  lambda аргументы : выражение

    Разделенный запятыми список аргументов играет роль входных данных. Лямбда-функция вычисляет выражение и возвращает результат.

    Посмотрим, как решить поставленную задачу путем создания фильтрующей функции, описанной в виде лямбда-функции.

Код

    Рассмотрим следующую задачу, показанную в примере 3.24: создать функцию для фильтрации, принимающую на входе список книг x и их рейтинг у и возвращающую список потенциальных бестселлеров, рейтинг которых превышает заданное пороговое значение: y'>y.


Пример 3.24. Однострочное решение, использующее лямбда-функции, преобразование типов и булевы операторы
## Зависимости
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']]

    Резюмируя: вы научились фильтровать данные с помощью одного только булева доступа по индексу и лямбда-функций. Далее мы займемся логическими операторами и изучим полезный трюк для лаконичного написания операции логического И.

    На следующем шаге мы рассмотрим создание расширенных фильтров массивов с помощью статистических показателей, а также математических и логических операций.




Предыдущий шаг Содержание Следующий шаг