From 005c6c97e79992c788a6663dfc30a5a361a82463 Mon Sep 17 00:00:00 2001 From: liurui Date: Thu, 7 Nov 2024 16:21:48 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=81=9A=E7=83=AF=E7=83=83?= =?UTF-8?q?=E7=94=BB=E5=9B=BE=EF=BC=8C=E6=A8=A1=E5=9E=8B=E5=8F=9680%?= =?UTF-8?q?=E7=BD=AE=E4=BF=A1=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config_jingbo.py | 2 +- dataset/jbsh_yuanyou.db | Bin 65536 -> 73728 bytes lib/dataread.py | 4 +- main.py | 83 +++++++++++++++++++---------------- models/nerulforcastmodels.py | 20 ++++++--- 5 files changed, 60 insertions(+), 49 deletions(-) diff --git a/config_jingbo.py b/config_jingbo.py index 38ba7fd..2f45bcc 100644 --- a/config_jingbo.py +++ b/config_jingbo.py @@ -178,7 +178,7 @@ is_update_report = False # 是否上传报告 # 数据截取日期 -end_time = '' # 数据截取日期 +end_time = '2024-10-28' # 数据截取日期 delweekenday = True is_corr = False # 特征是否参与滞后领先提升相关系数 add_kdj = False # 是否添加kdj指标 diff --git a/dataset/jbsh_yuanyou.db b/dataset/jbsh_yuanyou.db index d5cfb0d5c78afd8cbf3fba422dfbc98cec8dd5fc..a6eddafcca3b9a6ae5a98b4dac8ba264a993f042 100644 GIT binary patch literal 73728 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 N7!85Z5EvpM003L-I==t_ diff --git a/lib/dataread.py b/lib/dataread.py index 1320b42..e110328 100644 --- a/lib/dataread.py +++ b/lib/dataread.py @@ -20,8 +20,8 @@ plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签 plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 from datetime import timedelta -# from config_jingbo import * -from config_juxiting import * +from config_jingbo import * +# from config_juxiting import * from sklearn import metrics from reportlab.pdfbase import pdfmetrics # 注册字体 from reportlab.pdfbase.ttfonts import TTFont # 字体类 diff --git a/main.py b/main.py index 05d09b9..66e1b0d 100644 --- a/main.py +++ b/main.py @@ -1,7 +1,7 @@ # 读取配置 -# from config_jingbo import * +from config_jingbo import * # from config_tansuanli import * -from config_juxiting import * +# from config_juxiting import * from lib.dataread import * from lib.tools import * from models.nerulforcastmodels import ex_Model,model_losss,brent_export_pdf,tansuanli_export_pdf,pp_export_pdf,model_losss_juxiting @@ -78,26 +78,31 @@ def predict_main(): is_weekday = datetime.datetime.now().weekday() == 3 if is_weekday: logger.info('今天是周一,更新预测模型') - # 计算最近20天预测残差最低的模型名称 + try: + # 计算最近20天预测残差最低的模型名称 - model_results = sqlitedb.select_data('trueandpredict',order_by = "ds DESC",limit = "20") - model_results = model_results.dropna() - modelnames = model_results.columns.to_list()[2:] - for col in model_results[modelnames].select_dtypes(include=['object']).columns: - model_results[col] = model_results[col].astype(np.float32) - # 计算每个预测值与真实值之间的偏差率 - for model in modelnames: - model_results[f'{model}_abs_error_rate'] = abs(model_results['y'] - model_results[model]) / model_results['y'] + model_results = sqlitedb.select_data('trueandpredict',order_by = "ds DESC",limit = "20") + model_results = model_results.dropna() + modelnames = model_results.columns.to_list()[2:] + for col in model_results[modelnames].select_dtypes(include=['object']).columns: + model_results[col] = model_results[col].astype(np.float32) + # 计算每个预测值与真实值之间的偏差率 + for model in modelnames: + model_results[f'{model}_abs_error_rate'] = abs(model_results['y'] - model_results[model]) / model_results['y'] - # 获取每行对应的最小偏差率值 - min_abs_error_rate_values = model_results.apply(lambda row: row[[f'{model}_abs_error_rate' for model in modelnames]].min(), axis=1) - # 获取每行对应的最小偏差率值对应的列名 - min_abs_error_rate_column_name = model_results.apply(lambda row: row[[f'{model}_abs_error_rate' for model in modelnames]].idxmin(), axis=1) - # 将列名索引转换为列名 - min_abs_error_rate_column_name = min_abs_error_rate_column_name.map(lambda x: x.split('_')[0]) - # 取出现次数最多的模型名称 - most_common_model = min_abs_error_rate_column_name.value_counts().idxmax() - logger.info(f"最近20天预测残差最低的模型名称:{most_common_model}") + # 获取每行对应的最小偏差率值 + min_abs_error_rate_values = model_results.apply(lambda row: row[[f'{model}_abs_error_rate' for model in modelnames]].min(), axis=1) + # 获取每行对应的最小偏差率值对应的列名 + min_abs_error_rate_column_name = model_results.apply(lambda row: row[[f'{model}_abs_error_rate' for model in modelnames]].idxmin(), axis=1) + # 将列名索引转换为列名 + min_abs_error_rate_column_name = min_abs_error_rate_column_name.map(lambda x: x.split('_')[0]) + # 取出现次数最多的模型名称 + most_common_model = min_abs_error_rate_column_name.value_counts().idxmax() + logger.info(f"最近20天预测残差最低的模型名称:{most_common_model}") + except Exception as e: + logger.error(f"最近20天预测残差最低的模型名称计算失败:{e}") + # 取txt中的模型名称 + most_common_model = pd.read_csv(os.path.join(dataset,'best_modelnames.txt'),header=None).values.flatten().tolist()[0] # 保存结果到数据库 @@ -118,25 +123,25 @@ def predict_main(): row,col = df.shape now = datetime.datetime.now().strftime('%Y%m%d%H%M%S') - # ex_Model(df, - # horizon=horizon, - # input_size=input_size, - # train_steps=train_steps, - # val_check_steps=val_check_steps, - # early_stop_patience_steps=early_stop_patience_steps, - # is_debug=is_debug, - # dataset=dataset, - # is_train=is_train, - # is_fivemodels=is_fivemodels, - # val_size=val_size, - # test_size=test_size, - # settings=settings, - # now=now, - # etadata = etadata, - # modelsindex = modelsindex, - # data = data, - # is_eta=is_eta, - # ) + ex_Model(df, + horizon=horizon, + input_size=input_size, + train_steps=train_steps, + val_check_steps=val_check_steps, + early_stop_patience_steps=early_stop_patience_steps, + is_debug=is_debug, + dataset=dataset, + is_train=is_train, + is_fivemodels=is_fivemodels, + val_size=val_size, + test_size=test_size, + settings=settings, + now=now, + etadata = etadata, + modelsindex = modelsindex, + data = data, + is_eta=is_eta, + ) logger.info('模型训练完成') diff --git a/models/nerulforcastmodels.py b/models/nerulforcastmodels.py index e26296e..7bd0429 100644 --- a/models/nerulforcastmodels.py +++ b/models/nerulforcastmodels.py @@ -540,7 +540,7 @@ def model_losss_juxiting(sqlitedb): row = row[best_models] q10 = row.min() q90 = row.max() - # 获取 row行10%分位值对应的模型名称 + # 获取 row行最大最小值模型名称 min_model = row[row == q10].idxmin() max_model = row[row == q90].idxmin() @@ -559,12 +559,18 @@ def model_losss_juxiting(sqlitedb): # # 通道使用预测模型的80%置信度 # def find_min_max_within_quantile(row): # row.drop(['ds','y'], inplace=True) - # # 获取分位数10%和90%的值 - # q10 = row.quantile(0.1) - # q90 = row.quantile(0.9) - # # 获取 row行10%分位值对应的模型名称 - # min_model = row[row == q10].index[0] - # max_model = row[row == q90].index[0] + # row = row.astype(float).round(2) + + # row_sorted = row.sort_values(ascending=True).reset_index(drop=True) + # # 计算 10% 和 90% 位置的索引 + # index_10 = int(len(row_sorted) * 0.1) + # index_90 = int(len(row_sorted) * 0.9) + # q10 = row_sorted[index_10] + # q90 = row_sorted[index_90] + # # 获取模型名称 + # min_model = row[row == q10].idxmin() + # max_model = row[row == q90].idxmin() + # # # 判断flot值是否为空值 # # if pd.isna(q10) or pd.isna(q90):