#120 新增组件

Birleştirildi
anweiguo anweiguo/dev_awg 2 hafta önce içindeki anweiguo/dev_hzh işlemelerini 10 ile birleştirdi

+ 3 - 1
common/database_dml.py

@@ -144,7 +144,7 @@ def get_data_fromMysql(params):
     return df
 
 
-def insert_pickle_model_into_mongo(model, args):
+def insert_pickle_model_into_mongo(model, args, features=None):
     # 获取 hive 配置部分
     mongodb_connection = config['mongodb']['mongodb_connection']
     mongodb_database, mongodb_write_table, model_name = args['mongodb_database'], args['mongodb_write_table'], args[
@@ -157,6 +157,8 @@ def insert_pickle_model_into_mongo(model, args):
         'model_name': model_name,
         'model': model_bytes,  # 将模型字节流存入数据库
     }
+    if features is not None:
+        model_data['features'] = features
     print('Training completed!')
 
     if mongodb_write_table in db.list_collection_names():

+ 46 - 0
data_processing/data_operation/weight.py

@@ -0,0 +1,46 @@
+import numpy as np
+
+
+def balance_weights(y: np.ndarray, bins=10, normalize: bool = True, **kwargs) -> np.ndarray:
+    """
+    平衡权重,分布数量越少权重越大
+    """
+    bins = int(bins)
+    counts, bin_edges = np.histogram(y, bins=bins)
+
+    # digitize 不使用 right=True,这样最小值也能落在 bin 0 开始
+    bin_indices = np.digitize(y, bin_edges[1:-1], right=False)
+
+    # bin_counts 用 0 到 bins-1 的索引
+    bin_counts = {i: count for i, count in enumerate(counts)}
+
+    # 对于每个样本分配权重(加个兜底:出现异常时给个较大默认值)
+    weights = np.array([1.0 / bin_counts.get(b, 1e-6) for b in bin_indices])
+
+    if normalize:
+        weights /= np.mean(weights)
+
+    return weights
+
+def south_weight(target: np.ndarray, cap, **kwargs) -> np.ndarray:
+    """
+    应付南方点网的奇怪考核
+    为了不把曲线压太低,这里有所收敛(添加开方处理,不让权重分布过于离散)
+    """
+    cap = float(cap)
+    weight = 1 / np.sqrt(np.where(target < 0.2 * cap, 0.2 * cap, target))
+    return weight
+
+def standard_weight(target: np.array, **kwargs) -> np.ndarray:
+    """
+    标准化权重
+    """
+    weight = np.sqrt(np.abs(target - np.mean(target))) / np.std(target)
+    return weight
+
+# ------------------------------权重函数注册------------------------------------------------
+WEIGHT_REGISTER = {
+    "balance": balance_weights,
+    "south": south_weight,
+    "std": standard_weight
+}

+ 1 - 2
models_processing/model_predict/model_prediction_lightgbm.py

@@ -119,5 +119,4 @@ if __name__=="__main__":
     logger = logging.getLogger("model_prediction_lightgbm log")
     from waitress import serve
     serve(app, host="0.0.0.0", port=10090)
-    print("server start!")
-    
+    print("server start!")

+ 152 - 0
models_processing/model_predict/model_prediction_ml.py

