2016-08-20 7 views
4

次のコードは、値が次の行でヒットまたはミスしたかどうかを識別し、条件が満たされた時間を示す出力列を提供します。完全一致ではなく - より大きい値をキャプチャするようにコードを修正する

import datetime,numpy as np,pandas as pd; 
nan = np.nan; 

a = pd.DataFrame( {'price': {datetime.time(9, 0): 1, datetime.time(10, 0): 0, datetime.time(11, 0): 3, datetime.time(12, 0): 4, datetime.time(13, 0): 7, datetime.time(14, 0): 6, datetime.time(15, 0): 5, datetime.time(16, 0): 4, datetime.time(17, 0): 0, datetime.time(18, 0): 2, datetime.time(19, 0): 4, datetime.time(20, 0): 7}, 'reversal': {datetime.time(9, 0): nan, datetime.time(10, 0): nan, datetime.time(11, 0): nan, datetime.time(12, 0): nan, datetime.time(13, 0): nan, 
    datetime.time(14, 0): 6.0, datetime.time(15, 0): nan, datetime.time(16, 0): nan, datetime.time(17, 0): nan, datetime.time(18, 0): nan, datetime.time(19, 0): nan, datetime.time(20, 0): nan}}); 


a['target_hit_time']=a['target_miss_time']=nan; 
a['target1']=a['reversal']+1; 
a['target2']=a['reversal']-a['reversal']; 
a.sort_index(1,inplace=True); 

hits = a.ix[:,:-2].dropna(); 

for row,hit in hits.iterrows(): 

     forwardRows = [row]<a['price'].index.values 

     targetHit = a.index.values[(hit['target1']==a['price'].values) & forwardRows][0]; 
     targetMiss = a.index.values[(hit['target2']==a['price'].values) & forwardRows][0]; 

     if targetHit>targetMiss: 
      a.loc[row,"target_miss_time"] = targetMiss; 
     else: 
      a.loc[row,"target_hit_time"] = targetHit; 


a 

この画像は容易にこのコードを実行することによって再生することができる上記のコードからの出力を示しています。

current working code

私が持っている問題は、このコードは、実際のデータに使用されたときということです価格は正確には一致しない可能性があります。私たちは、以下の画像を見ればそう:

desired

我々は値>= 7.5を探しているだけの価値7.5を探していなかった場合target1基準が満たされることを参照してください。誰でもこのコードを修正してください。

答えて

1

一部IFSと、すべてのthats:D ...

import datetime,numpy as np,pandas as pd; 
nan = np.nan; 

a = pd.DataFrame( {'price': {datetime.time(9, 0): 1, datetime.time(10, 0): 0, datetime.time(11, 0): 3, datetime.time(12, 0): 4, datetime.time(13, 0): 7, datetime.time(14, 0): 6, datetime.time(15, 0): 5, datetime.time(16, 0): 4, datetime.time(17, 0): 2, datetime.time(18, 0): 2, datetime.time(19, 0): 4, datetime.time(20, 0): 8}, 'reversal': {datetime.time(9, 0): nan, datetime.time(10, 0): nan, datetime.time(11, 0): nan, datetime.time(12, 0): nan, datetime.time(13, 0): nan, 
    datetime.time(14, 0): 6.0, datetime.time(15, 0): nan, datetime.time(16, 0): nan, datetime.time(17, 0): nan, datetime.time(18, 0): nan, datetime.time(19, 0): nan, datetime.time(20, 0): nan}}); 


a['target_hit_time']=a['target_miss_time']=nan; 
a['target1']=a['reversal']+1; 
a['target2']=a['reversal']-a['reversal']; 
a.sort_index(1,inplace=True); 

hits = a.ix[:,:-2].dropna(); 

