Панды .rolling.corr с использованием даты / времени смещения - PullRequest
0 голосов
/ 06 июля 2018

У меня возникла небольшая проблема с функцией прокрутки панд, и я не совсем уверен, где я иду не так. Если я макет двух тестовых серий чисел:

df_index = pd.date_range(start='1990-01-01', end ='2010-01-01', freq='D')
test_df = pd.DataFrame(index=df_index)

test_df['Series1'] = np.random.randn(len(df_index))
test_df['Series2'] = np.random.randn(len(df_index))

Тогда легко взглянуть на их скользящее годовое соотношение:

test_df['Series1'].rolling(365).corr(test_df['Series2']).plot()

, который производит:

enter image description here

Пока все хорошо. Если я попытаюсь сделать то же самое, используя смещение даты и времени:

test_df['Series1'].rolling('365D').corr(test_df['Series2']).plot()

Я получаю совершенно другой (и явно неправильный) результат:

enter image description here

Что-то не так с пандами или что-то не так со мной?

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

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

Это очень сложно, я думаю, что поведение window как int и offset отличается:

Новое в версии 0.19.0 - возможность передавать смещение (или конвертируемый) в метод .rolling () и позволяет производить переменные окна на основе прошедшего временного окна. Для каждого момента времени этот включает в себя все предыдущие значения, встречающиеся в течение указанного времени дельта.

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

Вы должны оформить документацию Роллинг с учетом времени .

r1 = test_df['Series1'].rolling(window=365) # has default `min_periods=365`
r2 = test_df['Series1'].rolling(window='365D') # has default `min_periods=1`
r3 = test_df['Series1'].rolling(window=365, min_periods=1)

r1.corr(test_df['Series2']).plot()
r2.corr(test_df['Series2']).plot()
r3.corr(test_df['Series2']).plot()

Этот код выдает схожую форму графиков для r2.corr().plot() и r3.corr().plot(), но обратите внимание, что результаты расчета по-прежнему различаются: r2.corr(test_df['Series2']) == r3.corr(test_df['Series2']).

Я думаю, что для регулярного индекса частоты вы должны просто придерживаться r1.

0 голосов
/ 06 июля 2018

Это в основном потому, что результат двух прокаток 365 и 365D различен. Например

sub = test_df.head()
sub['Series2'].rolling(2).sum()
Out[15]: 
1990-01-01         NaN
1990-01-02   -0.355230
1990-01-03    0.844281
1990-01-04    2.515529
1990-01-05    1.508412

sub['Series2'].rolling('2D').sum()
Out[16]: 
1990-01-01   -0.043692
1990-01-02   -0.355230
1990-01-03    0.844281
1990-01-04    2.515529
1990-01-05    1.508412

Так как в прокатке 365 много NaN, корр двух серий в двух отношениях совершенно различен.

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