Импорт данных с помощью Genfromtxt

NumPyBeginner
Практиковаться сейчас

Введение

В этой лабораторной работе вы научитесь импортировать табличные данные из текстовых файлов с помощью функции 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 две вещи:

  1. Данные разделены запятыми.
  2. Первая строка является заголовком и должна быть проигнорирована.

Мы можем добиться этого, используя аргументы 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.