Введение
В этой лабораторной работе вы научитесь импортировать табличные данные из текстовых файлов с помощью функции numpy.genfromtxt. NumPy (Numerical Python) — это фундаментальная библиотека для научных вычислений в Python, предоставляющая мощные структуры данных и функции для работы с числовыми данными. Ее основной структурой данных является массив NumPy — быстрый и эффективный по памяти способ хранения и обработки больших наборов данных.
Функция numpy.genfromtxt является краеугольным камнем анализа данных в Python, позволяя считывать структурированные данные и преобразовывать их в массивы NumPy. Мы начнем с базового импорта и постепенно добавим опции для обработки распространенных сценариев реального мира, таких как заголовки, различные разделители столбцов, пропущенные значения и выбор конкретных столбцов данных. Все операции будут выполняться путем написания и выполнения скриптов Python в WebIDE.
Базовая загрузка данных с помощью genfromtxt
Сначала давайте ознакомимся со средой. В проводнике файлов слева вы увидите два файла: main.py и my_data.csv. Мы будем писать наш код Python в main.py для загрузки данных из my_data.csv.
Самое базовое использование функции numpy.genfromtxt требует одного аргумента: пути к источнику данных. Попробуем загрузить наш файл данных с настройками по умолчанию.
Откройте файл main.py и добавьте в него следующий код:
import numpy as np ## Импортирует NumPy и присваивает ему псевдоним 'np' для удобства
## Загрузка данных из CSV файла
## Относительные пути приведут к ошибке валидации, пожалуйста, используйте абсолютные пути в лаборатории
data = np.genfromtxt('/home/labex/project/my_data.csv')
## Вывод полученного массива
print(data)
Теперь сохраните файл и запустите его из терминала в нижней части IDE.
python main.py
Вы увидите следующий вывод:
[nan nan nan nan]
Этот вывод может показаться неожиданным. Результатом является массив значений nan (Not a Number). NaN — это специальное значение с плавающей запятой, представляющее неопределенные или непредставимые числовые результаты; это способ NumPy указать, что значение не удалось правильно преобразовать в число. Это происходит потому, что genfromtxt по умолчанию пытается разделить строки по пробелам и интерпретировать все как число с плавающей запятой. Наш файл my_data.csv использует запятые в качестве разделителей и содержит нечисловую строку заголовка, что приводит к сбою импорта по умолчанию. На следующем шаге мы это исправим.
Указание разделителей и пропуск заголовков
Чтобы правильно разобрать наш файл my_data.csv, нам нужно сообщить genfromtxt две вещи:
- Данные разделены запятыми.
- Первая строка является заголовком и должна быть проигнорирована.
Мы можем добиться этого, используя аргументы delimiter и skip_header.
delimiter=',': Это указывает функции использовать запятую для разделения значений.skip_header=1: Это указывает функции игнорировать первую строку файла.
Измените файл main.py, обновив код:
import numpy as np ## Импорт библиотеки NumPy
## Загрузка данных с указанием разделителя и пропуском заголовка
data = np.genfromtxt('/home/labex/project/my_data.csv', delimiter=',', skip_header=1)
## Вывод полученного массива
print(data)
Сохраните файл и снова запустите его в терминале:
python main.py
Теперь вывод будет выглядеть гораздо лучше:
[[ 1. 22.5 45. ]
[ 2. 23.1 48. ]
[ 3. nan 46. ]
[ 4. 23.5 52. ]]
Как вы видите, данные теперь структурированы в 2D-массив (двумерный массив). Представьте его как таблицу или электронную таблицу с строками и столбцами — наш массив имеет 4 строки (по одной для каждого показания датчика) и 3 столбца (ID датчика, Температура, Влажность). Числа правильно разобраны как числа с плавающей запятой (floating-point numbers, которые могут представлять десятичные значения, такие как 22.5). Однако обратите внимание на nan в третьей строке. Это связано с тем, что наш исходный файл содержит текст NA для обозначения пропущенного показания температуры, а genfromtxt не распознает его как число. Мы разберем это на следующем шаге.
Обработка пропущенных значений
Реальные наборы данных часто бывают неполными. genfromtxt предоставляет удобный способ обработки этого с помощью аргументов missing_values и filling_values.
missing_values: Строка или список строк, которые следует интерпретировать как пропущенные данные.filling_values: Значение для замены любых пропущенных записей.
В наших данных пропущенное значение представлено как NA. Сообщим genfromtxt распознавать NA как пропущенное значение и заменить его на -99 для легкой идентификации.
Обновите файл main.py следующим образом:
import numpy as np ## Импорт библиотеки NumPy
## Обработка пропущенных значений
data = np.genfromtxt('/home/labex/project/my_data.csv', delimiter=',', skip_header=1,
missing_values='NA', filling_values=-99)
## Вывод полученного массива
print(data)
Сохраните файл и выполните его:
python main.py
Вывод теперь показывает полный числовой массив с заменой пропущенного значения:
[[ 1. 22.5 45. ]
[ 2. 23.1 48. ]
[ 3. -99. 46. ]
[ 4. 23.5 52. ]]
Теперь наши данные чистые и полностью числовые, готовые к вычислениям.
Выбор столбцов и установка типов данных
Иногда вам нужна только часть данных. Аргумент usecols позволяет указать, какие столбцы импортировать. Он принимает кортеж (неизменяемую последовательность значений, например, (1, 2)) индексов столбцов (начиная с 0). Например, usecols=(1, 2) означает "импортировать только столбцы 1 и 2".
Кроме того, вы можете принудительно установить определенный тип данных для всех импортируемых данных с помощью аргумента dtype. В программировании типы данных определяют, как значения хранятся и какие операции над ними можно выполнять. Например, dtype=int преобразует все значения в целые числа (whole numbers), dtype=float гарантирует, что они останутся числами с плавающей запятой (decimals), а dtype=str будет рассматривать их как текст. Обратите внимание, что dtype=int обрежет любые десятичные части (22.5 станет 22).
Давайте изменим наш скрипт, чтобы импортировать только Temperature (столбец 1) и Humidity (столбец 2) и убедиться, что они обрабатываются как числа с плавающей запятой.
Обновите main.py в последний раз:
import numpy as np ## Импорт библиотеки NumPy
## Выбор конкретных столбцов и установка типа данных
data = np.genfromtxt('/home/labex/project/my_data.csv', delimiter=',', skip_header=1,
missing_values='NA', filling_values=0,
usecols=(1, 2), dtype=float)
## Вывод полученного массива
print(data)
Примечание: В этом примере мы изменили
filling_valuesна0.
Сохраните файл и запустите его из терминала:
python main.py
Окончательный вывод будет представлять собой 2D-массив, содержащий только данные о температуре и влажности:
[[22.5 45. ]
[23.1 48. ]
[ 0. 46. ]
[23.5 52. ]]
Вы успешно импортировали и очистили набор данных, выбрав только нужные столбцы и устранив все несоответствия данных на протяжении всего процесса.
Резюме
В этой лабораторной работе вы научились эффективно использовать numpy.genfromtxt для импорта данных из текстового файла в массив NumPy. Вы отработали использование нескольких ключевых аргументов для решения реальных задач с данными:
delimiter: Для указания разделителя столбцов.skip_header: Для игнорирования строк заголовка в файле данных.missing_values: Для идентификации пользовательских строк, представляющих пропущенные данные.filling_values: Для замены пропущенных данных определенным значением.usecols: Для импорта только определенного подмножества столбцов.dtype: Для управления типом данных результирующего массива.
Овладение genfromtxt является фундаментальным навыком для любого специалиста по данным или инженера, работающего с Python и NumPy.



