Я посмотрел на этот ответ , где у них есть действительно умное решение, чтобы найти точку, где начинается максимальная просадка, и где максимальная просадка имеет самую низкую точку.Однако, согласно Википедии , это не конец периода (как утверждается в ответе).Конец периода - это когда вы достигаете того же пикового значения, которое было до начала периода просадки.
Это означает, что период просадки не имеет конца для графика, приведенного в ответе, с которым я связан.Я пытаюсь написать код, который может решить эту проблему, в обоих случаях {1) у него есть конечный период, 2) у него нет конечного периода}.
Если период никогда не заканчивается, я просто хочу, чтобы он возвращал последний индекс массива (так, в основном, длину массива), и если период действительно заканчивается, я хочу правильный индекс.Вот упрощенный пример, в котором я попытался решить первый случай - когда у него есть конечный период:
import numpy as np
an_array = [21, 22, 23, 40, 19, 35, 37, 45, 42, 39, 28]
running_maximum = np.maximum.accumulate(an_array)
# running_maximum = [21, 22, 23, 40, 40, 40, 40, 45, 45, 45, 45]
bottom_index = np.argmax(running_maximum - an_array)
start_index = np.argmax(an_array[:bottom_of_period])
# bottom_index = 4, start_index = 3
difference = running_maximum - an_array
# difference = [0, 0, 0, 0, 21, 5, 3, 0, 3, 6, 17]
Причина, по которой я вычисляю difference
, заключается в том, что она позволяет легко увидеть, что end_index=7
.Это связано с тем, что максимальная просадка составляет 21 по индексу 4, а с difference=0
снова по индексу 7 это означает, что я снова прошел (или только что достиг) своего пика.Я попытался написать np.argmin(difference[bottom_index:])
, чтобы получить индекс, но, конечно, это не дает мне 7, так как я нарезаю вектор difference
, вместо этого он дает мне 3, что неверно.
Любые советы о том, как яможет решить эту проблему, а также сделать так, чтобы он возвращал последний индекс в тех случаях, когда нет конечного периода, что было бы удивительно.