Манипулирование сериями панд для получения максимальной корреляции при отставании 0 - PullRequest
0 голосов
/ 04 января 2019

Я пытаюсь выровнять свои данные так, чтобы при использовании другого метода сравнения два набора данных были выровнены так, чтобы они были наиболее похожими. До сих пор я взаимно коррелировал две Серии Панд и нашел позицию запаздывания для наивысшей корреляции. Как я могу затем сдвинуть свои данные, чтобы получить новую самую высокую позицию задержки корреляции 0, когда Серии затем снова взаимно коррелируют.

У меня есть 4 довольно больших серии панд. Одна из этих серий - это запрос, который нужно сравнить с другой 3-й серией и самой собой. Чтобы найти смещение для наивысшей корреляции между парой рядов запрос-цель, я использовал np.correlate () и рассчитал позицию отставания, а также наивысшую корреляцию. Найдя эту позицию отставания, я попытался включить эту задержку в каждую серию, чтобы после пересчета взаимной корреляции новое отставание для наивысшей корреляции стало теперь 0. К сожалению, это не очень удачно.

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

Что у меня есть

Создание DataFrame, содержащего исходные позиции задержки для наивысшей корреляции в каждом сравнении.

lags_o = pd.Dataframe({"a":[np.correlate(s4, s1, mode='full').argmax() - np.correlate(s4, s1, mode='full').size/2], 
         "b": [np.correlate(s4, s2, mode='full').argmax() - np.correlate(s4, s2, mode='full').size/2], 
         "c": [np.correlate(s4, s3, mode='full').argmax() - np.correlate(s4, s3, mode='full').size/2], 
         "d": [np.correlate(s4, s4, mode='full').argmax() - np.correlate(s4, s4, mode='full').size/2]})

При запуске я получаю ожидаемое значение 0 для столбца "d", что указывает на оптимальное выравнивание двух рядов (что имеет смысл). Другие столбцы возвращают ненулевые значения, так что теперь я хочу включить эти необходимые сдвиги в новую взаимную корреляцию.

# shifting the series by the lag given in lags_o for that comparison
s1_lagged = s1.shift(lags_o["a"].item() 
# selecting all non-NaN values in the series for the next correlation
s1_lagged = s1_lagged[~np.isnan(s1_lagged)]
# this is repeated for the other routes - selecting the appropriate df column

То, что я ожидал получить, когда маршрут запроса и новая смещенная целевая серия были затем переданы кросс-корреляции, заключался в том, что каждая позиция отставания в lags_n будет равна 0. Однако это совсем не то, что я получаю. Еще более запутанным является то, что новая позиция запаздывания, кажется, не связана со старой позицией запаздывания (поскольку в запаздывании, похоже, не происходит сдвиг вместе со сдвигом, вмененным в ряд). Я попытался изменить последовательность запросов и целевых рядов по очереди, но не смог получить требуемое значение.

Так что мой вопрос в том, как мне правильно манипулировать этими Сериями, чтобы я мог выровнять эти наборы данных. Поздравляем с Новым годом и благодарим вас за потраченное время и любые ваши предложения.

...