2015-12-03 3 views
0

J'ai cette boucle qui vérifie les conditions suivantes. Pour chaque itération de i, il faut obtenir une valeur pour m1, m2, m3, m4 and m5. Est-ce que les instructions if doivent être vérifiées comme ceci (par "paires") ou y a-t-il une façon plus intelligente/plus rapide de le faire?Conditions IF par paire de conditions

for i in range(len(df.index)): 

    if  df.ix[i, 'ema4'] >= df.ix[i, 'ema9']: 
      m1 = 1 
    elif df.ix[i, 'ema4'] < df.ix[i, 'ema9']: 
      m1 = -1 

    if  df.ix[i, 'ema9'] >= df.ix[i, 'ema20']: 
      m2 = 1    
    elif df.ix[i, 'ema9'] < df.ix[i, 'ema20']: 
      m2 = -1 

    if  df.ix[i, 'ema20'] >= df.ix[i, 'ema48']: 
      m3 = 1 
    elif df.ix[i, 'ema20'] < df.ix[i, 'ema48']: 
      m3 = -1   

    if  df.ix[i, 'ema48'] >= df.ix[i, 'ema80']: 
      m4 = 1 
    elif df.ix[i, 'ema48'] < df.ix[i, 'ema80']: 
      m4 = -1 

    if  df.ix[i, 'ema80'] >= df.ix[i, 'ema100']: 
      m5 = 1 
    elif df.ix[i, 'ema80'] < df.ix[i, 'ema100']: 
      m5 = -1 

    df.ix[i,'test'] = (m1 + m2 + m3 + m4 + m5) 
+2

Avez-vous vraiment pas entendu parler de 'else' ? – TigerhawkT3

+0

Je suppose que vous pourriez remplacer tous ces 'elif ...' avec un simple 'else' – Hacketo

+0

Ou juste' m1 = (condition) * 2-1' si vous ne voulez vraiment pas utiliser des branches pour une raison quelconque. – TigerhawkT3

Répondre

4

Pour simplifier le code, vous pouvez initialiser les variables à la valeur par défaut et utiliser un tas de if s:

m1 = m2 = m3 = m4 = m5 = -1 

for i in range(len(df.index)): 
    if df.ix[i, 'ema4'] >= df.ix[i, 'ema9']: 
     m1 = 1 
    ... 
+0

c'était exactement ce que je cherchais. Merci. – Gabriel

0

Comme commentaires dit tout à l'utiliser d'autre:

for i in range(len(df.index)): 
    if df.ix[i, 'ema4'] >= df.ix[i, 'ema9']: 
     m1 = 1 
    else: 
     m1 = -1 

ou vous pourriez prérégler et juste faire le si:

m1 = -1 
    if df.ix[i, 'ema4'] >= df.ix[i, 'ema9']: 
     m1 = 1 

répétition pour tous les ifs

+0

Que 'for..else' est techniquement valide, mais il ne fait pas ce que vous pensez qu'il fait. – TigerhawkT3

+0

vient de voir ça - l'a corrigé - oups – gkusner

1

Vous pouvez utiliser 2 boucles, celle qui est mentionnée par @eugene y avec peu de modification des listes et une autre avec vous colonnes:

df_size = len(df.index) 
m = [-1] * df_size 
col_names = ['ema4', 'ema9', 'ema20', 'ema48', 'ema80'] 

for i in range(df_size): 
    for col_name in col_names: 
      if df.ix[i, col_name] >= df.ix[i, col_name ]: 
       m[i] = 1 


df.ix[i,'test'] = sum(m) 
+0

vous a mis à jour. belle façon aussi. – Gabriel