#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)
Конечный результат: