python - numpy genfromtxt csv
¿Cómo leo los datos CSV en una matriz de registros en NumPy? (10)
Me pregunto si hay una forma directa de importar el contenido de un archivo CSV a una matriz de registros, de forma muy parecida a la forma en que la read.table()
, read.delim()
y read.csv()
de R importa datos a R ¿marco de datos?
¿O es la mejor manera de usar csv.reader() y luego aplicar algo como numpy.core.records.fromrecords()
?
Como probé de dos maneras usando NumPy y Pandas, usar pandas tiene muchas ventajas:
- Más rápido
- Menos uso de la CPU
- Uso de 1/3 RAM en comparación con NumPy genfromtxt
Este es mi código de prueba:
$ for f in test_pandas.py test_numpy_csv.py ; do /usr/bin/time python $f; done
2.94user 0.41system 0:03.05elapsed 109%CPU (0avgtext+0avgdata 502068maxresident)k
0inputs+24outputs (0major+107147minor)pagefaults 0swaps
23.29user 0.72system 0:23.72elapsed 101%CPU (0avgtext+0avgdata 1680888maxresident)k
0inputs+0outputs (0major+416145minor)pagefaults 0swaps
test_numpy_csv.py
from numpy import genfromtxt
train = genfromtxt(''/home/hvn/me/notebook/train.csv'', delimiter='','')
test_pandas.py
from pandas import read_csv
df = read_csv(''/home/hvn/me/notebook/train.csv'')
Archivo de datos:
du -h ~/me/notebook/train.csv
59M /home/hvn/me/notebook/train.csv
Con NumPy y pandas en versiones:
$ pip freeze | egrep -i ''pandas|numpy''
numpy==1.13.3
pandas==0.20.2
Cronometre el
from numpy import genfromtxt
genfromtxt(fname = dest_file, dtype = (<whatever options>))
versus
import csv
import numpy as np
with open(dest_file,''r'') as dest_f:
data_iter = csv.reader(dest_f,
delimiter = delimiter,
quotechar = ''"'')
data = [data for data in data_iter]
data_array = np.asarray(data, dtype = <whatever options>)
en 4.6 millones de filas con alrededor de 70 columnas, se encontró que la ruta NumPy tomó 2 minutos y 16 segundos y el método de comprensión csv-list tomó 13 segundos.
Recomendaría el método de comprensión csv-list, ya que lo más probable es que se base en bibliotecas precompiladas y no en el intérprete tanto como en NumPy. Sospecho que el método de los pandas tendría una sobrecarga de intérprete similar.
Esta es la manera más fácil:
import csv with open(''testfile.csv'', newline='''') as csvfile: data = list(csv.reader(csvfile))
Ahora cada entrada en los datos es un registro, representado como una matriz. Así que tienes una matriz 2D. Me ahorró mucho tiempo.
Intenté esto:
import pandas as p
import numpy as n
closingValue = p.read_csv("<FILENAME>", usecols=[4], dtype=float)
print(closingValue)
Puede usar el método genfromtxt()
de genfromtxt()
para hacerlo, configurando el delimiter
kwarg a una coma.
from numpy import genfromtxt
my_data = genfromtxt(''my_file.csv'', delimiter='','')
Más información sobre la función se puede encontrar en su documentation respectiva.
Puede usar este código para enviar datos de archivos CSV a una matriz:
import numpy as np
csv = np.genfromtxt(''test.csv'', delimiter=",")
print(csv)
Recomendaría la función read_csv
de la biblioteca de pandas
:
import pandas as pd
df=pd.read_csv(''myfile.csv'', sep='','',header=None)
df.values
array([[ 1. , 2. , 3. ],
[ 4. , 5.5, 6. ]])
Esto proporciona un DataFrame pandas, que permite muchas funciones útiles de manipulación de datos que no están disponibles directamente con matrices de registros numpy .
DataFrame es una estructura de datos etiquetada bidimensional con columnas de tipos potencialmente diferentes. Puedes considerarlo como una hoja de cálculo o una tabla SQL ...
También recomendaría genfromtxt
. Sin embargo, dado que la pregunta solicita una matriz de registro , a diferencia de una matriz normal, el parámetro dtype=None
debe agregarse a la llamada genfromtxt
:
Dado un archivo de entrada, myfile.csv
:
1.0, 2, 3
4, 5.5, 6
import numpy as np
np.genfromtxt(''myfile.csv'',delimiter='','')
da una matriz:
array([[ 1. , 2. , 3. ],
[ 4. , 5.5, 6. ]])
y
np.genfromtxt(''myfile.csv'',delimiter='','',dtype=None)
da una matriz de registro:
array([(1.0, 2.0, 3), (4.0, 5.5, 6)],
dtype=[(''f0'', ''<f8''), (''f1'', ''<f8''), (''f2'', ''<i4'')])
Esto tiene la ventaja de que el archivo con múltiples tipos de datos (incluidas las cadenas) se puede importar fácilmente .
También puede probar recfromcsv()
que puede adivinar los tipos de datos y devolver una matriz de registros con el formato correcto.
Usando numpy.loadtxt
Un método bastante simple. Pero requiere que todos los elementos estén flotando (int y así sucesivamente)
import numpy as np
data = np.loadtxt(''c://1.csv'',delimiter='','',skiprows=0)
Yo sugeriría usar tablas ( pip3 install tables
). Puede guardar su archivo .csv
en .h5
usando pandas ( pip3 install pandas
),
import pandas as pd
data = pd.read_csv("dataset.csv")
store = pd.HDFStore(''dataset.h5'')
store[''mydata''] = data
store.close()
Entonces puede fácilmente, y con menos tiempo, incluso para una gran cantidad de datos, cargar sus datos en una matriz NumPy .
import pandas as pd
store = pd.HDFStore(''dataset.h5'')
data = store[''mydata'']
store.close()
# Data in NumPy format
data = data.values