2017-12-29 10 views
2

コンテキスト:私は株式取引戦略のバックテスターを構築しています。 OHLCVデータを含む2446個のCSVがあります。各CSVはデータの1取引日です。また、パフォーマンスが懸念された後、これらのファイルを約140万行の単一のCSVに連結しました。それについては後で詳しく説明します。Pandasのデータフレームの一覧上の反復実行のパフォーマンスは大きく変わります

開発の初期段階では、各ファイルをpd.read_csvで1つずつ読み込み、各データフレームをリストに追加していました。次に、データフレームのリストでシミュレーションを実行します。このテクニックを使用するとシミュレーション自体は97秒かかります。

all_days = [] 
for file in (os.listdir("C:/Users/XYZ/Desktop/EURUSD/CSV")): 
    all_days.append(pd.read_csv("C:/Users/XYZ/Desktop/EURUSD/CSV/"+file)) 

私はプログラム全体をより速く動かしたがっていました。だから、私は1つのCSVを作成し、groupbyを使用して毎日のデータを分離しました。確かに、データフレームのリストの作成ははるかに迅速です。しかしここで私はループのために投げつけられているところです:シミュレーションはかなり遅くなりました。のようにデータフレームのリストをまだ受信しているにもかかわらず、シミュレーションは〜172秒になります。また、シミュレーションがまったく同じ結果を生むことに注目することも重要です。

df = pd.read_csv("C:/Users/XYZ/Desktop/EURUSD/Concatenated CSVs/EURUSD.csv", 
index_col=0,parse_dates=True) 
df['Time'] = pd.to_datetime(df['Time']) 

all_days = [] 
for each in df.groupby(pd.Grouper(key='Time',freq='D')): 
    if each[1].empty is False: 
     all_days.append(each[1]) 

パフォーマンスが低下する原因は何でしょうか?

+0

私は何かをするかもしれないと思う。 2番目のコードブロックのforループ内で、リストに追加する前にデータフレームのインデックスをリセットすると、シミュレーションの実行時間が約172秒から約82秒に短縮されました。このパンダの専門家から聞くのが大好きです。 – jnic1989

答えて

1

なぜあなたはそれがより速くなると思いますか?

各ファイルを個別に開く必要はありませんが、最終的にはまったく同じ量のデータをメモリに読み込んでいます。

しかし、2番目の例では、140万行のデータをすべてスキャンすることで、パンダに小さなデータフレームを作成するよう求めています。

2番目の例がデータフレームを作成するのに費やす時間と、それを繰り返す時間を試してみてください。

+0

明確にするために、私は、**私はそれに何も修正を加えていないにもかかわらず、**シミュレーション**のコードが遅い理由を知りたいだけです。データフレームのリストの作成は間違いなく高速です。 – jnic1989

関連する問題