2016-10-24 2 views
2

Представлено в качестве примера.Как найти выравнивание двух наборов данных в пандах

Два набора данных. Один собран в течение 1 часа. Один собран в течение 20 минут в течение этого часа.

Каждый набор данных содержит экземпляры событий, которые могут быть преобразованы в отдельные столбцы истины (-) или false (_), представляющие, если событие происходит или нет.

DS1.event:

_-__-_--___----_-__--_-__---__ 

DS2.event:

__--_-__-- 

Я ищу способ автоматизировать корреляцию (поправьте меня, если терминология неверна) двух данных устанавливает и находит смещение (-ы) в DS1, в котором DS2 больше всего (верхний x много), вероятно, произошел. Вероятно, это приведет к некоторому соответствующему проценту, который я могу затем установить для определения правильности совпадения.

Такое, что

_-__-_--___----_-__--_-__---__ 
       __--_-__-- 

DS1.start + 34min ~ = DS2.start

Дополнительная информация:
DS1 был записан на примерно 1 Гц. DS2 примерно на 30 Гц. Это делает менее вероятным, что будет 100% чистое совпадение.

Альтернативные методы (для панд) будут оценены, но python/pandas - вот что я имею в своем распоряжении.

+0

Можете ли вы использовать 'numpy.convolve' и найти максимум этого? – Evert

ответ

1

Похоже, вы просто хотите что-то вроде взаимной корреляции?

Я бы сначала преобразовать строку в числовое представление, так заменить - и _ с 1 и 0

Вы можете сделать это с помощью струны replace метод (например signal.replace("-", "1"))

конвертировать их в список или массив numpy:

event1 = [int(x) for x in signal1] 
event2 = [int(x) for x in signal2] 

Затем рассчитать взаимную корреляцию между ними:

xcor = np.correlate(event1, event2, "full") 

Это даст вам значение взаимной корреляции при каждом временном лагере. Вы просто хотите, чтобы найти наибольшее значение, и разница во времени, при котором это происходит:

nR = max(xcor) 
maxLag = np.argmax(xcor) # I imported numpy as np here 

Давать вам что-то вроде:

Cross correlation value: 5 
Lag: 20 

Похоже, вы больше заинтересованы в значении задержки здесь ,То, что отставание говорит вам, по существу, сколько времени/позиционные изменения необходимы, чтобы получить максимальное поперечное значение корреляции (степень матча) между вашими 2 сигналами

Вы могли бы хотеть взглянуть на документы для np.correlate и np.convolve к определить метод (полный, тот же или действительный), который вы хотите использовать, как это определено длиной ваших данных и тем, что вы хотите, если ваши сигналы различной длины

+0

Я попробую. «-' и' _' должны были быть репрезентативными. Фактически они будут значениями булева типа. Будет ли это обрабатывать разницу в плотности выборки или мне нужно сначала опробовать один набор данных? –

+0

Извините, я пропустил часть о частоте дискретизации в вопросе. В случаях взаимной корреляции и свертки вы в основном принимаете один сигнал и сдвигаете его по другому. Вам, скорее всего, придется сбрасывать образец, потому что в противном случае ваши 2 сигнала будут по существу в разных масштабах. Я не уверен, как вы это сделаете без выборки вверх/вниз – Simon

Смежные вопросы