@@ -0,0 +1,152 @@
+import pandas as pd
+from pymongo import MongoClient
+import pickle
+from flask import Flask, request
+import time
+import logging
+import traceback
+from common.database_dml import get_data_from_mongo, insert_data_into_mongo
+from common.alert import send_message
+from datetime import datetime, timedelta
+import pytz
+from pytz import timezone
+
+from common.processing_data_common import get_xxl_dq
+
+app = Flask('model_prediction_ml——service')
+
+def str_to_list(arg):
+    if arg == '':
+        return []
+    else:
+        return arg.split(',')
+
+def forecast_data_distribution(pre_data, args):
+    col_time = args['col_time']
+    farm_id = args['farm_id']
+    dt = datetime.now(pytz.utc).astimezone(timezone("Asia/Shanghai")).strftime('%Y%m%d')
+    tomorrow = (datetime.now(pytz.utc).astimezone(timezone("Asia/Shanghai")) + timedelta(days=1)).strftime('%Y-%m-%d')
+    field_mapping = {'clearsky_ghi': 'clearskyGhi', 'dni_calcd': 'dniCalcd', 'surface_pressure': 'surfacePressure',
+                     'wd140m': 'tj_wd140', 'ws140m': 'tj_ws140', 'wd170m': 'tj_wd170', 'cldt': 'tj_tcc',
+                     'wd70m': 'tj_wd70',
+                     'ws100m': 'tj_ws100', 'DSWRFsfc': 'tj_radiation', 'wd10m': 'tj_wd10', 'TMP2m': 'tj_t2',
+                     'wd30m': 'tj_wd30',
+                     'ws30m': 'tj_ws30', 'rh2m': 'tj_rh', 'PRATEsfc': 'tj_pratesfc', 'ws170m': 'tj_ws170',
+                     'wd50m': 'tj_wd50',
+                     'ws50m': 'tj_ws50', 'wd100m': 'tj_wd100', 'ws70m': 'tj_ws70', 'ws10m': 'tj_ws10',
+                     'psz': 'tj_pressure',
+                     'cldl': 'tj_lcc', 'pres': 'tj_pres', 'dateTime': 'date_time'}
+    # 根据字段映射重命名列
+    pre_data = pre_data.rename(columns=field_mapping)
+
+    if len(pre_data) == 0:
+        send_message('lightgbm预测组件', farm_id, '请注意:获取NWP数据为空,预测文件无法生成!')
+        result = get_xxl_dq(farm_id, dt)
+
+    elif len(pre_data[pre_data[col_time].str.contains(tomorrow)]) < 96:
+        send_message('lightgbm预测组件', farm_id, "日前数据记录缺失,不足96条,用DQ代替并补值!")
+        result = get_xxl_dq(farm_id, dt)
+    else:
+        df = pre_data.sort_values(by=col_time).fillna(method='ffill').fillna(method='bfill')
+        mongodb_connection, mongodb_database, mongodb_model_table, model_name = "mongodb://root:sdhjfREWFWEF23e@192.168.1.43:30000/", \
+            args['mongodb_database'], args['mongodb_model_table'], args['model_name']
+        client = MongoClient(mongodb_connection)
+        db = client[mongodb_database]
+        collection = db[mongodb_model_table]
+        model_data = collection.find_one({"model_name": model_name})
+        print(model_data.keys())
+        if model_data is not None:
+            model_binary = model_data['model']  # 确保这个字段是存储模型的二进制数据
+            # 反序列化模型
+            model = pickle.loads(model_binary)
+            if 'features' in model_data.keys():
+                features = model_data['features']
+            else:
+                features = model.feature_name()
+            diff = set(features) - set(pre_data.columns)
+            if len(diff) > 0:
+                send_message('lightgbm预测组件', farm_id, f'NWP特征列缺失,使用DQ代替!features:{diff}')
+                result = get_xxl_dq(farm_id, dt)
+            else:
+                df['power_forecast'] = model.predict(df[features])
+                df.loc[df['power_forecast'] < 0, 'power_forecast'] = 0
+                print("model predict result  successfully!")
+                if 'farm_id' not in df.columns:
+                    df['farm_id'] = farm_id
+                result = df[['farm_id', 'date_time', 'power_forecast']]
+        else:
+            send_message('lightgbm预测组件', farm_id, "模型文件缺失,用DQ代替并补值!")
+            result = get_xxl_dq(farm_id, dt)
+    result['power_forecast'] = round(result['power_forecast'], 2)
+    return result
+
+def model_prediction(df, args):
+    mongodb_connection, mongodb_database, mongodb_model_table, model_name, howLongAgo, farm_id, target = "mongodb://root:sdhjfREWFWEF23e@192.168.1.43:30000/", \
+    args['mongodb_database'], args['mongodb_model_table'], args['model_name'], int(args['howLongAgo']), args['farm_id'], \
+    args['target']
+    client = MongoClient(mongodb_connection)
+    db = client[mongodb_database]
+    collection = db[mongodb_model_table]
+    model_data = collection.find_one({"model_name": model_name})
+    if 'is_limit' in df.columns:
+        df = df[df['is_limit'] == False]
+
+    if model_data is not None:
+        model_binary = model_data['model']  # 确保这个字段是存储模型的二进制数据
+        # 反序列化模型
+        model = pickle.loads(model_binary)
+        if 'features' in model_data.keys():
+            features = model_data['features']
+        else:
+            features = model.feature_name()
+        df.dropna(subset=features, inplace=True)
+        df['power_forecast'] = model.predict(df[features])
+        df.loc[df['power_forecast'] < 0, 'power_forecast'] = 0
+        df['model'] = model_name
+        df['howLongAgo'] = howLongAgo
+        df['farm_id'] = farm_id
+        print("model predict result  successfully!")
+
+    return df[['dateTime', 'howLongAgo', 'model', 'farm_id', 'power_forecast', target]]
+
+@app.route('/model_prediction_ml', methods=['POST'])
+def model_prediction_ml():
+    # 获取程序开始时间
+    start_time = time.time()
+    result = {}
+    success = 0
+    print("Program starts execution!")
+    try:
+        args = request.values.to_dict()
+        print('args', args)
+        forecast_file = int(args['forecast_file'])
+        power_df = get_data_from_mongo(args)
+        if forecast_file == 1:
+            predict_data = forecast_data_distribution(power_df, args)
+        else:
+            predict_data = model_prediction(power_df, args)
+        insert_data_into_mongo(predict_data, args)
+        success = 1
+    except Exception as e:
+        my_exception = traceback.format_exc()
+        my_exception.replace("\n", "\t")
+        result['msg'] = my_exception
+    end_time = time.time()
+
+    result['success'] = success
+    result['args'] = args
+    result['start_time'] = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(start_time))
+    result['end_time'] = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(end_time))
+    print("Program execution ends!")
+    return result
+
+
+
+if __name__ == "__main__":
+    print("Program starts execution!")
+    logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
+    logger = logging.getLogger("model_prediction_ml log")
+    from waitress import serve
+
+    serve(app, host="0.0.0.0", port=10129)
+    print("server start!")

