2013-10-16 9 views
7

私はトレーディング戦略から得られた取引で満ちたデータフレームを持っています。戦略がすでに取引中であれば取引が行われないように取引戦略のロジックを更新する必要がありますが、それは別の問題です。以前の多くの取引の取引データは、csvファイルからデータフレームに読み込まれます。パンダのデータフレームを比較する行が重複している行とドロップする

私は持っているデータのための私の問題です: RowXのEntrydateがExitDate rowX-1より小さいかどうかを判断するために、データフレームの行ごとの比較を行う必要があります。

私のデータのサンプル:それは発生しないはずの取引であるため、

Row 1: 
EntryDate ExitDate 
2012-07-25 2012-07-27 

Row 2: 
EntryDate ExitDate 
2012-07-26 2012-07-29 

行2つのニーズを削除します。

重複する行を特定してから削除するのに問題があります。私はapproach in answer 3 of this questionを試してみましたが、データフレームを手動で繰り返して各行のデータを読み取る必要があるため、理想的ではありません。私の現在のアプローチは以下の通りであり、醜いです。私は、日付を確認し、新しいデータフレームに追加します。さらに、このアプローチにより、最終的なデータフレームに複数の重複が生じます。

for i in range(0,len(df)+1): 
    if i+1 == len(df): break #to keep from going past last row 
    ExitDate = df['ExitDate'].irow(i) 
    EntryNextTrade = df['EntryDate'].irow(i+1) 

    if EntryNextTrade>ExitDate: 
     line={'EntryDate':EntryDate,'ExitDate':ExitDate} 
     df_trades=df_trades.append(line,ignore_index=True) 

これをより効率的に行う方法についての考えやアイデアはありますか?

私の実際のデータフレームを再生したい場合は、click hereのデータをサンプリングして見ることができます。

+1

回避しないでください。 –

+0

はい。私は知っている...しかし、それは私が始めることができる唯一の方法だった:) –

答えて

11

この種の操作を行うには、何らかの種類のブールマスクを使用する必要があります。

一つの方法は、次の貿易のためのダミー列を作成することです:

msk = df['EntryNextTrade'] > df'[ExitDate'] 

そして、MSKがTrueであるsubDataFrameを見てLOCを使用します。マスクを作成するための

df['EntryNextTrade'] = df['EntryDate'].shift() 

使用この指定された列のみ:

df.loc[msk, ['EntryDate', 'ExitDate']] 
+0

ありがとう。今すぐ試してみてください。私は使用できる簡単なものがあることを知っていました。 –

+0

これは完全に機能しました。大変に感謝していますが、私は新しくなったため投票できませんが、もしできれば投票します。 –

関連する問題