У меня есть различные временные ряды, которые я хочу коррелировать - или, скорее, взаимно коррелировать - друг с другом, чтобы выяснить, при каком временном лаге коэффициент корреляции является наибольшим.
Я нашел различных вопросы и ответы / ссылки, в которых обсуждается, как это сделать с помощью numpy, но это будет означать, что мне нужно превратить свои фреймы данных в массивы numpy. А поскольку мои временные ряды часто охватывают разные периоды, я боюсь столкнуться с хаосом.
Изменить
Проблема, с которой я сталкиваюсь со всеми методами numpy / scipy, заключается в том, что они, похоже, не осведомлены о характере временных рядов моих данных. Когда я сопоставляю временной ряд, который начинается, скажем, в 1940 году, с тем, который начинается в 1970 году, pandas corr
знает это, тогда как np.correlate
просто создает массив из 1020 записей (длина более длинного ряда), полный нан.
Различные вопросы по этому поводу указывают на то, что должен быть способ решить проблему разной длины, но до сих пор я не видел никаких указаний о том, как использовать его в определенные периоды времени. Мне просто нужно сдвинуть на 12 месяцев с шагом 1, чтобы увидеть время максимальной корреляции в пределах одного года.
Edit2
Некоторые минимальные образцы данных:
import pandas as pd
import numpy as np
dfdates1 = pd.date_range('01/01/1980', '01/01/2000', freq = 'MS')
dfdata1 = (np.random.random_integers(-30,30,(len(dfdates1)))/10.0) #My real data is from measurements, but random between -3 and 3 is fitting
df1 = pd.DataFrame(dfdata1, index = dfdates1)
dfdates2 = pd.date_range('03/01/1990', '02/01/2013', freq = 'MS')
dfdata2 = (np.random.random_integers(-30,30,(len(dfdates2)))/10.0)
df2 = pd.DataFrame(dfdata2, index = dfdates2)
Из-за различных этапов обработки эти dfs в конечном итоге превращаются в df, которые проиндексированы с 1940 по 2015 год. Это должно воспроизвести следующее:
bigdates = pd.date_range('01/01/1940', '01/01/2015', freq = 'MS')
big1 = pd.DataFrame(index = bigdates)
big2 = pd.DataFrame(index = bigdates)
big1 = pd.concat([big1, df1],axis = 1)
big2 = pd.concat([big2, df2],axis = 1)
Вот что я получаю, когда коррелирую с пандами и сдвигаю один набор данных:
In [451]: corr_coeff_0 = big1[0].corr(big2[0])
In [452]: corr_coeff_0
Out[452]: 0.030543266378853299
In [453]: big2_shift = big2.shift(1)
In [454]: corr_coeff_1 = big1[0].corr(big2_shift[0])
In [455]: corr_coeff_1
Out[455]: 0.020788314779320523
И пробуя scipy:
In [456]: scicorr = scipy.signal.correlate(big1,big2,mode="full")
In [457]: scicorr
Out[457]:
array([[ nan],
[ nan],
[ nan],
...,
[ nan],
[ nan],
[ nan]])
который согласно whos
scicorr ndarray 1801x1: 1801 elems, type `float64`, 14408 bytes
Но я бы хотел иметь только 12 записей. / Edit2
Идея, которую я придумал, состоит в том, чтобы самому реализовать корреляцию с задержкой по времени, например:
corr_coeff_0 = df1['Data'].corr(df2['Data'])
df1_1month = df1.shift(1)
corr_coeff_1 = df1_1month['Data'].corr(df2['Data'])
df1_6month = df1.shift(6)
corr_coeff_6 = df1_6month['Data'].corr(df2['Data'])
...and so on
Но это, вероятно, медленно, и я, вероятно, пытаюсь здесь изобрести велосипед. Изменить. Похоже, что описанный выше подход работает, и я ввел его в цикл, чтобы использовать все 12 месяцев в году, но я все же предпочел бы встроенный метод.
scipy.signal.correlate
и _2 _. Я бы сказал, что преобразование в массивы numpy, вероятно, ваш лучший выбор. - person wgwz   schedule 16.10.2015pd.HDFStore
иh5py
. Если вы хотите изобретать велосипед, дерзайте. - person wgwz   schedule 19.10.2015series.apply
, спасибо, это может пригодиться позже. Проблема, с которой я сталкиваюсь со всеми методами numpy / scipy, заключается в том, что они, похоже, не осведомлены о характере временных рядов моих данных. Когда я сопоставляю временной ряд, который начинается, скажем, в 1940 году, с временным рядом, который начинается в 1970 году, pandascorr
знает это, тогда какnp.correlate
просто создает массив из 1020 записей, полныйnan
. Мне просто нужно переключиться, чтобы увидеть максимальную корреляцию в течение одного года. - person JC_CL   schedule 20.10.2015