Importando Dados com Genfromtxt

NumPyBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá como importar dados tabulares de arquivos de texto usando a função numpy.genfromtxt. NumPy (Numerical Python) é uma biblioteca fundamental para computação científica em Python que fornece estruturas de dados e funções poderosas para trabalhar com dados numéricos. Sua estrutura de dados principal é o array NumPy - uma maneira rápida e eficiente em termos de memória de armazenar e manipular grandes conjuntos de dados.

A função numpy.genfromtxt é um pilar da análise de dados em Python, permitindo que você leia dados estruturados e os converta em arrays NumPy. Começaremos com uma importação básica e adicionaremos progressivamente opções para lidar com cenários comuns do mundo real, como cabeçalhos, diferentes separadores de colunas, valores ausentes e seleção de colunas de dados específicas. Todas as operações serão realizadas escrevendo e executando scripts Python no WebIDE.

Este é um Lab Guiado, que fornece instruções passo a passo para ajudá-lo a aprender e praticar. Siga as instruções cuidadosamente para completar cada etapa e ganhar experiência prática. Dados históricos mostram que este é um laboratório de nível iniciante com uma taxa de conclusão de 96%. Recebeu uma taxa de avaliações positivas de 100% dos estudantes.

Carregamento Básico de Dados com genfromtxt

Primeiro, vamos nos familiarizar com o ambiente. No explorador de arquivos à esquerda, você verá dois arquivos: main.py e my_data.csv. Escreveremos nosso código Python em main.py para carregar dados de my_data.csv.

O uso mais básico da função numpy.genfromtxt requer um argumento: o caminho para a fonte de dados. Vamos tentar carregar nosso arquivo de dados com as configurações padrão.

Abra o arquivo main.py e adicione o seguinte código a ele:

import numpy as np  ## Isso importa o NumPy e lhe dá o alias 'np' para conveniência

## Carrega dados do arquivo CSV
## Caminhos relativos causarão falha na validação, por favor, use caminhos absolutos no laboratório
data = np.genfromtxt('/home/labex/project/my_data.csv')

## Imprime o array resultante
print(data)

Agora, salve o arquivo e execute-o a partir do terminal na parte inferior do IDE.

python main.py

Você verá a seguinte saída:

[nan nan nan nan]

Esta saída pode ser surpreendente. O resultado é um array de valores nan (Not a Number). NaN é um valor especial de ponto flutuante que representa resultados numéricos indefinidos ou não representáveis - é a maneira do NumPy indicar que um valor não pôde ser convertido corretamente para um número. Isso acontece porque genfromtxt por padrão tenta dividir as linhas por espaços em branco e interpretar tudo como um número de ponto flutuante. Nosso arquivo my_data.csv usa vírgulas como separadores e contém uma linha de cabeçalho não numérica, o que faz com que a importação padrão falhe. Na próxima etapa, corrigiremos isso.

Especificando Delimitadores e Pulando Cabeçalhos

Para analisar corretamente nosso arquivo my_data.csv, precisamos informar duas coisas ao genfromtxt:

  1. Os dados são separados por vírgulas.
  2. A primeira linha é um cabeçalho e deve ser ignorada.

Podemos conseguir isso usando os argumentos delimiter e skip_header.

  • delimiter=',': Isso informa à função para usar uma vírgula para separar os valores.
  • skip_header=1: Isso informa à função para ignorar a primeira linha do arquivo.

Modifique seu arquivo main.py com o código atualizado:

import numpy as np  ## Importa a biblioteca NumPy

## Carrega dados, especificando o delimitador e ignorando o cabeçalho
data = np.genfromtxt('/home/labex/project/my_data.csv', delimiter=',', skip_header=1)

## Imprime o array resultante
print(data)

Salve o arquivo e execute-o novamente no terminal:

python main.py

A saída agora parecerá muito melhor:

[[ 1.   22.5  45. ]
 [ 2.   23.1  48. ]
 [ 3.    nan  46. ]
 [ 4.   23.5  52. ]]

