def fit(self, modelarg: ModelArguments): model_param = modelarg.model_param ts_train = modelarg.endog[modelarg.train_start_date:modelarg. train_end_date] if 'window_size' in model_param: window_size = model_param['window_size'] else: window_size = len(ts_train) ts_train = ts_train[-window_size:] ARIMA_fit_results, min_aic, min_aic_fit_order, min_aic_fit_res = \ auto_arima.iterative_ARIMA_fit(ts_train, model_param['max_p'], model_param['max_d'], model_param['max_q']) print("Selected Model Order=", min_aic_fit_order) print("AIC score for selected model=", min_aic) est_param = { "train_size": window_size, "order": min_aic_fit_order, "aic": min_aic, "result": min_aic_fit_res } modelres = ModelResults(model_name="ARIMA", estimated_param=est_param) return modelres
def fit(self, modeleval: ModelEvaluation): model_param = modeleval.model_param ts_train = modeleval.ts_train ts_test = modeleval.ts_test # create daywise data ts_dayofweek = ts_train.groupby(ts_train.index.dayofweek) train_end_date = ts_train.index.max() test_end_date = ts_test.index.max() gap_and_test_dates = pd.date_range( train_end_date + pd.Timedelta(days=1), test_end_date) gap_and_test_dates_dayofweek = gap_and_test_dates.groupby( gap_and_test_dates.dayofweek ) test_dates_dayofweek = ts_test.index.groupby(ts_test.index.dayofweek) ts_pred = pd.Series() for day, ts_day in ts_dayofweek: ARIMA_fit_results, min_aic, min_aic_fit_order, min_aic_fit_res = \ auto_arima.iterative_ARIMA_fit(ts_day, model_param['max_p'], model_param['max_d'], model_param['max_q']) print("Selected Model Order=", min_aic_fit_order) print("AIC score for selected model=", min_aic) indx_gap_test_dayofweek = gap_and_test_dates_dayofweek[day] indx_test_dayofweek = test_dates_dayofweek[day] forecast_res = min_aic_fit_res.forecast( steps=len(indx_gap_test_dayofweek)) list_pred = forecast_res[0][-len(indx_test_dayofweek):] ts_pred_sub = pd.Series(list_pred, index=indx_test_dayofweek) ts_pred = ts_pred.append(ts_pred_sub) print("Model info:") print("Day =", day) print("Min aic order =", min_aic_fit_order) ts_pred = ts_pred.sort_index() if "pred_days" in model_param: pass ts_pred.name = 'count' ts_pred.index.name = 'date' return ts_pred
def fit2(self, ts, max_p, max_d, max_q): ts_dayofweek = ts.groupby(ts.index.dayofweek) train_end_date = ts.index.max() test_end_date = ts.index.max() estimated_models = {} for day, ts_day in ts_dayofweek: ARIMA_fit_results, min_aic, min_aic_fit_order, min_aic_fit_res = \ auto_arima.iterative_ARIMA_fit(ts_day, max_p, max_d, max_q) print("Selected Model Order=", min_aic_fit_order) print("AIC score for selected model=", min_aic) # print("TS: ", ts_day) estimated_models[day] = {} estimated_models[day]['min_aic_fit_order'] = min_aic_fit_order estimated_models[day]['min_aic_fit_res'] = min_aic_fit_res return estimated_models
def fit_arima(model_param, ts_train, ts_test): ARIMA_fit_results, min_aic, min_aic_fit_order, min_aic_fit_res = \ auto_arima.iterative_ARIMA_fit(ts_train, model_param['max_p'], model_param['max_d'], model_param['max_q']) # print("Min AIC=", min_aic) # print("Order=", min_aic_fit_order) train_end_date = ts_train.index.max() test_end_date = ts_test.index.max() gap_and_test_dates = pd.date_range(train_end_date + pd.Timedelta(days=1), test_end_date) forecast_res = min_aic_fit_res.forecast(steps=len(gap_and_test_dates)) list_pred = forecast_res[0][-len(ts_test):] ts_pred = pd.Series(list_pred, index=ts_test.index) ts_pred.name = 'count' ts_pred.index.name = 'date' return ts_pred
def fit_and_forecast(self, modeleval: ModelEvaluation): model_param = modeleval.model_param test_param = modeleval.test_param ts_train = modeleval.ts_train ts_test = modeleval.ts_test list_pred = [] if test_param['sliding_window']: print("Sliding window approach") if test_param['window_size']: window_size = test_param['window_size'] else: window_size = len(ts_train) if not test_param["look_ahead_step"]: look_ahead_step = 1 else: look_ahead_step = test_param["look_ahead_step"] cur_window_data_points = ts_train[-window_size:] # cur_window_data_points = list(ts_train[-window_size:].values) print(len(ts_test)) for i in range(0, len(ts_test), look_ahead_step): ARIMA_fit_results, min_aic, min_aic_fit_order, min_aic_fit_res = \ auto_arima.iterative_ARIMA_fit(cur_window_data_points, model_param['max_p'], model_param['max_d'], model_param['max_q']) print("Selected Model Order=", min_aic_fit_order) print("AIC score for selected model=", min_aic) forecast_res = min_aic_fit_res.forecast(steps=look_ahead_step) list_pred.extend(forecast_res[0]) cur_window_data_points = cur_window_data_points[ look_ahead_step:] temp_val = ts_test[i:i + look_ahead_step] cur_window_data_points = cur_window_data_points.append(temp_val) else: ARIMA_fit_results, min_aic, min_aic_fit_order, min_aic_fit_res = \ auto_arima.iterative_ARIMA_fit(ts_train, model_param['max_p'], model_param['max_d'], model_param['max_q']) print("Selected Model Order=", min_aic_fit_order) print("AIC score for selected model=", min_aic) train_end_date = ts_train.index.max() test_end_date = ts_test.index.max() gap_and_test_dates = pd.date_range( train_end_date + pd.Timedelta(days=1), test_end_date) forecast_res = min_aic_fit_res.forecast( steps=len(gap_and_test_dates)) list_pred = forecast_res[0][-len(ts_test):] # ts_pred = pd.Series(list_pred, index=ts_test.index) print(len(list_pred)) print(len(ts_test)) ts_pred = pd.Series(list_pred[:ts_test.size], index=ts_test.index) ts_pred.name = 'count' ts_pred.index.name = 'date' return ts_pred
def fit2(self, ts, max_p, max_d, max_q): ARIMA_fit_results, min_aic, min_aic_fit_order, min_aic_fit_res = \ auto_arima.iterative_ARIMA_fit(ts, max_p, max_d, max_q) print("Selected Model Order=", min_aic_fit_order) print("AIC score for selected model=", min_aic) return min_aic_fit_res, min_aic_fit_order