Проблемы с графиками и операндами ACF - PullRequest
0 голосов
/ 05 апреля 2020

Этот фрагмент кода раньше работал нормально, но по неизвестным причинам он больше не работает. У него почему-то есть проблема с построением всего второго графика ACF.

import numpy as np, pandas as pd
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
import matplotlib.pyplot as plt
plt.rcParams.update({'figure.figsize':(9,7), 'figure.dpi':120})

# Import data
df = pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/wwwusage.csv', 
             names=['value'], header=0)

# Original Series
fig, axes = plt.subplots(2, 2, sharex=True)
axes[0, 0].plot(df.value); axes[0, 0].set_title('Original Series')
plot_acf(df.value, ax=axes[0, 1], lags = np.arange(len(df)))

# 1st Differencing
axes[1, 0].plot(df.value.diff()); axes[1, 0].set_title('1st Order Differencing')
plot_acf(df.value.diff().dropna(), ax=axes[1, 1], lags = np.arange(len(df)))
plt.show()

Output: ValueError: operands could not be broadcast together with shapes (98,) (97,) (98,) 

Кто-нибудь знает, как интерпретировать этот вывод? Я предполагаю, что функция dropna создает проблему, но я не уверен, является ли это источником проблемы. Как я уже сказал, раньше все работало нормально, данные все те же. Я обновил свою библиотеку statsmodels, но сомневаюсь, что это является причиной моей проблемы. Заранее спасибо

1 Ответ

1 голос
/ 05 апреля 2020

Проблема в том, что при построении ACF для разностного временного ряда (который имеет 99 наблюдений) вы устанавливаете количество лагов, равное количеству наблюдений в исходном временном ряду (которое имеет 100 наблюдений), то есть число из лагов больше, чем количество наблюдений.

Чтобы решить проблему, вам нужно заменить lags = np.arange(len(df)) на lags = np.arange(len(df) - 1) во втором графике ACF.

Обратите внимание, что при расчете первых различий временного ряда вы теряете одно наблюдение, для которого установлено значение NaN (в частности, для первого наблюдения установлено значение NaN). Следовательно, после удаления пропущенных значений с помощью dropna() у вас будет на одно наблюдение меньше.

import numpy as np, pandas as pd
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
import matplotlib.pyplot as plt
plt.rcParams.update({'figure.figsize':(9,7), 'figure.dpi':120})

# Import data
df = pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/wwwusage.csv', names=['value'], header=0)

# Original Series
fig, axes = plt.subplots(2, 2, sharex=True)
axes[0, 0].plot(df.value); axes[0, 0].set_title('Original Series')
plot_acf(df.value, ax=axes[0, 1], lags=np.arange(len(df)))

# 1st Differencing
axes[1, 0].plot(df.value.diff()); axes[1, 0].set_title('1st Order Differencing')
plot_acf(df.value.diff().dropna(), ax=axes[1, 1], lags=np.arange(len(df) - 1))
plt.show()

enter image description here

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