for row,hit in hits.iterrows(): 

     forwardRows = a[a.index.values > row]; 
     targetHit = hit['target1']<=forwardRows['price'].values; 
     targetMiss = hit['target2']==forwardRows['price'].values; 
     targetHit = forwardRows[targetHit].head(1).index.values; 
     targetMiss = forwardRows[targetMiss].head(1).index.values; 

     targetHit, targetMiss = \ 
     targetHit[0] if targetHit else [], \ 
     targetMiss[0] if targetMiss else []; 

     goMiss,goHit = False,False 
     if targetHit and targetMiss: 
      if targetHit>targetMiss: goMiss=True; 
      else: goHit=True; 
     elif targetHit and not targetMiss:goHit = True; 
     elif not targetHit and targetMiss:goMiss = True; 

     if goMiss:a.loc[row,"target_miss_time"] = targetMiss; 
     elif goHit:a.loc[row,"target_hit_time"] = targetHit; 



print '#'*50 
print a 
''' 
################################################## 
      price reversal target1 target2 target_hit_time target_miss_time 
09:00:00  1  NaN  NaN  NaN    NaN    NaN 
10:00:00  0  NaN  NaN  NaN    NaN    NaN 
11:00:00  3  NaN  NaN  NaN    NaN    NaN 
12:00:00  4  NaN  NaN  NaN    NaN    NaN 
13:00:00  7  NaN  NaN  NaN    NaN    NaN 
14:00:00  6  6.0  7.0  0.0  20:00:00    NaN 
15:00:00  5  NaN  NaN  NaN    NaN    NaN 
16:00:00  4  NaN  NaN  NaN    NaN    NaN 
17:00:00  2  NaN  NaN  NaN    NaN    NaN 
18:00:00  2  NaN  NaN  NaN    NaN    NaN 
19:00:00  4  NaN  NaN  NaN    NaN    NaN 
20:00:00  8  NaN  NaN  NaN    NaN    NaN 
''' 
+0

ロバートこれはとても素敵な感謝です! – ade1e

+0

今日はあなたのコードを理解して理解するのに時間がかかりました。これは私が学ぶのに非常に便利なので、あなたが入れてくれた努力に感謝します。私たちに 'a.sort_index(1、inplace = True);が必要な理由を理解してください。私たちは列に基づいてソートを行っていますが、どうしてですか?ソート列の前には – ade1e

+1

があります: "price reversal target_hit_time target_miss_time target1 target2"; 「価格反転目標1目標2目標_時間_目標_利益_時間」となる。あなたが知っているべきことはすべて...ただあなたの魂を試しになるようにしました。何か問題がなければ気になります。通常、私は推測したり、そのように働いているようにチェック: "a.sort_index(0、inplace = True); a.sort_index(1、inplace = True);"それから二人のうちの一人を取っている:D。 –

0

重く、あなたのコードを変更せずに、これは私が思い付いたものです:targetHit、targetMissは、配列を返すので、

import numpy as np 

for row,hit in hits.iterrows(): 
     print ("row", row) 
     print ("hit",hit) 

     forwardRows = a[a.index.values > row] 

     targetHit = forwardRows[(hit['target1'] <= forwardRows['price'].values)].head(1).index.values 

     targetMiss = forwardRows[(hit['target2'] >= forwardRows['price'].values)].head(1).index.values 

     if targetHit>targetMiss: 
      a.loc[row,"target_miss_time"] = targetMiss 
     else: 
      a.loc[row,"target_hit_time"] = targetHit 

    price reversal target1 target2 target_hit_time target_miss_time 
09:00:00 1 NaN NaN NaN NaN NaN 
10:00:00 0 NaN NaN NaN NaN NaN 
11:00:00 3 NaN NaN NaN NaN NaN 
12:00:00 4 NaN NaN NaN NaN NaN 
13:00:00 7 NaN NaN NaN NaN NaN 
14:00:00 6 6.5 7.5 0.0 [20:00:00] NaN 
15:00:00 5 NaN NaN NaN NaN NaN 
16:00:00 4 NaN NaN NaN NaN NaN 
17:00:00 2 NaN NaN NaN NaN NaN 
18:00:00 2 NaN NaN NaN NaN NaN 
19:00:00 4 NaN NaN NaN NaN NaN 
20:00:00 8 NaN NaN NaN NaN NaN 

これが改善されることはまだですし、アレイ内の任意の要素があるかどうかを確認する必要があります両方の配列に要素がある場合は、最初の要素を比較する必要があります。現在は、1つの配列が空の場合にのみ機能します。

+0

は、データ/コードをPNG形式の使用をいけないしてください。 – Merlin

関連する問題