Uso de StringIO para leer archivos de texto delimitados en NumPy

Uso de StringIO para leer archivos de texto delimitados en NumPy

  • Inteligencia artificial
6 min de lectura Actualizado Jan 12, 2021

Puntos clave: Este tutorial explica cómo leer datos de texto delimitados en un array NumPy usando el paquete StringIO, incluyendo el código y los parámetros necesarios para la importación de datos.

  • Demuestra el uso de StringIO para importar datos CSV en arrays NumPy.
  • Proporciona ejemplos prácticos, fragmentos de código y trata sobre cómo manejar valores y tipos de datos faltantes.

En este tutorial, te mostraremos cómo leer datos de texto delimitados en un array NumPy usando el paquete StringIO.

Datos que usamos

Leeremos estos datos sobre delitos:

    ,crime$cluster,Murder,Assault,UrbanPop,Rape
Alabama,4,13.2,236,58,21.2
Alaska,4,10,263,48,44.5
Arizona,4,8.1,294,80,31
Arkansas,3,8.8,190,50,19.5
California,4,9,276,91,40.6
Colorado,3,7.9,204,78,38.7
Connecticut,2,3.3,110,77,11.1
Delaware,4,5.9,238,72,15.8
Florida,4,15.4,335,80,31.9

Parámetros

En el código de abajo, descargamos los datos usando urllib. Luego utilizamos np.genfromtxt para importarlos al array de NumPy. Observa los siguientes parámetros:

delimiter="," El delimitador entre columnas.
skip_header=1 Saltamos el encabezado porque ahí hay encabezados de columna y no datos.
dtype=dtypes

Este parámetro significa utilizar las tuplas (nombre, dtype) para convertir los datos usando el nombre como el numpy dtype asignado (tipo de dato).

Si no queremos asignar nombres, utilizaríamos (dtype1, dtype2, ...).

Ten en cuenta que utilizamos el tipo float. Como NumPy está construido usando el lenguaje C, te puedes utilizar cualquiera de los muchos tipos c, como enteros de 32 bits, etc.

Nosotros utiliza S12 para str ya que str convierte estos datos en " ". te también podría utiliza unicode U12.

También podríamos haber escrito np.string_ y np.unicode_ pero eso no da longitud, así que significa un byte terminado nulo, que no están una cadena. Así que devolvería un espacio en blanco.

También podríamos haber usado objeto .

Ten en cuenta que NumPy usa estos nombres:

· dtype=[('crimen', 'S12'), ('cluster', '<f8'), ('Murder', '<f8'), ('Assault', '<f8'), ('UrbanPop', '<f8'), ('Rape', '<f8')])

· El signo < se refiere al orden de bytes, que puede ser little-endian o big-endian.

usecols=(1,5) No utilizamos este parámetro. Si lo hubiéramos usado, habría saltado la primera columna.

El código explicado

Aquí está el código:

    import urllib
import numpy as np
from io import StringIO
url = "https://raw.githubusercontent.com/werowe/MLexamples/master/crime_data.csv"
file = urllib.request.urlopen(url)
data = ""
for d in file:
data = data + d.decode('utf-8')
dtypes=[('crime',"S12"),
('cluster', float),
('Murder' ,float),
('Assault',float),
('UrbanPop',float),
('Rape',float)]
arr=np.genfromtxt(StringIO(data), delimiter=",", skip_header=1,
dtype=dtypes)

Resultados en:

    array([(b'Alabama', 4., 13.2, 236., 58., 21.2),
(b'Alaska', 4., 10. , 263., 48., 44.5),

Obstemos que NumPy devolvió un array de bytes para la columna de cadena. Si queremos una cadena, podemos utilizar Unicode:

    dtypes=[('crime','U25'),
('cluster', '>f'),
('Murder' ,float),
('Assault',float),
('UrbanPop',float),
('Rape',float)]

Resultados en:

    array([('Alabama', 4., 13.2, 236., 58., 21.2),
('Alaska', 4., 10. , 263., 48., 44.5),

Si dejamos fuera los dtypes y dejamos que NumPy elija los tipos de datos, se NaN (datos faltantes) a la columna de cadena. También usa float como predeterminado para todos los valores numéricos.

    arr=np.genfromtxt(StringIO(data), delimiter=",", skip_header=1)

Resultados en:

    array([[  nan,   4. ,  13.2, 236. ,  58. ,  21.2],
[  nan,   4. ,  10. , 263. ,  48. ,  44.5],

Habiendo asignado nombres a las columnas, podemos referirnos a su nombre en lugar de indexar:

    arr['Murder']
    array([13.2, 10. ,  8.1,  8.8,  9. ,  7.9,  3.3,  5.9, 15.4, 17.4,  5.3,
2.6, 10.4,  7.2,  2.2,  6. ,  9.7, 15.4,  2.1, 11.3,  4.4, 12.1,
2.7, 16.1,  9. ,  6. ,  4.3, 12.2,  2.1,  7.4, 11.4, 11.1, 13. ,
0.8,  7.3,  6.6,  4.9,  6.3,  3.4, 14.4,  3.8, 13.2, 12.7,  3.2,
2.2,  8.5,  4. ,  5.7,  2.6,  6.8])

Valores faltantes

Podemos decirle a NumPy que introduzca un valor para un valor que falte, como -1, usando missing_values. El comportamiento por defecto para floats están np.nan. Para int it están -1.

    Alaska,4,10,263,48,44.5
Arizona,4, ,1,294,80,31

Estas publicaciones son mías y no representan necesariamente la posición, estrategias u opinión de BMC.

Más de Inteligencia artificial

Suscríbete al Informe

Al registrarse para esta oferta te son confirmar que te leído y aceptado la Política de Privacidad de BMC.

Gracias te

Tú te has suscrito a The Brief
El Brief abarca la orquestación de mainframe y empresa—BMC AMI y Control-M—y la investigación de analistas, despliegues de clientes y eventos en ambas áreas.