Importar Datos con Genfromtxt

NumPyBeginner
Practicar Ahora

Introducción

En este laboratorio, aprenderá a importar datos tabulares de archivos de texto utilizando la función numpy.genfromtxt. NumPy (Numerical Python) es una biblioteca fundamental para la computación científica en Python que proporciona potentes estructuras de datos y funciones para trabajar con datos numéricos. Su estructura de datos principal es el array de NumPy (NumPy array), una forma rápida y eficiente en memoria para almacenar y manipular grandes conjuntos de datos.

La función numpy.genfromtxt es una piedra angular del análisis de datos en Python, permitiéndole leer datos estructurados y convertirlos en arrays de NumPy. Comenzaremos con una importación básica y agregaremos progresivamente opciones para manejar escenarios comunes del mundo real, como encabezados, diferentes separadores de columnas, valores faltantes y la selección de columnas de datos específicas. Todas las operaciones se realizarán escribiendo y ejecutando scripts de Python en el WebIDE.

Este es un Guided Lab, que proporciona instrucciones paso a paso para ayudarte a aprender y practicar. Sigue las instrucciones cuidadosamente para completar cada paso y obtener experiencia práctica. Los datos históricos muestran que este es un laboratorio de nivel principiante con una tasa de finalización del 96%. Ha recibido una tasa de reseñas positivas del 100% por parte de los estudiantes.

Carga Básica de Datos con genfromtxt

Primero, familiaricémonos con el entorno. En el explorador de archivos de la izquierda, verá dos archivos: main.py y my_data.csv. Escribiremos nuestro código Python en main.py para cargar datos de my_data.csv.

El uso más básico de la función numpy.genfromtxt requiere un argumento: la ruta a la fuente de datos. Intentemos cargar nuestro archivo de datos con la configuración predeterminada.

Abra el archivo main.py y agregue el siguiente código:

import numpy as np  ## Esto importa NumPy y le da el alias 'np' para mayor comodidad

## Cargar datos del archivo CSV
## Las rutas relativas harán que la validación falle, por favor use rutas absolutas en el laboratorio
data = np.genfromtxt('/home/labex/project/my_data.csv')

## Imprimir el array resultante
print(data)

Ahora, guarde el archivo y ejecútelo desde la terminal en la parte inferior del IDE.

python main.py

Verá la siguiente salida:

[nan nan nan nan]

Esta salida puede ser sorprendente. El resultado es un array de valores nan (Not a Number). NaN es un valor especial de punto flotante que representa resultados numéricos indefinidos o irrepresentables; es la forma en que NumPy indica que un valor no pudo ser convertido correctamente a un número. Esto sucede porque genfromtxt por defecto intenta dividir las líneas por espacios en blanco e interpretar todo como un número de punto flotante. Nuestro archivo my_data.csv utiliza comas como separadores y contiene una línea de encabezado no numérica, lo que hace que la importación predeterminada falle. En el siguiente paso, solucionaremos esto.

Especificar Delimitadores y Saltar Encabezados

Para analizar correctamente nuestro archivo my_data.csv, necesitamos indicarle a genfromtxt dos cosas:

  1. Los datos están separados por comas.
  2. La primera línea es un encabezado y debe ser ignorada.

Podemos lograr esto utilizando los argumentos delimiter y skip_header.

  • delimiter=',': Esto le indica a la función que use una coma para separar los valores.
  • skip_header=1: Esto le indica a la función que ignore la primera línea del archivo.

Modifique su archivo main.py con el código actualizado:

import numpy as np  ## Importar la biblioteca NumPy

## Cargar datos, especificando el delimitador y omitiendo el encabezado
data = np.genfromtxt('/home/labex/project/my_data.csv', delimiter=',', skip_header=1)

## Imprimir el array resultante
print(data)

Guarde el archivo y ejecútelo de nuevo en la terminal:

python main.py

La salida ahora se verá mucho mejor:

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

