Как найти выравнивание двух наборов данных в pandas

#python #pandas

#python #pandas

Вопрос:

Представлено в качестве примера.

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

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

DS1.событие:

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

DS2.событие:

 __--_-__--
  

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

Такое, что

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

DS1.start 34min ~ = DS2.start

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

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

Комментарии:

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

Ответ №1:

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

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

Вы можете сделать это с помощью replace метода strings (например 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
  

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

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

Комментарии:

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

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