Comment puis-je lire les données CSV dans un tableau d'enregistrement en NumPy?
-
29-09-2019 - |
Question
Je me demande s'il y a un moyen direct d'importer le contenu d'un fichier CSV dans un tableau d'enregistrement, beaucoup de la manière que read.table()
de R, read.delim()
, et les importations de la famille read.csv()
données à la trame de données de R?
Ou est la meilleure façon d'utiliser csv.reader () et ensuite appliquer quelque chose comme numpy.core.records.fromrecords()
?
La solution
Vous pouvez utiliser la méthode de genfromtxt()
de Numpy de le faire, en réglant le kwarg de delimiter
à une virgule.
from numpy import genfromtxt
my_data = genfromtxt('my_file.csv', delimiter=',')
Plus d'informations sur la fonction se trouve à sa documentation respectifs .
Autres conseils
Je recommande read_csv
fonction de la bibliothèque pandas
:
import pandas as pd
df=pd.read_csv('myfile.csv', sep=',',header=None)
df.values
array([[ 1. , 2. , 3. ],
[ 4. , 5.5, 6. ]])
Cela donne une dataframe - permettant de nombreuses fonctions de manipulation de données utiles qui ne sont pas directement disponibles avec des tableaux d'enregistrement numpy .
trame de données est une structure de données marqué deux dimensions avec des colonnes de types potentiellement différents. Vous pouvez penser comme une feuille de calcul ou table SQL ...
Je recommande également genfromtxt
. Cependant, étant donné que la question demande un tableau enregistrement , par opposition à un tableau normal, le paramètre dtype=None
doit être ajouté à l'appel genfromtxt
:
Étant donné un fichier d'entrée, myfile.csv
:
1.0, 2, 3
4, 5.5, 6
import numpy as np
np.genfromtxt('myfile.csv',delimiter=',')
donne un tableau:
array([[ 1. , 2. , 3. ],
[ 4. , 5.5, 6. ]])
et
np.genfromtxt('myfile.csv',delimiter=',',dtype=None)
donne un tableau d'enregistrements:
array([(1.0, 2.0, 3), (4.0, 5.5, 6)],
dtype=[('f0', '<f8'), ('f1', '<f8'), ('f2', '<i4')])
Ceci a l'avantage que fichier plusieurs types de données (y compris les chaînes) peuvent être facilement importées .
Vous pouvez également essayer recfromcsv()
qui peut deviner les types de données et retourner un tableau enregistrement correctement formaté.
Je Temporisé
from numpy import genfromtxt
genfromtxt(fname = dest_file, dtype = (<whatever options>))
contre
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>)
à 4,6 millions de lignes avec environ 70 colonnes et ont trouvé que le chemin NumPy a pris 2 min 16 sec et la méthode de compréhension csv-liste a pris 13 secondes.
Je recommande la méthode de compréhension csv-liste car il est le plus probable repose sur les bibliothèques compilées pré-et non l'interprète autant que NumPy. Je soupçonne que la méthode de pandas géants aurait en tête d'un interprète similaire.
Comme je l'ai essayé les deux façons en utilisant NumPy et Pandas, en utilisant pandas géants a beaucoup d'avantages:
- Plus rapide
- Moins d'utilisation du processeur
- 1/3 utilisation de la RAM par rapport à NumPy genfromtxt
Ceci est mon code de test:
$ 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')
Fichier de données:
du -h ~/me/notebook/train.csv
59M /home/hvn/me/notebook/train.csv
Avec NumPy et pandas versions:
$ pip freeze | egrep -i 'pandas|numpy'
numpy==1.13.3
pandas==0.20.2
Vous pouvez utiliser ce code pour envoyer des données de fichiers CSV dans un tableau:
import numpy as np
csv = np.genfromtxt('test.csv', delimiter=",")
print(csv)
J'ai essayé ceci:
import pandas as p
import numpy as n
closingValue = p.read_csv("<FILENAME>", usecols=[4], dtype=float)
print(closingValue)
Utilisation numpy.loadtxt
Une méthode assez simple. Mais il exige que tous les éléments étant flotteur (int et ainsi de suite)
import numpy as np
data = np.loadtxt('c:\\1.csv',delimiter=',',skiprows=0)
Ceci est la meilleure façon:
import csv
with open('testfile.csv', newline='') as csvfile:
data = list(csv.reader(csvfile))
Maintenant, chaque entrée de données est un disque, représentée comme un tableau. Vous avez donc un tableau 2D. Il m'a sauvé beaucoup de temps.
Je suggère d'utiliser des tables (pip3 install tables
). Vous pouvez enregistrer votre fichier .csv
à l'aide .h5
pandas géants (pip3 install pandas
),
import pandas as pd
data = pd.read_csv("dataset.csv")
store = pd.HDFStore('dataset.h5')
store['mydata'] = data
store.close()
Vous pouvez alors facilement et avec moins de temps, même pour énorme quantité de données, charger vos données dans un array NumPy .
import pandas as pd
store = pd.HDFStore('dataset.h5')
data = store['mydata']
store.close()
# Data in NumPy format
data = data.values
Ce travail comme charme ...
import csv
with open("data.csv", 'r') as f:
data = list(csv.reader(f, delimiter=";"))
import numpy as np
data = np.array(data, dtype=np.float)