+ 145 - 0
models_processing/model_train/model_training_ml.py

@@ -0,0 +1,145 @@
+import lightgbm as lgb
+import numpy as np
+from sklearn.model_selection import train_test_split
+from sklearn.metrics import mean_squared_error, mean_absolute_error
+from flask import Flask, request
+import time
+import traceback
+import logging
+from common.database_dml import get_data_from_mongo, insert_pickle_model_into_mongo
+from common.processing_data_common import missing_features, str_to_list
+from sklearn.pipeline import Pipeline
+from sklearn.svm import SVR
+from sklearn.preprocessing import MinMaxScaler
+from data_processing.data_operation.weight import WEIGHT_REGISTER
+
+app = Flask('model_training_ml——service')
+
+def get_sample_weight(df, label, args):
+    # 样本权重
+    if 'sample_weight' in args.keys():
+        if args['sample_weight'] in WEIGHT_REGISTER.keys():
+            sample_weight = WEIGHT_REGISTER[args['sample_weight']](df[label].values.reshape(-1), **args)
+        elif args['sample_weight'] in df.columns.tolist():
+            sample_weight = df[args['sample_weight']].values.reshape(-1)
+        else:
+            sample_weight = None
+            print('sample_weight is neither in the predefined weights nor a column of the DataFrame, not applicable')
+    return sample_weight
+
+def train_lgb(data_split, categorical_features, model_params, num_boost_round=100, sample_weight=None):
+    X_train, X_test, y_train, y_test = data_split
+    # 创建LightGBM数据集
+    lgb_train = lgb.Dataset(X_train, y_train, categorical_feature=categorical_features, weight=sample_weight)
+    lgb_eval = lgb.Dataset(X_test, y_test, reference=lgb_train)
+    # 设置参数
+    params = {
+        'objective': 'regression',
+        'metric': 'rmse',
+        'boosting_type': 'gbdt',
+        'verbose': 1
+    }
+    params.update(model_params)
+    # 训练模型
+    print('Starting training...')
+    gbm = lgb.train(params,
+                    lgb_train,
+                    num_boost_round=num_boost_round,
+                    valid_sets=[lgb_train, lgb_eval],
+                    )
+    y_pred = gbm.predict(X_test, num_iteration=gbm.best_iteration)
+    return gbm, y_pred
+
+
+def train_svr(data_split, model_params, sample_weight=None):
+    X_train, X_test, y_train, y_test = data_split
+
+    svr = Pipeline([('scaler', MinMaxScaler()),
+                    ('model', SVR(**model_params))])
+
+    # 训练模型
+    print('Starting training...')
+    svr.fit(X_train, y_train, model__sample_weight=sample_weight)
+    y_pred = svr.predict(X_test)
+    return svr, y_pred
+
+
+def build_model(df, args):
+    np.random.seed(42)
+    # 参数
+    numerical_features, categorical_features, label, model_name, model_params, col_time = str_to_list(
+        args['numerical_features']), str_to_list(args['categorical_features']), args['label'], args['model_name'], eval(
+        args['model_params']), args['col_time']
+
+    features = numerical_features + categorical_features
+    print("features:************", features)
+    if 'is_limit' in df.columns:
+        df = df[df['is_limit'] == False]
+    # 清洗特征平均缺失率大于20%的天
+    df = missing_features(df, features, col_time)
+    df = df[~np.isnan(df[label])]
+    # 拆分数据为训练集和测试集
+    df_train, df_test = train_test_split(df, test_size=0.2, random_state=42,
+                                                        shuffle=False)
+    X_train, y_train = df_train[features].values, df_train[label].values
+    X_test, y_test = df_test[features].values, df_test[label].values
+
+    # 获取样本权重
+    sample_weight = get_sample_weight(df_train, label=label, args=args)
+
+    model_type = args['model_type']
+    # 区分常规机器学习模型和lgb,这里只实例化svr,后续可扩展
+    if model_type == "lightgbm":
+        num_boost_round = int(args['num_boost_round'])
+        model, y_pred = train_lgb([X_train, X_test, y_train, y_test], categorical_features, model_params,
+                                  num_boost_round, sample_weight=sample_weight)
+    elif model_type == "svr":
+        model, y_pred = train_svr([X_train, X_test, y_train, y_test], model_params, sample_weight=sample_weight)
+    else:
+        raise ValueError(f"Invalid model_type, must be one of [lightgbm, svr]")
+
+    # 评估
+    mse = mean_squared_error(y_test, y_pred)
+    rmse = np.sqrt(mse)
+    mae = mean_absolute_error(y_test, y_pred)
+    print(f'The test rmse is: {rmse},"The test mae is:"{mae}')
+    return model, features
+
+
+@app.route('/model_training_ml', methods=['POST'])
+def model_training_ml():
+    # 获取程序开始时间
+    start_time = time.time()
+    result = {}
+    success = 0
+    print("Program starts execution!")
+    try:
+        args = request.values.to_dict()
+        print('args', args)
+        logger.info(args)
+        power_df = get_data_from_mongo(args)
+        model, features = build_model(power_df, args)
+        insert_pickle_model_into_mongo(model, args, features=features)
+        success = 1
+    except Exception as e:
+        my_exception = traceback.format_exc()
+        my_exception.replace("\n", "\t")
+        result['msg'] = my_exception
+    end_time = time.time()
+
+    result['success'] = success
+    result['args'] = args
+    result['start_time'] = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(start_time))
+    result['end_time'] = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(end_time))
+    print("Program execution ends!")
+    return result
+
+
+if __name__ == "__main__":
+    print("Program starts execution!")
+    logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
+    logger = logging.getLogger("model_training_ml log")
+    from waitress import serve
+
+    serve(app, host="0.0.0.0", port=10128)
+    print("server start!")

