Как мне узнать, где одна линия пересекает другую с помощью pandas/matplotlib?

#pandas #numpy #matplotlib

Вопрос:

У меня есть фрейм данных под названием df['x'] , который я использовал Matplotlib для построения графика, как показано ниже. Фрейм данных имеет индекс даты и времени, и он колеблется между 0 и выше 0. Есть также две фиолетовые линии y=2 и y=5.

Мне интересно найти даты в индексе, когда синяя линия пересекает фиолетовую линию y=2 при движении вверх. Однако с одной оговоркой, если синяя линия пересекает фиолетовую линию, поднимающуюся во второй раз, прежде чем достигнет 0, я бы не хотел, чтобы она учитывалась. Поэтому я ищу систему, которая возвращает мне 6 дат. Спасибо за любую помощь.

https://gyazo.com/40aac726ef3546c22c9191fa2d9bc3e2
Текст

Ответ №1:

В итоге я перепробовал кучу разных вещей. Поначалу я действительно не был уверен, как подойти к этой проблеме, потому что я довольно новичок в кодировании. Проведя небольшое исследование, я нашел решение, которое работает, применяя функцию для создания нового столбца, а затем находя индекс областей столбца, соответствующих определенным критериям.

 #Making a function to apply to df
trade_pos = ''
dip = ''
def apply_function(df):
    global trade_pos
    global dip
    if df.Drawdown == 0 and trade_pos == 'open':
        trade_pos = 'closed'
        dip = 'false'
        return 'Exit'
    elif df.Drawdown == 0:
        trade_pos = 'closed'
        dip = 'false'
        return 0
    elif df.Drawdown >= 2 and df.Drawdown < 5 and trade_pos == 'closed' and dip != 'true':
        trade_pos = 'open'
        return 'Entry'
    elif df.Drawdown >=5 and trade_pos == 'open':
        trade_pos = 'closed'
        dip = 'true'
        return 'Exit'
    else:
        return 0

#Applying function to df
df['Strategy'] = df.apply(apply_function, axis=1)

Finding dates of crossover with caveats
entry = df[df['Strategy'] == 'Entry']
entry = list(entry.index)
#We finish with a list of dates that meet the criteria of the original post
 

Я надеюсь, что это поможет кому-нибудь еще с подобной проблемой.