1

では、注目している市場データの更新があると仮定しましょう。

 1. Bid 1 Ask 1.5
 2. Bid 1 Ask 1.5
 3. Bid 1 Ask 1.5
 4. Bid 1.5 Ask 2
 5. Bid 1.5 Ask 2
 6. Bid 2 Ask 2.5
 7. Bid 2 Ask 2.5
 8. Bid 2 Ask 3

これで drop_duplicates を使用して、ビッドまたはアスクが変更された時間のみを保持することを検討しています。私は試した

df.drop_duplicates(cols=['Bid,Ask'])

しかし、思い通りにはなりませんでした。このリストで必要な動作は、リストを要約することです(番号がインデックスであると仮定して、インデックスを保持します)

 1. Bid 1 Ask 1.5
 4. Bid 1.5 Ask 2
 6. Bid 2 Ask 2.5
 8. Bid 2 Ask 3

したがって、ビッドとアスクの両方がその前の行と同じである場合、その行はドロップされます。

これを行う明白な方法はありますか?

4

2 に答える 2

3

を使用.shift()して列をシフトし、 を使用anyして違いを確認できます。たとえば、次のようなフレームがあるとします。

>>> df
   Bid  Ask
1  1.0  1.5
2  1.0  1.5
3  1.0  1.5
4  1.5  2.0
5  1.5  2.0
6  2.0  2.5
7  2.0  2.5
8  2.0  3.0
>>> df[(df != df.shift()).any(axis=1)]
   Bid  Ask
1  1.0  1.5
4  1.5  2.0
6  2.0  2.5
8  2.0  3.0

段階的に、1 シフトダウンします。

>>> df.shift()
   Bid  Ask
1  NaN  NaN
2  1.0  1.5
3  1.0  1.5
4  1.0  1.5
5  1.5  2.0
6  1.5  2.0
7  2.0  2.5
8  2.0  2.5

データフレームをシフトされたバージョンと比較します。

>>> df != df.shift()
     Bid    Ask
1   True   True
2  False  False
3  False  False
4   True   True
5  False  False
6   True   True
7  False  False
8  False   True

そして、これらのいずれかが true で、行が次の行と異なる場合にのみ True となる系列を作成します。

>>> (df != df.shift()).any(axis=1)
1     True
2    False
3    False
4     True
5    False
6     True
7    False
8     True
dtype: bool
于 2013-10-22T23:15:06.377 に答える
0

重複を実際に削除する必要はありません。同一の後続の行を削除する必要があります。同じビッド/アスク ペアが 1 日に数回発生する可能性があるため、必ずしも連続して発生するわけではありません。次のようにデータフレームをループします。

for i in df.index:
    if(i-1 in df.index and df['Ask'][i]==df['Ask'][i-1] and df['Bid'][i]==df['Bid'][i]):
        df = df.drop([i])

これにはもっとエレガントな解決策があると確信していますが、これは便利な一般的なアイデアです...

于 2013-10-22T23:06:23.883 に答える