+ 98 - 0
post_processing/post_process.py

@@ -0,0 +1,98 @@
+import pandas as pd
+from flask import Flask, request, jsonify
+import time
+import logging
+import traceback
+
+from common.database_dml import get_data_from_mongo, insert_data_into_mongo
+
+app = Flask('post_process——service')
+
+def get_data(args):
+    df = get_data_from_mongo(args)
+    col_time = args['col_time']
+    if not df.empty:
+        print("预测数据加载成功!")
+        df[col_time] = pd.to_datetime(df[col_time])
+        df.set_index(col_time, inplace=True)
+        df.sort_index(inplace=True)
+    else:
+        raise ValueError("未获取到预测数据。")
+    return df
+
+
+def predict_result_adjustment(df, args):
+    """
+    光伏/风电 数据后处理 主要操作
+    1. 光伏 (夜间 置零 + 平滑)
+    2. 风电 (平滑)
+    3. cap 封顶
+    """
+    mongodb_database, plant_type, cap, col_time = args['mongodb_database'], args['plant_type'], float(args['cap']), \
+        args['col_time']
+    if 'smooth_window' in args.keys():
+        smooth_window = int(args['smooth_window'])
+    else:
+        smooth_window = 3
+
+    # 平滑
+    df_cp = df.copy()
+    df_cp['power_forecast'] = df_cp['power_forecast'].rolling(window=smooth_window, min_periods=1,
+                                                              center=True).mean().clip(0, 0.985 * cap)
+    print("smooth processed")
+
+    # 光伏晚上置零
+    if plant_type == 'solar' and 'mongodb_nwp_table' in args.keys():
+        nwp_param = {
+            'mongodb_database': mongodb_database,
+            'mongodb_read_table': args['mongodb_nwp_table'],
+            'col_time': col_time
+        }
+        nwp = get_data(nwp_param)
+
+        df_cp = df_cp.join(nwp['radiation'])
+        df_cp.loc[nwp['radiation'] == 0, 'power_forecast'] = 0
+        df_cp['power_forecast'] = round(df_cp['power_forecast'], 2)
+        df_cp.drop(columns=['radiation'], inplace=True)
+        print("solar processed")
+    df_cp.reset_index(inplace=True)
+    df_cp[col_time] = df_cp[col_time].dt.strftime('%Y-%m-%d %H:%M:%S')
+    return df_cp
+
+
+@app.route('/post_process', methods=['POST'])
+def data_join():
+    # 获取程序开始时间
+    start_time = time.time()
+    result = {}
+    success = 0
+    print("Program starts execution!")
+    try:
+        args = request.values.to_dict()
+        print('args', args)
+        logger.info(args)
+        df_pre = get_data(args)
+        res_df = predict_result_adjustment(df_pre, args)
+        insert_data_into_mongo(res_df, args)
+        success = 1
+    except Exception as e:
+        my_exception = traceback.format_exc()
+        my_exception.replace("\n", "\t")
+        result['msg'] = my_exception
+    end_time = time.time()
+    result['success'] = success
+    result['args'] = args
+    result['start_time'] = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(start_time))
+    result['end_time'] = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(end_time))
+    print("Program execution ends!")
+    return result
+
+
+if __name__ == "__main__":
+    print("Program starts execution!")
+    logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
+    logger = logging.getLogger("post_processing")
+    from waitress import serve
+
+    serve(app, host="0.0.0.0", port=10130)
+    print("server start!")

