def run_prediction(params: PredictParams): try: date_range = pd.date_range(parser.parse(params.end_date) + datetime.timedelta(days=1), params.forecast_date, freq=params.offset.value) model = getattr(source.back.models, params.model.value).Model(params.params) model.load(params) res_y = model.train_and_predict(len(date_range)) res_index = list(date_range) if params.upload: real_df = make_df(params.uploaded_data, params.start_date, params.forecast_date) else: real_df = DataProcess.load_data_from_moex(params.ticker, params.start_date, params.forecast_date, params.offset.value) except: print(traceback.format_exc()) return PredictionData(status=cfg.Status.fail, data=cfg.PREDICTION_FAILED) return PredictionData(data={ "X": list(dates_from_array(real_df.index)), "Y": list(real_df[params.ticker]), "PredictedX": list(dates_from_array(res_index)), "PredictedY": list(res_y) }, status=cfg.Status.ready)
def load(self, params: PredictParams): if params.upload: loaded_df = make_df(params.uploaded_data, params.start_date, params.end_date) else: loaded_df = DataProcess.load_data_from_moex(params.ticker, params.start_date, params.end_date, params.offset.value, self.exogenous_variables) self.df = DataProcess.get_prepared_data_frame(loaded_df, predict_day=0)
def load(self, params: PredictParams): if params.upload: loaded_df = make_df(params.uploaded_data, params.start_date, params.end_date) else: loaded_df = DataProcess.load_data_from_moex( params.ticker, params.start_date, params.end_date, params.offset.value) self.df = loaded_df[loaded_df.columns[0]].reset_index(drop=True)
def run_cross_validation(params: PredictParams): avg_mse = 0 avg_mape = 0 try: if params.upload: loaded_df = make_df(params.uploaded_data, params.start_date, params.end_date) else: loaded_df = DataProcess.load_data_from_moex( params.ticker, params.start_date, params.end_date, params.offset.value, params.params.get('exogenous_variables', [])) mse = [] mape = [] for i in tqdm( range( 0, loaded_df.shape[0] - params.cv_period - params.cv_predict_days, params.cv_shift)): model = getattr(source.back.models, params.model.value).Model(params.params) local_params = copy.deepcopy(params) local_params.start_date, local_params.end_date = loaded_df.index[ i], loaded_df.index[i + params.cv_period - 1] local_params.upload, local_params.uploaded_data = params.upload, params.uploaded_data model.load(local_params) res = [[], []] res[0] = model.train_and_predict(params.cv_predict_days) res[1] = list( loaded_df.iloc[i + params.cv_period:i + params.cv_period + params.cv_predict_days, 0]) mse.append(metrics.mean_squared_error(res[1], res[0])) mape.append(metrics.mean_absolute_percentage_error(res[1], res[0])) if mse[-1] > 18000: print( mse[-1], loaded_df.index[i], loaded_df.index[i + params.cv_period - 1], loaded_df.index[i + params.cv_period + params.cv_predict_days - 1]) avg_mse = sum(mse) / len(mse) avg_mape = sum(mape) / len(mape) except: print(traceback.format_exc()) return PredictionData(status=cfg.Status.fail, data=cfg.CROSS_VALIDATION_FAILED) return PredictionData(data={ "mse": avg_mse, "mape": avg_mape }, status=cfg.Status.ready)