Стационарный метод временных рядов - PullRequest
2 голосов
/ 12 июля 2020

Я работаю с данными временных рядов (нестационарными), я применил .diff (period = n) для дифференцирования данных, чтобы исключить тенденции и факторы сезонности из данных.

Используя .diff ( периоды = n), наблюдение с предыдущего временного шага (t-1) вычитается из текущего наблюдения (t).

Теперь я хочу вернуть разностные данные к исходному масштабу, но я есть проблемы с этим.

Вы можете ввести код здесь: https://colab.research.google.com/drive/1DacBLM6Y6YN5NHlRJdiEInl1WkfZHvrd?usp=sharing#scrollTo = AfMVhOG2SO8l

Мой код для сравнения:

data_diff = df.diff(periods=1)     

data_diff.head(5) 

Код для инвертирования данных в исходный масштаб:

cols = df.columns
x = []
for col in cols:
    diff_results = df[col] + data_diff[col].shift(-1)
    x.append(diff_results)
diff_df_inverted = pd.concat(x, axis=1)

diff_df_inverted

Как вы можете видеть из последнего вывода в коде, я успешно инвертировал свои данные обратно в исходный масштаб. Однако я не получаю инвертированные данные для строки 1. Он инвертирует и сдвигает значения на строку вверх. У меня вопрос, почему? Что мне не хватает?

спасибо!

1 Ответ

3 голосов
/ 13 июля 2020

В этой строке: diff_results = df[col] + data_diff[col].shift(-1) data_diff начинается со второй строки, и поэтому кажется, что он может быть сдвинут вверх. Причина этого в том, что вы используете shift(-1).

Простым решением было бы использовать df.cumcum , поскольку он является полной противоположностью df.dif

единственное, что вам нужно сделать, это получить первую строку, чтобы заменить значения NaN из вашего data_diff фрейма данных. Вам нужно сделать это, потому что это исходная строка, в которую будут добавлены все остальные строки. После этого вы звоните data_diff.cumsum() и теперь у вас есть исходные данные.

Вот подробный код.

data_diff.iloc[0]=df.iloc[0]
a = data_diff.cumsum()
...