На этом шаге мы закрепим свои навыки доступа к массивам по индексу и транслирования на примере извлечения
пользователей Instagram более чем со 100 миллионами подписчиков из небольшого набора данных. А именно, мы
выясним имена всех известных блогеров более чем со 100 миллионами подписчиков по заданному двумерному массиву блогеров
(строки), в котором первый столбец задает имя блогера в виде строкового значения, а второй - количество подписчиков этого блогера.
Массивы NumPy расширяют простой тип данных списка дополнительной функциональностью, например многомерными срезами и многомерным доступом по индексу. Взгляните на фрагмент кода в примере 3.16.
import numpy as np a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) indices = np.array([[False, False, True], [False, False, False], [True, True, False]]) print(a[indices]) # [3 7 8]
Мы создали два массива: a, содержащий двумерные числовые данные (можете считать его массивом данных), и indices, содержащий булевы значения (можете считать его массивом индексов). В NumPy замечательно то, что можно использовать булев массив для весьма выборочного доступа к массиву данных. Попросту говоря, мы создали новый массив, содержащий только те элементы массива данных a, для которых в соответствующих местах массива индексов indices содержатся значения True. Например, если indices[i,j]==True, то наш новый массив содержит значение a[i,j]. Аналогично, если indices[i,j]==False, то наш новый массив не содержит значения a[i,j]. Таким образом, итоговый массив содержит три значения: 3, 7 и 8.
В следующем однострочнике воспользуемся этой возможностью, чтобы провести небольшой анализ социальной сети.
В примере 3.17 мы найдем имена суперзвезд Instagram более чем со 100 миллионами подписчиков!
## Зависимости import numpy as np ## Данные: популярные учетные записи Instagram (миллионы подписчиков) inst = np.array([[232, "@instagram"], [133, "@selenagomez"], [59, "@victoriassecret"], [120, "@cristiano"], [111, "@beyonce"], [76, "@nike"]]) ## Однострочник superstars = inst[inst[:, 0].astype(float) > 100, 1] ## Результат print(superstars)
Как обычно, проверьте, сможете ли мысленно произвести вычисления этого однострочника, прежде чем читать пояснения.
Наши данные состоят из двумерного массива, inst, каждая строка которого описывает известного блогера Instagram. Первый столбец отражает количество их подписчиков (в миллионах), а вторая - имена в Instagram. Из этих данных мы хотим извлечь имена известных блогеров Instagram, у которых более чем 100 миллионов подписчиков.
Существует несколько способов решить эту задачу в одной строке кода. Вот простейший подход:
## Однострочник superstars = inst[inst[:,0].astype(float) > 100, 1]
Разберем этот однострочник по частям. Внутреннее выражение вычисляет булево значение, указывающее, превышает ли 100 миллионов количество подписчиков каждого из наших блогеров:
print(inst[:,0].astype(float) > 100) # [ True True False True True False]
Количество подписчиков содержится в первом столбце, так что мы воспользуемся срезом для доступа к этим данным: inst[: ,0] возвращает все строки, но только в первом столбце. Впрочем, поскольку массив данных содержит различные типы данных (целочисленные и строковые значения), NumPy автоматически выбирает для массива нечисловой тип данных. Дело в том, что числовой не подошел бы для строковых значений, поэтому NumPy преобразует данные в тип, способный отражать все данные из массива (строковые и целочисленные). Необходимо произвести числовое сравнение значений из первого столбца массива данных с числом 100, для чего мы сначала преобразуем полученный массив в тип данных с плавающей точкой с помощью .astype(float).
Далее необходимо проверить, превышают ли значения в массиве NumPy с плавающей точкой целочисленное значение 100. В данном случае NumPy автоматически приводит два операнда в одинаковую форму с помощью транслирования, чтобы произвести поэлементное сравнение. Результат представляет собой массив булевых значений, из которого видно, что у четырех из наших влиятельных блогеров более 100 миллионов подписчиков.
Теперь можно на основе этого булева массива (называемого также массивом индексов с маскированием (mask index array)) выбрать блогеров более чем со 100 миллионами подписчиков (строки) с помощью булева доступа по индексу:
inst[inst[:,0].astype(float) > 100, 1]
А поскольку нам нужны только имена этих популярных блогеров, мы выбираем из результата второй столбец в качестве окончательного результата и сохраняем его в переменной superstars.
В итоге получаем следующий список блогеров более чем со 100 миллионами подписчиков из нашего набора данных:
# ['@instagram' '@selenagomez' '@cristiano' '@beyonce']
Подводя итог: мы воспользовались такими понятиями NumPy, как срезы, транслирование, булев доступ по индексу и преобразование типов данных, чтобы решить небольшую задачу исследования данных в сфере анализа социальных медиа. Далее вам предстоит увидеть еще одну сферу приложения - интернет вещей.
На следующем шаге мы рассмотрим очистку каждого i-го элемента массива с помощью транслирования, присваивания срезу и изменения формы.