Вычислить корреляцию между пересечением двух временных рядов с помощью pandas.Серии

#python #pandas #correlation

#python #pandas #корреляция

Вопрос:

Рассматривая два временных ряда как pandas.Series :

tser_a :

 date

2016-05-25 13:30:00.023   50.41
2016-05-26 13:30:00.023   51.96
2016-05-27 13:30:00.030   51.98
2016-05-28 13:30:00.041   52.00
2016-05-29 13:30:00.048   52.01
2016-06-02 13:30:00.049   51.97
2016-06-03 13:30:00.072   52.01
2016-06-04 13:30:00.075   52.10
  

tser_b :

 date

2016-05-24 13:30:00.023   74.41
2016-05-25 13:30:00.023   74.96
2016-05-26 13:30:00.030   74.98
2016-05-27 13:30:00.041   73.00
2016-05-28 13:30:00.048   73.01
2016-05-29 13:30:00.049   73.97
2016-06-02 13:30:00.072   72.01
2016-06-03 13:30:00.075   72.10
  

Я хотел бы вычислить корреляцию между этими двумя временными рядами.

Pandas предлагает функцию pandas.Series.corr (ref) для вычисления такого значения.

 corr = tser_a.corr(tser_b)
  

Мои сомнения:

Однако мне нужно быть уверенным, что корреляция учитывает одну и ту же дату для каждого значения, таким образом, учитывая только пересечение между tser_a и tser_b .

Как псевдокод:

 if ((tser_a[date_x] IS NOT NIL) AND (tser_b[date_x] IS NOT NIL)):
    then: consider(tser_a[date_x], tser_b[date_x])
else:
    then: skip and go ahead
  

Затем:

 tser_a -> 2016-05-24 13:30:00.023   74.41
tser_b -> 2016-06-04 13:30:00.075   52.10
  

Должно быть исключено.

pandas.Series.corr Предполагает ли это поведение по умолчанию или я должен сначала пересечь два временных date ряда в соответствии с?

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

1. Вы уверены, что каждая серия содержит не более одной выборки в день? Если нет, что произойдет, если у вас будет несколько выборок в день?

2. В этом я уже уверен, поскольку для моего варианта использования выборка производится один раз в день

Ответ №1:

Похоже tser_a.corr(tser_b) , что соответствует индексам. Однако, поскольку у двух данных могут быть разные временные метки, вы получите неожиданный результат. Вместо этого вы можете использовать resample first:

 tser_a.resample('D').mean().corr(tser_b.resample('D').mean())
# out -0.5522781562573792