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
Eso concluye este tutorial.
Lecturas relacionadas
Guía de Pandas
- Introducción y tutoriales de Pandas para principiantes
- Pandas: Cómo leer archivos CSV y JSON
- Cómo Crea un Dataframe Pandas a partir de un diccionario
- Cómo agrupar, concatenar y fusionar datos en Pandas
- Tipos de datos de Pandas
- Manejo de datos faltantes en Pandas: Explicación de los valores de NaN
- Introducción de NumPy con ejemplos
- Uso de StringIO para leer archivos de texto delimitados en NumPy
- Usando la función estadística NumPy Bincount
- Funciones y distribuciones estadísticas principales de NumPy
Estas publicaciones son mías y no representan necesariamente la posición, estrategias u opinión de BMC.