From 334b92ace7e3a21db531434176448759ef31367c Mon Sep 17 00:00:00 2001 From: you-n-g Date: Thu, 14 Oct 2021 23:35:12 +0800 Subject: [PATCH] Checking dataset empty (#647) * Checking dataset empty * add dataset checker --- qlib/contrib/model/catboost_model.py | 2 ++ qlib/contrib/model/double_ensemble.py | 2 ++ qlib/contrib/model/gbdt.py | 4 ++++ qlib/contrib/model/highfreq_gdbt_model.py | 2 ++ qlib/contrib/model/linear.py | 2 ++ qlib/contrib/model/pytorch_alstm.py | 2 ++ qlib/contrib/model/pytorch_alstm_ts.py | 2 ++ qlib/contrib/model/pytorch_gats.py | 2 ++ qlib/contrib/model/pytorch_gats_ts.py | 2 ++ qlib/contrib/model/pytorch_gru.py | 2 ++ qlib/contrib/model/pytorch_gru_ts.py | 2 ++ qlib/contrib/model/pytorch_localformer.py | 2 ++ qlib/contrib/model/pytorch_localformer_ts.py | 2 ++ qlib/contrib/model/pytorch_lstm.py | 2 ++ qlib/contrib/model/pytorch_lstm_ts.py | 2 ++ qlib/contrib/model/pytorch_sfm.py | 2 ++ qlib/contrib/model/pytorch_tabnet.py | 2 ++ qlib/contrib/model/pytorch_tcts.py | 2 ++ qlib/contrib/model/pytorch_transformer.py | 2 ++ qlib/contrib/model/pytorch_transformer_ts.py | 3 +++ qlib/data/dataset/__init__.py | 4 ++++ 21 files changed, 47 insertions(+) diff --git a/qlib/contrib/model/catboost_model.py b/qlib/contrib/model/catboost_model.py index 5138e0e6f..6fe5edb1f 100644 --- a/qlib/contrib/model/catboost_model.py +++ b/qlib/contrib/model/catboost_model.py @@ -38,6 +38,8 @@ class CatBoostModel(Model, FeatureInt): col_set=["feature", "label"], data_key=DataHandlerLP.DK_L, ) + if df_train.empty or df_valid.empty: + raise ValueError("Empty data from dataset, please check your dataset config.") x_train, y_train = df_train["feature"], df_train["label"] x_valid, y_valid = df_valid["feature"], df_valid["label"] diff --git a/qlib/contrib/model/double_ensemble.py b/qlib/contrib/model/double_ensemble.py index d3ca898f8..9ce005507 100644 --- a/qlib/contrib/model/double_ensemble.py +++ b/qlib/contrib/model/double_ensemble.py @@ -64,6 +64,8 @@ class DEnsembleModel(Model, FeatureInt): df_train, df_valid = dataset.prepare( ["train", "valid"], col_set=["feature", "label"], data_key=DataHandlerLP.DK_L ) + if df_train.empty or df_valid.empty: + raise ValueError("Empty data from dataset, please check your dataset config.") x_train, y_train = df_train["feature"], df_train["label"] # initialize the sample weights N, F = x_train.shape diff --git a/qlib/contrib/model/gbdt.py b/qlib/contrib/model/gbdt.py index 1a7cf7fba..f0b0d2eb1 100644 --- a/qlib/contrib/model/gbdt.py +++ b/qlib/contrib/model/gbdt.py @@ -25,6 +25,8 @@ class LGBModel(ModelFT, LightGBMFInt): df_train, df_valid = dataset.prepare( ["train", "valid"], col_set=["feature", "label"], data_key=DataHandlerLP.DK_L ) + if df_train.empty or df_valid.empty: + raise ValueError("Empty data from dataset, please check your dataset config.") x_train, y_train = df_train["feature"], df_train["label"] x_valid, y_valid = df_valid["feature"], df_valid["label"] @@ -83,6 +85,8 @@ class LGBModel(ModelFT, LightGBMFInt): """ # Based on existing model and finetune by train more rounds dtrain, _ = self._prepare_data(dataset) + if dtrain.empty: + raise ValueError("Empty data from dataset, please check your dataset config.") self.model = lgb.train( self.params, dtrain, diff --git a/qlib/contrib/model/highfreq_gdbt_model.py b/qlib/contrib/model/highfreq_gdbt_model.py index 04d6ab9d5..c8a108cab 100644 --- a/qlib/contrib/model/highfreq_gdbt_model.py +++ b/qlib/contrib/model/highfreq_gdbt_model.py @@ -82,6 +82,8 @@ class HFLGBModel(ModelFT, LightGBMFInt): df_train, df_valid = dataset.prepare( ["train", "valid"], col_set=["feature", "label"], data_key=DataHandlerLP.DK_L ) + if df_train.empty or df_valid.empty: + raise ValueError("Empty data from dataset, please check your dataset config.") x_train, y_train = df_train["feature"], df_train["label"] x_valid, y_valid = df_train["feature"], df_valid["label"] diff --git a/qlib/contrib/model/linear.py b/qlib/contrib/model/linear.py index f16acc1ec..d5a16760c 100644 --- a/qlib/contrib/model/linear.py +++ b/qlib/contrib/model/linear.py @@ -51,6 +51,8 @@ class LinearModel(Model): def fit(self, dataset: DatasetH): df_train = dataset.prepare("train", col_set=["feature", "label"], data_key=DataHandlerLP.DK_L) + if df_train.empty: + raise ValueError("Empty data from dataset, please check your dataset config.") X, y = df_train["feature"].values, np.squeeze(df_train["label"].values) if self.estimator in [self.OLS, self.RIDGE, self.LASSO]: diff --git a/qlib/contrib/model/pytorch_alstm.py b/qlib/contrib/model/pytorch_alstm.py index 4fe2b2714..f3f2f090d 100644 --- a/qlib/contrib/model/pytorch_alstm.py +++ b/qlib/contrib/model/pytorch_alstm.py @@ -224,6 +224,8 @@ class ALSTM(Model): col_set=["feature", "label"], data_key=DataHandlerLP.DK_L, ) + if df_train.empty or df_valid.empty: + raise ValueError("Empty data from dataset, please check your dataset config.") x_train, y_train = df_train["feature"], df_train["label"] x_valid, y_valid = df_valid["feature"], df_valid["label"] diff --git a/qlib/contrib/model/pytorch_alstm_ts.py b/qlib/contrib/model/pytorch_alstm_ts.py index f1aa8227c..f545ecb72 100644 --- a/qlib/contrib/model/pytorch_alstm_ts.py +++ b/qlib/contrib/model/pytorch_alstm_ts.py @@ -207,6 +207,8 @@ class ALSTM(Model): ): dl_train = dataset.prepare("train", col_set=["feature", "label"], data_key=DataHandlerLP.DK_L) dl_valid = dataset.prepare("valid", col_set=["feature", "label"], data_key=DataHandlerLP.DK_L) + if dl_train.empty or dl_valid.empty: + raise ValueError("Empty data from dataset, please check your dataset config.") dl_train.config(fillna_type="ffill+bfill") # process nan brought by dataloader dl_valid.config(fillna_type="ffill+bfill") # process nan brought by dataloader diff --git a/qlib/contrib/model/pytorch_gats.py b/qlib/contrib/model/pytorch_gats.py index 7e5bb78ee..7f379c3b9 100644 --- a/qlib/contrib/model/pytorch_gats.py +++ b/qlib/contrib/model/pytorch_gats.py @@ -237,6 +237,8 @@ class GATs(Model): col_set=["feature", "label"], data_key=DataHandlerLP.DK_L, ) + if df_train.empty or df_valid.empty: + raise ValueError("Empty data from dataset, please check your dataset config.") x_train, y_train = df_train["feature"], df_train["label"] x_valid, y_valid = df_valid["feature"], df_valid["label"] diff --git a/qlib/contrib/model/pytorch_gats_ts.py b/qlib/contrib/model/pytorch_gats_ts.py index 52b7183be..f5d8fefaa 100644 --- a/qlib/contrib/model/pytorch_gats_ts.py +++ b/qlib/contrib/model/pytorch_gats_ts.py @@ -245,6 +245,8 @@ class GATs(Model): dl_train = dataset.prepare("train", col_set=["feature", "label"], data_key=DataHandlerLP.DK_L) dl_valid = dataset.prepare("valid", col_set=["feature", "label"], data_key=DataHandlerLP.DK_L) + if dl_train.empty or dl_valid.empty: + raise ValueError("Empty data from dataset, please check your dataset config.") dl_train.config(fillna_type="ffill+bfill") # process nan brought by dataloader dl_valid.config(fillna_type="ffill+bfill") # process nan brought by dataloader diff --git a/qlib/contrib/model/pytorch_gru.py b/qlib/contrib/model/pytorch_gru.py index 552815d39..740bdd977 100755 --- a/qlib/contrib/model/pytorch_gru.py +++ b/qlib/contrib/model/pytorch_gru.py @@ -224,6 +224,8 @@ class GRU(Model): col_set=["feature", "label"], data_key=DataHandlerLP.DK_L, ) + if df_train.empty or df_valid.empty: + raise ValueError("Empty data from dataset, please check your dataset config.") x_train, y_train = df_train["feature"], df_train["label"] x_valid, y_valid = df_valid["feature"], df_valid["label"] diff --git a/qlib/contrib/model/pytorch_gru_ts.py b/qlib/contrib/model/pytorch_gru_ts.py index c094a3e3c..0ee8cf97d 100755 --- a/qlib/contrib/model/pytorch_gru_ts.py +++ b/qlib/contrib/model/pytorch_gru_ts.py @@ -206,6 +206,8 @@ class GRU(Model): ): dl_train = dataset.prepare("train", col_set=["feature", "label"], data_key=DataHandlerLP.DK_L) dl_valid = dataset.prepare("valid", col_set=["feature", "label"], data_key=DataHandlerLP.DK_L) + if dl_train.empty or dl_valid.empty: + raise ValueError("Empty data from dataset, please check your dataset config.") dl_train.config(fillna_type="ffill+bfill") # process nan brought by dataloader dl_valid.config(fillna_type="ffill+bfill") # process nan brought by dataloader diff --git a/qlib/contrib/model/pytorch_localformer.py b/qlib/contrib/model/pytorch_localformer.py index 2ec56067f..7548c936f 100644 --- a/qlib/contrib/model/pytorch_localformer.py +++ b/qlib/contrib/model/pytorch_localformer.py @@ -176,6 +176,8 @@ class LocalformerModel(Model): col_set=["feature", "label"], data_key=DataHandlerLP.DK_L, ) + if df_train.empty or df_valid.empty: + raise ValueError("Empty data from dataset, please check your dataset config.") x_train, y_train = df_train["feature"], df_train["label"] x_valid, y_valid = df_valid["feature"], df_valid["label"] diff --git a/qlib/contrib/model/pytorch_localformer_ts.py b/qlib/contrib/model/pytorch_localformer_ts.py index 683a9bd4f..9645e28f3 100644 --- a/qlib/contrib/model/pytorch_localformer_ts.py +++ b/qlib/contrib/model/pytorch_localformer_ts.py @@ -153,6 +153,8 @@ class LocalformerModel(Model): dl_train = dataset.prepare("train", col_set=["feature", "label"], data_key=DataHandlerLP.DK_L) dl_valid = dataset.prepare("valid", col_set=["feature", "label"], data_key=DataHandlerLP.DK_L) + if dl_train.empty or dl_valid.empty: + raise ValueError("Empty data from dataset, please check your dataset config.") dl_train.config(fillna_type="ffill+bfill") # process nan brought by dataloader dl_valid.config(fillna_type="ffill+bfill") # process nan brought by dataloader diff --git a/qlib/contrib/model/pytorch_lstm.py b/qlib/contrib/model/pytorch_lstm.py index 0ecfc2083..4920613af 100755 --- a/qlib/contrib/model/pytorch_lstm.py +++ b/qlib/contrib/model/pytorch_lstm.py @@ -219,6 +219,8 @@ class LSTM(Model): col_set=["feature", "label"], data_key=DataHandlerLP.DK_L, ) + if df_train.empty or df_valid.empty: + raise ValueError("Empty data from dataset, please check your dataset config.") x_train, y_train = df_train["feature"], df_train["label"] x_valid, y_valid = df_valid["feature"], df_valid["label"] diff --git a/qlib/contrib/model/pytorch_lstm_ts.py b/qlib/contrib/model/pytorch_lstm_ts.py index 1f97bd5b1..83288dfb6 100755 --- a/qlib/contrib/model/pytorch_lstm_ts.py +++ b/qlib/contrib/model/pytorch_lstm_ts.py @@ -201,6 +201,8 @@ class LSTM(Model): ): dl_train = dataset.prepare("train", col_set=["feature", "label"], data_key=DataHandlerLP.DK_L) dl_valid = dataset.prepare("valid", col_set=["feature", "label"], data_key=DataHandlerLP.DK_L) + if dl_train.empty or dl_valid.empty: + raise ValueError("Empty data from dataset, please check your dataset config.") dl_train.config(fillna_type="ffill+bfill") # process nan brought by dataloader dl_valid.config(fillna_type="ffill+bfill") # process nan brought by dataloader diff --git a/qlib/contrib/model/pytorch_sfm.py b/qlib/contrib/model/pytorch_sfm.py index cf65c2662..5d076b9fd 100644 --- a/qlib/contrib/model/pytorch_sfm.py +++ b/qlib/contrib/model/pytorch_sfm.py @@ -374,6 +374,8 @@ class SFM(Model): col_set=["feature", "label"], data_key=DataHandlerLP.DK_L, ) + if df_train.empty or df_valid.empty: + raise ValueError("Empty data from dataset, please check your dataset config.") x_train, y_train = df_train["feature"], df_train["label"] x_valid, y_valid = df_valid["feature"], df_valid["label"] diff --git a/qlib/contrib/model/pytorch_tabnet.py b/qlib/contrib/model/pytorch_tabnet.py index bd8f085ec..504048210 100644 --- a/qlib/contrib/model/pytorch_tabnet.py +++ b/qlib/contrib/model/pytorch_tabnet.py @@ -169,6 +169,8 @@ class TabnetModel(Model): col_set=["feature", "label"], data_key=DataHandlerLP.DK_L, ) + if df_train.empty or df_valid.empty: + raise ValueError("Empty data from dataset, please check your dataset config.") df_train.fillna(df_train.mean(), inplace=True) x_train, y_train = df_train["feature"], df_train["label"] x_valid, y_valid = df_valid["feature"], df_valid["label"] diff --git a/qlib/contrib/model/pytorch_tcts.py b/qlib/contrib/model/pytorch_tcts.py index c0dae98e4..7cd59be9b 100644 --- a/qlib/contrib/model/pytorch_tcts.py +++ b/qlib/contrib/model/pytorch_tcts.py @@ -255,6 +255,8 @@ class TCTS(Model): col_set=["feature", "label"], data_key=DataHandlerLP.DK_L, ) + if df_train.empty or df_valid.empty: + raise ValueError("Empty data from dataset, please check your dataset config.") x_train, y_train = df_train["feature"], df_train["label"] x_valid, y_valid = df_valid["feature"], df_valid["label"] diff --git a/qlib/contrib/model/pytorch_transformer.py b/qlib/contrib/model/pytorch_transformer.py index 53ebff3c5..da36cd5f6 100644 --- a/qlib/contrib/model/pytorch_transformer.py +++ b/qlib/contrib/model/pytorch_transformer.py @@ -175,6 +175,8 @@ class TransformerModel(Model): col_set=["feature", "label"], data_key=DataHandlerLP.DK_L, ) + if df_train.empty or df_valid.empty: + raise ValueError("Empty data from dataset, please check your dataset config.") x_train, y_train = df_train["feature"], df_train["label"] x_valid, y_valid = df_valid["feature"], df_valid["label"] diff --git a/qlib/contrib/model/pytorch_transformer_ts.py b/qlib/contrib/model/pytorch_transformer_ts.py index c53564903..fbb47df7f 100644 --- a/qlib/contrib/model/pytorch_transformer_ts.py +++ b/qlib/contrib/model/pytorch_transformer_ts.py @@ -151,6 +151,9 @@ class TransformerModel(Model): dl_train = dataset.prepare("train", col_set=["feature", "label"], data_key=DataHandlerLP.DK_L) dl_valid = dataset.prepare("valid", col_set=["feature", "label"], data_key=DataHandlerLP.DK_L) + if dl_train.empty or dl_valid.empty: + raise ValueError("Empty data from dataset, please check your dataset config.") + dl_train.config(fillna_type="ffill+bfill") # process nan brought by dataloader dl_valid.config(fillna_type="ffill+bfill") # process nan brought by dataloader diff --git a/qlib/data/dataset/__init__.py b/qlib/data/dataset/__init__.py index 2acaa77fe..1002df8ba 100644 --- a/qlib/data/dataset/__init__.py +++ b/qlib/data/dataset/__init__.py @@ -385,6 +385,10 @@ class TSDataSampler: idx_map[real_idx] = (i, j) return idx_df, idx_map + @property + def empty(self): + return self.__len__() == 0 + def _get_indices(self, row: int, col: int) -> np.array: """ get series indices of self.data_arr from the row, col indices of self.idx_df