2017-02-12 56 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

您可以使用“信号”列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) 
相关问题