Могу ли я использовать statsmodel ARIMA для интерполяции временных рядов? - PullRequest
0 голосов
/ 03 октября 2019

В Python 3.7 у меня есть временной ряд, представленный фреймом данных Pandas, в котором индекс представляет собой DateTimeIndex, а столбец с одним значением - это цена акции:

enter image description here

Разрывы соответствуют значениям «цены» 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 предсказанных записей?

...