2017-02-12 10 views
1

Python:前の値(前の行)に依存するPandas列に値を設定するにはどうすればよいですか?

私は金融アプリを構築しています。私の位置は、の前の位置の「信号」の列(同列)に依存します。

DataFrameはSPYと呼ばれます。

position_arr = [] 
position = 0 
for row in SPY['signal']: 
    if row=='BUY' and position == 0: 
     position = 1 
    elif row=='SELL' and position == 0: 
     position = -1 
    elif row=='CLOSE SELL' and position == -1: 
     position = 0 
    elif row=='CLOSE BUY' and position == 1: 
     position = 0 
    position_arr.append(position) 

SPY['position']=position_arr 

これを行うには、より効率的な方法がありますか?

答えて

1

'signal'列にapplyを使用し、変数を使用して以前の値を保持することができます。

prev_val = None #if you don't know what should be the first value 

def check_condition(current_val): 
    global prev_val 
    val = 0 
    if prev_val is not None: 
     if current_val == 'BUY' and prev_val == 0: 
      val = 1 
     elif current_val == 'SELL' and prev_val == 0: 
      val = -1 
     elif current_val == 'CLOSE SELL' and prev_val == -1: 
      val = 0 
     elif current_val == 'CLOSE BUY' and prev_val == 1: 
      val = 0 
    else: # handle the first row case separately 
     val = 0 # TODO: what is the value for the first row? 
    prev_val = val 
    return val 

df['position'] = df['signal'].apply(check_condition) 
2

あなたはposition列をシフトし、列軸にapply()を使用することもできます。

def apply_func(row): 
    if row['signal']=='BUY' and row['pos_shifted'] == 0: 
     position = 1 
    elif row['signal']=='SELL' and row['pos_shifted'] == 0: 
     position = -1 
    elif row['signal']=='CLOSE SELL' and row['pos_shifted'] == -1: 
     position = 0 
    elif row['signal']=='CLOSE BUY' and row['pos_shifted'] == 1: 
     position = 0 
    return position 

SPY['pos_shift'] = SPY['position'].shift() 
SPY['position'] = SPY.apply(apply_func, axis=1) 
関連する問題