Как получить корреляцию между двумя временными сериями, используя панд - PullRequest
13 голосов
/ 24 июня 2011

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

Я играл с Пандами , чтобы попытаться сделать это.Я создал две временные серии и использую TimeSeriesA.corr(TimeSeriesB).Однако, если времена в 2 таймсериях не совпадают точно (они обычно отключаются на секунды), я получаю Null в качестве ответа.Я мог бы получить достойный ответ, если бы мог:

a) Интерполировать / заполнить пропущенные времена в каждом TimeSeries (я знаю, что это возможно в Pandas, я просто не знаю, как это сделать)

b) вырезать секунды из объектов даты и времени Python (установите секунды на 00, не меняя минут).Я бы потерял степень точности, но не огромную сумму

c) Используйте что-то еще в Pandas, чтобы получить корреляцию между двумя timeSeries

d) Используйте что-то в python, чтобы получить корреляциюмежду двумя списками с плавающей точкой, каждый с плавающей точкой, имеющий соответствующий объект даты-времени, с учетом времени.

У кого-нибудь есть предложения?

1 Ответ

13 голосов
/ 24 июня 2011

У вас есть несколько вариантов использования панд, но вы должны принять решение о том, как имеет смысл выравнивать данные, учитывая, что они не встречаются в один и тот же момент.

Использованиезначения «по состоянию» на время в одном из временных рядов , вот пример:

    In [15]: ts
    Out[15]: 
    2000-01-03 00:00:00    -0.722808451504
    2000-01-04 00:00:00    0.0125041039477
    2000-01-05 00:00:00    0.777515530539
    2000-01-06 00:00:00    -0.35714026263
    2000-01-07 00:00:00    -1.55213541118
    2000-01-10 00:00:00    -0.508166334892
    2000-01-11 00:00:00    0.58016097981
    2000-01-12 00:00:00    1.50766289013
    2000-01-13 00:00:00    -1.11114968643
    2000-01-14 00:00:00    0.259320239297



    In [16]: ts2
    Out[16]: 
    2000-01-03 00:00:30    1.05595278907
    2000-01-04 00:00:30    -0.568961755792
    2000-01-05 00:00:30    0.660511172645
    2000-01-06 00:00:30    -0.0327384421979
    2000-01-07 00:00:30    0.158094407533
    2000-01-10 00:00:30    -0.321679671377
    2000-01-11 00:00:30    0.977286027619
    2000-01-12 00:00:30    -0.603541295894
    2000-01-13 00:00:30    1.15993249209
    2000-01-14 00:00:30    -0.229379534767

вы можете видеть, что они отключены на 30 секунд.Функция reindex позволяет выровнять данные при заполнении значений вперед (получая значение «как из»):

    In [17]: ts.reindex(ts2.index, method='pad')
    Out[17]: 
    2000-01-03 00:00:30    -0.722808451504
    2000-01-04 00:00:30    0.0125041039477
    2000-01-05 00:00:30    0.777515530539
    2000-01-06 00:00:30    -0.35714026263
    2000-01-07 00:00:30    -1.55213541118
    2000-01-10 00:00:30    -0.508166334892
    2000-01-11 00:00:30    0.58016097981
    2000-01-12 00:00:30    1.50766289013
    2000-01-13 00:00:30    -1.11114968643
    2000-01-14 00:00:30    0.259320239297

    In [18]: ts2.corr(ts.reindex(ts2.index, method='pad'))
    Out[18]: -0.31004148593302283

обратите внимание, что для pad также используется псевдоним ffill (но только всамая последняя версия панд на GitHub на данный момент!).

Уберите секунды из всех ваших дат .Лучший способ сделать это - использовать rename

    In [25]: ts2.rename(lambda date: date.replace(second=0))
    Out[25]: 
    2000-01-03 00:00:00    1.05595278907
    2000-01-04 00:00:00    -0.568961755792
    2000-01-05 00:00:00    0.660511172645
    2000-01-06 00:00:00    -0.0327384421979
    2000-01-07 00:00:00    0.158094407533
    2000-01-10 00:00:00    -0.321679671377
    2000-01-11 00:00:00    0.977286027619
    2000-01-12 00:00:00    -0.603541295894
    2000-01-13 00:00:00    1.15993249209
    2000-01-14 00:00:00    -0.229379534767

Обратите внимание, что если переименование приводит к дублированию дат, будет выброшено Exception.

Для чего-то более продвинутого , предположим, что вы хотите коррелировать среднее значение для каждой минуты (когда у вас есть несколько наблюдений в секунду):

    In [31]: ts_mean = ts.groupby(lambda date: date.replace(second=0)).mean()

    In [32]: ts2_mean = ts2.groupby(lambda date: date.replace(second=0)).mean()

    In [33]: ts_mean.corr(ts2_mean)
    Out[33]: -0.31004148593302283

Этипоследние фрагменты кода могут не работать, если у вас нет последнего кода из https://github.com/wesm/pandas. Если .mean() не работает на GroupBy объекте, указанном выше, попробуйте .agg(np.mean)

Надеюсь, что этопомогает!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...