На этом шаге мы воспользуемся сочетанием спискового включения и срезов для выборки из двумерного набора данных. Наша цель - создать меньшую,
но вполне репрезентативную выборку данных из неприемлемо большого набора данных.
Представьте, что работаете финансовым аналитиком в крупном банке и обучаете новую модель машинного обучения, предназначенную для прогнозов курсов акций. Однако набор данных огромен, и обучение модели занимает на вашем компьютере буквально вечность. Например, в машинном обучении часто контролируется точность предсказания модели для различных наборов ее параметров. В нашем приложении, скажем, приходится ждать часами завершения обучения модели (обучение очень сложных моделей на больших объемах данных на самом деле занимает часы). Для ускорения мы сократим набор данных вдвое, исключив из него каждую вторую точку данных курсов акций. Вряд ли эта модификация существенно снизит безошибочность модели.
На данном шаге мы обратимся к двум возможностям Python, о которых вы узнали ранее: списковое включение
и срезы. Списковое включение позволяет проходить в цикле по всем элементам списка, последовательно модифицируя
их. Срезы помогают быстро выбрать из заданного списка каждый второй элемент, а потому прекрасно подходят для
простых операций фильтрации. Посмотрим внимательнее на совместное использование этих двух возможностей.
Наша цель - создать на основе имеющихся данных новую обучающую выборку: список списков, каждый из которых состоит из шести чисел с плавающей точкой. Для этого выберем из исходного набора данных каждое второе значение с плавающей точкой. Взгляните на пример 2.6.
## Данные (ежедневные котировки акций ($)) price = [[9.9, 9.8, 9.8, 9.4, 9.5, 9.7], [9.5, 9.4, 9.4, 9.3, 9.2, 9.1], [8.4, 7.9, 7.9, 8.1, 8.0, 8.0], [7.1, 5.9, 4.8, 4.8, 4.7, 3.9]] ## Однострочник sample = [line[::2] for line in price] ## Результат print(sample)
Как обычно, посмотрим, сможете ли вы догадаться, какими будут результаты выполнения этого фрагмента кода.
В нашем решении используется двухэтапный подход. Во-первых, мы воспользуемся списковым включением для прохода в цикле по всем строкам исходного списка, price. Во-вторых, создадим новый список значений с плавающей точкой путем среза каждой из строк; для этого мы добавим line[начало:конец:шаг] с параметрами начало и конец по умолчанию и шаг = 2. Этот новый список чисел с плавающей точкой состоит всего из трех значений с плавающей точкой (вместо шести), в результате чего получается следующий массив:
## Результат print(sample) # [[9.9, 9.8, 9.5], [9.5, 9.4, 9.2], [8.4, 7.9, 8.0], [7.1, 4.8, 4.7]]
Это простой однострочник, использующий встроенную функциональность Python. Однако в следующих шагах вы увидите еще более короткую версию, в которой для исследования данных применяется библиотека NumPy.
Задание 2.2. Вернитесь к этому однострочнику после изучения возможностей бибилиотеки NumPy и попробуйте написать его более лаконичный вариант с помощью этой библиотеки. Подсказка: воспользуйтесь расширенными возможностями срезов NumPy.
Раскрыть/скрыть решение и комментарии.
На следующем шаге мы рассмотрим исправление испорченных списков с помощью присваивания срезам.