Замена NaN оценками регрессии, содержащими запаздывающее значение Y

#python #nan #statsmodels

Вопрос:

У меня есть рамка данных с ежемесячными данными:

введите описание изображения здесь

Мне нужно спрогнозировать (т. Е. перезаписать NaN), выделенный желтым цветом по месяцам, используя следующую линейную регрессию:

pkg_yld = C adv pkg_yld(1)

где pkg_yld(1) — запаздывающее значение pkg_yld по сравнению с предыдущим месяцем.

Вот примерная модель:

 import statsmodels.api as sm

X = df.loc['2020-06-30':'2021-06-30','adv']
y = df.loc['2020-06-30':'2021-06-30','pkg_yld']

X = sm.add_constant(X)                        # X var:  ADV plus the constant term
X['pkg_yld_lag']=df_un['pkg_yld'].shift(1)    # X var: pkg_yld lagged 1 month

model = sm.OLS(y, X, missing='drop').fit()       # Y var, X var(s)   constant term 
model.summary()
 

и итоговый результат:

введите описание изображения здесь

Итак, формула такова: 2,813178 0,000009 x ADV 0,650444 x pkg_yld_lag

Для июля 2021 года: используйте предоставленное значение ADV за июль плюс фактическое зарегистрированное значение pkg_yld за июнь: 2.8113178 0.000009*(16101.75) 0.650444*(8.28) = 8.34

Для августа 2021 года: используйте предоставленное значение ADV за август 2021 года плюс прогнозируемое значение pkg_yld за июль в качестве значения задержки: 2.8113178 0.000009*(13865.25) 0.650444*(8.34) = 8.37

и так далее.

Первый месяц прогноза всегда использует последнее зарегистрированное значение pkg_yld, а затем использует прогнозируемое значение pkg_yld из модели. Модель.прогноз не работает, учитывая наличие запаздывающего значения Y.

Как бы я поступил, чтобы получить окончательный результат ниже?

введите описание изображения здесь

Ответ №1:

Обновить

С помощью коллеги решение для получения вышеуказанных результатов может быть достигнуто с помощью цикла для прогнозирования на следующие 6 месяцев, а затем поместить эти цифры в существующий фрейм данных:

 counter = 0
while counter < 6:
 
    df['pkg_yld_lag']=df['pkg_yld'].shift(1)                  # Create a 1-month lag of pkg_yld
    adv_input = sm.add_constant(df[['adv','pkg_yld_lag']])    # Set up model model 
    df['pkg_yld_p']= model.predict(adv_input)                 # Predict 
    df['pkg_yld'].fillna(df["pkg_yld_p"], inplace=True)       # Replace NaN with predicted value

    counter  = 1
 

Затем удалите ненужные столбцы:

 df.drop(['pkg_yld_lag','pkg_yld_p'], axis=1, inplace=True)
 

Конечный результат:

введите описание изображения здесь