Страницы

Поиск по вопросам

среда, 22 января 2020 г.

Python, Pandas - перебор элементов с условием

#python #pandas


updated
Привет! Помогите чайнику :) В процессе освоения Python и Pandas, столкнулся с проблемой
применения к Series своей функции. 
Пытаюсь сделать функцию, которая будет перебирать значения заранее заданного набора
чисел в Series и, в случае соответствия одному из нескольких критериев, осуществлять
операцию с числом и вносить его в новый Series, иначе переходить к следующему числу. 

Попытался на своем понимании построить следующую функцию, но она не работает (Jupyter
просто уходит в бесконечные раздумия):

def trail_stop(high, low, close):
  for row in close:
    i = -1
    run = True  
    high.s = high.shift(i)
    low.s = low.shift(i)
    trail = (close + 0.0002)
    stop_loss = (close - 0.0002)
    while run == True:
      if high.s[0] > trail and low.s[0] < stop_loss:
        stop_loss = trail
        trail = trail + 0.0002
        i = i - 1
      elif low.s[0] > stop_loss:
        return stop_loss
        run = False
      elif high.s[0] < trail and low.s[0] < stop_loss:
        i = i - 1
      else:
        run = False

table['trail'] = table.apply(trail_stop(table.High, table.Low, table.Close), axis = 1) 


То есть при таких исходящих данных (столбцы Close, High, Low) нужно получить на выходе
следующее (столбец trail):

        High      Low    Close    trail
0    1.32396  1.32358  1.32391  1.32371
1    1.32392  1.32365  1.32365  1.32385 
2    1.32370  1.32364  1.32369  1.32389 
3    1.32378  1.32365  1.32371  1.32391 
4    1.32378  1.32360  1.32360  1.32380 
5    1.32390  1.32366  1.32370  1.32390 
6    1.32384  1.32370  1.32384  1.32364 
7    1.32386  1.32355  1.32380  1.32360 
8    1.32384  1.32358  1.32379  None
9    1.32389  1.32379  1.32387  None 
10   1.32386  1.32379  1.32383  1.32363 
11   1.32394  1.32360  1.32387  None 
12   1.32389  1.32370  1.32370  1.32390  
13   1.32390  1.32370  1.32390  1.32370 
14   1.32390  1.32364  1.32387  None  
15   1.32382  1.32373  1.32382  None 


Буду рад любой помощи или совету куда копать. Спасибо
    


Ответы

Ответ 1



Добрый день. 1) У вас объявление run == True стоит внутри цикла, и тем самым у вас цикл ходит по замкнутому кругу. Попробуйте вынести его в первую строчку функции, над циклом. 2) Не уверен, что верно понимаю всю задачу, но, в качестве другого варианта, попробуйте использовать if вместо while.

Ответ 2



в вашем цикле есть ветвь if из которой вы никогда не выйдете, что и происходит при каких-то данных elif high.s[0] < trail and low.s[0] < stop_loss: i = i - 1

Комментариев нет:

Отправить комментарий