В Python 3.7 у меня есть временной ряд, представленный фреймом данных Pandas, в котором индекс представляет собой DateTimeIndex, а столбец с одним значением - это цена акции:
Разрывы соответствуют значениям «цены» NaN, и существует 126 не-NaN значений и 20 значений NaN. То, что я пытаюсь сделать, это интерполировать не-NaN значения, чтобы предсказать значения, которые являются NaN. Я попробовал несколько методов интерполяции (линейный, кубический сплайн), но они не достаточно точны, и, глядя на график выше, кажется, что существует значительный восходящий тренд, а также некоторые следы еженедельной периодичности, поэтому я решил использовать statsmodel ARIMA. Вот мой код:
def fill_in_dataframe_ARIMA( df ):
price_is_not_NaN = df[ 'price' ].notnull()
price_is_NaN = np.logical_not( price_is_not_NaN )
# Convert the datetimes of the index into milliseconds:
datetime_ms = df.index.map( to_ms )
# Train the ARIMA model:
train_datetime_ms = datetime_ms[ price_is_not_NaN ]
train_price = df.price[ price_is_not_NaN ]
arima_model = ARIMA( train_price, ( 5, 1, 2 ), train_datetime_ms ).fit()
# Use model to predict the missing prices:
missing_datetime_ms = datetime_ms[ price_is_NaN ]
missing_price = arima_model.predict( exog = missing_datetime_ms )
return missing_price
Я ожидаю, что missing_price
станет массивоподобным объектом из двадцати записей, например missing_datetime_ms
. Вместо этого missing_price
имеет 125 записей, что на одно число меньше, чем число выборок в train_datetime_ms:train_price
.
Очевидно, я не понимаю, что подразумевается под эндогенными и экзогенными (не говоря уже о интерполировать против экстраполировать ). Может кто-нибудь объяснить, как я могу получить ожидаемый результат 20 предсказанных записей?