Como puede ver, los datos ahora están estructurados en un array 2D (array bidimensional). Piense en ello como una tabla o una hoja de cálculo con filas y columnas; nuestro array tiene 4 filas (una por cada lectura del sensor) y 3 columnas (ID del Sensor, Temperatura, Humedad). Los números se analizan correctamente como floats (números de punto flotante, que pueden representar valores decimales como 22.5). Sin embargo, observe el nan en la tercera fila. Esto se debe a que nuestro archivo de origen contiene el texto NA para representar una lectura de temperatura faltante, y genfromtxt no lo reconoce como un número. Abordaremos esto en el siguiente paso.

Manejo de Valores Faltantes

Los conjuntos de datos del mundo real a menudo están incompletos. genfromtxt proporciona una forma limpia de manejar esto utilizando los argumentos missing_values y filling_values.

  • missing_values: Una cadena o una lista de cadenas que deben interpretarse como datos faltantes.
  • filling_values: Un valor para sustituir cualquier entrada faltante.

En nuestros datos, el valor faltante está representado por NA. Indiquemos a genfromtxt que reconozca NA como un valor faltante y lo reemplace por -99 para una fácil identificación.

Actualice su archivo main.py de la siguiente manera:

import numpy as np  ## Importar la biblioteca NumPy

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

## Imprimir el array resultante
print(data)

Guarde el archivo y ejecútelo:

python main.py

La salida ahora muestra un array numérico completo, con el valor faltante reemplazado:

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

Ahora nuestros datos están limpios y completamente numéricos, listos para cálculos.

Seleccionar Columnas y Establecer Tipos de Datos

A veces, solo necesita un subconjunto de los datos. El argumento usecols le permite especificar qué columnas importar. Toma una tupla (una secuencia inmutable de valores, como (1, 2)) de índices de columna (comenzando desde 0). Por ejemplo, usecols=(1, 2) significa "importar solo las columnas 1 y 2".

Además, puede forzar un tipo de dato específico para todos los datos importados utilizando el argumento dtype. En programación, los tipos de datos determinan cómo se almacenan los valores y qué operaciones se pueden realizar sobre ellos. Por ejemplo, dtype=int convertirá todos los valores a enteros (números enteros), dtype=float asegurará que permanezcan como números de punto flotante (decimales), y dtype=str los tratará como texto. Tenga en cuenta que dtype=int truncará cualquier parte decimal (22.5 se convierte en 22).

Modifiquemos nuestro script para importar solo la Temperatura (columna 1) y la Humedad (columna 2) y asegurarnos de que se traten como números de punto flotante.

Actualice main.py por última vez:

import numpy as np  ## Importar la biblioteca NumPy

## Seleccionar columnas específicas y establecer el tipo de dato
data = np.genfromtxt('/home/labex/project/my_data.csv', delimiter=',', skip_header=1,
                     missing_values='NA', filling_values=0,
                     usecols=(1, 2), dtype=float)

## Imprimir el array resultante
print(data)

Nota: Cambiamos filling_values a 0 para este ejemplo.

Guarde el archivo y ejecútelo desde la terminal:

python main.py

La salida final será un array 2D que contiene solo los datos de temperatura y humedad:

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

Ha importado y limpiado con éxito un conjunto de datos seleccionando solo las columnas relevantes y manejando todas las inconsistencias de datos a lo largo del proceso.

Resumen

En este laboratorio, ha aprendido a utilizar eficazmente numpy.genfromtxt para importar datos de un archivo de texto a un array de NumPy. Ha practicado el uso de varios argumentos clave para manejar desafíos de datos del mundo real:

  • delimiter: Para especificar cómo se separan las columnas.
  • skip_header: Para ignorar las líneas de encabezado en el archivo de datos.
  • missing_values: Para identificar cadenas personalizadas que representan datos faltantes.
  • filling_values: Para reemplazar los datos faltantes con un valor específico.
  • usecols: Para importar solo un subconjunto específico de columnas.
  • dtype: Para controlar el tipo de dato del array resultante.

Dominar genfromtxt es una habilidad fundamental para cualquier científico o ingeniero de datos que trabaje con Python y NumPy.