2017-03-26 9 views
0

私はPythonにMatlabで書かれたコードを変換しようとします。 私はdatファイル(csvファイル)を読み込もうとしています。そのファイルには約30の列と、10進数のデータ(Matlabでは2重の行列に読み込まれた)を含む数千の行があります。 私はdatファイルと最も類似したオブジェクト/ array/...を読み込むための最速の方法を求めています。効率的な方法は、数値データでPythonで読み取る

私は、次の方法の両方でファイルを読み込もうとしました:

my_data1 = numpy.genfromtxt('FileName.dat', delimiter=',') 
my_data2 = pd.read_csv('FileName.dat',delimiter=',') 

は、任意のより良いオプションがありますか?

+1

どのようにすればよいですか?あなたが持っているものに何が間違っていますか? – excaza

+0

これらのデータで何をしたいですか? –

+2

30列、1000行の大きな音はありません。ファイルが本当に大きければ、データを保存して処理するのに必要なメモリについてさらに心配する必要があります。 MATLABの行列のサイズはどれくらいですか? – hpaulj

答えて

1

pd.read_csvはそれなりの効率があります。高速化するために、複数のコアを使用してデータを並行してロードすることを試みることができます。ここでは、pd.read_csvでデータをロードし、そのデータを高速に処理する必要があるときに、joblibを使用したコード例を示します。

from os import listdir 
from os.path import dirname, abspath, isfile, join 
import pandas as pd 
import sys 
import time 
from datetime import datetime 
# Multi-threading 
from joblib import Parallel, delayed 
import multiprocessing 
# Garbage collector 
import gc 

# Number of cores 
TOTAL_NUM_CORES = multiprocessing.cpu_count() 
# Path of this script's file 
DATA_PATH = 'D:\\' 
# Path to save the processed files 
TARGET_PATH = 'C:\\' 

def read_and_convert(f,num_files): 
    #global i 
    # Read the file 
    dataframe = pd.read_csv(DATA_PATH + f, low_memory=False, header=None, names=['Symbol', 'Date_Time', 'Bid', 'Ask'], index_col=1, parse_dates=True) 
    # Process the data 
    data_ask_bid = process_data(dataframe) 
    # Store processed data in target folder 
    data_ask_bid.to_csv(TARGET_PATH + f) 
    print(f) 
    # Garbage collector. I needed to use this, otherwise my memory would get full after a few files, but you might not need it. 
    gc.collect() 

def main(): 
    # Counter for converted files 
    global i 
    i = 0 
    start_time = time.time() 
    # Get the paths for all the data files 
    files_names = [f for f in listdir(DATA_PATH) if isfile(join(DATA_PATH, f))] 

    # Load and process files in parallel 
    Parallel(n_jobs=TOTAL_NUM_CORES)(delayed(read_and_convert)(f,len(files_names)) for f in files_names) 
    # for f in files_names: read_and_convert(f,len(files_names)) # non-parallel 
    print("\nTook %s seconds." % (time.time() - start_time)) 

if __name__ == "__main__": 
    main() 
+0

このコードを実行するにはどうすればよいですか? DATA_PATHは未処理のcsvファイルの名前ですか? TARGET_PATHは何に使用されていますか? – pyigal

関連する問題