Поиск нескольких интерполированных значений x из необратимой функции

Я пытаюсь найти два интерполированных значения x функции, найденной при пересечении порога.

здесь

Я попытался переключить значения x и y, как было предложено в предыдущих ответах на аналогичные вопросы; однако это возвращает только одно из двух значений x, которые я ищу, из-за значений, имеющих одну и ту же координату x при инвертировании.

Перевернутый график.

Красная точка на каждом графике показывает точку, которую я уже нашел с помощью следующего кода:

interp = interp1d(data[1], data.times)
val = interp(great.middle.iloc[1])

Где data — это фрейм данных pandas, который содержит все события (так что здесь мы смотрим на событие 1) и один столбец времени, а great — это другой фрейм данных pandas, где среднее значение — это наибольшее значение в столбце событий, деленное на 2. Здесь val равно 42,28045192307682, что является интерполированным временем достижения среднего значения (во второй раз).

Я попытался сузить значения для функции интерполяции, но интерполяция значения y всегда приводит к значениям Nan x.

Данные, которые я использую, довольно велики, но вот вывод по напряжению и времени: ://drive.google.com/open?id=16xPB5HU_ZJ4qmIdD8icKrDKAAXAO2lH7 https://drive.google.com/open?id=1Yc-_ole-dFAnpTNJhEjKNYU6hQfCSiar


person Erica    schedule 29.05.2019    source источник
comment
Вам действительно нужно опубликовать код и, возможно, некоторые примеры данных, которые вы используете.   -  person Stephen Rauch    schedule 29.05.2019
comment
@StephenRauch Я обновил вопрос, надеюсь, он немного полезнее! У меня действительно нет другого кода для публикации, когда дело доходит до интерполяции.   -  person Erica    schedule 29.05.2019
comment
Используйте это, чтобы найти нулевые пересечения: > stackoverflow.com/questions/23289976/ Затем сузьте интервал до этих диапазонов пересечений.   -  person Stephen Rauch    schedule 29.05.2019


Ответы (1)


Вот как я решил это:

#save the event data column as pulse (y-values)
pulse = data[1]
#save the time data as time (x-values)
times = data.times

#resample the zero points of the data (the data - the threshold)
spulse = signal.resample(pulse - np.max(pulse)/2., 10*len(pulse))

#find the place where the data changes signs
crossings = np.where(np.diff(np.sign(spulse)))[0]

#because the data has noise, average the first and second crossings 
first = np.mean(crossings[crossings < np.argmax(spulse)])/1000
second = np.mean(crossings[crossings > np.argmax(spulse)])/1000

#print the times that the threshold was crossed
print "First crossing at: " + str(first) + ", Second at: " + str(second)
person Erica    schedule 30.05.2019