Как поменять сезонную разность временного ряда в python - PullRequest
2 голосов
/ 26 января 2020

Не могли бы вы помочь мне с этой проблемой, так как я сделал много поисков, но не могу ее решить. У меня есть многовариантный фрейм данных о потреблении электроэнергии, и я делаю прогнозирование, используя модель VAR (векторная авторегрессия) для временных рядов. Я сделал прогнозы, но мне нужно обратить вспять временной ряд (energy_log_diff), так как я применил сезонную разницу в журнале, чтобы сделать ser ie стационарным, чтобы получить реальное значение энергии:

df['energy_log'] = np.log(df['energy'])
df['energy_log_diff'] = df['energy_log'] - df['energy_log'].shift(1)

Для то, что я сделал сначала:

df['energy'] = np.exp(df['energy_log_diff']) 

Предполагается, что это даст разность энергий между двумя значениями, отставшими на 365 дней, но я не уверен ни в этом.

Как я могу это сделать

1 Ответ

1 голос
/ 04 февраля 2020

Краткий ответ - вы должны запускать обратные преобразования в обратном порядке, что в вашем случае означает:

  1. Обратное преобразование дифференцирования
  2. Обратное преобразование журнала

Как конвертировать разностные прогнозы обратно описано, например, здесь (у него есть флаг R , но кода нет, и идея такая же, даже для Python). В своем посте вы вычисляете экспоненту, но сначала вы должны обратить обратное дифференцирование, прежде чем делать это.

Вы можете попробовать это:

energy_log_diff_rev = []
v_prev = v_0
for v in df['energy_log_diff']:
    v_prev += v
    energy_log_diff_rev.append(v_prev)

Или, если вы предпочитаете pandas way , вы можете попробовать это (только для разницы первого порядка):

energy_log_diff_rev = df['energy_log_diff'].expanding(min_periods=0).sum() + v_0

Обратите внимание на значение v_0, которое является исходным значением (после преобразования журнала до разницы), оно описано в ссылке выше.

Затем, после этого шага, вы можете сделать экспоненту (обратную по логу):

energy_orig = np.exp(energy_log_diff_rev)

Примечания / Вопросы:

  • Вы упоминаете отстающие значения на 365, но смещаете данные на 1. Означает ли это, что у вас есть годовые данные? Или вы хотели бы сделать это - df['energy_log_diff'] = df['energy_log'] - df['energy_log'].shift(365) вместо этого (в случае ежедневной детализации данных)?
  • Вы хотите получить обратный временной ряд из прогнозов, верно? Или я что-то упустил? В таком случае вы будете делать обратные преобразования для прогноза, а не для данных, которые я использовал выше для объяснения.
...