Возможно, это будет работать;он просто основан на аппроксимации производной с «центральной разностью», то есть для индекса i
, производная в этой точке рассчитывается с использованием точек h
позади и h
впереди (score[i+h]-score[i-h])/(2*h)
.
def derivatives(score, h=100):
score_derivatives = {}
for i in range(h,len(score)-h):
first_derivative = (score[i+h]-score[i-h])/(h*2)
score_derivatives[i] = first_derivative
return score_derivatives
Это вернет вам словарь производных по центральной разнице в каждом индексе.Вам просто нужно будет пройтись по этому словарю, чтобы найти первый индекс со значением, меньшим, чем предварительно установленный порог (градиент вашего «крутого падения»).
Если h
достаточно большой (яустановите значение по умолчанию 100), этот метод будет устойчив к шуму.