+ 46 - 42
run_all.py

@@ -2,49 +2,53 @@ import subprocess
 import os
 # 定义要启动的应用及其路径和端口
 services = [
-    ("data_processing/data_operation/data_join.py", 10094),
-    ("data_processing/data_operation/mysql_to_mongo.py", 10095),
-    ("data_processing/data_operation/pre_prod_ftp.py", 10118),
-    ("data_processing/processing_limit_power/processing_limit_power_by_agcavc.py", 10086),
-    ("data_processing/processing_limit_power/processing_limit_power_by_machines.py", 10087),
-    ("data_processing/processing_limit_power/processing_limit_power_by_records.py", 10088),
-    ("data_processing/processing_limit_power/processing_limit_power_by_statistics_light.py", 10085),
-    ("data_processing/processing_limit_power/processing_limit_power_by_statistics_wind.py", 10093),
-    ("data_processing/data_operation/pre_prod_ftp.py", '_'),
-    ("evaluation_processing/analysis_report.py", 10092),
-    ("evaluation_processing/evaluation_accuracy.py", 10091),
-    ("evaluation_processing/analysis_cdq.py", 10108),
-    ("models_processing/model_train/model_training_lightgbm.py", 10089),
-    ("models_processing/model_predict/model_prediction_lightgbm.py", 10090),
-    ("models_processing/model_train/model_training_lstm.py", 10096),
-    ("models_processing/model_predict/model_prediction_lstm.py", 10097),
-    ("models_processing/model_tf/tf_bp_pre.py", 10110),
-    ("models_processing/model_tf/tf_bp_train.py", 10111),
-    ("models_processing/model_tf/tf_cnn_pre.py", 10112),
-    ("models_processing/model_tf/tf_cnn_train.py", 10113),
-    ("models_processing/model_tf/tf_lstm_pre.py", 10114),
-    ("models_processing/model_tf/tf_lstm_train.py", 10115),
-    ("models_processing/model_tf/tf_test_pre.py", 10116),
-    ("models_processing/model_tf/tf_test_train.py", 10117),
-    ("models_processing/model_tf/tf_lstm2_pre.py", 10120),
-    ("models_processing/model_tf/tf_lstm2_train.py", 10119),
-    ("models_processing/model_tf/tf_lstm3_pre.py", 10122),
-    ("models_processing/model_tf/tf_lstm3_train.py", 10121),
-    ("models_processing/model_tf/tf_lstm_zone_pre.py", 10125),
-    ("models_processing/model_tf/tf_lstm_zone_train.py", 10124),
+    # ("data_processing/data_operation/data_join.py", 10094),
+    # ("data_processing/data_operation/mysql_to_mongo.py", 10095),
+    # ("data_processing/data_operation/pre_prod_ftp.py", 10118),
+    # ("data_processing/processing_limit_power/processing_limit_power_by_agcavc.py", 10086),
+    # ("data_processing/processing_limit_power/processing_limit_power_by_machines.py", 10087),
+    # ("data_processing/processing_limit_power/processing_limit_power_by_records.py", 10088),
+    # ("data_processing/processing_limit_power/processing_limit_power_by_statistics_light.py", 10085),
+    # ("data_processing/processing_limit_power/processing_limit_power_by_statistics_wind.py", 10093),
+    # ("data_processing/data_operation/pre_prod_ftp.py", '_'),
+    # ("evaluation_processing/analysis_report.py", 10092),
+    # ("evaluation_processing/evaluation_accuracy.py", 10091),
+    # ("evaluation_processing/analysis_cdq.py", 10108),
+    # ("models_processing/model_train/model_training_lightgbm.py", 10089),
+    # ("models_processing/model_predict/model_prediction_lightgbm.py", 10090),
+    # ("models_processing/model_train/model_training_lstm.py", 10096),
+    # ("models_processing/model_predict/model_prediction_lstm.py", 10097),
+    # ("models_processing/model_tf/tf_bp_pre.py", 10110),
+    # ("models_processing/model_tf/tf_bp_train.py", 10111),
+    # ("models_processing/model_tf/tf_cnn_pre.py", 10112),
+    # ("models_processing/model_tf/tf_cnn_train.py", 10113),
+    # ("models_processing/model_tf/tf_lstm_pre.py", 10114),
+    # ("models_processing/model_tf/tf_lstm_train.py", 10115),
+    # ("models_processing/model_tf/tf_test_pre.py", 10116),
+    # ("models_processing/model_tf/tf_test_train.py", 10117),
+    # ("models_processing/model_tf/tf_lstm2_pre.py", 10120),
+    # ("models_processing/model_tf/tf_lstm2_train.py", 10119),
+    # ("models_processing/model_tf/tf_lstm3_pre.py", 10122),
+    # ("models_processing/model_tf/tf_lstm3_train.py", 10121),
+    # ("models_processing/model_tf/tf_lstm_zone_pre.py", 10125),
+    # ("models_processing/model_tf/tf_lstm_zone_train.py", 10124),
+    #
+    # ("post_processing/post_processing.py", 10098),
+    # ("evaluation_processing/analysis.py", 10099),
+    # ("models_processing/model_predict/res_prediction.py", 10105),
+    # ("data_processing/data_operation/pre_data_ftp.py", 10101),
+    # ("data_processing/data_operation/data_nwp_ftp.py", 10102),
+    # ("models_processing/model_train/model_training_bp.py", 10103),
+    # ("models_processing/model_predict/model_prediction_bp.py", 10104),
+    # ("data_processing/data_operation/data_tj_nwp_ftp.py", 10106),
+    # ("post_processing/pre_post_processing.py", 10107),
+    # ("post_processing/cdq_coe_gen.py", 10123),
+    # ("models_processing/model_predict/model_prediction_photovoltaic_physical.py", 10126),
+    # ("data_processing/data_operation/hive_to_mongo.py", 10127),
 
-    ("post_processing/post_processing.py", 10098),
-    ("evaluation_processing/analysis.py", 10099),
-    ("models_processing/model_predict/res_prediction.py", 10105),
-    ("data_processing/data_operation/pre_data_ftp.py", 10101),
-    ("data_processing/data_operation/data_nwp_ftp.py", 10102),
-    ("models_processing/model_train/model_training_bp.py", 10103),
-    ("models_processing/model_predict/model_prediction_bp.py", 10104),
-    ("data_processing/data_operation/data_tj_nwp_ftp.py", 10106),
-    ("post_processing/pre_post_processing.py", 10107),
-    ("post_processing/cdq_coe_gen.py", 10123),
-    ("models_processing/model_predict/model_prediction_photovoltaic_physical.py", 10126),
-    ("data_processing/data_operation/hive_to_mongo.py", 10127),
+    ("models_processing/model_train/model_training_ml.py", 10128),
+    ("models_processing/model_predict/model_prediction_ml.py", 10129),
+    ("post_processing/post_process.py", 10130)
 ]
 
 # 获取当前脚本所在的根目录