Como você pode ver, os dados agora estão estruturados em um array 2D (array bidimensional). Pense nisso como uma tabela ou planilha com linhas e colunas - nosso array tem 4 linhas (uma para cada leitura do sensor) e 3 colunas (ID do Sensor, Temperatura, Umidade). Os números são corretamente analisados como floats (números de ponto flutuante, que podem representar valores decimais como 22.5). No entanto, observe o nan na terceira linha. Isso ocorre porque nosso arquivo de origem contém o texto NA para representar uma leitura de temperatura ausente, e genfromtxt não o reconhece como um número. Abordaremos isso na próxima etapa.

Tratamento de Valores Ausentes

Conjuntos de dados do mundo real são frequentemente incompletos. genfromtxt oferece uma maneira limpa de lidar com isso usando os argumentos missing_values e filling_values.

  • missing_values: Uma string ou uma lista de strings que devem ser interpretadas como dados ausentes.
  • filling_values: Um valor para substituir quaisquer entradas ausentes.

Em nossos dados, o valor ausente é representado por NA. Vamos dizer ao genfromtxt para reconhecer NA como um valor ausente e substituí-lo por -99 para fácil identificação.

Atualize seu arquivo main.py da seguinte forma:

import numpy as np  ## Importa a biblioteca NumPy

## Trata valores ausentes
data = np.genfromtxt('/home/labex/project/my_data.csv', delimiter=',', skip_header=1,
                     missing_values='NA', filling_values=-99)

## Imprime o array resultante
print(data)

Salve o arquivo e execute-o:

python main.py

A saída agora mostra um array numérico completo, com o valor ausente substituído:

[[  1.    22.5   45.  ]
 [  2.    23.1   48.  ]
 [  3.   -99.    46.  ]
 [  4.    23.5   52.  ]]

Agora nossos dados estão limpos e totalmente numéricos, prontos para cálculos.

Selecionando Colunas e Definindo Tipos de Dados

Às vezes, você precisa apenas de um subconjunto dos dados. O argumento usecols permite especificar quais colunas importar. Ele recebe uma tupla (uma sequência imutável de valores, como (1, 2)) de índices de coluna (começando em 0). Por exemplo, usecols=(1, 2) significa "importar apenas as colunas 1 e 2".

Além disso, você pode impor um tipo de dado específico para todos os dados importados usando o argumento dtype. Em programação, os tipos de dados determinam como os valores são armazenados e quais operações podem ser realizadas sobre eles. Por exemplo, dtype=int converterá todos os valores para inteiros (números inteiros), dtype=float garantirá que eles permaneçam como números de ponto flutuante (decimais), e dtype=str os tratará como texto. Note que dtype=int truncará quaisquer partes decimais (22.5 se tornará 22).

Vamos modificar nosso script para importar apenas a Temperatura (coluna 1) e a Umidade (coluna 2) e garantir que sejam tratadas como números de ponto flutuante.

Atualize main.py pela última vez:

import numpy as np  ## Importa a biblioteca NumPy

## Seleciona colunas específicas e define o tipo de dado
data = np.genfromtxt('/home/labex/project/my_data.csv', delimiter=',', skip_header=1,
                     missing_values='NA', filling_values=0,
                     usecols=(1, 2), dtype=float)

## Imprime o array resultante
print(data)

Nota: Mudamos filling_values para 0 para este exemplo.

Salve o arquivo e execute-o no terminal:

python main.py

A saída final será um array 2D contendo apenas os dados de temperatura e umidade:

[[22.5 45. ]
 [23.1 48. ]
 [ 0.  46. ]
 [23.5 52. ]]

Você importou e limpou com sucesso um conjunto de dados, selecionando apenas as colunas relevantes e tratando todas as inconsistências de dados ao longo do caminho.

Resumo

Neste laboratório, você aprendeu a usar efetivamente numpy.genfromtxt para importar dados de um arquivo de texto para um array NumPy. Você praticou o uso de vários argumentos chave para lidar com desafios de dados do mundo real:

  • delimiter: Para especificar como as colunas são separadas.
  • skip_header: Para ignorar linhas de cabeçalho no arquivo de dados.
  • missing_values: Para identificar strings personalizadas que representam dados ausentes.
  • filling_values: Para substituir dados ausentes por um valor específico.
  • usecols: Para importar apenas um subconjunto específico de colunas.
  • dtype: Para controlar o tipo de dado do array resultante.

Dominar genfromtxt é uma habilidade fundamental para qualquer cientista de dados ou engenheiro que trabalhe com Python e NumPy.