diff --git a/backend/0.43.0 b/backend/0.43.0 new file mode 100644 index 0000000..6b5e534 --- /dev/null +++ b/backend/0.43.0 @@ -0,0 +1,30 @@ +Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple +Collecting shap + Downloading https://pypi.tuna.tsinghua.edu.cn/packages/a5/8e/cee1ee136a4e54fe2fbb63a60d72d7c25e21a4ffe6aa05779cab7669cb31/shap-0.51.0-cp311-cp311-win_amd64.whl (554 kB) + ---------------------------------------- 554.9/554.9 kB 6.2 MB/s 0:00:00 +Requirement already satisfied: numpy>=2 in D:\anaconda\envs\ml-nlp\Lib\site-packages (from shap) (2.3.5) +Requirement already satisfied: scipy in D:\anaconda\envs\ml-nlp\Lib\site-packages (from shap) (1.17.1) +Requirement already satisfied: scikit-learn in D:\anaconda\envs\ml-nlp\Lib\site-packages (from shap) (1.8.0) +Requirement already satisfied: pandas in D:\anaconda\envs\ml-nlp\Lib\site-packages (from shap) (3.0.1) +Requirement already satisfied: tqdm>=4.27.0 in D:\anaconda\envs\ml-nlp\Lib\site-packages (from shap) (4.67.3) +Requirement already satisfied: packaging>20.9 in D:\anaconda\envs\ml-nlp\Lib\site-packages (from shap) (25.0) +Collecting slicer==0.0.8 (from shap) + Downloading https://pypi.tuna.tsinghua.edu.cn/packages/63/81/9ef641ff4e12cbcca30e54e72fb0951a2ba195d0cda0ba4100e532d929db/slicer-0.0.8-py3-none-any.whl (15 kB) +Collecting numba (from shap) + Downloading https://pypi.tuna.tsinghua.edu.cn/packages/53/ff/1371cbbe955be340a46093a10b61462437e0fadc7a63290473a0e584cb03/numba-0.65.0-cp311-cp311-win_amd64.whl (2.7 MB) + ---------------------------------------- 2.7/2.7 MB 15.9 MB/s 0:00:00 +Collecting llvmlite (from shap) + Downloading https://pypi.tuna.tsinghua.edu.cn/packages/a2/50/59227d06bdc96e23322713c381af4e77420949d8cd8a042c79e0043096cc/llvmlite-0.47.0-cp311-cp311-win_amd64.whl (38.1 MB) + ---------------------------------------- 38.1/38.1 MB 29.2 MB/s 0:00:01 +Collecting cloudpickle (from shap) + Downloading https://pypi.tuna.tsinghua.edu.cn/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl (22 kB) +Requirement already satisfied: typing-extensions in D:\anaconda\envs\ml-nlp\Lib\site-packages (from shap) (4.15.0) +Requirement already satisfied: colorama in D:\anaconda\envs\ml-nlp\Lib\site-packages (from tqdm>=4.27.0->shap) (0.4.6) +Requirement already satisfied: python-dateutil>=2.8.2 in D:\anaconda\envs\ml-nlp\Lib\site-packages (from pandas->shap) (2.9.0.post0) +Requirement already satisfied: tzdata in D:\anaconda\envs\ml-nlp\Lib\site-packages (from pandas->shap) (2025.3) +Requirement already satisfied: six>=1.5 in D:\anaconda\envs\ml-nlp\Lib\site-packages (from python-dateutil>=2.8.2->pandas->shap) (1.17.0) +Requirement already satisfied: joblib>=1.3.0 in D:\anaconda\envs\ml-nlp\Lib\site-packages (from scikit-learn->shap) (1.5.3) +Requirement already satisfied: threadpoolctl>=3.2.0 in D:\anaconda\envs\ml-nlp\Lib\site-packages (from scikit-learn->shap) (3.6.0) +Installing collected packages: slicer, llvmlite, cloudpickle, numba, shap + +Successfully installed cloudpickle-3.1.2 llvmlite-0.47.0 numba-0.65.0 shap-0.51.0 slicer-0.0.8 diff --git a/backend/=0.43.0 b/backend/=0.43.0 new file mode 100644 index 0000000..ff1997a --- /dev/null +++ b/backend/=0.43.0 @@ -0,0 +1,38 @@ +Collecting shap + Downloading shap-0.51.0-cp312-cp312-win_amd64.whl.metadata (26 kB) +Collecting numpy>=2 (from shap) + Downloading numpy-2.4.4-cp312-cp312-win_amd64.whl.metadata (6.6 kB) +Requirement already satisfied: scipy in d:\anaconda\lib\site-packages (from shap) (1.13.1) +Requirement already satisfied: scikit-learn in d:\anaconda\lib\site-packages (from shap) (1.5.1) +Requirement already satisfied: pandas in d:\anaconda\lib\site-packages (from shap) (2.2.2) +Requirement already satisfied: tqdm>=4.27.0 in d:\anaconda\lib\site-packages (from shap) (4.66.5) +Requirement already satisfied: packaging>20.9 in d:\anaconda\lib\site-packages (from shap) (24.1) +Collecting slicer==0.0.8 (from shap) + Downloading slicer-0.0.8-py3-none-any.whl.metadata (4.0 kB) +Requirement already satisfied: numba in d:\anaconda\lib\site-packages (from shap) (0.60.0) +Requirement already satisfied: llvmlite in d:\anaconda\lib\site-packages (from shap) (0.43.0) +Requirement already satisfied: cloudpickle in d:\anaconda\lib\site-packages (from shap) (3.0.0) +Requirement already satisfied: typing-extensions in d:\anaconda\lib\site-packages (from shap) (4.14.1) +Requirement already satisfied: colorama in d:\anaconda\lib\site-packages (from tqdm>=4.27.0->shap) (0.4.6) +Collecting numpy>=2 (from shap) + Downloading numpy-2.0.2-cp312-cp312-win_amd64.whl.metadata (59 kB) +Requirement already satisfied: python-dateutil>=2.8.2 in d:\anaconda\lib\site-packages (from pandas->shap) (2.9.0.post0) +Requirement already satisfied: pytz>=2020.1 in d:\anaconda\lib\site-packages (from pandas->shap) (2024.1) +Requirement already satisfied: tzdata>=2022.7 in d:\anaconda\lib\site-packages (from pandas->shap) (2023.3) +Requirement already satisfied: joblib>=1.2.0 in d:\anaconda\lib\site-packages (from scikit-learn->shap) (1.4.2) +Requirement already satisfied: threadpoolctl>=3.1.0 in d:\anaconda\lib\site-packages (from scikit-learn->shap) (3.5.0) +Requirement already satisfied: six>=1.5 in d:\anaconda\lib\site-packages (from python-dateutil>=2.8.2->pandas->shap) (1.16.0) +Downloading shap-0.51.0-cp312-cp312-win_amd64.whl (556 kB) + --------------------------------------- 556.1/556.1 kB 60.5 kB/s eta 0:00:00 +Downloading slicer-0.0.8-py3-none-any.whl (15 kB) +Downloading numpy-2.0.2-cp312-cp312-win_amd64.whl (15.6 MB) + ---------------------------------------- 15.6/15.6 MB 31.3 kB/s eta 0:00:00 +Installing collected packages: slicer, numpy, shap + Attempting uninstall: numpy + Found existing installation: numpy 1.26.4 + Uninstalling numpy-1.26.4: + Successfully uninstalled numpy-1.26.4 +ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts. +contourpy 1.2.0 requires numpy<2.0,>=1.20, but you have numpy 2.0.2 which is incompatible. +gensim 4.3.3 requires numpy<2.0,>=1.18.5, but you have numpy 2.0.2 which is incompatible. +Successfully installed numpy-2.0.2 shap-0.51.0 slicer-0.0.8 diff --git a/backend/api/__init__.py b/backend/api/__init__.py index 4bd9fd3..341a0a9 100644 --- a/backend/api/__init__.py +++ b/backend/api/__init__.py @@ -2,6 +2,8 @@ from .overview_routes import overview_bp from .analysis_routes import analysis_bp from .predict_routes import predict_bp from .cluster_routes import cluster_bp +from .jdr_routes import jdr_bp +from .shap_routes import shap_bp def register_blueprints(app): @@ -9,3 +11,5 @@ def register_blueprints(app): app.register_blueprint(analysis_bp) app.register_blueprint(predict_bp) app.register_blueprint(cluster_bp) + app.register_blueprint(jdr_bp) + app.register_blueprint(shap_bp) diff --git a/backend/api/jdr_routes.py b/backend/api/jdr_routes.py new file mode 100644 index 0000000..4075813 --- /dev/null +++ b/backend/api/jdr_routes.py @@ -0,0 +1,51 @@ +from flask import Blueprint, jsonify, request + +from services.jdr_service import jdr_service + +jdr_bp = Blueprint('jdr', __name__, url_prefix='/api/jdr') + + +@jdr_bp.route('/dimensions', methods=['GET']) +def get_dimensions(): + try: + result = jdr_service.get_dimension_scores() + return jsonify({'code': 200, 'message': 'success', 'data': result}) + except Exception as e: + return jsonify({'code': 500, 'message': str(e), 'data': None}), 500 + + +@jdr_bp.route('/burnout-engagement', methods=['GET']) +def get_burnout_engagement(): + try: + result = jdr_service.get_burnout_engagement_analysis() + return jsonify({'code': 200, 'message': 'success', 'data': result}) + except Exception as e: + return jsonify({'code': 500, 'message': str(e), 'data': None}), 500 + + +@jdr_bp.route('/path-analysis', methods=['GET']) +def get_path_analysis(): + try: + result = jdr_service.get_jdr_path_analysis() + return jsonify({'code': 200, 'message': 'success', 'data': result}) + except Exception as e: + return jsonify({'code': 500, 'message': str(e), 'data': None}), 500 + + +@jdr_bp.route('/profile', methods=['GET']) +def get_profile(): + try: + dimension = request.args.get('dimension', '所属行业') + result = jdr_service.get_jdr_profile(dimension) + return jsonify({'code': 200, 'message': 'success', 'data': result}) + except Exception as e: + return jsonify({'code': 500, 'message': str(e), 'data': None}), 500 + + +@jdr_bp.route('/risk-distribution', methods=['GET']) +def get_risk_distribution(): + try: + result = jdr_service.get_risk_distribution() + return jsonify({'code': 200, 'message': 'success', 'data': result}) + except Exception as e: + return jsonify({'code': 500, 'message': str(e), 'data': None}), 500 diff --git a/backend/api/predict_routes.py b/backend/api/predict_routes.py index 6d87939..0f9561b 100644 --- a/backend/api/predict_routes.py +++ b/backend/api/predict_routes.py @@ -100,3 +100,18 @@ def get_model_info(): 'message': str(e), 'data': None }), 500 + + +@predict_bp.route('/risk-classify', methods=['POST']) +def risk_classify(): + try: + data = request.get_json() + if not data: + return jsonify({'code': 400, 'message': 'Request body is required', 'data': None}), 400 + model_type = data.get('model_type') + result = predict_service.predict_risk_classification(data, model_type) + if result is None: + return jsonify({'code': 404, 'message': 'No classifier available', 'data': None}), 404 + return jsonify({'code': 200, 'message': 'success', 'data': result}) + except Exception as e: + return jsonify({'code': 500, 'message': str(e), 'data': None}), 500 diff --git a/backend/api/shap_routes.py b/backend/api/shap_routes.py new file mode 100644 index 0000000..67270a6 --- /dev/null +++ b/backend/api/shap_routes.py @@ -0,0 +1,50 @@ +from flask import Blueprint, jsonify, request + +from services.shap_service import shap_service + +shap_bp = Blueprint('shap', __name__, url_prefix='/api/shap') + + +@shap_bp.route('/global', methods=['GET']) +def get_global_importance(): + try: + model_type = request.args.get('model', 'random_forest') + result = shap_service.get_global_importance(model_type) + return jsonify({'code': 200, 'message': 'success', 'data': result}) + except Exception as e: + return jsonify({'code': 500, 'message': str(e), 'data': None}), 500 + + +@shap_bp.route('/local', methods=['POST']) +def get_local_explanation(): + try: + data = request.get_json() + if not data: + return jsonify({'code': 400, 'message': 'Request body is required', 'data': None}), 400 + model_type = data.get('model_type', 'random_forest') + result = shap_service.get_local_explanation(data, model_type) + return jsonify({'code': 200, 'message': 'success', 'data': result}) + except Exception as e: + return jsonify({'code': 500, 'message': str(e), 'data': None}), 500 + + +@shap_bp.route('/interaction', methods=['GET']) +def get_interactions(): + try: + model_type = request.args.get('model', 'random_forest') + top_n = int(request.args.get('top_n', 10)) + result = shap_service.get_interactions(model_type, top_n) + return jsonify({'code': 200, 'message': 'success', 'data': result}) + except Exception as e: + return jsonify({'code': 500, 'message': str(e), 'data': None}), 500 + + +@shap_bp.route('/dependence', methods=['GET']) +def get_dependence(): + try: + feature = request.args.get('feature', '月均加班时长') + model_type = request.args.get('model', 'random_forest') + result = shap_service.get_dependence(feature, model_type) + return jsonify({'code': 200, 'message': 'success', 'data': result}) + except Exception as e: + return jsonify({'code': 500, 'message': str(e), 'data': None}), 500 diff --git a/backend/app.py b/backend/app.py index 65fa0cd..8ddc068 100644 --- a/backend/app.py +++ b/backend/app.py @@ -39,6 +39,19 @@ def create_app(): '/api/cluster/result', '/api/cluster/profile', '/api/cluster/scatter' + ], + 'jdr': [ + '/api/jdr/dimensions', + '/api/jdr/burnout-engagement', + '/api/jdr/path-analysis', + '/api/jdr/profile', + '/api/jdr/risk-distribution' + ], + 'shap': [ + '/api/shap/global', + '/api/shap/local', + '/api/shap/interaction', + '/api/shap/dependence' ] } } diff --git a/backend/config.py b/backend/config.py index 1e37791..020f9a9 100644 --- a/backend/config.py +++ b/backend/config.py @@ -147,4 +147,63 @@ FEATURE_NAME_CN = { '年龄分层': '年龄分层', '通勤分层': '通勤分层', '加班分层': '加班分层', + # JD-R 工作要求维度 + '工作自主性': '工作自主性', + '情绪劳动强度': '情绪劳动强度', + '时间压力感知': '时间压力感知', + '角色模糊度': '角色模糊度', + '工作家庭冲突': '工作家庭冲突', + # JD-R 工作资源维度 + '上级支持': '上级支持', + '同事支持': '同事支持', + '技能多样性': '技能多样性', + '职业发展机会': '职业发展机会', + '参与决策': '参与决策', + '组织公平感': '组织公平感', + # JD-R 个人资源维度 + '自我效能感': '自我效能感', + '心理韧性': '心理韧性', + '乐观程度': '乐观程度', + # JD-R 中介变量 + '工作倦怠': '工作倦怠', + '工作投入': '工作投入', + # JD-R 复合指数 + '工作要求指数': '工作要求指数', + '工作资源指数': '工作资源指数', + '个人资源指数': '个人资源指数', + 'JD-R平衡度': 'JD-R平衡度', + '倦怠风险指数': '倦怠风险指数', + '工作投入指数': '工作投入指数', } + +# JD-R 理论维度映射 +JDR_DIMENSIONS = { + 'job_demands': { + 'name_cn': '工作要求', + 'features': ['月均加班时长', '通勤时长分钟', '是否夜班岗位', '工作自主性', + '情绪劳动强度', '时间压力感知', '角色模糊度', '工作家庭冲突'], + }, + 'job_resources': { + 'name_cn': '工作资源', + 'features': ['工作自主性', '上级支持', '同事支持', '技能多样性', + '职业发展机会', '参与决策', '组织公平感'], + }, + 'personal_resources': { + 'name_cn': '个人资源', + 'features': ['自我效能感', '心理韧性', '乐观程度'], + }, + 'mediators': { + 'name_cn': '中介变量', + 'features': ['工作倦怠', '工作投入'], + }, +} + +# 风险等级配置 +RISK_LEVELS = { + 'low': {'max_hours': 4, 'label': '低风险', 'color': '#22c55e'}, + 'medium': {'min_hours': 4, 'max_hours': 8, 'label': '中风险', 'color': '#f59e0b'}, + 'high': {'min_hours': 8, 'label': '高风险', 'color': '#ef4444'}, +} + +# JD-R 数据版本标记 +JDR_DATA_VERSION = '1.0' diff --git a/backend/core/generate_dataset.py b/backend/core/generate_dataset.py index 3c8e8f5..a5fb67a 100644 --- a/backend/core/generate_dataset.py +++ b/backend/core/generate_dataset.py @@ -387,16 +387,181 @@ def generate_dataset(output_path=None, sample_count=12000, random_state=None): return df -def ensure_dataset(): - if not os.path.exists(config.RAW_DATA_PATH): - generate_dataset(config.RAW_DATA_PATH) - return +def enrich_with_jdr_columns(df): + """为现有数据追加 JD-R(工作要求-资源)理论维度列。 - try: - df = pd.read_csv(config.RAW_DATA_PATH) - validate_dataset(df) - except Exception: + 在已有的员工/事件属性基础上,合成 16 个新列: + - 工作要求:工作自主性、情绪劳动强度、时间压力感知、角色模糊度、工作家庭冲突 + - 工作资源:上级支持、同事支持、技能多样性、职业发展机会、参与决策、组织公平感 + - 个人资源:自我效能感、心理韧性、乐观程度 + - 中介变量:工作倦怠、工作投入 + """ + rng = np.random.default_rng(config.RANDOM_STATE + 100) + df = df.copy() + n = len(df) + + # ── 辅助:条件性 Likert 生成 ── + def likert(mean_offset, std=0.8, low=1.0, high=5.0): + return np.clip(rng.normal(mean_offset, std, size=n), low, high) + + # ── 预提取列 ── + overtime = df['月均加班时长'].values + commute = df['通勤时长分钟'].values + night = df['是否夜班岗位'].values + children = df['子女数量'].values + married_arr = (df['婚姻状态'] == '已婚').astype(int).values + tenure = df['司龄年数'].values + team_size = df['团队人数'].values + manager_span = df['直属上级管理跨度'].values + exercise = df['每周运动频次'].values + sleep = df['近30天睡眠时长均值'].values + chronic = df['是否慢性病史'].values + perf_a = (df['绩效等级'] == 'A').astype(int).values + perf_ab = df['绩效等级'].isin(['A', 'B']).astype(int).values + level_map = {'初级': 0, '中级': 1, '高级': 2, '主管': 3, '经理及以上': 4} + level_vals = df['岗位级别'].map(level_map).fillna(1).values + industry_vals = df['所属行业'].values + employment_type = df['用工类型'].values + job_family = df['岗位序列'].values + company_scale_map = { + '100人以下': 0, '100-499人': 1, '500-999人': 2, '1000-4999人': 3, '5000人及以上': 4 + } + scale_vals = df['企业规模'].map(company_scale_map).fillna(1).values + + formal_employee = (df['用工类型'] == '正式员工').astype(int).values + edu_map = {'中专及以下': 0, '大专': 1, '本科': 2, '硕士': 3, '博士': 4} + edu_vals = df['最高学历'].map(edu_map).fillna(2).values + + # ── 工作要求维度 (5 列) ── + df['工作自主性'] = likert( + 3.2 + level_vals * 0.25 + + np.isin(industry_vals, ['互联网', '金融服务']).astype(int) * 0.3 + - night * 0.4 + ).round(1) + + df['情绪劳动强度'] = likert( + 2.8 + + np.isin(job_family, ['客服坐席', '销售业务']).astype(int) * 0.6 + + np.isin(industry_vals, ['医药健康', '零售连锁']).astype(int) * 0.3 + ).round(1) + + df['时间压力感知'] = likert( + 3.0 + overtime * 0.02 + commute * 0.01 + + np.isin(industry_vals, ['互联网', '金融服务']).astype(int) * 0.2 + ).round(1) + + df['角色模糊度'] = likert( + 2.5 + + np.isin(employment_type, ['劳务派遣', '外包驻场']).astype(int) * 0.5 + - tenure * 0.05 + ).round(1) + + df['工作家庭冲突'] = likert( + 2.6 + overtime * 0.02 + children * 0.3 + married_arr * 0.3 + ).round(1) + + # ── 工作资源维度 (6 列) ── + df['上级支持'] = likert( + 3.4 - manager_span * 0.02 + level_vals * 0.2 + ).round(1) + + df['同事支持'] = likert( + 3.3 + team_size * 0.02 + + np.isin(job_family, ['管理', '专业技术']).astype(int) * 0.2 + ).round(1) + + df['技能多样性'] = likert( + 3.0 + + np.isin(job_family, ['专业技术', '管理']).astype(int) * 0.5 + - np.isin(job_family, ['生产操作']).astype(int) * 0.3 + ).round(1) + + df['职业发展机会'] = likert( + 3.1 + + np.isin(industry_vals, ['互联网', '金融服务']).astype(int) * 0.4 + + scale_vals * 0.1 + ).round(1) + + df['参与决策'] = likert( + 2.8 + level_vals * 0.35 + ).round(1) + + df['组织公平感'] = likert( + 3.3 + formal_employee * 0.4 + perf_ab * 0.3 + ).round(1) + + # ── 个人资源维度 (3 列) ── + df['自我效能感'] = likert( + 3.3 + perf_a * 0.4 + perf_ab * 0.2 + tenure * 0.03 + edu_vals * 0.08 + ).round(1) + + df['心理韧性'] = likert( + 3.2 + exercise * 0.1 + sleep * 0.15 + tenure * 0.02 + ).round(1) + + df['乐观程度'] = likert( + 3.3 + perf_ab * 0.3 - chronic * 0.3 + married_arr * 0.15 + ).round(1) + + # ── 中介变量 (2 列) ── + # 工作倦怠 (1-7):健康损伤过程 — 高需求→高倦怠 + df['工作倦怠'] = np.clip( + rng.normal(3.0, 0.8, size=n) + + overtime * 0.015 + night * 0.3 + commute * 0.008 + + df['情绪劳动强度'].values * 0.25 + + df['时间压力感知'].values * 0.25 + + df['工作家庭冲突'].values * 0.2 + + df['角色模糊度'].values * 0.15 + - df['工作自主性'].values * 0.2 + - df['上级支持'].values * 0.15 + - df['自我效能感'].values * 0.2 + - df['心理韧性'].values * 0.15, + 1.0, 7.0 + ).round(1) + + # 工作投入 (1-7):激励过程 — 高资源→高投入 + df['工作投入'] = np.clip( + rng.normal(3.5, 0.8, size=n) + + df['工作自主性'].values * 0.2 + + df['上级支持'].values * 0.2 + + df['同事支持'].values * 0.15 + + df['技能多样性'].values * 0.15 + + df['职业发展机会'].values * 0.15 + + df['参与决策'].values * 0.1 + + df['组织公平感'].values * 0.1 + + df['自我效能感'].values * 0.2 + + df['心理韧性'].values * 0.15 + + df['乐观程度'].values * 0.15 + - df['工作倦怠'].values * 0.2, + 1.0, 7.0 + ).round(1) + + # JD-R 数据版本标记 + df['_jdr_version'] = config.JDR_DATA_VERSION + + return df + + +def ensure_dataset(): + needs_regenerate = not os.path.exists(config.RAW_DATA_PATH) + + if not needs_regenerate: + try: + df = pd.read_csv(config.RAW_DATA_PATH) + validate_dataset(df) + except Exception: + needs_regenerate = True + + if needs_regenerate: generate_dataset(config.RAW_DATA_PATH) + df = pd.read_csv(config.RAW_DATA_PATH) + + # 检查是否需要 JD-R 数据丰富 + jdr_columns = ['工作自主性', '上级支持', '自我效能感', '工作倦怠', '工作投入'] + if not all(col in df.columns for col in jdr_columns): + df = enrich_with_jdr_columns(df) + os.makedirs(os.path.dirname(config.RAW_DATA_PATH), exist_ok=True) + df.to_csv(config.RAW_DATA_PATH, index=False, encoding='utf-8-sig') if __name__ == '__main__': diff --git a/backend/core/model_features.py b/backend/core/model_features.py index d66d9d5..09a2253 100644 --- a/backend/core/model_features.py +++ b/backend/core/model_features.py @@ -35,6 +35,11 @@ NUMERICAL_OUTLIER_COLUMNS = [ 'BMI', '近30天睡眠时长均值', '每周运动频次', + # JD-R 维度列 + '工作自主性', '情绪劳动强度', '时间压力感知', '角色模糊度', '工作家庭冲突', + '上级支持', '同事支持', '技能多样性', '职业发展机会', '参与决策', '组织公平感', + '自我效能感', '心理韧性', '乐观程度', + '工作倦怠', '工作投入', ] DEFAULT_PREDICTION_INPUT = { 'industry': '制造业', @@ -82,6 +87,26 @@ DEFAULT_PREDICTION_INPUT = { 'urgent_leave_flag': 1, 'continuous_absence_flag': 0, 'previous_day_overtime_flag': 1, + # JD-R 工作要求维度 + 'work_autonomy': 3.0, + 'emotional_labor': 3.0, + 'time_pressure': 3.0, + 'role_ambiguity': 3.0, + 'work_family_conflict': 3.0, + # JD-R 工作资源维度 + 'supervisor_support': 3.0, + 'coworker_support': 3.0, + 'skill_variety': 3.0, + 'career_development': 3.0, + 'decision_participation': 3.0, + 'organizational_justice': 3.0, + # JD-R 个人资源维度 + 'self_efficacy': 3.0, + 'resilience': 3.0, + 'optimism': 3.0, + # JD-R 中介变量 + 'burnout': 3.5, + 'work_engagement': 3.5, } @@ -171,6 +196,50 @@ def engineer_features(df): ) df['管理负荷指数'] = df['团队人数'] * 0.4 + df['直属上级管理跨度'] * 0.25 + # ── JD-R 复合指数 ── + autonomy = df.get('工作自主性', pd.Series(3.0, index=df.index)) + df['工作要求指数'] = ( + df['月均加班时长'] * 0.20 + + df['通勤时长分钟'] * 0.08 + + df['是否夜班岗位'] * 1.5 + + (5 - autonomy) * 0.3 + + df.get('情绪劳动强度', pd.Series(3.0, index=df.index)) * 0.25 + + df.get('时间压力感知', pd.Series(3.0, index=df.index)) * 0.25 + + df.get('角色模糊度', pd.Series(3.0, index=df.index)) * 0.20 + + df.get('工作家庭冲突', pd.Series(3.0, index=df.index)) * 0.20 + ) / 2 + + df['工作资源指数'] = ( + autonomy * 0.18 + + df.get('上级支持', pd.Series(3.0, index=df.index)) * 0.18 + + df.get('同事支持', pd.Series(3.0, index=df.index)) * 0.14 + + df.get('技能多样性', pd.Series(3.0, index=df.index)) * 0.14 + + df.get('职业发展机会', pd.Series(3.0, index=df.index)) * 0.14 + + df.get('参与决策', pd.Series(3.0, index=df.index)) * 0.10 + + df.get('组织公平感', pd.Series(3.0, index=df.index)) * 0.12 + ) + + df['个人资源指数'] = ( + df.get('自我效能感', pd.Series(3.0, index=df.index)) * 0.35 + + df.get('心理韧性', pd.Series(3.0, index=df.index)) * 0.35 + + df.get('乐观程度', pd.Series(3.0, index=df.index)) * 0.30 + ) + + df['JD-R平衡度'] = df['工作资源指数'] - df['工作要求指数'] * 0.5 + + df['倦怠风险指数'] = ( + df.get('工作倦怠', pd.Series(3.5, index=df.index)) * 0.40 + + df['工作要求指数'] * 0.30 + - df['工作资源指数'] * 0.20 + - df['个人资源指数'] * 0.10 + ) + + df['工作投入指数'] = ( + df.get('工作投入', pd.Series(3.5, index=df.index)) * 0.40 + + df['工作资源指数'] * 0.30 + + df['个人资源指数'] * 0.30 + ) + df['工龄分层'] = pd.cut(df['司龄年数'], bins=[0, 2, 5, 10, 40], labels=['1', '2', '3', '4']) df['年龄分层'] = pd.cut(df['年龄'], bins=[18, 25, 32, 40, 60], labels=['1', '2', '3', '4']) df['通勤分层'] = pd.cut(df['通勤时长分钟'], bins=[0, 25, 45, 70, 180], labels=['1', '2', '3', '4']) @@ -299,6 +368,26 @@ def build_prediction_dataframe(data): 'previous_day_overtime_flag', DEFAULT_PREDICTION_INPUT['previous_day_overtime_flag'], ), + # JD-R 工作要求维度 + '工作自主性': data.get('work_autonomy', DEFAULT_PREDICTION_INPUT['work_autonomy']), + '情绪劳动强度': data.get('emotional_labor', DEFAULT_PREDICTION_INPUT['emotional_labor']), + '时间压力感知': data.get('time_pressure', DEFAULT_PREDICTION_INPUT['time_pressure']), + '角色模糊度': data.get('role_ambiguity', DEFAULT_PREDICTION_INPUT['role_ambiguity']), + '工作家庭冲突': data.get('work_family_conflict', DEFAULT_PREDICTION_INPUT['work_family_conflict']), + # JD-R 工作资源维度 + '上级支持': data.get('supervisor_support', DEFAULT_PREDICTION_INPUT['supervisor_support']), + '同事支持': data.get('coworker_support', DEFAULT_PREDICTION_INPUT['coworker_support']), + '技能多样性': data.get('skill_variety', DEFAULT_PREDICTION_INPUT['skill_variety']), + '职业发展机会': data.get('career_development', DEFAULT_PREDICTION_INPUT['career_development']), + '参与决策': data.get('decision_participation', DEFAULT_PREDICTION_INPUT['decision_participation']), + '组织公平感': data.get('organizational_justice', DEFAULT_PREDICTION_INPUT['organizational_justice']), + # JD-R 个人资源维度 + '自我效能感': data.get('self_efficacy', DEFAULT_PREDICTION_INPUT['self_efficacy']), + '心理韧性': data.get('resilience', DEFAULT_PREDICTION_INPUT['resilience']), + '乐观程度': data.get('optimism', DEFAULT_PREDICTION_INPUT['optimism']), + # JD-R 中介变量 + '工作倦怠': data.get('burnout', DEFAULT_PREDICTION_INPUT['burnout']), + '工作投入': data.get('work_engagement', DEFAULT_PREDICTION_INPUT['work_engagement']), } return pd.DataFrame([feature_row]) diff --git a/backend/core/shap_analysis.py b/backend/core/shap_analysis.py new file mode 100644 index 0000000..0f22d60 --- /dev/null +++ b/backend/core/shap_analysis.py @@ -0,0 +1,399 @@ +import os + +import joblib +import numpy as np +import pandas as pd + +import config + +try: + import shap + SHAP_AVAILABLE = True +except ImportError: + SHAP_AVAILABLE = False + + +class SHAPAnalyzer: + """基于 SHAP 值的可解释性分析器,按 JD-R 维度聚合解释结果。""" + + def __init__(self): + self.explainers = {} + self.models = {} + self.scaler = None + self.feature_names = None + self.selected_features = None + self.label_encoders = {} + self.background_data = None + self._initialized = False + + def _ensure_initialized(self): + if self._initialized: + return + + # 加载回归模型(SHAP 分析基于回归模型) + models_dir = config.MODELS_DIR + model_files = { + 'random_forest': 'random_forest_model.pkl', + 'xgboost': 'xgboost_model.pkl', + 'lightgbm': 'lightgbm_model.pkl', + 'gradient_boosting': 'gradient_boosting_model.pkl', + 'extra_trees': 'extra_trees_model.pkl', + } + for name, filename in model_files.items(): + path = os.path.join(models_dir, filename) + if os.path.exists(path): + try: + self.models[name] = joblib.load(path) + except Exception: + pass + + # 加载预处理工件 + if os.path.exists(config.SCALER_PATH): + self.scaler = joblib.load(config.SCALER_PATH) + for filename, attr in [ + ('feature_names.pkl', 'feature_names'), + ('selected_features.pkl', 'selected_features'), + ('label_encoders.pkl', 'label_encoders'), + ]: + path = os.path.join(models_dir, filename) + if os.path.exists(path): + try: + setattr(self, attr, joblib.load(path)) + except Exception: + pass + + self._initialized = True + + def _get_tree_explainer(self, model_type='random_forest'): + """获取或创建 TreeExplainer""" + if not SHAP_AVAILABLE: + return None + + if model_type in self.explainers: + return self.explainers[model_type] + + model = self.models.get(model_type) + if model is None: + return None + + try: + explainer = shap.TreeExplainer(model) + self.explainers[model_type] = explainer + return explainer + except Exception: + return None + + def _get_background_sample(self, n_samples=500): + """获取背景数据样本""" + if self.background_data is not None: + return self.background_data + + try: + from core.preprocessing import get_clean_data + from core.model_features import ( + normalize_columns, prepare_modeling_dataframe, + apply_outlier_bounds, fit_outlier_bounds, + engineer_features, extract_xy, fit_label_encoders, + apply_label_encoders, align_feature_frame, to_float_array, + NUMERICAL_OUTLIER_COLUMNS, ORDINAL_COLUMNS, + ) + + raw_df = normalize_columns(get_clean_data()) + df = prepare_modeling_dataframe(raw_df) + + bounds = fit_outlier_bounds(df, NUMERICAL_OUTLIER_COLUMNS) + df = apply_outlier_bounds(df, bounds) + df = engineer_features(df) + X_df, _ = extract_xy(df) + X_df, encoders = fit_label_encoders(X_df, ORDINAL_COLUMNS) + + if self.feature_names: + X_df = align_feature_frame(X_df, self.feature_names) + + if n_samples < len(X_df): + X_df = X_df.sample(n=n_samples, random_state=config.RANDOM_STATE) + + if self.scaler is not None: + X = self.scaler.transform(to_float_array(X_df)) + else: + X = to_float_array(X_df) + + if self.selected_features and self.feature_names: + selected_indices = [self.feature_names.index(n) for n in self.selected_features if n in self.feature_names] + if selected_indices: + X = X[:, selected_indices] + + self.background_data = X + return X + except Exception: + return None + + def _get_feature_display_names(self): + """获取特征显示名称映射""" + feature_names = self.selected_features or self.feature_names or [] + return {name: config.FEATURE_NAME_CN.get(name, name) for name in feature_names} + + def _map_feature_to_dimension(self, feature_name): + """将特征映射到 JD-R 维度""" + for dim_key, dim_info in config.JDR_DIMENSIONS.items(): + if feature_name in dim_info['features']: + return dim_key + # 事件/上下文特征 + context_features = ['缺勤月份', '星期几', '是否节假日前后', '季节', + '请假类型', '请假原因大类', '是否提供医院证明', + '是否临时请假', '是否连续缺勤', '前一工作日是否加班'] + if feature_name in context_features: + return 'event_context' + return 'other' + + def global_shap_values(self, model_type='random_forest'): + """计算全局 SHAP 重要性,按 JD-R 维度分组""" + if not SHAP_AVAILABLE: + return {'error': 'SHAP library not installed'} + + self._ensure_initialized() + explainer = self._get_tree_explainer(model_type) + if explainer is None: + return {'error': f'No tree model available for {model_type}'} + + X = self._get_background_sample() + if X is None: + return {'error': 'Failed to prepare background data'} + + try: + shap_values = explainer.shap_values(X) + if isinstance(shap_values, list): + shap_values = shap_values[0] + + mean_abs_shap = np.abs(shap_values).mean(axis=0) + feature_names = self.selected_features or self.feature_names or [] + name_map = self._get_feature_display_names() + + # 按维度分组 + dimensions = {} + for dim_key, dim_info in config.JDR_DIMENSIONS.items(): + dim_features = [] + for fname in feature_names: + if fname in dim_info['features']: + idx = list(feature_names).index(fname) + dim_features.append({ + 'name': fname, + 'name_cn': name_map.get(fname, fname), + 'importance': round(float(mean_abs_shap[idx]), 4), + }) + if dim_features: + dimensions[dim_key] = { + 'name_cn': dim_info['name_cn'], + 'features': sorted(dim_features, key=lambda x: x['importance'], reverse=True), + } + + # 事件上下文维度 + context_features = [] + for fname in feature_names: + if self._map_feature_to_dimension(fname) == 'event_context': + idx = list(feature_names).index(fname) + context_features.append({ + 'name': fname, + 'name_cn': name_map.get(fname, fname), + 'importance': round(float(mean_abs_shap[idx]), 4), + }) + if context_features: + dimensions['event_context'] = { + 'name_cn': '事件上下文', + 'features': sorted(context_features, key=lambda x: x['importance'], reverse=True), + } + + # Top 特征列表 + top_indices = np.argsort(mean_abs_shap)[::-1][:20] + top_features = [] + for idx in top_indices: + fname = feature_names[idx] if idx < len(feature_names) else f'f{idx}' + top_features.append({ + 'name': fname, + 'name_cn': name_map.get(fname, fname), + 'importance': round(float(mean_abs_shap[idx]), 4), + 'dimension': self._map_feature_to_dimension(fname), + }) + + return { + 'model_type': model_type, + 'dimensions': dimensions, + 'top_features': top_features, + } + except Exception as exc: + return {'error': str(exc)} + + def local_shap_values(self, data, model_type='random_forest'): + """计算单条预测的 SHAP 解释""" + if not SHAP_AVAILABLE: + return {'error': 'SHAP library not installed'} + + self._ensure_initialized() + explainer = self._get_tree_explainer(model_type) + if explainer is None: + return {'error': f'No tree model available for {model_type}'} + + try: + from core.model_features import ( + build_prediction_dataframe, engineer_features, + apply_label_encoders, align_feature_frame, to_float_array, + ) + + X_df = build_prediction_dataframe(data) + X_df = engineer_features(X_df) + X_df = apply_label_encoders(X_df, self.label_encoders) + if self.feature_names: + X_df = align_feature_frame(X_df, self.feature_names) + features = self.scaler.transform(to_float_array(X_df)) + if self.selected_features and self.feature_names: + selected_indices = [self.feature_names.index(n) for n in self.selected_features if n in self.feature_names] + if selected_indices: + features = features[:, selected_indices] + + shap_values = explainer.shap_values(features) + if isinstance(shap_values, list): + shap_values = shap_values[0] + + base_value = float(explainer.expected_value) + if isinstance(base_value, (list, np.ndarray)): + base_value = float(base_value[0]) + + feature_names = self.selected_features or self.feature_names or [] + name_map = self._get_feature_display_names() + + feature_contributions = [] + dimension_contribution = {} + for idx, fname in enumerate(feature_names): + sv = float(shap_values[0][idx]) + fv = float(features[0][idx]) + dim = self._map_feature_to_dimension(fname) + feature_contributions.append({ + 'name': fname, + 'name_cn': name_map.get(fname, fname), + 'shap_value': round(sv, 4), + 'feature_value': round(fv, 4), + 'dimension': dim, + }) + dimension_contribution[dim] = dimension_contribution.get(dim, 0) + sv + + feature_contributions.sort(key=lambda x: abs(x['shap_value']), reverse=True) + + # 维度标签 + dim_labels = {} + for dk, di in config.JDR_DIMENSIONS.items(): + dim_labels[dk] = di['name_cn'] + dim_labels['event_context'] = '事件上下文' + dim_labels['other'] = '其他' + + return { + 'base_value': round(base_value, 4), + 'features': feature_contributions[:20], + 'dimension_contribution': { + dim_labels.get(k, k): round(v, 4) + for k, v in sorted(dimension_contribution.items(), key=lambda x: abs(x[1]), reverse=True) + }, + } + except Exception as exc: + return {'error': str(exc)} + + def shap_interaction(self, model_type='random_forest', top_n=10): + """计算 SHAP 交互值""" + if not SHAP_AVAILABLE: + return {'error': 'SHAP library not installed'} + + self._ensure_initialized() + explainer = self._get_tree_explainer(model_type) + if explainer is None: + return {'error': f'No tree model available for {model_type}'} + + X = self._get_background_sample(n_samples=200) + if X is None: + return {'error': 'Failed to prepare background data'} + + try: + interaction_values = explainer.shap_interaction_values(X) + if isinstance(interaction_values, list): + interaction_values = interaction_values[0] + + mean_interaction = np.abs(interaction_values).mean(axis=0) + feature_names = self.selected_features or self.feature_names or [] + + # 获取 top_n 特征的交互 + mean_abs = np.abs(interaction_values.mean(axis=0)) + np.fill_diagonal(mean_abs, 0) + flat_idx = np.argsort(mean_abs.ravel())[::-1][:top_n * 2] + top_pairs = [] + seen = set() + for idx in flat_idx: + i, j = divmod(idx, mean_abs.shape[1]) + if i >= j: + continue + pair_key = (min(i, j), max(i, j)) + if pair_key in seen: + continue + seen.add(pair_key) + fi = feature_names[i] if i < len(feature_names) else f'f{i}' + fj = feature_names[j] if j < len(feature_names) else f'f{j}' + name_map = self._get_feature_display_names() + top_pairs.append({ + 'feature_1': fi, + 'feature_1_cn': name_map.get(fi, fi), + 'feature_2': fj, + 'feature_2_cn': name_map.get(fj, fj), + 'strength': round(float(mean_interaction[i, j]), 4), + }) + if len(top_pairs) >= top_n: + break + + return { + 'model_type': model_type, + 'top_interactions': top_pairs, + } + except Exception as exc: + return {'error': str(exc)} + + def shap_dependence(self, feature_name, model_type='random_forest'): + """计算单个特征的 SHAP 依赖图数据""" + if not SHAP_AVAILABLE: + return {'error': 'SHAP library not installed'} + + self._ensure_initialized() + explainer = self._get_tree_explainer(model_type) + if explainer is None: + return {'error': f'No tree model available for {model_type}'} + + X = self._get_background_sample() + if X is None: + return {'error': 'Failed to prepare background data'} + + try: + feature_names = self.selected_features or self.feature_names or [] + if feature_name not in feature_names: + return {'error': f'Feature {feature_name} not found'} + + col_idx = list(feature_names).index(feature_name) + shap_values = explainer.shap_values(X) + if isinstance(shap_values, list): + shap_values = shap_values[0] + + feature_vals = X[:, col_idx].tolist() + shap_vals = shap_values[:, col_idx].tolist() + + # 下采样用于可视化 + max_points = 300 + if len(feature_vals) > max_points: + indices = np.random.RandomState(config.RANDOM_STATE).choice( + len(feature_vals), max_points, replace=False + ) + feature_vals = [feature_vals[i] for i in indices] + shap_vals = [shap_vals[i] for i in indices] + + name_map = self._get_feature_display_names() + return { + 'feature': feature_name, + 'feature_cn': name_map.get(feature_name, feature_name), + 'values': [round(v, 4) for v in feature_vals], + 'shap_values': [round(v, 4) for v in shap_vals], + } + except Exception as exc: + return {'error': str(exc)} diff --git a/backend/core/train_model.py b/backend/core/train_model.py index efa6c53..782fa6f 100644 --- a/backend/core/train_model.py +++ b/backend/core/train_model.py @@ -7,8 +7,10 @@ from datetime import datetime import joblib import numpy as np from sklearn.ensemble import ExtraTreesRegressor, GradientBoostingRegressor, RandomForestRegressor +from sklearn.ensemble import GradientBoostingClassifier, RandomForestClassifier from sklearn.feature_selection import SelectKBest, f_regression from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score +from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix from sklearn.model_selection import RandomizedSearchCV, train_test_split from sklearn.preprocessing import RobustScaler @@ -351,9 +353,81 @@ class OptimizedModelTrainer: ) self.save_models() + + # 风险分类模型训练 + print('\nRisk Classification Training') + risk_trainer = RiskClassifierTrainer(self) + risk_trainer.train_all(X_train, y_train, X_test, y_test) + risk_trainer.save() + return self.model_metrics +class RiskClassifierTrainer: + """风险等级分类模型训练器:低(<4h) / 中(4-8h) / 高(>8h)""" + + RISK_MAP = {'low': 0, 'medium': 1, 'high': 2} + RISK_LABELS = ['low', 'medium', 'high'] + + def __init__(self, regression_trainer): + self.regression_trainer = regression_trainer + self.classifiers = {} + self.classification_metrics = {} + + def _make_target(self, y_hours): + y_class = np.full(len(y_hours), 1, dtype=int) + y_class[y_hours < 4] = 0 + y_class[y_hours > 8] = 2 + return y_class + + def train_all(self, X_train, y_train_hours, X_test, y_test_hours): + y_train_cls = self._make_target(y_train_hours) + y_test_cls = self._make_target(y_test_hours) + + classifier_configs = { + 'random_forest': RandomForestClassifier( + n_estimators=300, max_depth=14, random_state=config.RANDOM_STATE, n_jobs=-1, + ), + 'gradient_boosting': GradientBoostingClassifier( + n_estimators=200, max_depth=4, learning_rate=0.05, random_state=config.RANDOM_STATE, + ), + } + + if lgb is not None: + classifier_configs['lightgbm'] = lgb.LGBMClassifier( + n_estimators=260, max_depth=7, learning_rate=0.05, + random_state=config.RANDOM_STATE, n_jobs=-1, verbose=-1, + ) + if xgb is not None: + classifier_configs['xgboost'] = xgb.XGBClassifier( + n_estimators=260, max_depth=6, learning_rate=0.05, + random_state=config.RANDOM_STATE, n_jobs=-1, + ) + + for name, clf in classifier_configs.items(): + try: + clf.fit(X_train, y_train_cls) + y_pred = clf.predict(X_test) + self.classifiers[name] = clf + self.classification_metrics[name] = { + 'accuracy': round(accuracy_score(y_test_cls, y_pred), 4), + 'precision_macro': round(precision_score(y_test_cls, y_pred, average='macro', zero_division=0), 4), + 'recall_macro': round(recall_score(y_test_cls, y_pred, average='macro', zero_division=0), 4), + 'f1_macro': round(f1_score(y_test_cls, y_pred, average='macro', zero_division=0), 4), + 'confusion_matrix': confusion_matrix(y_test_cls, y_pred).tolist(), + } + m = self.classification_metrics[name] + print(f' {name:20s} Acc={m["accuracy"]:.4f} F1={m["f1_macro"]:.4f}') + except Exception as exc: + print(f' {name:20s} Skipped: {exc}') + + def save(self): + for name, clf in self.classifiers.items(): + path = os.path.join(config.MODELS_DIR, f'risk_{name}_classifier.pkl') + joblib.dump(clf, path) + joblib.dump(self.classification_metrics, os.path.join(config.MODELS_DIR, 'classification_metrics.pkl')) + + def train_and_save_models(): start = time.time() trainer = OptimizedModelTrainer() diff --git a/backend/outputs/eval_figures/01_模型性能对比.png b/backend/outputs/eval_figures/01_模型性能对比.png new file mode 100644 index 0000000..190b4c2 Binary files /dev/null and b/backend/outputs/eval_figures/01_模型性能对比.png differ diff --git a/backend/outputs/eval_figures/02_LSTM真实值_vs_预测值.png b/backend/outputs/eval_figures/02_LSTM真实值_vs_预测值.png new file mode 100644 index 0000000..6c3b938 Binary files /dev/null and b/backend/outputs/eval_figures/02_LSTM真实值_vs_预测值.png differ diff --git a/backend/outputs/eval_figures/03_LSTM残差分析.png b/backend/outputs/eval_figures/03_LSTM残差分析.png new file mode 100644 index 0000000..c8f7814 Binary files /dev/null and b/backend/outputs/eval_figures/03_LSTM残差分析.png differ diff --git a/backend/outputs/eval_figures/04_LSTM风险等级混淆矩阵.png b/backend/outputs/eval_figures/04_LSTM风险等级混淆矩阵.png new file mode 100644 index 0000000..7fdaa8c Binary files /dev/null and b/backend/outputs/eval_figures/04_LSTM风险等级混淆矩阵.png differ diff --git a/backend/outputs/eval_figures/05_特征重要性_Top15.png b/backend/outputs/eval_figures/05_特征重要性_Top15.png new file mode 100644 index 0000000..d32726a Binary files /dev/null and b/backend/outputs/eval_figures/05_特征重要性_Top15.png differ diff --git a/backend/outputs/eval_figures/evaluation_summary.json b/backend/outputs/eval_figures/evaluation_summary.json new file mode 100644 index 0000000..f4408c9 --- /dev/null +++ b/backend/outputs/eval_figures/evaluation_summary.json @@ -0,0 +1,50 @@ +{ + "best_model": "lstm_mlp", + "metrics": { + "lstm_mlp": { + "r2": 0.9272, + "mse": 0.3597, + "rmse": 0.5997, + "mae": 0.4735 + }, + "xgboost": { + "r2": 0.7838, + "mse": 1.0687, + "rmse": 1.0338, + "mae": 0.7578 + }, + "gradient_boosting": { + "r2": 0.7804, + "mse": 1.0854, + "rmse": 1.0418, + "mae": 0.7651 + }, + "random_forest": { + "r2": 0.7647, + "mse": 1.1631, + "rmse": 1.0785, + "mae": 0.7921 + }, + "extra_trees": { + "r2": 0.7577, + "mse": 1.1976, + "rmse": 1.0943, + "mae": 0.8045 + } + }, + "lstm_prediction_summary": { + "prediction_count": 2400, + "residual_mean": -0.0498, + "residual_std": 0.5976, + "risk_accuracy": 0.8562 + }, + "feature_importance_model": "xgboost", + "generated_files": [ + "01_模型性能对比.png", + "02_LSTM真实值_vs_预测值.png", + "03_LSTM残差分析.png", + "04_LSTM风险等级混淆矩阵.png", + "05_特征重要性_Top15.png", + "lstm_predictions.csv" + ] +} \ No newline at end of file diff --git a/backend/outputs/eval_figures/lstm_predictions.csv b/backend/outputs/eval_figures/lstm_predictions.csv new file mode 100644 index 0000000..f5d4ebc --- /dev/null +++ b/backend/outputs/eval_figures/lstm_predictions.csv @@ -0,0 +1,2401 @@ +真实值,预测值,残差,真实风险等级,预测风险等级 +4.9,4.5082,-0.3918,中风险,中风险 +7.4,7.8822,0.4822,中风险,中风险 +3.5,2.633,-0.867,低风险,低风险 +4.4,4.2099,-0.1901,中风险,中风险 +2.9,2.4485,-0.4515,低风险,低风险 +11.4,11.0718,-0.3282,高风险,高风险 +2.9,3.4642,0.5642,低风险,低风险 +6.8,5.4301,-1.3699,中风险,中风险 +6.9,6.3356,-0.5644,中风险,中风险 +8.3,8.2596,-0.0404,高风险,高风险 +9.4,9.6418,0.2418,高风险,高风险 +6.8,7.1788,0.3788,中风险,中风险 +4.2,4.2253,0.0253,中风险,中风险 +3.1,3.2756,0.1756,低风险,低风险 +3.5,5.083,1.583,低风险,中风险 +7.0,6.9437,-0.0563,中风险,中风险 +6.6,5.8894,-0.7106,中风险,中风险 +3.6,3.564,-0.036,低风险,低风险 +4.4,4.6302,0.2302,中风险,中风险 +5.1,5.2189,0.1189,中风险,中风险 +5.3,4.7826,-0.5174,中风险,中风险 +6.9,7.4634,0.5634,中风险,中风险 +1.8,2.3298,0.5298,低风险,低风险 +8.1,7.9114,-0.1886,高风险,中风险 +3.1,3.0754,-0.0246,低风险,低风险 +6.0,6.7522,0.7522,中风险,中风险 +5.8,5.2742,-0.5258,中风险,中风险 +7.8,6.8572,-0.9428,中风险,中风险 +10.5,10.9456,0.4456,高风险,高风险 +11.1,10.8667,-0.2333,高风险,高风险 +9.1,9.7198,0.6198,高风险,高风险 +5.4,5.1457,-0.2543,中风险,中风险 +8.2,7.1144,-1.0856,高风险,中风险 +8.0,7.2561,-0.7439,中风险,中风险 +6.1,6.3196,0.2196,中风险,中风险 +5.2,5.472,0.272,中风险,中风险 +3.7,4.0148,0.3148,低风险,中风险 +6.2,6.6255,0.4255,中风险,中风险 +6.2,7.1374,0.9374,中风险,中风险 +6.8,7.6603,0.8603,中风险,中风险 +8.1,7.2533,-0.8467,高风险,中风险 +6.2,6.6037,0.4037,中风险,中风险 +6.5,7.352,0.852,中风险,中风险 +6.2,5.7007,-0.4993,中风险,中风险 +5.1,5.4397,0.3397,中风险,中风险 +4.2,4.4323,0.2323,中风险,中风险 +4.5,4.4105,-0.0895,中风险,中风险 +4.1,3.3796,-0.7204,中风险,低风险 +3.5,4.073,0.573,低风险,中风险 +8.4,9.2541,0.8541,高风险,高风险 +7.0,7.728,0.728,中风险,中风险 +5.1,5.2348,0.1348,中风险,中风险 +4.8,4.9469,0.1469,中风险,中风险 +7.2,8.0235,0.8235,中风险,高风险 +4.3,4.0217,-0.2783,中风险,中风险 +3.9,4.0789,0.1789,低风险,中风险 +6.8,6.7612,-0.0388,中风险,中风险 +2.3,2.7925,0.4925,低风险,低风险 +8.7,8.4136,-0.2864,高风险,高风险 +3.0,4.0773,1.0773,低风险,中风险 +6.3,6.9341,0.6341,中风险,中风险 +5.6,5.5959,-0.0041,中风险,中风险 +6.6,6.9011,0.3011,中风险,中风险 +8.2,7.8776,-0.3224,高风险,中风险 +2.6,2.9185,0.3185,低风险,低风险 +4.6,5.1842,0.5842,中风险,中风险 +7.6,9.0139,1.4139,中风险,高风险 +4.9,3.9547,-0.9453,中风险,低风险 +4.3,3.7875,-0.5125,中风险,低风险 +5.1,4.3736,-0.7264,中风险,中风险 +7.5,7.3087,-0.1913,中风险,中风险 +8.2,8.2301,0.0301,高风险,高风险 +7.2,7.0632,-0.1368,中风险,中风险 +8.7,8.2673,-0.4327,高风险,高风险 +6.9,6.9303,0.0303,中风险,中风险 +2.6,2.5112,-0.0888,低风险,低风险 +4.9,4.9603,0.0603,中风险,中风险 +7.9,7.8011,-0.0989,中风险,中风险 +6.4,6.0714,-0.3286,中风险,中风险 +6.2,6.1496,-0.0504,中风险,中风险 +6.3,6.6469,0.3469,中风险,中风险 +4.5,4.5084,0.0084,中风险,中风险 +3.4,2.9952,-0.4048,低风险,低风险 +3.6,4.263,0.663,低风险,中风险 +2.7,2.4607,-0.2393,低风险,低风险 +6.3,6.5358,0.2358,中风险,中风险 +4.5,4.5798,0.0798,中风险,中风险 +6.4,7.0404,0.6404,中风险,中风险 +3.9,4.1301,0.2301,低风险,中风险 +1.6,2.262,0.662,低风险,低风险 +6.0,6.4072,0.4072,中风险,中风险 +7.8,7.8346,0.0346,中风险,中风险 +6.6,6.247,-0.353,中风险,中风险 +8.4,7.5607,-0.8393,高风险,中风险 +2.1,2.4139,0.3139,低风险,低风险 +7.4,7.142,-0.258,中风险,中风险 +7.7,8.028,0.328,中风险,高风险 +3.8,3.836,0.036,低风险,低风险 +4.5,4.534,0.034,中风险,中风险 +8.4,8.1226,-0.2774,高风险,高风险 +5.9,6.1531,0.2531,中风险,中风险 +2.7,2.7053,0.0053,低风险,低风险 +5.0,4.0034,-0.9966,中风险,中风险 +2.5,2.9722,0.4722,低风险,低风险 +3.7,3.4999,-0.2001,低风险,低风险 +7.7,6.5008,-1.1992,中风险,中风险 +7.9,7.0435,-0.8565,中风险,中风险 +9.2,7.9953,-1.2046,高风险,中风险 +8.3,7.8101,-0.4899,高风险,中风险 +6.6,5.5072,-1.0928,中风险,中风险 +3.6,4.2489,0.6489,低风险,中风险 +5.3,5.2604,-0.0396,中风险,中风险 +2.2,3.0071,0.8071,低风险,低风险 +2.7,3.1087,0.4087,低风险,低风险 +1.9,2.6734,0.7734,低风险,低风险 +4.6,4.6821,0.0821,中风险,中风险 +5.0,5.2539,0.2539,中风险,中风险 +3.6,3.3077,-0.2923,低风险,低风险 +3.0,3.305,0.305,低风险,低风险 +3.4,3.6367,0.2367,低风险,低风险 +4.4,4.6096,0.2096,中风险,中风险 +8.1,8.2822,0.1822,高风险,高风险 +4.5,3.9216,-0.5784,中风险,低风险 +3.7,4.0316,0.3316,低风险,中风险 +8.2,8.386,0.186,高风险,高风险 +7.8,7.3695,-0.4305,中风险,中风险 +2.5,3.0969,0.5969,低风险,低风险 +7.1,7.9575,0.8575,中风险,中风险 +2.6,2.1666,-0.4334,低风险,低风险 +3.7,2.8838,-0.8162,低风险,低风险 +5.8,6.3626,0.5626,中风险,中风险 +4.1,4.341,0.241,中风险,中风险 +7.6,6.3846,-1.2154,中风险,中风险 +4.3,4.556,0.256,中风险,中风险 +7.1,6.9753,-0.1247,中风险,中风险 +2.0,3.1995,1.1995,低风险,低风险 +8.4,7.591,-0.809,高风险,中风险 +7.0,7.6984,0.6984,中风险,中风险 +3.9,3.9281,0.0281,低风险,低风险 +3.7,3.4582,-0.2418,低风险,低风险 +3.5,2.8213,-0.6787,低风险,低风险 +4.2,3.8644,-0.3356,中风险,低风险 +8.8,9.0925,0.2925,高风险,高风险 +6.4,6.3563,-0.0437,中风险,中风险 +7.2,6.5353,-0.6647,中风险,中风险 +6.6,6.1428,-0.4572,中风险,中风险 +2.3,2.1999,-0.1001,低风险,低风险 +2.2,2.9358,0.7358,低风险,低风险 +1.4,2.065,0.665,低风险,低风险 +7.1,6.437,-0.663,中风险,中风险 +7.9,7.2416,-0.6584,中风险,中风险 +3.9,4.3038,0.4038,低风险,中风险 +3.3,3.8559,0.5559,低风险,低风险 +2.8,2.1451,-0.6549,低风险,低风险 +7.1,7.3969,0.2969,中风险,中风险 +3.5,3.5532,0.0532,低风险,低风险 +9.3,8.1544,-1.1456,高风险,高风险 +8.2,8.074,-0.126,高风险,高风险 +6.0,6.0952,0.0952,中风险,中风险 +11.7,11.7852,0.0852,高风险,高风险 +6.8,6.6442,-0.1558,中风险,中风险 +8.2,7.6492,-0.5508,高风险,中风险 +9.3,8.655,-0.645,高风险,高风险 +6.8,6.482,-0.318,中风险,中风险 +3.4,3.0409,-0.3591,低风险,低风险 +4.3,4.1721,-0.1279,中风险,中风险 +3.1,3.131,0.031,低风险,低风险 +2.7,3.0201,0.3201,低风险,低风险 +7.3,6.5633,-0.7367,中风险,中风险 +9.4,9.4091,0.0091,高风险,高风险 +2.7,2.8022,0.1022,低风险,低风险 +8.2,7.2652,-0.9348,高风险,中风险 +9.2,8.0812,-1.1188,高风险,高风险 +5.2,4.8358,-0.3642,中风险,中风险 +4.8,4.2919,-0.5081,中风险,中风险 +6.4,6.1864,-0.2136,中风险,中风险 +5.8,6.1738,0.3738,中风险,中风险 +5.6,5.2164,-0.3836,中风险,中风险 +5.1,5.1174,0.0174,中风险,中风险 +8.0,7.9557,-0.0443,中风险,中风险 +8.3,8.3216,0.0216,高风险,高风险 +7.1,6.4444,-0.6556,中风险,中风险 +4.8,4.9681,0.1681,中风险,中风险 +7.5,6.7319,-0.7681,中风险,中风险 +4.6,4.7386,0.1386,中风险,中风险 +4.9,5.4262,0.5262,中风险,中风险 +1.6,2.0476,0.4476,低风险,低风险 +7.7,8.2002,0.5002,中风险,高风险 +6.8,6.4755,-0.3245,中风险,中风险 +6.1,5.3738,-0.7262,中风险,中风险 +4.3,4.6099,0.3099,中风险,中风险 +6.5,6.8145,0.3145,中风险,中风险 +2.5,2.784,0.284,低风险,低风险 +7.4,7.2505,-0.1495,中风险,中风险 +4.9,4.4075,-0.4925,中风险,中风险 +4.6,4.1682,-0.4318,中风险,中风险 +8.7,8.5963,-0.1037,高风险,高风险 +8.6,8.412,-0.188,高风险,高风险 +5.0,5.1885,0.1885,中风险,中风险 +1.7,2.0591,0.3591,低风险,低风险 +2.9,2.6896,-0.2104,低风险,低风险 +5.6,4.8095,-0.7905,中风险,中风险 +2.7,2.801,0.101,低风险,低风险 +7.4,7.1111,-0.2889,中风险,中风险 +4.7,4.7388,0.0388,中风险,中风险 +1.4,1.8598,0.4598,低风险,低风险 +8.2,7.5851,-0.6149,高风险,中风险 +6.9,7.1556,0.2556,中风险,中风险 +7.5,6.9693,-0.5307,中风险,中风险 +3.7,3.5896,-0.1104,低风险,低风险 +4.1,3.6955,-0.4045,中风险,低风险 +4.3,3.7736,-0.5264,中风险,低风险 +7.3,6.218,-1.082,中风险,中风险 +1.9,2.3153,0.4153,低风险,低风险 +2.6,3.0977,0.4977,低风险,低风险 +2.3,2.2771,-0.0229,低风险,低风险 +9.3,10.357,1.057,高风险,高风险 +9.4,10.0163,0.6163,高风险,高风险 +9.1,8.1873,-0.9127,高风险,高风险 +2.4,3.0475,0.6475,低风险,低风险 +4.1,2.7253,-1.3747,中风险,低风险 +4.4,4.8644,0.4644,中风险,中风险 +5.7,5.3327,-0.3673,中风险,中风险 +6.9,5.6416,-1.2584,中风险,中风险 +6.5,7.3147,0.8147,中风险,中风险 +4.5,5.6972,1.1972,中风险,中风险 +4.5,4.8491,0.3491,中风险,中风险 +4.0,4.2045,0.2045,中风险,中风险 +4.3,4.5371,0.2371,中风险,中风险 +5.4,5.3615,-0.0385,中风险,中风险 +4.2,4.059,-0.141,中风险,中风险 +5.8,6.8733,1.0733,中风险,中风险 +8.2,7.7311,-0.4689,高风险,中风险 +4.8,5.1831,0.3831,中风险,中风险 +4.0,4.8618,0.8618,中风险,中风险 +6.5,5.3314,-1.1686,中风险,中风险 +3.9,3.1262,-0.7738,低风险,低风险 +3.5,3.7543,0.2543,低风险,低风险 +5.0,5.2229,0.2229,中风险,中风险 +8.3,8.5539,0.2539,高风险,高风险 +4.1,4.4564,0.3564,中风险,中风险 +6.5,6.2042,-0.2958,中风险,中风险 +7.8,7.8681,0.0681,中风险,中风险 +2.4,3.8288,1.4288,低风险,低风险 +5.6,5.1665,-0.4335,中风险,中风险 +7.2,5.5642,-1.6358,中风险,中风险 +7.2,5.4916,-1.7084,中风险,中风险 +4.5,4.1291,-0.3709,中风险,中风险 +8.1,6.8083,-1.2917,高风险,中风险 +11.3,11.0305,-0.2695,高风险,高风险 +2.2,3.1252,0.9252,低风险,低风险 +9.8,8.9408,-0.8592,高风险,高风险 +7.3,6.4842,-0.8158,中风险,中风险 +3.0,2.9206,-0.0794,低风险,低风险 +8.4,7.0215,-1.3785,高风险,中风险 +3.4,4.1183,0.7183,低风险,中风险 +2.2,2.8629,0.6629,低风险,低风险 +5.4,6.3279,0.9279,中风险,中风险 +6.6,5.598,-1.002,中风险,中风险 +8.6,8.3025,-0.2975,高风险,高风险 +3.7,4.7323,1.0323,低风险,中风险 +1.9,2.8972,0.9972,低风险,低风险 +2.5,3.2764,0.7764,低风险,低风险 +4.2,4.1635,-0.0365,中风险,中风险 +4.3,3.1655,-1.1345,中风险,低风险 +4.7,3.9662,-0.7338,中风险,低风险 +8.2,8.3033,0.1033,高风险,高风险 +5.9,5.2619,-0.6381,中风险,中风险 +2.5,3.7289,1.2289,低风险,低风险 +6.9,6.6775,-0.2225,中风险,中风险 +4.5,4.404,-0.096,中风险,中风险 +8.5,7.6963,-0.8037,高风险,中风险 +6.2,6.0941,-0.1059,中风险,中风险 +7.5,7.6215,0.1215,中风险,中风险 +6.9,7.2809,0.3809,中风险,中风险 +7.9,6.9483,-0.9517,中风险,中风险 +7.4,6.4965,-0.9035,中风险,中风险 +8.5,8.4126,-0.0874,高风险,高风险 +6.3,7.4732,1.1732,中风险,中风险 +10.0,9.7992,-0.2008,高风险,高风险 +7.6,8.3444,0.7444,中风险,高风险 +6.5,5.4693,-1.0307,中风险,中风险 +4.6,4.6941,0.0941,中风险,中风险 +8.0,7.6227,-0.3773,中风险,中风险 +5.2,5.9394,0.7394,中风险,中风险 +9.9,10.0629,0.1629,高风险,高风险 +10.9,10.7623,-0.1377,高风险,高风险 +10.8,11.025,0.225,高风险,高风险 +1.9,1.5689,-0.3311,低风险,低风险 +5.5,5.6689,0.1689,中风险,中风险 +8.4,8.3484,-0.0516,高风险,高风险 +4.5,3.7667,-0.7333,中风险,低风险 +4.9,5.0726,0.1726,中风险,中风险 +4.2,4.6748,0.4748,中风险,中风险 +5.1,5.62,0.52,中风险,中风险 +3.9,4.2069,0.3069,低风险,中风险 +6.0,5.8865,-0.1135,中风险,中风险 +5.5,5.4992,-0.0008,中风险,中风险 +7.2,7.6641,0.4641,中风险,中风险 +8.6,7.5595,-1.0405,高风险,中风险 +6.8,7.456,0.656,中风险,中风险 +6.9,7.0669,0.1669,中风险,中风险 +4.9,4.9319,0.0319,中风险,中风险 +4.3,4.2059,-0.0941,中风险,中风险 +4.2,3.3822,-0.8178,中风险,低风险 +4.8,3.9802,-0.8198,中风险,低风险 +2.6,3.367,0.767,低风险,低风险 +3.6,3.6599,0.0599,低风险,低风险 +2.1,2.4174,0.3174,低风险,低风险 +3.0,3.3427,0.3427,低风险,低风险 +8.4,8.826,0.426,高风险,高风险 +5.6,4.7616,-0.8384,中风险,中风险 +9.4,8.1587,-1.2413,高风险,高风险 +4.9,4.1125,-0.7875,中风险,中风险 +3.4,2.8011,-0.5989,低风险,低风险 +5.8,5.6066,-0.1934,中风险,中风险 +9.8,8.77,-1.03,高风险,高风险 +9.1,8.4245,-0.6755,高风险,高风险 +3.5,3.7998,0.2998,低风险,低风险 +3.7,3.9253,0.2253,低风险,低风险 +5.9,5.5293,-0.3707,中风险,中风险 +5.0,5.7591,0.7591,中风险,中风险 +4.1,4.523,0.423,中风险,中风险 +4.2,3.9254,-0.2746,中风险,低风险 +6.2,5.6986,-0.5014,中风险,中风险 +5.9,5.0715,-0.8285,中风险,中风险 +4.7,5.0611,0.3611,中风险,中风险 +2.6,2.2879,-0.3121,低风险,低风险 +4.0,4.4348,0.4348,中风险,中风险 +10.1,10.1877,0.0877,高风险,高风险 +10.0,10.1272,0.1272,高风险,高风险 +2.9,3.297,0.397,低风险,低风险 +8.1,8.1258,0.0258,高风险,高风险 +6.1,5.6524,-0.4476,中风险,中风险 +2.8,3.3363,0.5363,低风险,低风险 +3.8,3.8662,0.0662,低风险,低风险 +10.9,11.2499,0.3499,高风险,高风险 +3.8,4.2924,0.4924,低风险,中风险 +8.4,7.5454,-0.8546,高风险,中风险 +9.0,7.9935,-1.0065,高风险,中风险 +5.1,3.867,-1.233,中风险,低风险 +4.1,4.2075,0.1075,中风险,中风险 +5.6,5.0456,-0.5544,中风险,中风险 +3.6,3.6398,0.0398,低风险,低风险 +4.7,5.5776,0.8776,中风险,中风险 +4.4,3.9618,-0.4382,中风险,低风险 +4.1,4.0446,-0.0554,中风险,中风险 +2.8,3.0169,0.2169,低风险,低风险 +5.1,6.7093,1.6093,中风险,中风险 +9.8,9.1844,-0.6156,高风险,高风险 +5.0,4.5533,-0.4467,中风险,中风险 +9.0,9.8748,0.8748,高风险,高风险 +8.8,7.778,-1.022,高风险,中风险 +3.8,3.0499,-0.7501,低风险,低风险 +8.2,8.531,0.331,高风险,高风险 +8.7,8.7836,0.0836,高风险,高风险 +6.5,6.9885,0.4885,中风险,中风险 +2.5,2.8709,0.3709,低风险,低风险 +4.6,5.3351,0.7351,中风险,中风险 +7.3,7.1742,-0.1258,中风险,中风险 +6.7,7.1747,0.4747,中风险,中风险 +5.3,5.3765,0.0765,中风险,中风险 +6.1,6.3462,0.2462,中风险,中风险 +4.4,4.1904,-0.2096,中风险,中风险 +7.7,7.8332,0.1332,中风险,中风险 +8.3,7.4111,-0.8889,高风险,中风险 +3.9,4.2784,0.3784,低风险,中风险 +6.0,6.6282,0.6282,中风险,中风险 +4.2,4.3066,0.1066,中风险,中风险 +3.5,3.4369,-0.0631,低风险,低风险 +3.3,4.0117,0.7117,低风险,中风险 +3.6,3.6287,0.0287,低风险,低风险 +3.0,3.5524,0.5524,低风险,低风险 +3.8,3.4589,-0.3411,低风险,低风险 +3.1,3.4017,0.3017,低风险,低风险 +2.3,2.7425,0.4425,低风险,低风险 +5.9,5.1805,-0.7195,中风险,中风险 +4.9,4.9409,0.0409,中风险,中风险 +6.0,5.7618,-0.2382,中风险,中风险 +5.2,5.0199,-0.1801,中风险,中风险 +3.8,4.6917,0.8917,低风险,中风险 +5.9,5.2219,-0.6781,中风险,中风险 +6.8,6.7778,-0.0222,中风险,中风险 +3.7,3.6753,-0.0247,低风险,低风险 +5.3,5.4071,0.1071,中风险,中风险 +7.6,7.1891,-0.4109,中风险,中风险 +5.6,5.9612,0.3612,中风险,中风险 +5.2,5.7126,0.5126,中风险,中风险 +3.9,4.4775,0.5775,低风险,中风险 +2.9,3.0106,0.1106,低风险,低风险 +2.5,3.2726,0.7726,低风险,低风险 +3.4,2.715,-0.685,低风险,低风险 +10.0,10.0772,0.0772,高风险,高风险 +7.0,7.254,0.254,中风险,中风险 +4.4,4.7254,0.3254,中风险,中风险 +3.6,4.1689,0.5689,低风险,中风险 +8.1,8.4491,0.3491,高风险,高风险 +2.5,2.2451,-0.2549,低风险,低风险 +4.3,3.9253,-0.3747,中风险,低风险 +5.5,5.7574,0.2574,中风险,中风险 +7.3,6.8493,-0.4507,中风险,中风险 +7.5,6.2998,-1.2002,中风险,中风险 +10.5,10.6466,0.1466,高风险,高风险 +10.8,10.6098,-0.1902,高风险,高风险 +4.0,5.1026,1.1026,中风险,中风险 +2.8,3.5573,0.7573,低风险,低风险 +3.6,4.2104,0.6104,低风险,中风险 +3.8,3.4726,-0.3274,低风险,低风险 +9.8,9.0618,-0.7382,高风险,高风险 +4.4,3.729,-0.671,中风险,低风险 +4.6,3.8446,-0.7554,中风险,低风险 +3.9,3.6623,-0.2377,低风险,低风险 +5.6,6.4606,0.8606,中风险,中风险 +7.7,7.6563,-0.0437,中风险,中风险 +6.3,6.5882,0.2882,中风险,中风险 +10.2,9.9944,-0.2056,高风险,高风险 +10.1,10.113,0.013,高风险,高风险 +3.7,3.5498,-0.1502,低风险,低风险 +7.4,7.3925,-0.0075,中风险,中风险 +5.5,5.5503,0.0503,中风险,中风险 +5.8,5.8569,0.0569,中风险,中风险 +6.2,6.7054,0.5054,中风险,中风险 +6.3,6.7747,0.4747,中风险,中风险 +6.8,6.0903,-0.7097,中风险,中风险 +6.2,5.8247,-0.3753,中风险,中风险 +5.4,5.9478,0.5478,中风险,中风险 +6.4,5.9124,-0.4876,中风险,中风险 +7.7,8.1815,0.4815,中风险,高风险 +5.3,4.7763,-0.5237,中风险,中风险 +7.0,6.3625,-0.6375,中风险,中风险 +2.9,3.9296,1.0296,低风险,低风险 +3.3,3.7404,0.4404,低风险,低风险 +7.5,7.5766,0.0766,中风险,中风险 +3.0,2.999,-0.001,低风险,低风险 +6.1,4.7333,-1.3667,中风险,中风险 +8.6,7.7641,-0.8359,高风险,中风险 +2.8,2.6386,-0.1614,低风险,低风险 +5.1,4.6473,-0.4527,中风险,中风险 +9.4,8.8764,-0.5236,高风险,高风险 +6.4,6.0904,-0.3096,中风险,中风险 +5.5,4.9242,-0.5758,中风险,中风险 +7.5,7.9198,0.4198,中风险,中风险 +5.3,4.7851,-0.5149,中风险,中风险 +5.1,5.5507,0.4507,中风险,中风险 +6.8,6.7744,-0.0256,中风险,中风险 +3.4,2.7494,-0.6506,低风险,低风险 +3.2,2.9572,-0.2428,低风险,低风险 +2.8,3.2709,0.4709,低风险,低风险 +7.0,8.2283,1.2283,中风险,高风险 +6.9,7.95,1.05,中风险,中风险 +6.0,5.8516,-0.1484,中风险,中风险 +8.2,7.3519,-0.8481,高风险,中风险 +7.5,8.617,1.117,中风险,高风险 +7.7,7.1338,-0.5662,中风险,中风险 +7.0,6.3784,-0.6216,中风险,中风险 +3.3,3.4408,0.1408,低风险,低风险 +2.6,2.8048,0.2048,低风险,低风险 +6.3,6.5409,0.2409,中风险,中风险 +3.8,3.5794,-0.2206,低风险,低风险 +8.1,7.2869,-0.8131,高风险,中风险 +6.8,6.9328,0.1328,中风险,中风险 +4.2,4.4522,0.2522,中风险,中风险 +6.9,6.6397,-0.2603,中风险,中风险 +2.9,3.0424,0.1424,低风险,低风险 +7.9,7.4808,-0.4192,中风险,中风险 +5.2,5.0123,-0.1877,中风险,中风险 +6.1,5.873,-0.227,中风险,中风险 +8.7,8.4175,-0.2825,高风险,高风险 +6.0,6.2916,0.2916,中风险,中风险 +6.4,6.8324,0.4324,中风险,中风险 +2.7,2.6809,-0.0191,低风险,低风险 +10.4,10.4051,0.0051,高风险,高风险 +8.6,6.9493,-1.6507,高风险,中风险 +5.5,5.0759,-0.4241,中风险,中风险 +1.8,2.4368,0.6368,低风险,低风险 +5.5,5.2643,-0.2357,中风险,中风险 +4.4,4.5306,0.1306,中风险,中风险 +3.9,4.1661,0.2661,低风险,中风险 +2.5,2.8288,0.3288,低风险,低风险 +5.2,5.2903,0.0903,中风险,中风险 +7.4,7.0582,-0.3418,中风险,中风险 +7.2,7.3934,0.1934,中风险,中风险 +6.6,6.4081,-0.1919,中风险,中风险 +7.4,7.1011,-0.2989,中风险,中风险 +7.4,7.3768,-0.0232,中风险,中风险 +1.9,2.418,0.518,低风险,低风险 +5.5,5.2767,-0.2233,中风险,中风险 +9.4,7.9371,-1.4629,高风险,中风险 +6.5,6.7459,0.2459,中风险,中风险 +7.7,7.2503,-0.4497,中风险,中风险 +4.6,3.8209,-0.7791,中风险,低风险 +4.8,5.9279,1.1279,中风险,中风险 +3.2,4.6717,1.4717,低风险,中风险 +2.9,2.6406,-0.2594,低风险,低风险 +6.3,6.1322,-0.1678,中风险,中风险 +9.2,9.2653,0.0653,高风险,高风险 +6.1,6.1573,0.0573,中风险,中风险 +9.9,10.2231,0.3231,高风险,高风险 +7.5,7.1468,-0.3532,中风险,中风险 +4.9,5.0703,0.1703,中风险,中风险 +5.8,5.4443,-0.3557,中风险,中风险 +1.9,2.1905,0.2905,低风险,低风险 +5.7,5.6798,-0.0202,中风险,中风险 +7.4,6.4964,-0.9036,中风险,中风险 +7.9,6.8876,-1.0124,中风险,中风险 +5.5,4.7892,-0.7108,中风险,中风险 +4.7,4.58,-0.12,中风险,中风险 +8.2,7.615,-0.585,高风险,中风险 +7.5,7.6584,0.1584,中风险,中风险 +3.5,3.6041,0.1041,低风险,低风险 +6.0,6.6399,0.6399,中风险,中风险 +2.6,3.2783,0.6783,低风险,低风险 +4.6,4.3831,-0.2169,中风险,中风险 +6.3,6.1217,-0.1783,中风险,中风险 +7.9,7.0805,-0.8195,中风险,中风险 +10.6,10.5636,-0.0364,高风险,高风险 +5.1,4.8034,-0.2966,中风险,中风险 +3.5,3.5524,0.0524,低风险,低风险 +8.0,7.6028,-0.3972,中风险,中风险 +5.3,4.8973,-0.4027,中风险,中风险 +7.5,7.641,0.141,中风险,中风险 +7.9,8.1094,0.2094,中风险,高风险 +4.2,4.3921,0.1921,中风险,中风险 +4.9,4.8679,-0.0321,中风险,中风险 +6.3,7.0438,0.7438,中风险,中风险 +9.1,8.9259,-0.1741,高风险,高风险 +8.5,7.7948,-0.7052,高风险,中风险 +7.7,7.7611,0.0611,中风险,中风险 +7.1,7.8045,0.7045,中风险,中风险 +4.7,5.0137,0.3137,中风险,中风险 +7.5,7.101,-0.399,中风险,中风险 +3.9,4.9112,1.0112,低风险,中风险 +4.7,4.2684,-0.4316,中风险,中风险 +8.9,7.9735,-0.9265,高风险,中风险 +5.1,6.2201,1.1201,中风险,中风险 +7.8,7.8912,0.0912,中风险,中风险 +2.9,2.7133,-0.1867,低风险,低风险 +3.0,2.7277,-0.2723,低风险,低风险 +4.0,3.4408,-0.5592,中风险,低风险 +4.6,5.7242,1.1242,中风险,中风险 +5.1,5.4152,0.3152,中风险,中风险 +3.1,2.7828,-0.3172,低风险,低风险 +5.5,4.962,-0.538,中风险,中风险 +8.2,7.9296,-0.2704,高风险,中风险 +8.3,7.9768,-0.3232,高风险,中风险 +4.0,4.135,0.135,中风险,中风险 +3.0,3.5914,0.5914,低风险,低风险 +3.5,4.1073,0.6073,低风险,中风险 +3.6,3.6177,0.0177,低风险,低风险 +7.4,7.2088,-0.1912,中风险,中风险 +2.8,2.9782,0.1782,低风险,低风险 +5.6,5.8417,0.2417,中风险,中风险 +10.4,8.6546,-1.7454,高风险,高风险 +10.3,8.7478,-1.5522,高风险,高风险 +6.5,7.3829,0.8829,中风险,中风险 +3.8,5.042,1.242,低风险,中风险 +3.6,3.5442,-0.0558,低风险,低风险 +3.8,3.5474,-0.2526,低风险,低风险 +6.1,5.276,-0.824,中风险,中风险 +4.5,4.4611,-0.0389,中风险,中风险 +3.2,3.0615,-0.1385,低风险,低风险 +8.7,8.3011,-0.3989,高风险,高风险 +4.3,4.8626,0.5626,中风险,中风险 +5.3,5.9574,0.6574,中风险,中风险 +5.5,5.1812,-0.3188,中风险,中风险 +8.1,7.475,-0.625,高风险,中风险 +6.2,6.0412,-0.1588,中风险,中风险 +5.3,4.9753,-0.3247,中风险,中风险 +7.1,8.0024,0.9024,中风险,高风险 +7.1,6.9217,-0.1783,中风险,中风险 +6.6,6.9743,0.3743,中风险,中风险 +6.4,6.4756,0.0756,中风险,中风险 +6.5,7.148,0.648,中风险,中风险 +2.5,2.9709,0.4709,低风险,低风险 +5.9,5.7518,-0.1482,中风险,中风险 +8.6,8.8528,0.2528,高风险,高风险 +4.4,4.8309,0.4309,中风险,中风险 +4.8,4.133,-0.667,中风险,中风险 +5.1,4.1811,-0.9189,中风险,中风险 +6.6,7.0449,0.4449,中风险,中风险 +9.5,7.8301,-1.6699,高风险,中风险 +5.5,5.6193,0.1193,中风险,中风险 +2.0,2.7808,0.7808,低风险,低风险 +7.2,6.5173,-0.6827,中风险,中风险 +7.6,6.7435,-0.8565,中风险,中风险 +5.1,4.0459,-1.0541,中风险,中风险 +3.1,4.3993,1.2993,低风险,中风险 +2.8,3.1763,0.3763,低风险,低风险 +6.8,6.7303,-0.0697,中风险,中风险 +3.2,2.7341,-0.4659,低风险,低风险 +7.7,7.4911,-0.2089,中风险,中风险 +3.3,3.2938,-0.0062,低风险,低风险 +4.3,4.5916,0.2916,中风险,中风险 +8.0,7.6442,-0.3558,中风险,中风险 +9.6,8.0866,-1.5134,高风险,高风险 +7.0,7.2953,0.2953,中风险,中风险 +7.0,6.8373,-0.1627,中风险,中风险 +10.6,8.6507,-1.9493,高风险,高风险 +11.5,11.2469,-0.2531,高风险,高风险 +5.0,5.7736,0.7736,中风险,中风险 +6.5,7.6341,1.1341,中风险,中风险 +8.3,8.6412,0.3412,高风险,高风险 +7.7,6.959,-0.741,中风险,中风险 +5.1,4.4079,-0.6921,中风险,中风险 +6.8,6.8087,0.0087,中风险,中风险 +5.0,4.379,-0.621,中风险,中风险 +1.7,1.6671,-0.0329,低风险,低风险 +5.3,4.9778,-0.3222,中风险,中风险 +6.3,5.9017,-0.3983,中风险,中风险 +9.0,9.2103,0.2103,高风险,高风险 +9.1,9.2239,0.1239,高风险,高风险 +1.4,1.9362,0.5362,低风险,低风险 +6.8,6.1565,-0.6435,中风险,中风险 +7.6,8.1661,0.5661,中风险,高风险 +5.8,5.4291,-0.3709,中风险,中风险 +8.9,9.4375,0.5375,高风险,高风险 +5.9,5.4395,-0.4605,中风险,中风险 +8.6,8.9123,0.3123,高风险,高风险 +10.0,9.23,-0.77,高风险,高风险 +7.7,7.8042,0.1042,中风险,中风险 +3.1,3.5359,0.4359,低风险,低风险 +8.3,7.7078,-0.5922,高风险,中风险 +6.7,6.9369,0.2369,中风险,中风险 +4.2,5.011,0.811,中风险,中风险 +3.5,4.1105,0.6105,低风险,中风险 +7.7,8.2457,0.5457,中风险,高风险 +7.7,7.6361,-0.0639,中风险,中风险 +4.2,4.8776,0.6776,中风险,中风险 +3.4,4.0348,0.6348,低风险,中风险 +7.4,7.5436,0.1436,中风险,中风险 +7.8,7.9683,0.1683,中风险,中风险 +8.7,8.5494,-0.1506,高风险,高风险 +3.0,2.3132,-0.6868,低风险,低风险 +6.6,6.0399,-0.5601,中风险,中风险 +4.4,3.9303,-0.4697,中风险,低风险 +7.6,8.1068,0.5068,中风险,高风险 +8.1,7.1531,-0.9469,高风险,中风险 +4.4,4.3785,-0.0215,中风险,中风险 +7.9,7.2768,-0.6232,中风险,中风险 +7.7,8.2164,0.5164,中风险,高风险 +6.3,5.3751,-0.9249,中风险,中风险 +3.3,3.6586,0.3586,低风险,低风险 +3.3,3.0973,-0.2027,低风险,低风险 +4.8,4.2091,-0.5909,中风险,中风险 +3.9,3.794,-0.106,低风险,低风险 +7.2,6.5206,-0.6794,中风险,中风险 +4.0,3.6093,-0.3907,中风险,低风险 +4.0,3.1372,-0.8628,中风险,低风险 +5.7,6.5341,0.8341,中风险,中风险 +2.7,3.0084,0.3084,低风险,低风险 +5.1,5.1147,0.0147,中风险,中风险 +6.1,7.2816,1.1816,中风险,中风险 +6.8,7.2938,0.4938,中风险,中风险 +2.9,2.9992,0.0992,低风险,低风险 +5.8,4.9065,-0.8935,中风险,中风险 +8.0,6.7956,-1.2044,中风险,中风险 +6.1,6.4369,0.3369,中风险,中风险 +6.8,7.6822,0.8822,中风险,中风险 +6.4,5.9771,-0.4229,中风险,中风险 +4.0,3.4746,-0.5254,中风险,低风险 +8.0,8.2699,0.2699,中风险,高风险 +2.8,3.1859,0.3859,低风险,低风险 +3.8,3.6421,-0.1579,低风险,低风险 +5.6,5.8457,0.2457,中风险,中风险 +2.8,3.2052,0.4052,低风险,低风险 +4.3,4.7287,0.4287,中风险,中风险 +5.2,5.6034,0.4034,中风险,中风险 +7.1,7.0441,-0.0559,中风险,中风险 +7.5,7.8699,0.3699,中风险,中风险 +7.0,7.0359,0.0359,中风险,中风险 +9.3,9.5224,0.2224,高风险,高风险 +2.8,3.1131,0.3131,低风险,低风险 +4.7,4.2967,-0.4033,中风险,中风险 +6.8,6.727,-0.073,中风险,中风险 +3.5,3.8685,0.3685,低风险,低风险 +2.9,3.4563,0.5563,低风险,低风险 +3.8,4.567,0.767,低风险,中风险 +7.4,6.9408,-0.4592,中风险,中风险 +7.7,7.2645,-0.4355,中风险,中风险 +4.6,4.7883,0.1883,中风险,中风险 +7.8,6.9134,-0.8866,中风险,中风险 +3.9,3.915,0.015,低风险,低风险 +4.6,4.7247,0.1247,中风险,中风险 +3.7,3.4813,-0.2187,低风险,低风险 +4.1,5.1314,1.0314,中风险,中风险 +7.6,6.5307,-1.0693,中风险,中风险 +6.0,6.4153,0.4153,中风险,中风险 +5.1,3.8322,-1.2678,中风险,低风险 +1.3,1.5338,0.2338,低风险,低风险 +1.2,1.4197,0.2197,低风险,低风险 +8.2,8.4755,0.2755,高风险,高风险 +7.7,8.666,0.966,中风险,高风险 +8.1,9.0816,0.9816,高风险,高风险 +6.7,7.1051,0.4051,中风险,中风险 +6.3,6.3584,0.0584,中风险,中风险 +7.0,7.1824,0.1824,中风险,中风险 +7.0,7.3754,0.3754,中风险,中风险 +6.6,7.7195,1.1195,中风险,中风险 +6.2,5.4535,-0.7465,中风险,中风险 +3.0,3.2661,0.2661,低风险,低风险 +7.3,6.9632,-0.3368,中风险,中风险 +3.3,3.2613,-0.0387,低风险,低风险 +6.5,5.9582,-0.5418,中风险,中风险 +6.0,5.6114,-0.3886,中风险,中风险 +4.9,4.4155,-0.4845,中风险,中风险 +3.2,4.7948,1.5948,低风险,中风险 +8.7,8.8967,0.1967,高风险,高风险 +10.6,11.1433,0.5433,高风险,高风险 +7.3,6.4579,-0.8421,中风险,中风险 +10.8,11.0421,0.2421,高风险,高风险 +2.9,3.7173,0.8173,低风险,低风险 +3.7,3.4875,-0.2125,低风险,低风险 +5.4,6.05,0.65,中风险,中风险 +3.7,4.081,0.381,低风险,中风险 +7.3,7.2294,-0.0706,中风险,中风险 +5.5,6.3101,0.8101,中风险,中风险 +5.5,4.1263,-1.3737,中风险,中风险 +2.3,3.0707,0.7707,低风险,低风险 +4.9,5.1446,0.2446,中风险,中风险 +4.3,3.8981,-0.4019,中风险,低风险 +3.9,3.5267,-0.3733,低风险,低风险 +8.4,7.6942,-0.7058,高风险,中风险 +5.3,5.8107,0.5107,中风险,中风险 +4.7,5.3973,0.6973,中风险,中风险 +4.5,4.5047,0.0047,中风险,中风险 +8.4,7.4471,-0.9529,高风险,中风险 +6.6,5.2503,-1.3497,中风险,中风险 +4.6,5.0355,0.4355,中风险,中风险 +5.7,6.08,0.38,中风险,中风险 +7.1,7.075,-0.025,中风险,中风险 +8.1,7.2071,-0.8929,高风险,中风险 +10.1,10.1534,0.0534,高风险,高风险 +4.8,4.9972,0.1972,中风险,中风险 +6.9,5.9554,-0.9446,中风险,中风险 +3.4,4.244,0.844,低风险,中风险 +4.8,5.5619,0.7619,中风险,中风险 +7.1,6.5024,-0.5976,中风险,中风险 +7.1,7.2588,0.1588,中风险,中风险 +7.8,7.4379,-0.3621,中风险,中风险 +5.6,5.5231,-0.0769,中风险,中风险 +1.8,2.1826,0.3826,低风险,低风险 +3.7,3.6245,-0.0755,低风险,低风险 +5.4,5.7531,0.3531,中风险,中风险 +9.9,10.6926,0.7926,高风险,高风险 +6.5,7.4465,0.9465,中风险,中风险 +3.1,3.2079,0.1079,低风险,低风险 +5.4,5.6353,0.2353,中风险,中风险 +8.4,8.5584,0.1584,高风险,高风险 +2.6,3.012,0.412,低风险,低风险 +8.6,7.7362,-0.8638,高风险,中风险 +2.3,2.8636,0.5636,低风险,低风险 +3.3,3.1703,-0.1297,低风险,低风险 +6.9,6.0912,-0.8088,中风险,中风险 +5.8,5.4081,-0.3919,中风险,中风险 +2.5,3.5269,1.0269,低风险,低风险 +6.5,7.0551,0.5551,中风险,中风险 +6.8,7.2907,0.4907,中风险,中风险 +4.8,5.0436,0.2436,中风险,中风险 +6.0,7.0238,1.0238,中风险,中风险 +5.3,4.391,-0.909,中风险,中风险 +3.3,3.4052,0.1052,低风险,低风险 +3.9,3.5071,-0.3929,低风险,低风险 +8.7,7.9306,-0.7694,高风险,中风险 +2.4,3.1927,0.7927,低风险,低风险 +4.1,3.5533,-0.5467,中风险,低风险 +6.4,5.8212,-0.5788,中风险,中风险 +3.3,3.1231,-0.1769,低风险,低风险 +3.2,2.5748,-0.6252,低风险,低风险 +3.5,3.6997,0.1997,低风险,低风险 +8.1,7.9362,-0.1638,高风险,中风险 +7.0,7.589,0.589,中风险,中风险 +5.4,5.5963,0.1963,中风险,中风险 +8.6,7.3834,-1.2166,高风险,中风险 +5.8,5.4433,-0.3567,中风险,中风险 +4.7,4.1565,-0.5435,中风险,中风险 +9.4,8.6542,-0.7458,高风险,高风险 +7.3,6.8123,-0.4877,中风险,中风险 +4.3,4.8889,0.5889,中风险,中风险 +6.0,4.5614,-1.4386,中风险,中风险 +4.6,4.0682,-0.5318,中风险,中风险 +2.9,3.4373,0.5373,低风险,低风险 +6.0,5.2804,-0.7196,中风险,中风险 +5.9,4.8636,-1.0364,中风险,中风险 +3.6,3.9664,0.3664,低风险,低风险 +11.4,11.1083,-0.2917,高风险,高风险 +9.0,8.8198,-0.1802,高风险,高风险 +6.4,7.407,1.007,中风险,中风险 +7.4,6.8829,-0.5171,中风险,中风险 +3.1,4.009,0.909,低风险,中风险 +5.3,5.4265,0.1265,中风险,中风险 +2.5,2.8561,0.3561,低风险,低风险 +3.7,2.6635,-1.0365,低风险,低风险 +6.5,5.9309,-0.5691,中风险,中风险 +6.9,5.9838,-0.9162,中风险,中风险 +8.2,8.5403,0.3403,高风险,高风险 +7.3,7.4848,0.1848,中风险,中风险 +5.9,7.1104,1.2104,中风险,中风险 +5.9,5.1343,-0.7657,中风险,中风险 +9.3,9.0834,-0.2166,高风险,高风险 +9.2,8.8476,-0.3524,高风险,高风险 +4.6,5.2201,0.6201,中风险,中风险 +6.7,6.6808,-0.0192,中风险,中风险 +7.6,7.3679,-0.2321,中风险,中风险 +3.5,3.6123,0.1123,低风险,低风险 +7.8,7.9647,0.1647,中风险,中风险 +5.7,5.8101,0.1101,中风险,中风险 +1.8,2.3882,0.5882,低风险,低风险 +8.2,7.9297,-0.2703,高风险,中风险 +6.1,6.1943,0.0943,中风险,中风险 +3.2,3.3939,0.1939,低风险,低风险 +4.0,4.9216,0.9216,中风险,中风险 +6.7,8.1841,1.4841,中风险,高风险 +2.7,2.772,0.072,低风险,低风险 +6.2,7.5509,1.3509,中风险,中风险 +5.9,6.6174,0.7174,中风险,中风险 +4.2,4.3888,0.1888,中风险,中风险 +6.4,7.2047,0.8047,中风险,中风险 +5.4,4.9079,-0.4921,中风险,中风险 +2.5,2.4143,-0.0857,低风险,低风险 +4.5,3.9182,-0.5818,中风险,低风险 +2.9,2.6692,-0.2308,低风险,低风险 +9.5,10.4632,0.9632,高风险,高风险 +2.2,2.3301,0.1301,低风险,低风险 +5.2,5.731,0.531,中风险,中风险 +11.3,10.5496,-0.7504,高风险,高风险 +9.6,8.8424,-0.7576,高风险,高风险 +7.8,8.1105,0.3105,中风险,高风险 +8.8,8.5366,-0.2634,高风险,高风险 +3.9,4.7174,0.8174,低风险,中风险 +3.5,4.5066,1.0066,低风险,中风险 +3.0,3.0188,0.0188,低风险,低风险 +4.4,3.5901,-0.8099,中风险,低风险 +3.3,3.3762,0.0762,低风险,低风险 +7.4,6.9176,-0.4824,中风险,中风险 +7.0,6.9118,-0.0882,中风险,中风险 +2.9,3.0437,0.1437,低风险,低风险 +7.2,6.797,-0.403,中风险,中风险 +6.4,6.6309,0.2309,中风险,中风险 +7.5,7.7908,0.2908,中风险,中风险 +5.8,6.8608,1.0608,中风险,中风险 +7.5,7.4071,-0.0929,中风险,中风险 +4.5,5.524,1.024,中风险,中风险 +2.5,3.4128,0.9128,低风险,低风险 +5.8,5.9813,0.1813,中风险,中风险 +4.5,4.9043,0.4043,中风险,中风险 +4.6,3.8679,-0.7321,中风险,低风险 +2.0,3.0589,1.0589,低风险,低风险 +11.8,11.2709,-0.5291,高风险,高风险 +4.0,5.0275,1.0275,中风险,中风险 +6.8,7.0611,0.2611,中风险,中风险 +8.3,8.1236,-0.1764,高风险,高风险 +6.9,6.6242,-0.2758,中风险,中风险 +8.6,7.9244,-0.6756,高风险,中风险 +3.3,4.0728,0.7728,低风险,中风险 +3.8,4.2061,0.4061,低风险,中风险 +3.1,3.0302,-0.0698,低风险,低风险 +7.0,6.3859,-0.6141,中风险,中风险 +8.7,8.9957,0.2957,高风险,高风险 +7.0,6.5707,-0.4293,中风险,中风险 +3.7,3.9174,0.2174,低风险,低风险 +5.5,4.5368,-0.9632,中风险,中风险 +8.2,7.7979,-0.4021,高风险,中风险 +5.7,5.5871,-0.1129,中风险,中风险 +8.4,8.6042,0.2042,高风险,高风险 +9.3,8.8996,-0.4004,高风险,高风险 +3.7,3.4622,-0.2378,低风险,低风险 +5.0,4.459,-0.541,中风险,中风险 +8.7,8.2003,-0.4997,高风险,高风险 +6.5,6.7941,0.2941,中风险,中风险 +4.3,4.6939,0.3939,中风险,中风险 +4.6,4.3745,-0.2255,中风险,中风险 +6.9,7.0924,0.1924,中风险,中风险 +3.0,3.3414,0.3414,低风险,低风险 +8.0,7.1713,-0.8287,中风险,中风险 +9.1,7.8321,-1.2679,高风险,中风险 +2.9,3.7368,0.8368,低风险,低风险 +4.7,4.0983,-0.6017,中风险,中风险 +7.6,6.8171,-0.7829,中风险,中风险 +3.5,2.845,-0.655,低风险,低风险 +7.1,7.187,0.087,中风险,中风险 +3.0,2.8226,-0.1774,低风险,低风险 +3.5,3.938,0.438,低风险,低风险 +4.9,5.3019,0.4019,中风险,中风险 +7.5,8.0195,0.5195,中风险,高风险 +6.9,7.8843,0.9843,中风险,中风险 +4.2,4.5001,0.3001,中风险,中风险 +8.7,10.1637,1.4637,高风险,高风险 +6.2,5.2808,-0.9192,中风险,中风险 +7.5,6.6714,-0.8286,中风险,中风险 +5.2,4.0793,-1.1207,中风险,中风险 +2.1,2.7061,0.6061,低风险,低风险 +4.9,5.4846,0.5846,中风险,中风险 +7.2,7.8342,0.6342,中风险,中风险 +7.6,6.511,-1.089,中风险,中风险 +4.6,3.9942,-0.6058,中风险,低风险 +11.3,8.6766,-2.6234,高风险,高风险 +4.4,4.6531,0.2531,中风险,中风险 +4.8,5.2468,0.4468,中风险,中风险 +4.1,4.2831,0.1831,中风险,中风险 +6.8,6.5148,-0.2852,中风险,中风险 +8.0,8.5813,0.5813,中风险,高风险 +8.5,8.7099,0.2099,高风险,高风险 +5.4,5.6178,0.2178,中风险,中风险 +6.2,6.7057,0.5057,中风险,中风险 +3.7,3.9248,0.2248,低风险,低风险 +2.0,2.5946,0.5946,低风险,低风险 +7.3,7.3379,0.0379,中风险,中风险 +6.6,6.2525,-0.3475,中风险,中风险 +10.6,10.3569,-0.2431,高风险,高风险 +3.5,3.9841,0.4841,低风险,低风险 +4.8,5.2713,0.4713,中风险,中风险 +3.1,4.5207,1.4207,低风险,中风险 +2.2,1.7725,-0.4275,低风险,低风险 +4.5,3.8672,-0.6328,中风险,低风险 +1.9,1.7372,-0.1628,低风险,低风险 +3.1,3.2451,0.1451,低风险,低风险 +3.3,3.0379,-0.2621,低风险,低风险 +4.6,4.8519,0.2519,中风险,中风险 +8.2,7.3511,-0.8489,高风险,中风险 +2.5,2.9285,0.4285,低风险,低风险 +5.0,4.5853,-0.4147,中风险,中风险 +4.9,4.6006,-0.2994,中风险,中风险 +4.6,4.571,-0.029,中风险,中风险 +10.5,10.3175,-0.1825,高风险,高风险 +5.9,5.1786,-0.7214,中风险,中风险 +5.5,5.2471,-0.2529,中风险,中风险 +8.7,8.1907,-0.5093,高风险,高风险 +2.9,2.6515,-0.2485,低风险,低风险 +6.9,6.7447,-0.1553,中风险,中风险 +6.9,6.8739,-0.0261,中风险,中风险 +5.7,5.2082,-0.4918,中风险,中风险 +9.0,8.577,-0.423,高风险,高风险 +8.7,8.5275,-0.1725,高风险,高风险 +5.7,5.5734,-0.1266,中风险,中风险 +2.2,3.1078,0.9078,低风险,低风险 +4.7,3.7172,-0.9828,中风险,低风险 +5.8,3.3133,-2.4867,中风险,低风险 +2.3,2.9814,0.6814,低风险,低风险 +5.3,4.6618,-0.6382,中风险,中风险 +8.3,7.5384,-0.7616,高风险,中风险 +8.1,7.2089,-0.8911,高风险,中风险 +6.9,6.7544,-0.1456,中风险,中风险 +4.8,4.881,0.081,中风险,中风险 +5.9,4.8627,-1.0373,中风险,中风险 +8.6,8.2757,-0.3243,高风险,高风险 +7.3,7.8931,0.5931,中风险,中风险 +4.5,4.6792,0.1792,中风险,中风险 +5.6,5.5639,-0.0361,中风险,中风险 +4.1,4.378,0.278,中风险,中风险 +9.8,9.5868,-0.2132,高风险,高风险 +7.1,7.835,0.735,中风险,中风险 +9.0,10.4662,1.4662,高风险,高风险 +5.9,4.9634,-0.9366,中风险,中风险 +8.4,7.9645,-0.4355,高风险,中风险 +4.0,3.7116,-0.2884,中风险,低风险 +8.8,7.5868,-1.2132,高风险,中风险 +7.2,7.1708,-0.0292,中风险,中风险 +9.7,8.4968,-1.2032,高风险,高风险 +2.8,2.6117,-0.1883,低风险,低风险 +2.5,2.7184,0.2184,低风险,低风险 +4.9,5.4997,0.5997,中风险,中风险 +7.7,6.4141,-1.2859,中风险,中风险 +5.0,4.7573,-0.2427,中风险,中风险 +9.7,10.1213,0.4213,高风险,高风险 +8.2,8.5523,0.3523,高风险,高风险 +7.0,7.3349,0.3349,中风险,中风险 +3.0,2.976,-0.024,低风险,低风险 +6.7,6.8394,0.1394,中风险,中风险 +7.1,6.9573,-0.1427,中风险,中风险 +3.4,4.4819,1.0819,低风险,中风险 +7.9,7.4315,-0.4685,中风险,中风险 +6.2,6.1308,-0.0692,中风险,中风险 +6.0,5.097,-0.903,中风险,中风险 +2.6,2.7089,0.1089,低风险,低风险 +7.4,8.0888,0.6888,中风险,高风险 +8.9,8.3568,-0.5432,高风险,高风险 +4.8,4.8508,0.0508,中风险,中风险 +12.4,11.6756,-0.7244,高风险,高风险 +10.9,11.3769,0.4769,高风险,高风险 +10.5,10.9419,0.4419,高风险,高风险 +8.6,7.1796,-1.4204,高风险,中风险 +10.9,9.833,-1.067,高风险,高风险 +6.8,7.2017,0.4017,中风险,中风险 +9.8,11.0088,1.2088,高风险,高风险 +3.6,3.9878,0.3878,低风险,低风险 +4.8,4.5811,-0.2189,中风险,中风险 +8.9,8.2108,-0.6892,高风险,高风险 +8.7,7.1129,-1.5871,高风险,中风险 +10.7,9.6646,-1.0354,高风险,高风险 +6.1,4.887,-1.213,中风险,中风险 +6.3,6.1691,-0.1309,中风险,中风险 +8.5,8.7236,0.2236,高风险,高风险 +6.2,5.3038,-0.8962,中风险,中风险 +2.8,3.4792,0.6792,低风险,低风险 +4.4,4.7497,0.3497,中风险,中风险 +5.2,4.4174,-0.7826,中风险,中风险 +7.5,8.2917,0.7917,中风险,高风险 +3.8,4.6294,0.8294,低风险,中风险 +4.2,4.5729,0.3729,中风险,中风险 +5.0,5.001,0.001,中风险,中风险 +3.9,3.7781,-0.1219,低风险,低风险 +4.1,3.7531,-0.3469,中风险,低风险 +9.6,10.9662,1.3662,高风险,高风险 +6.0,5.1573,-0.8427,中风险,中风险 +7.6,8.2618,0.6618,中风险,高风险 +3.3,3.4555,0.1555,低风险,低风险 +6.3,5.8508,-0.4492,中风险,中风险 +8.2,7.7365,-0.4635,高风险,中风险 +4.6,4.9513,0.3513,中风险,中风险 +5.0,4.9821,-0.0179,中风险,中风险 +4.9,4.6609,-0.2391,中风险,中风险 +7.1,7.6813,0.5813,中风险,中风险 +4.0,3.7842,-0.2158,中风险,低风险 +2.3,2.5901,0.2901,低风险,低风险 +7.9,7.9185,0.0185,中风险,中风险 +4.8,5.3695,0.5695,中风险,中风险 +3.2,3.6935,0.4935,低风险,低风险 +2.1,1.8639,-0.2361,低风险,低风险 +4.9,4.8907,-0.0093,中风险,中风险 +5.4,5.1536,-0.2464,中风险,中风险 +1.8,1.733,-0.067,低风险,低风险 +2.0,1.8636,-0.1364,低风险,低风险 +3.0,2.9806,-0.0194,低风险,低风险 +4.8,4.5646,-0.2354,中风险,中风险 +10.0,9.5711,-0.4289,高风险,高风险 +6.4,6.3461,-0.0539,中风险,中风险 +4.1,4.2355,0.1355,中风险,中风险 +5.4,4.4811,-0.9189,中风险,中风险 +8.2,7.5462,-0.6538,高风险,中风险 +4.0,3.8885,-0.1115,中风险,低风险 +6.0,5.1298,-0.8702,中风险,中风险 +5.0,5.6101,0.6101,中风险,中风险 +5.7,5.1482,-0.5518,中风险,中风险 +5.6,5.5641,-0.0359,中风险,中风险 +5.8,6.0149,0.2149,中风险,中风险 +6.0,5.9529,-0.0471,中风险,中风险 +2.8,3.3153,0.5153,低风险,低风险 +4.5,4.9248,0.4248,中风险,中风险 +8.5,8.6593,0.1593,高风险,高风险 +5.9,6.1287,0.2287,中风险,中风险 +5.1,4.67,-0.43,中风险,中风险 +3.1,2.3676,-0.7324,低风险,低风险 +3.6,3.6044,0.0044,低风险,低风险 +9.7,8.2084,-1.4916,高风险,高风险 +4.2,3.6837,-0.5163,中风险,低风险 +6.5,7.179,0.679,中风险,中风险 +4.8,4.9441,0.1441,中风险,中风险 +7.2,7.2585,0.0585,中风险,中风险 +3.5,3.8094,0.3094,低风险,低风险 +2.9,3.4587,0.5587,低风险,低风险 +7.2,7.1405,-0.0595,中风险,中风险 +11.6,9.8331,-1.7669,高风险,高风险 +6.3,6.3447,0.0447,中风险,中风险 +4.1,4.2941,0.1941,中风险,中风险 +8.0,7.4103,-0.5897,中风险,中风险 +4.0,4.5709,0.5709,中风险,中风险 +2.0,2.3336,0.3336,低风险,低风险 +8.5,8.2523,-0.2477,高风险,高风险 +1.6,1.7255,0.1255,低风险,低风险 +4.3,4.0124,-0.2876,中风险,中风险 +4.7,4.5891,-0.1109,中风险,中风险 +2.9,3.9721,1.0721,低风险,低风险 +5.6,6.5926,0.9926,中风险,中风险 +3.9,4.1098,0.2098,低风险,中风险 +7.7,7.392,-0.308,中风险,中风险 +4.1,4.6932,0.5932,中风险,中风险 +4.0,3.9826,-0.0174,中风险,低风险 +4.1,4.5745,0.4745,中风险,中风险 +6.7,6.6035,-0.0965,中风险,中风险 +7.4,7.3405,-0.0595,中风险,中风险 +3.3,3.3135,0.0135,低风险,低风险 +4.0,3.7935,-0.2065,中风险,低风险 +5.3,4.8764,-0.4236,中风险,中风险 +2.7,3.137,0.437,低风险,低风险 +6.0,6.1504,0.1504,中风险,中风险 +3.5,4.65,1.15,低风险,中风险 +2.3,3.2845,0.9845,低风险,低风险 +3.0,3.6752,0.6752,低风险,低风险 +2.2,2.8225,0.6225,低风险,低风险 +3.1,3.4638,0.3638,低风险,低风险 +7.1,7.2627,0.1627,中风险,中风险 +9.5,8.6456,-0.8544,高风险,高风险 +8.8,8.4567,-0.3433,高风险,高风险 +3.9,4.9248,1.0248,低风险,中风险 +4.6,4.5669,-0.0331,中风险,中风险 +6.2,6.6926,0.4926,中风险,中风险 +5.1,5.4857,0.3857,中风险,中风险 +4.0,4.1465,0.1465,中风险,中风险 +7.3,7.1355,-0.1645,中风险,中风险 +5.4,5.2562,-0.1438,中风险,中风险 +4.1,3.9435,-0.1565,中风险,低风险 +5.5,5.1449,-0.3551,中风险,中风险 +8.6,7.3443,-1.2557,高风险,中风险 +4.0,4.3062,0.3062,中风险,中风险 +5.0,5.2564,0.2564,中风险,中风险 +9.3,8.0889,-1.2111,高风险,高风险 +10.6,11.1349,0.5349,高风险,高风险 +9.9,9.7067,-0.1933,高风险,高风险 +2.3,3.1815,0.8815,低风险,低风险 +5.3,4.9354,-0.3646,中风险,中风险 +7.5,7.1,-0.4,中风险,中风险 +3.4,3.1883,-0.2117,低风险,低风险 +4.3,4.3721,0.0721,中风险,中风险 +6.3,5.5347,-0.7653,中风险,中风险 +7.8,7.2826,-0.5174,中风险,中风险 +9.1,7.8628,-1.2372,高风险,中风险 +8.2,7.8021,-0.3979,高风险,中风险 +7.6,8.0708,0.4708,中风险,高风险 +5.2,4.9834,-0.2166,中风险,中风险 +5.0,4.2266,-0.7734,中风险,中风险 +5.6,6.1393,0.5393,中风险,中风险 +2.0,2.8046,0.8046,低风险,低风险 +3.9,4.0619,0.1619,低风险,中风险 +4.4,4.5815,0.1815,中风险,中风险 +4.4,3.3812,-1.0188,中风险,低风险 +4.2,3.2808,-0.9192,中风险,低风险 +4.9,5.0561,0.1561,中风险,中风险 +3.2,3.8923,0.6923,低风险,低风险 +5.3,5.0559,-0.2441,中风险,中风险 +6.0,6.7717,0.7717,中风险,中风险 +2.2,2.5432,0.3432,低风险,低风险 +6.4,7.2472,0.8472,中风险,中风险 +2.9,3.0021,0.1021,低风险,低风险 +6.4,6.5814,0.1814,中风险,中风险 +6.8,7.2487,0.4487,中风险,中风险 +6.9,6.7656,-0.1344,中风险,中风险 +3.1,2.8646,-0.2354,低风险,低风险 +5.3,5.0275,-0.2725,中风险,中风险 +7.3,7.0564,-0.2436,中风险,中风险 +6.5,5.9265,-0.5735,中风险,中风险 +2.7,3.2946,0.5946,低风险,低风险 +8.2,7.7335,-0.4665,高风险,中风险 +6.6,6.7199,0.1199,中风险,中风险 +2.4,2.8435,0.4435,低风险,低风险 +6.6,6.2023,-0.3977,中风险,中风险 +7.5,7.5735,0.0735,中风险,中风险 +7.5,7.5233,0.0233,中风险,中风险 +2.6,3.1194,0.5194,低风险,低风险 +3.7,3.4337,-0.2663,低风险,低风险 +7.0,7.6689,0.6689,中风险,中风险 +3.0,2.9565,-0.0435,低风险,低风险 +4.4,4.6739,0.2739,中风险,中风险 +4.2,4.2356,0.0356,中风险,中风险 +4.4,4.4341,0.0341,中风险,中风险 +6.1,6.0984,-0.0016,中风险,中风险 +10.2,10.0093,-0.1907,高风险,高风险 +3.6,3.5403,-0.0597,低风险,低风险 +3.7,3.4327,-0.2673,低风险,低风险 +6.1,6.8958,0.7958,中风险,中风险 +11.6,10.5628,-1.0372,高风险,高风险 +5.6,5.4853,-0.1147,中风险,中风险 +8.6,7.5162,-1.0838,高风险,中风险 +5.6,5.4177,-0.1823,中风险,中风险 +4.2,3.6831,-0.5169,中风险,低风险 +5.2,5.2007,0.0007,中风险,中风险 +7.1,6.8913,-0.2087,中风险,中风险 +8.3,7.8605,-0.4395,高风险,中风险 +4.1,4.1415,0.0415,中风险,中风险 +5.9,6.2927,0.3927,中风险,中风险 +7.6,7.0514,-0.5486,中风险,中风险 +7.9,7.5501,-0.3499,中风险,中风险 +3.3,3.6127,0.3127,低风险,低风险 +2.6,3.543,0.943,低风险,低风险 +8.4,7.0597,-1.3403,高风险,中风险 +5.0,4.8179,-0.1821,中风险,中风险 +3.8,4.1429,0.3429,低风险,中风险 +5.5,5.5272,0.0272,中风险,中风险 +8.7,8.4408,-0.2592,高风险,高风险 +4.1,3.8373,-0.2627,中风险,低风险 +2.7,3.2915,0.5915,低风险,低风险 +3.0,3.2908,0.2908,低风险,低风险 +5.4,5.6965,0.2965,中风险,中风险 +2.7,3.6976,0.9976,低风险,低风险 +4.6,4.8055,0.2055,中风险,中风险 +5.2,5.2574,0.0574,中风险,中风险 +9.4,10.2373,0.8373,高风险,高风险 +7.0,7.1119,0.1119,中风险,中风险 +5.8,6.6455,0.8455,中风险,中风险 +4.8,4.289,-0.511,中风险,中风险 +2.8,3.5922,0.7922,低风险,低风险 +3.4,2.2452,-1.1548,低风险,低风险 +3.6,3.1341,-0.4659,低风险,低风险 +7.5,6.524,-0.976,中风险,中风险 +3.6,3.1291,-0.4709,低风险,低风险 +6.8,5.943,-0.857,中风险,中风险 +6.8,7.7538,0.9538,中风险,中风险 +7.3,7.7083,0.4083,中风险,中风险 +6.7,7.4842,0.7842,中风险,中风险 +7.7,7.8314,0.1314,中风险,中风险 +4.6,4.5224,-0.0776,中风险,中风险 +7.0,7.8403,0.8403,中风险,中风险 +3.2,3.1748,-0.0252,低风险,低风险 +3.6,4.373,0.773,低风险,中风险 +5.7,4.9285,-0.7715,中风险,中风险 +4.6,4.5892,-0.0108,中风险,中风险 +2.8,3.5779,0.7779,低风险,低风险 +4.1,3.7982,-0.3018,中风险,低风险 +11.8,10.415,-1.385,高风险,高风险 +5.5,3.9038,-1.5962,中风险,低风险 +5.4,4.1032,-1.2968,中风险,中风险 +5.4,4.9574,-0.4426,中风险,中风险 +2.6,3.1041,0.5041,低风险,低风险 +5.7,5.2012,-0.4988,中风险,中风险 +7.6,7.1385,-0.4615,中风险,中风险 +5.6,5.4054,-0.1946,中风险,中风险 +2.9,3.2041,0.3041,低风险,低风险 +8.2,7.3627,-0.8373,高风险,中风险 +6.8,5.9985,-0.8015,中风险,中风险 +7.6,6.8315,-0.7685,中风险,中风险 +6.6,7.3227,0.7227,中风险,中风险 +6.9,7.0674,0.1674,中风险,中风险 +6.9,6.962,0.062,中风险,中风险 +2.7,2.9548,0.2548,低风险,低风险 +9.9,8.9112,-0.9888,高风险,高风险 +7.9,8.4658,0.5658,中风险,高风险 +3.8,4.8087,1.0087,低风险,中风险 +10.2,10.6643,0.4643,高风险,高风险 +7.7,6.9767,-0.7233,中风险,中风险 +1.7,2.6167,0.9167,低风险,低风险 +4.9,5.107,0.207,中风险,中风险 +9.1,8.3115,-0.7885,高风险,高风险 +2.7,2.419,-0.281,低风险,低风险 +5.0,5.105,0.105,中风险,中风险 +7.2,7.2872,0.0872,中风险,中风险 +3.9,3.3828,-0.5172,低风险,低风险 +2.8,3.1815,0.3815,低风险,低风险 +7.5,7.0738,-0.4262,中风险,中风险 +6.6,6.4647,-0.1353,中风险,中风险 +3.0,2.6193,-0.3807,低风险,低风险 +6.5,6.4985,-0.0015,中风险,中风险 +7.8,7.4472,-0.3528,中风险,中风险 +7.7,7.6836,-0.0164,中风险,中风险 +7.7,7.3502,-0.3498,中风险,中风险 +7.9,8.1027,0.2027,中风险,高风险 +7.9,7.1489,-0.7511,中风险,中风险 +4.8,3.9595,-0.8405,中风险,低风险 +7.2,7.548,0.348,中风险,中风险 +2.7,2.7555,0.0555,低风险,低风险 +6.3,7.4652,1.1652,中风险,中风险 +4.2,4.1221,-0.0779,中风险,中风险 +6.9,6.302,-0.598,中风险,中风险 +9.5,9.2718,-0.2282,高风险,高风险 +2.4,2.5695,0.1695,低风险,低风险 +5.0,5.0313,0.0313,中风险,中风险 +4.8,4.9529,0.1529,中风险,中风险 +9.0,9.1824,0.1824,高风险,高风险 +7.5,7.3035,-0.1965,中风险,中风险 +3.6,3.5915,-0.0085,低风险,低风险 +6.2,6.054,-0.146,中风险,中风险 +5.2,6.1,0.9,中风险,中风险 +9.0,8.4633,-0.5367,高风险,高风险 +8.3,8.4688,0.1688,高风险,高风险 +5.1,5.4846,0.3846,中风险,中风险 +7.0,7.8861,0.8861,中风险,中风险 +4.5,4.7526,0.2526,中风险,中风险 +8.1,7.5922,-0.5078,高风险,中风险 +8.0,7.6802,-0.3198,中风险,中风险 +7.7,6.8951,-0.8049,中风险,中风险 +11.1,11.3384,0.2384,高风险,高风险 +7.4,7.9838,0.5838,中风险,中风险 +5.1,4.5753,-0.5247,中风险,中风险 +4.7,4.3175,-0.3825,中风险,中风险 +3.8,3.1479,-0.6521,低风险,低风险 +4.3,4.7033,0.4033,中风险,中风险 +4.9,4.6983,-0.2017,中风险,中风险 +2.7,3.2844,0.5844,低风险,低风险 +5.9,5.8896,-0.0104,中风险,中风险 +5.5,5.0295,-0.4705,中风险,中风险 +3.3,3.5216,0.2216,低风险,低风险 +6.2,5.9734,-0.2266,中风险,中风险 +3.9,3.9485,0.0485,低风险,低风险 +7.8,7.6677,-0.1323,中风险,中风险 +8.1,7.709,-0.391,高风险,中风险 +6.3,5.8736,-0.4264,中风险,中风险 +3.2,3.8503,0.6503,低风险,低风险 +3.6,3.927,0.327,低风险,低风险 +4.5,4.6679,0.1679,中风险,中风险 +4.9,5.9234,1.0234,中风险,中风险 +4.8,4.6123,-0.1877,中风险,中风险 +8.3,8.641,0.341,高风险,高风险 +7.3,7.9779,0.6779,中风险,中风险 +8.4,7.865,-0.535,高风险,中风险 +4.6,5.4955,0.8955,中风险,中风险 +5.6,5.6559,0.0559,中风险,中风险 +5.3,5.4352,0.1352,中风险,中风险 +10.7,10.5844,-0.1156,高风险,高风险 +4.4,4.2859,-0.1141,中风险,中风险 +5.9,5.572,-0.328,中风险,中风险 +8.2,7.2793,-0.9207,高风险,中风险 +5.6,4.5832,-1.0168,中风险,中风险 +4.5,3.873,-0.627,中风险,低风险 +2.5,3.3649,0.8649,低风险,低风险 +8.3,8.441,0.141,高风险,高风险 +4.6,4.0741,-0.5259,中风险,中风险 +7.7,7.8259,0.1259,中风险,中风险 +5.6,5.3671,-0.2329,中风险,中风险 +4.2,4.1832,-0.0168,中风险,中风险 +9.3,9.325,0.025,高风险,高风险 +6.6,7.4711,0.8711,中风险,中风险 +5.6,5.6616,0.0616,中风险,中风险 +3.5,2.9809,-0.5191,低风险,低风险 +5.2,4.8937,-0.3063,中风险,中风险 +10.7,10.813,0.113,高风险,高风险 +10.2,10.5762,0.3762,高风险,高风险 +7.0,7.0666,0.0666,中风险,中风险 +5.3,4.7539,-0.5461,中风险,中风险 +5.0,4.5884,-0.4116,中风险,中风险 +7.2,6.8868,-0.3132,中风险,中风险 +3.7,2.8128,-0.8872,低风险,低风险 +3.5,2.9502,-0.5498,低风险,低风险 +8.1,7.0473,-1.0527,高风险,中风险 +6.7,8.0805,1.3805,中风险,高风险 +9.2,9.2719,0.0719,高风险,高风险 +4.8,4.256,-0.544,中风险,中风险 +2.8,3.7934,0.9934,低风险,低风险 +10.2,10.3547,0.1547,高风险,高风险 +5.4,4.4705,-0.9295,中风险,中风险 +5.3,5.0863,-0.2137,中风险,中风险 +7.3,7.069,-0.231,中风险,中风险 +8.0,6.2761,-1.7239,中风险,中风险 +6.2,6.577,0.377,中风险,中风险 +3.2,3.7031,0.5031,低风险,低风险 +10.0,10.0031,0.0031,高风险,高风险 +5.2,5.5905,0.3905,中风险,中风险 +4.6,4.6177,0.0177,中风险,中风险 +6.8,6.0587,-0.7413,中风险,中风险 +5.7,4.7035,-0.9965,中风险,中风险 +5.5,4.6273,-0.8727,中风险,中风险 +7.8,8.0136,0.2136,中风险,高风险 +3.8,3.3064,-0.4936,低风险,低风险 +3.5,3.8808,0.3808,低风险,低风险 +5.1,5.7905,0.6905,中风险,中风险 +10.1,9.1743,-0.9257,高风险,高风险 +4.4,3.9045,-0.4955,中风险,低风险 +6.9,7.017,0.117,中风险,中风险 +8.3,7.0033,-1.2967,高风险,中风险 +8.0,7.0451,-0.9549,中风险,中风险 +5.0,4.8498,-0.1502,中风险,中风险 +4.4,4.602,0.202,中风险,中风险 +3.3,3.5989,0.2989,低风险,低风险 +8.1,8.1161,0.0161,高风险,高风险 +8.5,8.4478,-0.0522,高风险,高风险 +2.2,3.2664,1.0664,低风险,低风险 +7.6,7.3883,-0.2117,中风险,中风险 +8.3,8.8978,0.5978,高风险,高风险 +3.5,3.7194,0.2194,低风险,低风险 +9.2,7.7564,-1.4436,高风险,中风险 +9.5,8.7989,-0.7011,高风险,高风险 +8.9,8.1515,-0.7485,高风险,高风险 +6.1,5.7907,-0.3093,中风险,中风险 +7.4,7.0898,-0.3102,中风险,中风险 +5.8,4.6879,-1.1121,中风险,中风险 +7.0,7.4988,0.4988,中风险,中风险 +3.1,3.0572,-0.0428,低风险,低风险 +9.5,8.9141,-0.5859,高风险,高风险 +2.8,3.4122,0.6122,低风险,低风险 +7.8,7.7179,-0.0821,中风险,中风险 +6.8,6.9701,0.1701,中风险,中风险 +6.4,6.8176,0.4176,中风险,中风险 +3.8,3.0125,-0.7875,低风险,低风险 +7.8,6.6581,-1.1419,中风险,中风险 +4.7,3.9074,-0.7926,中风险,低风险 +8.9,7.5682,-1.3318,高风险,中风险 +8.8,8.0825,-0.7175,高风险,高风险 +5.4,4.9239,-0.4761,中风险,中风险 +3.7,3.4328,-0.2672,低风险,低风险 +8.7,7.7927,-0.9073,高风险,中风险 +11.1,10.7989,-0.3011,高风险,高风险 +4.6,4.3496,-0.2504,中风险,中风险 +2.9,3.4701,0.5701,低风险,低风险 +2.4,2.3422,-0.0578,低风险,低风险 +3.5,4.3024,0.8024,低风险,中风险 +5.6,5.9012,0.3012,中风险,中风险 +4.5,4.5516,0.0516,中风险,中风险 +3.4,4.013,0.613,低风险,中风险 +3.7,4.1231,0.4231,低风险,中风险 +5.1,5.9176,0.8176,中风险,中风险 +2.1,2.2161,0.1161,低风险,低风险 +3.0,3.7103,0.7103,低风险,低风险 +4.6,4.0764,-0.5236,中风险,中风险 +2.7,2.6748,-0.0252,低风险,低风险 +3.6,3.5857,-0.0143,低风险,低风险 +1.9,1.9334,0.0334,低风险,低风险 +4.3,4.7435,0.4435,中风险,中风险 +6.9,8.0735,1.1735,中风险,高风险 +7.3,6.686,-0.614,中风险,中风险 +4.5,4.5581,0.0581,中风险,中风险 +10.1,9.8788,-0.2212,高风险,高风险 +6.0,5.4207,-0.5793,中风险,中风险 +4.2,5.1065,0.9065,中风险,中风险 +3.1,3.6691,0.5691,低风险,低风险 +4.6,4.6475,0.0475,中风险,中风险 +3.1,2.8463,-0.2537,低风险,低风险 +10.4,10.7981,0.3981,高风险,高风险 +7.9,7.4057,-0.4943,中风险,中风险 +7.5,7.0943,-0.4057,中风险,中风险 +6.4,5.924,-0.476,中风险,中风险 +9.7,9.6914,-0.0086,高风险,高风险 +5.2,4.448,-0.752,中风险,中风险 +7.0,6.9953,-0.0047,中风险,中风险 +3.7,3.4089,-0.2911,低风险,低风险 +8.6,7.837,-0.763,高风险,中风险 +4.6,4.8274,0.2274,中风险,中风险 +3.9,4.3085,0.4085,低风险,中风险 +5.5,5.8772,0.3772,中风险,中风险 +5.9,5.4866,-0.4134,中风险,中风险 +7.8,6.7261,-1.0739,中风险,中风险 +7.4,7.8876,0.4876,中风险,中风险 +8.0,8.0319,0.0319,中风险,高风险 +9.6,8.279,-1.321,高风险,高风险 +8.1,7.8034,-0.2966,高风险,中风险 +9.8,10.4232,0.6232,高风险,高风险 +3.3,3.4312,0.1312,低风险,低风险 +4.7,5.1814,0.4814,中风险,中风险 +7.9,7.7251,-0.1749,中风险,中风险 +6.6,6.6834,0.0834,中风险,中风险 +4.6,4.7471,0.1471,中风险,中风险 +2.9,3.3243,0.4243,低风险,低风险 +4.0,4.1649,0.1649,中风险,中风险 +8.1,7.9461,-0.1539,高风险,中风险 +8.1,7.8967,-0.2033,高风险,中风险 +7.0,7.4678,0.4678,中风险,中风险 +7.4,7.0797,-0.3203,中风险,中风险 +6.7,6.1539,-0.5461,中风险,中风险 +2.4,2.4601,0.0601,低风险,低风险 +4.1,3.9713,-0.1287,中风险,低风险 +7.5,6.8125,-0.6875,中风险,中风险 +6.9,7.0453,0.1453,中风险,中风险 +3.8,4.3901,0.5901,低风险,中风险 +4.3,5.3668,1.0668,中风险,中风险 +3.8,3.2452,-0.5548,低风险,低风险 +7.6,7.4733,-0.1267,中风险,中风险 +7.0,8.2143,1.2143,中风险,高风险 +4.4,4.5763,0.1763,中风险,中风险 +3.2,3.0194,-0.1806,低风险,低风险 +3.3,2.9351,-0.3649,低风险,低风险 +8.6,8.6905,0.0905,高风险,高风险 +4.1,4.4743,0.3743,中风险,中风险 +4.9,5.1704,0.2704,中风险,中风险 +6.1,5.095,-1.005,中风险,中风险 +5.7,4.4168,-1.2832,中风险,中风险 +6.7,6.9762,0.2762,中风险,中风险 +6.3,5.8585,-0.4415,中风险,中风险 +6.5,6.0198,-0.4802,中风险,中风险 +4.7,5.012,0.312,中风险,中风险 +5.2,4.829,-0.371,中风险,中风险 +8.1,7.685,-0.415,高风险,中风险 +8.0,8.8844,0.8844,中风险,高风险 +5.6,5.765,0.165,中风险,中风险 +3.7,4.161,0.461,低风险,中风险 +8.5,8.3552,-0.1448,高风险,高风险 +7.4,7.3525,-0.0475,中风险,中风险 +3.0,3.2958,0.2958,低风险,低风险 +10.2,9.256,-0.944,高风险,高风险 +9.5,9.271,-0.229,高风险,高风险 +6.9,6.5654,-0.3346,中风险,中风险 +3.6,4.2312,0.6312,低风险,中风险 +5.3,5.131,-0.169,中风险,中风险 +4.8,4.7669,-0.0331,中风险,中风险 +6.8,6.8024,0.0024,中风险,中风险 +4.9,4.8519,-0.0481,中风险,中风险 +7.8,7.0403,-0.7597,中风险,中风险 +4.6,4.3704,-0.2296,中风险,中风险 +2.8,2.6532,-0.1468,低风险,低风险 +5.0,4.6346,-0.3654,中风险,中风险 +5.8,5.8891,0.0891,中风险,中风险 +5.2,4.6988,-0.5012,中风险,中风险 +5.9,5.3062,-0.5938,中风险,中风险 +8.7,8.4617,-0.2383,高风险,高风险 +4.8,4.1404,-0.6596,中风险,中风险 +6.3,4.7072,-1.5928,中风险,中风险 +8.1,8.5951,0.4951,高风险,高风险 +5.5,5.682,0.182,中风险,中风险 +5.6,5.497,-0.103,中风险,中风险 +4.3,4.3454,0.0454,中风险,中风险 +8.1,7.5799,-0.5201,高风险,中风险 +7.6,7.2419,-0.3581,中风险,中风险 +6.0,6.0909,0.0909,中风险,中风险 +7.5,7.7707,0.2707,中风险,中风险 +6.5,7.0944,0.5944,中风险,中风险 +6.2,6.4343,0.2343,中风险,中风险 +5.1,5.8154,0.7154,中风险,中风险 +3.5,4.06,0.56,低风险,中风险 +4.3,4.0782,-0.2218,中风险,中风险 +4.0,4.0881,0.0881,中风险,中风险 +5.4,4.9822,-0.4178,中风险,中风险 +2.7,3.3473,0.6473,低风险,低风险 +3.2,3.3916,0.1916,低风险,低风险 +5.1,5.0736,-0.0264,中风险,中风险 +4.4,4.2325,-0.1675,中风险,中风险 +9.0,7.9015,-1.0985,高风险,中风险 +8.7,8.1822,-0.5178,高风险,高风险 +2.4,3.1795,0.7795,低风险,低风险 +7.8,7.8786,0.0786,中风险,中风险 +5.4,4.1694,-1.2306,中风险,中风险 +7.0,7.5107,0.5107,中风险,中风险 +6.4,7.5032,1.1032,中风险,中风险 +6.3,7.3617,1.0617,中风险,中风险 +5.1,4.878,-0.222,中风险,中风险 +12.1,12.2164,0.1164,高风险,高风险 +4.3,4.4921,0.1921,中风险,中风险 +6.0,5.2049,-0.7951,中风险,中风险 +12.1,11.1643,-0.9357,高风险,高风险 +6.3,5.4208,-0.8792,中风险,中风险 +8.9,9.8971,0.9971,高风险,高风险 +8.9,7.7966,-1.1034,高风险,中风险 +7.9,9.1672,1.2672,中风险,高风险 +9.4,9.0824,-0.3176,高风险,高风险 +8.2,7.0973,-1.1027,高风险,中风险 +7.1,7.2713,0.1713,中风险,中风险 +6.6,6.9329,0.3329,中风险,中风险 +5.5,5.8301,0.3301,中风险,中风险 +4.8,4.8229,0.0229,中风险,中风险 +5.0,4.7623,-0.2377,中风险,中风险 +13.8,12.2082,-1.5918,高风险,高风险 +4.4,4.2254,-0.1746,中风险,中风险 +6.3,6.2968,-0.0032,中风险,中风险 +5.6,5.2136,-0.3864,中风险,中风险 +5.7,6.3566,0.6566,中风险,中风险 +9.2,7.4559,-1.7441,高风险,中风险 +4.5,4.8836,0.3836,中风险,中风险 +8.5,7.3937,-1.1063,高风险,中风险 +5.1,4.2394,-0.8606,中风险,中风险 +4.4,3.4168,-0.9832,中风险,低风险 +5.1,4.5823,-0.5177,中风险,中风险 +6.6,7.0785,0.4785,中风险,中风险 +6.3,6.0732,-0.2268,中风险,中风险 +5.3,5.6109,0.3109,中风险,中风险 +3.5,3.1812,-0.3188,低风险,低风险 +4.1,3.4617,-0.6383,中风险,低风险 +6.4,5.8036,-0.5964,中风险,中风险 +1.7,2.1373,0.4373,低风险,低风险 +3.2,4.2233,1.0233,低风险,中风险 +4.1,4.2588,0.1588,中风险,中风险 +5.9,5.5969,-0.3031,中风险,中风险 +5.7,6.0445,0.3445,中风险,中风险 +8.4,7.2013,-1.1987,高风险,中风险 +11.6,11.153,-0.447,高风险,高风险 +6.5,5.788,-0.712,中风险,中风险 +8.9,8.6065,-0.2935,高风险,高风险 +7.0,5.9147,-1.0853,中风险,中风险 +5.8,6.6368,0.8368,中风险,中风险 +4.5,3.9537,-0.5463,中风险,低风险 +2.8,3.4318,0.6318,低风险,低风险 +3.7,3.7037,0.0037,低风险,低风险 +3.8,3.8402,0.0402,低风险,低风险 +7.7,8.1305,0.4305,中风险,高风险 +7.4,7.1518,-0.2482,中风险,中风险 +9.3,10.4623,1.1623,高风险,高风险 +6.3,6.0953,-0.2047,中风险,中风险 +10.8,11.5435,0.7435,高风险,高风险 +4.8,5.0887,0.2887,中风险,中风险 +9.0,8.2456,-0.7544,高风险,高风险 +8.3,8.0669,-0.2331,高风险,高风险 +6.9,7.4197,0.5197,中风险,中风险 +8.0,7.1773,-0.8227,中风险,中风险 +6.7,5.788,-0.912,中风险,中风险 +7.7,7.6738,-0.0262,中风险,中风险 +4.4,3.528,-0.872,中风险,低风险 +6.1,5.7441,-0.3559,中风险,中风险 +3.7,2.6212,-1.0788,低风险,低风险 +5.0,4.191,-0.809,中风险,中风险 +4.0,4.2869,0.2869,中风险,中风险 +3.8,4.0253,0.2253,低风险,中风险 +8.1,6.9861,-1.1139,高风险,中风险 +7.4,7.2257,-0.1743,中风险,中风险 +2.9,3.2814,0.3814,低风险,低风险 +2.5,2.2689,-0.2311,低风险,低风险 +4.3,4.2656,-0.0344,中风险,中风险 +3.7,3.0399,-0.6601,低风险,低风险 +6.5,6.0873,-0.4127,中风险,中风险 +5.7,5.2732,-0.4268,中风险,中风险 +10.6,11.7944,1.1944,高风险,高风险 +2.8,3.1281,0.3281,低风险,低风险 +8.6,8.1493,-0.4507,高风险,高风险 +3.8,3.5334,-0.2666,低风险,低风险 +9.0,7.7979,-1.2021,高风险,中风险 +4.3,4.5981,0.2981,中风险,中风险 +4.6,4.4777,-0.1223,中风险,中风险 +8.9,8.7517,-0.1483,高风险,高风险 +4.5,4.1352,-0.3648,中风险,中风险 +3.3,3.5526,0.2526,低风险,低风险 +2.6,2.9605,0.3605,低风险,低风险 +5.6,5.7099,0.1099,中风险,中风险 +2.2,2.4774,0.2774,低风险,低风险 +5.0,5.6293,0.6293,中风险,中风险 +4.9,4.7584,-0.1416,中风险,中风险 +5.6,5.0267,-0.5733,中风险,中风险 +9.4,9.3625,-0.0375,高风险,高风险 +3.7,2.4915,-1.2085,低风险,低风险 +5.7,6.2984,0.5984,中风险,中风险 +6.2,6.6117,0.4117,中风险,中风险 +9.0,7.9742,-1.0258,高风险,中风险 +3.8,3.8314,0.0314,低风险,低风险 +4.9,4.1795,-0.7205,中风险,中风险 +6.6,7.0157,0.4157,中风险,中风险 +6.6,6.9353,0.3353,中风险,中风险 +3.2,2.7077,-0.4923,低风险,低风险 +6.0,6.0349,0.0349,中风险,中风险 +6.1,6.1065,0.0065,中风险,中风险 +4.2,4.3198,0.1198,中风险,中风险 +4.7,4.9816,0.2816,中风险,中风险 +8.0,7.1274,-0.8726,中风险,中风险 +7.1,6.9444,-0.1556,中风险,中风险 +5.6,6.0394,0.4394,中风险,中风险 +3.9,3.9399,0.0399,低风险,低风险 +4.0,4.0632,0.0632,中风险,中风险 +5.1,5.8696,0.7696,中风险,中风险 +5.6,6.0339,0.4339,中风险,中风险 +2.7,3.6431,0.9431,低风险,低风险 +7.8,7.2281,-0.5719,中风险,中风险 +7.7,6.9702,-0.7298,中风险,中风险 +3.3,3.4427,0.1427,低风险,低风险 +6.1,6.0092,-0.0908,中风险,中风险 +5.2,4.8207,-0.3793,中风险,中风险 +1.4,2.211,0.811,低风险,低风险 +6.0,6.4416,0.4416,中风险,中风险 +3.4,3.7055,0.3055,低风险,低风险 +2.7,2.5902,-0.1098,低风险,低风险 +7.0,6.7666,-0.2334,中风险,中风险 +7.6,7.6461,0.0461,中风险,中风险 +4.5,4.8786,0.3786,中风险,中风险 +5.9,6.7218,0.8218,中风险,中风险 +8.2,8.4982,0.2982,高风险,高风险 +6.5,6.6045,0.1045,中风险,中风险 +9.8,10.2314,0.4314,高风险,高风险 +6.8,6.2807,-0.5193,中风险,中风险 +7.6,7.2122,-0.3878,中风险,中风险 +3.3,3.6259,0.3259,低风险,低风险 +2.2,2.0623,-0.1377,低风险,低风险 +4.4,3.8318,-0.5682,中风险,低风险 +6.3,5.6491,-0.6509,中风险,中风险 +7.7,8.2388,0.5388,中风险,高风险 +8.8,9.1865,0.3865,高风险,高风险 +6.8,7.892,1.092,中风险,中风险 +7.3,6.9825,-0.3175,中风险,中风险 +4.9,4.582,-0.318,中风险,中风险 +3.9,4.5796,0.6796,低风险,中风险 +4.9,4.716,-0.184,中风险,中风险 +4.3,4.0473,-0.2527,中风险,中风险 +3.6,4.4035,0.8035,低风险,中风险 +7.1,7.6104,0.5104,中风险,中风险 +3.2,3.4544,0.2544,低风险,低风险 +9.7,10.4002,0.7002,高风险,高风险 +3.0,2.65,-0.35,低风险,低风险 +1.6,2.0886,0.4886,低风险,低风险 +7.2,7.584,0.384,中风险,中风险 +6.3,5.7276,-0.5724,中风险,中风险 +10.4,11.0214,0.6214,高风险,高风险 +7.4,6.5761,-0.8239,中风险,中风险 +7.9,7.1783,-0.7217,中风险,中风险 +8.1,8.0754,-0.0246,高风险,高风险 +7.5,7.7393,0.2393,中风险,中风险 +5.6,4.9828,-0.6172,中风险,中风险 +5.7,5.2033,-0.4967,中风险,中风险 +5.1,4.7933,-0.3067,中风险,中风险 +4.5,5.1913,0.6913,中风险,中风险 +3.1,3.0754,-0.0246,低风险,低风险 +1.8,2.619,0.819,低风险,低风险 +3.5,4.3661,0.8661,低风险,中风险 +6.2,6.3106,0.1106,中风险,中风险 +6.1,6.6451,0.5451,中风险,中风险 +3.2,3.0632,-0.1368,低风险,低风险 +7.6,7.8889,0.2889,中风险,中风险 +4.0,3.6521,-0.3479,中风险,低风险 +6.0,4.8627,-1.1373,中风险,中风险 +3.3,2.7987,-0.5013,低风险,低风险 +4.7,3.4569,-1.2431,中风险,低风险 +8.9,7.5371,-1.3629,高风险,中风险 +5.4,5.0913,-0.3087,中风险,中风险 +11.0,10.8763,-0.1237,高风险,高风险 +4.0,4.1427,0.1427,中风险,中风险 +6.9,5.8292,-1.0708,中风险,中风险 +7.5,5.6169,-1.8831,中风险,中风险 +3.7,4.4171,0.7171,低风险,中风险 +8.9,7.5453,-1.3547,高风险,中风险 +6.7,7.0751,0.3751,中风险,中风险 +5.4,5.1944,-0.2056,中风险,中风险 +9.2,8.2916,-0.9084,高风险,高风险 +5.9,5.8324,-0.0676,中风险,中风险 +8.8,8.9675,0.1675,高风险,高风险 +7.5,6.5728,-0.9272,中风险,中风险 +3.6,3.3119,-0.2881,低风险,低风险 +8.0,7.3251,-0.6749,中风险,中风险 +11.5,11.2597,-0.2403,高风险,高风险 +7.1,6.4265,-0.6735,中风险,中风险 +7.2,6.4133,-0.7867,中风险,中风险 +8.0,7.8152,-0.1848,中风险,中风险 +4.1,3.5582,-0.5418,中风险,低风险 +4.2,3.8199,-0.3801,中风险,低风险 +4.4,4.5528,0.1528,中风险,中风险 +6.0,6.7176,0.7176,中风险,中风险 +10.6,11.2835,0.6835,高风险,高风险 +2.9,3.1381,0.2381,低风险,低风险 +3.1,4.2192,1.1192,低风险,中风险 +2.2,2.9206,0.7206,低风险,低风险 +8.0,7.7555,-0.2445,中风险,中风险 +8.8,7.4204,-1.3796,高风险,中风险 +5.4,4.8447,-0.5553,中风险,中风险 +3.5,3.9435,0.4435,低风险,低风险 +7.5,6.7419,-0.7581,中风险,中风险 +7.6,7.0323,-0.5677,中风险,中风险 +4.9,5.2847,0.3847,中风险,中风险 +3.9,3.6912,-0.2088,低风险,低风险 +3.7,3.6745,-0.0255,低风险,低风险 +10.4,10.4509,0.0509,高风险,高风险 +8.4,8.2707,-0.1293,高风险,高风险 +8.2,7.8155,-0.3845,高风险,中风险 +4.9,5.1766,0.2766,中风险,中风险 +8.0,7.9224,-0.0776,中风险,中风险 +8.7,9.6221,0.9221,高风险,高风险 +4.2,4.3516,0.1516,中风险,中风险 +5.7,5.6809,-0.0191,中风险,中风险 +3.9,4.2152,0.3152,低风险,中风险 +9.8,8.2577,-1.5423,高风险,高风险 +7.0,6.2626,-0.7374,中风险,中风险 +7.0,7.2287,0.2287,中风险,中风险 +3.4,3.8994,0.4994,低风险,低风险 +7.3,6.8295,-0.4705,中风险,中风险 +3.4,3.45,0.05,低风险,低风险 +4.9,4.5395,-0.3605,中风险,中风险 +9.2,9.7318,0.5318,高风险,高风险 +2.6,2.5002,-0.0998,低风险,低风险 +10.0,10.713,0.713,高风险,高风险 +6.3,5.608,-0.692,中风险,中风险 +3.1,3.0412,-0.0588,低风险,低风险 +5.1,4.3522,-0.7478,中风险,中风险 +2.6,3.1011,0.5011,低风险,低风险 +6.2,6.4352,0.2352,中风险,中风险 +6.9,6.5103,-0.3897,中风险,中风险 +7.8,8.1285,0.3285,中风险,高风险 +7.8,7.8996,0.0996,中风险,中风险 +7.1,6.3302,-0.7698,中风险,中风险 +2.2,3.0062,0.8062,低风险,低风险 +3.2,3.9423,0.7423,低风险,低风险 +6.8,6.9082,0.1082,中风险,中风险 +4.4,5.2069,0.8069,中风险,中风险 +4.4,4.5555,0.1555,中风险,中风险 +4.3,4.4115,0.1115,中风险,中风险 +4.0,4.1316,0.1316,中风险,中风险 +3.7,3.3342,-0.3658,低风险,低风险 +5.6,5.9688,0.3688,中风险,中风险 +7.5,7.295,-0.205,中风险,中风险 +8.4,8.7159,0.3159,高风险,高风险 +8.5,8.7229,0.2229,高风险,高风险 +9.6,8.9013,-0.6987,高风险,高风险 +6.0,6.0898,0.0898,中风险,中风险 +5.0,5.5816,0.5816,中风险,中风险 +4.7,4.7267,0.0267,中风险,中风险 +7.3,7.348,0.048,中风险,中风险 +3.8,2.9528,-0.8472,低风险,低风险 +6.5,6.9314,0.4314,中风险,中风险 +2.9,3.0573,0.1573,低风险,低风险 +6.9,6.9735,0.0735,中风险,中风险 +3.7,4.4102,0.7102,低风险,中风险 +7.9,7.8119,-0.0881,中风险,中风险 +9.1,7.9171,-1.1829,高风险,中风险 +2.3,3.0649,0.7649,低风险,低风险 +4.0,5.0827,1.0827,中风险,中风险 +4.2,3.6627,-0.5373,中风险,低风险 +2.6,2.7114,0.1114,低风险,低风险 +5.6,5.5539,-0.0461,中风险,中风险 +6.5,5.9527,-0.5473,中风险,中风险 +9.8,9.5298,-0.2702,高风险,高风险 +8.8,8.4111,-0.3889,高风险,高风险 +7.5,7.9248,0.4248,中风险,中风险 +5.4,5.8571,0.4571,中风险,中风险 +6.9,7.5336,0.6336,中风险,中风险 +8.1,8.8548,0.7548,高风险,高风险 +4.0,4.1961,0.1961,中风险,中风险 +7.7,7.7433,0.0433,中风险,中风险 +2.7,3.2327,0.5327,低风险,低风险 +10.4,10.5106,0.1106,高风险,高风险 +3.3,3.8677,0.5677,低风险,低风险 +8.8,9.067,0.267,高风险,高风险 +13.6,12.1096,-1.4904,高风险,高风险 +4.1,4.7595,0.6595,中风险,中风险 +8.0,7.5741,-0.4259,中风险,中风险 +6.7,6.6109,-0.0891,中风险,中风险 +7.2,6.7515,-0.4485,中风险,中风险 +7.1,6.4934,-0.6066,中风险,中风险 +10.3,9.7139,-0.5861,高风险,高风险 +3.8,4.0805,0.2805,低风险,中风险 +3.5,3.5631,0.0631,低风险,低风险 +6.4,6.6842,0.2842,中风险,中风险 +7.2,7.3142,0.1142,中风险,中风险 +9.8,11.0371,1.2371,高风险,高风险 +5.9,6.2986,0.3986,中风险,中风险 +5.0,4.3555,-0.6445,中风险,中风险 +3.6,3.8638,0.2638,低风险,低风险 +8.3,8.6416,0.3416,高风险,高风险 +7.6,6.8691,-0.7309,中风险,中风险 +4.4,4.2747,-0.1253,中风险,中风险 +4.8,4.3941,-0.4059,中风险,中风险 +4.1,3.6271,-0.4729,中风险,低风险 +6.1,5.8924,-0.2076,中风险,中风险 +7.9,7.4695,-0.4305,中风险,中风险 +7.8,7.6537,-0.1463,中风险,中风险 +8.6,7.7338,-0.8662,高风险,中风险 +3.8,3.6738,-0.1262,低风险,低风险 +6.7,6.7619,0.0619,中风险,中风险 +9.4,9.6167,0.2167,高风险,高风险 +6.8,7.2271,0.4271,中风险,中风险 +8.1,8.4821,0.3821,高风险,高风险 +5.5,5.5683,0.0683,中风险,中风险 +5.0,5.4381,0.4381,中风险,中风险 +6.0,5.855,-0.145,中风险,中风险 +3.2,3.2339,0.0339,低风险,低风险 +4.9,6.0205,1.1205,中风险,中风险 +7.9,8.4558,0.5558,中风险,高风险 +7.2,7.0355,-0.1645,中风险,中风险 +5.5,5.4745,-0.0255,中风险,中风险 +8.6,8.1338,-0.4662,高风险,高风险 +8.3,8.1965,-0.1035,高风险,高风险 +8.5,7.8262,-0.6738,高风险,中风险 +8.2,8.0153,-0.1847,高风险,高风险 +5.1,4.6864,-0.4136,中风险,中风险 +2.3,2.8792,0.5792,低风险,低风险 +8.4,7.9364,-0.4636,高风险,中风险 +8.1,7.7734,-0.3266,高风险,中风险 +10.0,10.126,0.126,高风险,高风险 +5.3,5.1332,-0.1668,中风险,中风险 +3.5,3.6471,0.1471,低风险,低风险 +4.0,4.4025,0.4025,中风险,中风险 +6.1,5.8256,-0.2744,中风险,中风险 +6.9,7.5128,0.6128,中风险,中风险 +7.2,7.9362,0.7362,中风险,中风险 +8.3,7.0914,-1.2086,高风险,中风险 +5.5,5.0562,-0.4438,中风险,中风险 +5.9,5.8854,-0.0146,中风险,中风险 +5.4,5.4611,0.0611,中风险,中风险 +8.0,7.556,-0.444,中风险,中风险 +6.3,7.4108,1.1108,中风险,中风险 +2.4,3.0414,0.6414,低风险,低风险 +7.6,7.4135,-0.1865,中风险,中风险 +3.5,3.5365,0.0365,低风险,低风险 +3.6,4.274,0.674,低风险,中风险 +2.9,3.4434,0.5434,低风险,低风险 +4.2,4.021,-0.179,中风险,中风险 +8.7,7.7663,-0.9337,高风险,中风险 +11.3,10.3971,-0.9029,高风险,高风险 +7.9,7.7066,-0.1934,中风险,中风险 +3.8,3.2693,-0.5307,低风险,低风险 +3.5,4.4652,0.9652,低风险,中风险 +4.5,4.6072,0.1072,中风险,中风险 +4.0,3.6437,-0.3563,中风险,低风险 +5.7,5.0983,-0.6017,中风险,中风险 +5.6,5.2295,-0.3705,中风险,中风险 +1.8,2.3683,0.5683,低风险,低风险 +3.6,3.3305,-0.2695,低风险,低风险 +3.1,3.0831,-0.0169,低风险,低风险 +4.3,4.7561,0.4561,中风险,中风险 +9.2,7.2291,-1.9709,高风险,中风险 +7.5,7.1987,-0.3013,中风险,中风险 +9.2,7.8,-1.4,高风险,中风险 +6.0,4.7816,-1.2184,中风险,中风险 +8.5,9.0191,0.5191,高风险,高风险 +4.5,3.9447,-0.5553,中风险,低风险 +9.2,9.1493,-0.0507,高风险,高风险 +8.9,7.7396,-1.1604,高风险,中风险 +5.3,5.2665,-0.0335,中风险,中风险 +8.6,8.0199,-0.5801,高风险,高风险 +8.4,8.1383,-0.2617,高风险,高风险 +6.8,5.6186,-1.1814,中风险,中风险 +2.8,3.177,0.377,低风险,低风险 +7.2,7.2534,0.0534,中风险,中风险 +5.4,5.2919,-0.1081,中风险,中风险 +4.8,5.0139,0.2139,中风险,中风险 +4.5,4.5032,0.0032,中风险,中风险 +5.3,5.0071,-0.2929,中风险,中风险 +5.0,5.1555,0.1555,中风险,中风险 +2.1,2.6536,0.5536,低风险,低风险 +2.6,2.6194,0.0194,低风险,低风险 +7.5,7.55,0.05,中风险,中风险 +9.0,8.9582,-0.0418,高风险,高风险 +9.4,9.6948,0.2948,高风险,高风险 +3.1,5.024,1.924,低风险,中风险 +4.7,3.4947,-1.2053,中风险,低风险 +9.0,9.1519,0.1519,高风险,高风险 +8.6,7.3083,-1.2917,高风险,中风险 +7.7,6.9569,-0.7431,中风险,中风险 +3.0,3.4081,0.4081,低风险,低风险 +6.3,7.2752,0.9752,中风险,中风险 +2.3,3.527,1.227,低风险,低风险 +5.7,5.2128,-0.4872,中风险,中风险 +3.7,3.8146,0.1146,低风险,低风险 +3.6,4.9342,1.3342,低风险,中风险 +5.4,4.7401,-0.6599,中风险,中风险 +8.3,7.9506,-0.3494,高风险,中风险 +7.9,7.7074,-0.1926,中风险,中风险 +4.7,5.0184,0.3184,中风险,中风险 +7.3,7.6296,0.3296,中风险,中风险 +3.8,4.7738,0.9738,低风险,中风险 +3.0,3.2809,0.2809,低风险,低风险 +7.7,7.0046,-0.6954,中风险,中风险 +7.9,7.1835,-0.7165,中风险,中风险 +7.3,6.9341,-0.3659,中风险,中风险 +4.2,4.3074,0.1074,中风险,中风险 +8.0,8.5349,0.5349,中风险,高风险 +7.1,6.7307,-0.3693,中风险,中风险 +6.5,6.5492,0.0492,中风险,中风险 +4.1,3.723,-0.377,中风险,低风险 +6.4,5.8161,-0.5839,中风险,中风险 +3.2,3.5076,0.3076,低风险,低风险 +8.2,6.9008,-1.2992,高风险,中风险 +4.4,3.9766,-0.4234,中风险,低风险 +5.2,4.7719,-0.4281,中风险,中风险 +8.5,7.1739,-1.3261,高风险,中风险 +8.4,8.4654,0.0654,高风险,高风险 +7.5,7.5299,0.0299,中风险,中风险 +2.7,2.5041,-0.1959,低风险,低风险 +2.1,2.4184,0.3184,低风险,低风险 +5.2,4.3255,-0.8745,中风险,中风险 +7.3,7.1732,-0.1268,中风险,中风险 +8.9,9.2515,0.3515,高风险,高风险 +5.3,5.3153,0.0153,中风险,中风险 +4.9,4.9266,0.0266,中风险,中风险 +9.3,9.3448,0.0448,高风险,高风险 +5.7,5.845,0.145,中风险,中风险 +2.1,2.4295,0.3295,低风险,低风险 +2.7,2.6943,-0.0057,低风险,低风险 +7.1,7.011,-0.089,中风险,中风险 +4.9,5.1256,0.2256,中风险,中风险 +3.5,4.6441,1.1441,低风险,中风险 +7.3,8.0527,0.7527,中风险,高风险 +6.3,7.0342,0.7342,中风险,中风险 +7.9,7.4161,-0.4839,中风险,中风险 +4.6,4.0353,-0.5647,中风险,中风险 +4.7,5.5894,0.8894,中风险,中风险 +8.0,8.4632,0.4632,中风险,高风险 +7.4,6.2557,-1.1443,中风险,中风险 +6.3,6.324,0.024,中风险,中风险 +3.7,3.2476,-0.4524,低风险,低风险 +4.4,4.4424,0.0424,中风险,中风险 +4.5,4.1,-0.4,中风险,中风险 +4.6,3.8743,-0.7257,中风险,低风险 +2.5,3.5842,1.0842,低风险,低风险 +6.3,6.0206,-0.2794,中风险,中风险 +2.4,2.3598,-0.0402,低风险,低风险 +4.6,3.9707,-0.6293,中风险,低风险 +3.9,3.8504,-0.0496,低风险,低风险 +4.8,4.842,0.042,中风险,中风险 +3.9,4.2507,0.3507,低风险,中风险 +4.0,4.141,0.141,中风险,中风险 +4.2,4.1856,-0.0144,中风险,中风险 +8.6,9.6717,1.0717,高风险,高风险 +2.0,2.3971,0.3971,低风险,低风险 +5.9,4.6922,-1.2078,中风险,中风险 +5.6,5.5804,-0.0196,中风险,中风险 +4.7,4.4517,-0.2483,中风险,中风险 +3.2,4.0397,0.8397,低风险,中风险 +4.9,5.1342,0.2342,中风险,中风险 +4.1,4.3183,0.2183,中风险,中风险 +2.0,3.0007,1.0007,低风险,低风险 +4.6,4.3691,-0.2309,中风险,中风险 +4.3,3.9872,-0.3128,中风险,低风险 +1.4,2.5322,1.1322,低风险,低风险 +5.9,5.776,-0.124,中风险,中风险 +6.3,6.3711,0.0711,中风险,中风险 +3.7,4.1502,0.4502,低风险,中风险 +3.6,3.8587,0.2587,低风险,低风险 +7.5,7.8702,0.3702,中风险,中风险 +6.8,5.9239,-0.8761,中风险,中风险 +3.4,3.451,0.051,低风险,低风险 +6.4,7.6827,1.2827,中风险,中风险 +6.0,6.1463,0.1463,中风险,中风险 +6.1,5.6599,-0.4401,中风险,中风险 +5.5,5.3811,-0.1189,中风险,中风险 +5.8,5.2421,-0.5579,中风险,中风险 +1.9,3.2822,1.3822,低风险,低风险 +8.1,8.1002,0.0002,高风险,高风险 +8.2,8.2497,0.0497,高风险,高风险 +3.8,4.6531,0.8531,低风险,中风险 +5.4,5.9363,0.5363,中风险,中风险 +5.4,5.2037,-0.1963,中风险,中风险 +7.8,7.4972,-0.3028,中风险,中风险 +5.3,4.437,-0.863,中风险,中风险 +6.4,6.2112,-0.1888,中风险,中风险 +7.5,7.0307,-0.4693,中风险,中风险 +7.9,7.4264,-0.4736,中风险,中风险 +7.1,7.0672,-0.0328,中风险,中风险 +7.6,7.1718,-0.4282,中风险,中风险 +7.9,7.6978,-0.2022,中风险,中风险 +4.0,4.446,0.446,中风险,中风险 +8.5,7.7408,-0.7592,高风险,中风险 +6.0,4.7115,-1.2885,中风险,中风险 +4.8,5.016,0.216,中风险,中风险 +7.4,6.9157,-0.4843,中风险,中风险 +6.0,5.878,-0.122,中风险,中风险 +3.8,3.9375,0.1375,低风险,低风险 +2.9,3.0109,0.1109,低风险,低风险 +10.2,9.8523,-0.3477,高风险,高风险 +6.5,6.2617,-0.2383,中风险,中风险 +4.1,4.6737,0.5737,中风险,中风险 +7.4,7.3112,-0.0888,中风险,中风险 +7.4,7.0534,-0.3466,中风险,中风险 +5.6,4.6616,-0.9384,中风险,中风险 +6.2,7.1198,0.9198,中风险,中风险 +3.0,3.3699,0.3699,低风险,低风险 +6.8,6.788,-0.012,中风险,中风险 +6.5,5.7012,-0.7988,中风险,中风险 +6.2,6.2141,0.0141,中风险,中风险 +6.9,7.7016,0.8016,中风险,中风险 +1.9,3.2753,1.3753,低风险,低风险 +2.9,3.1282,0.2282,低风险,低风险 +7.7,6.4162,-1.2838,中风险,中风险 +6.6,6.7568,0.1568,中风险,中风险 +8.1,7.1326,-0.9674,高风险,中风险 +2.9,3.0367,0.1367,低风险,低风险 +4.7,5.0365,0.3365,中风险,中风险 +6.9,7.9275,1.0275,中风险,中风险 +5.7,5.109,-0.591,中风险,中风险 +7.6,8.0208,0.4208,中风险,高风险 +6.3,6.1263,-0.1737,中风险,中风险 +3.9,4.0354,0.1354,低风险,中风险 +4.9,4.2575,-0.6425,中风险,中风险 +6.6,6.3674,-0.2326,中风险,中风险 +5.7,4.6768,-1.0232,中风险,中风险 +3.5,1.9367,-1.5633,低风险,低风险 +4.1,4.4658,0.3658,中风险,中风险 +3.1,3.491,0.391,低风险,低风险 +11.6,10.6276,-0.9724,高风险,高风险 +5.1,4.8733,-0.2267,中风险,中风险 +5.7,5.5573,-0.1427,中风险,中风险 +4.8,3.9823,-0.8177,中风险,低风险 +2.0,2.0298,0.0298,低风险,低风险 +2.9,2.3003,-0.5997,低风险,低风险 +4.1,4.3224,0.2224,中风险,中风险 +8.0,7.9521,-0.0479,中风险,中风险 +7.6,7.3595,-0.2405,中风险,中风险 +3.6,3.4178,-0.1822,低风险,低风险 +4.0,3.1393,-0.8607,中风险,低风险 +7.2,6.6586,-0.5414,中风险,中风险 +7.7,7.0057,-0.6943,中风险,中风险 +1.7,3.0975,1.3975,低风险,低风险 +3.7,3.2721,-0.4279,低风险,低风险 +2.7,2.7633,0.0633,低风险,低风险 +6.7,6.1624,-0.5376,中风险,中风险 +3.7,3.6406,-0.0594,低风险,低风险 +2.8,3.4944,0.6944,低风险,低风险 +3.5,4.1259,0.6259,低风险,中风险 +6.7,6.9155,0.2155,中风险,中风险 +5.9,6.9125,1.0125,中风险,中风险 +4.5,4.536,0.036,中风险,中风险 +3.1,4.1306,1.0306,低风险,中风险 +3.9,4.143,0.243,低风险,中风险 +5.4,5.172,-0.228,中风险,中风险 +4.2,3.6094,-0.5906,中风险,低风险 +6.4,6.7337,0.3337,中风险,中风险 +9.2,8.74,-0.46,高风险,高风险 +7.3,7.242,-0.058,中风险,中风险 +5.8,5.5633,-0.2367,中风险,中风险 +8.8,7.9831,-0.8169,高风险,中风险 +4.0,4.4019,0.4019,中风险,中风险 +7.6,7.8095,0.2095,中风险,中风险 +3.7,3.4498,-0.2502,低风险,低风险 +5.3,4.7599,-0.5401,中风险,中风险 +6.4,6.6369,0.2369,中风险,中风险 +8.7,7.6686,-1.0314,高风险,中风险 +8.0,7.9549,-0.0451,中风险,中风险 +11.7,11.115,-0.585,高风险,高风险 +7.9,7.3656,-0.5344,中风险,中风险 +6.7,8.4451,1.7451,中风险,高风险 +3.1,2.9223,-0.1777,低风险,低风险 +6.9,7.0041,0.1041,中风险,中风险 +5.0,5.7284,0.7284,中风险,中风险 +5.2,5.4404,0.2404,中风险,中风险 +3.2,3.6032,0.4032,低风险,低风险 +8.2,7.7732,-0.4268,高风险,中风险 +5.0,4.2489,-0.7511,中风险,中风险 +5.6,6.0312,0.4312,中风险,中风险 +8.6,8.6111,0.0111,高风险,高风险 +4.5,3.7977,-0.7023,中风险,低风险 +9.6,8.7443,-0.8557,高风险,高风险 +5.0,5.0177,0.0177,中风险,中风险 +7.0,7.4549,0.4549,中风险,中风险 +3.5,4.3461,0.8461,低风险,中风险 +9.4,9.9073,0.5073,高风险,高风险 +11.8,11.5438,-0.2562,高风险,高风险 +10.0,9.0249,-0.9751,高风险,高风险 +2.6,3.2487,0.6487,低风险,低风险 +3.6,3.5229,-0.0771,低风险,低风险 +3.7,3.987,0.287,低风险,低风险 +7.1,7.2907,0.1907,中风险,中风险 +2.9,2.6348,-0.2652,低风险,低风险 +6.4,6.2751,-0.1249,中风险,中风险 +4.7,4.2485,-0.4515,中风险,中风险 +4.9,4.7521,-0.1479,中风险,中风险 +5.1,4.9891,-0.1109,中风险,中风险 +8.9,9.8466,0.9466,高风险,高风险 +5.9,5.904,0.004,中风险,中风险 +11.9,12.0623,0.1623,高风险,高风险 +9.6,9.5491,-0.0509,高风险,高风险 +7.2,7.134,-0.066,中风险,中风险 +11.1,10.7497,-0.3503,高风险,高风险 +5.2,5.1226,-0.0774,中风险,中风险 +5.3,5.5003,0.2003,中风险,中风险 +3.8,3.8045,0.0045,低风险,低风险 +2.5,2.4003,-0.0997,低风险,低风险 +3.7,3.5084,-0.1916,低风险,低风险 +8.6,7.8857,-0.7143,高风险,中风险 +7.7,7.1661,-0.5339,中风险,中风险 +2.6,2.6678,0.0678,低风险,低风险 +3.3,2.8549,-0.4451,低风险,低风险 +8.0,7.125,-0.875,中风险,中风险 +7.0,5.782,-1.218,中风险,中风险 +3.7,3.6481,-0.0519,低风险,低风险 +3.0,2.2898,-0.7102,低风险,低风险 +7.0,5.5194,-1.4806,中风险,中风险 +4.5,3.91,-0.59,中风险,低风险 +6.9,5.8795,-1.0205,中风险,中风险 +4.9,5.2554,0.3554,中风险,中风险 +7.7,7.3794,-0.3206,中风险,中风险 +3.7,3.4651,-0.2349,低风险,低风险 +4.5,4.5638,0.0638,中风险,中风险 +7.7,7.2287,-0.4713,中风险,中风险 +10.5,9.919,-0.581,高风险,高风险 +5.2,5.3092,0.1092,中风险,中风险 +7.7,7.0825,-0.6175,中风险,中风险 +8.3,6.3423,-1.9577,高风险,中风险 +8.6,8.3747,-0.2253,高风险,高风险 +5.2,4.7288,-0.4712,中风险,中风险 +6.8,6.6277,-0.1723,中风险,中风险 +6.2,5.6858,-0.5142,中风险,中风险 +6.8,7.0629,0.2629,中风险,中风险 +7.1,7.0131,-0.0869,中风险,中风险 +5.2,4.4659,-0.7341,中风险,中风险 +6.0,5.3598,-0.6402,中风险,中风险 +12.7,12.2786,-0.4214,高风险,高风险 +5.9,5.5446,-0.3554,中风险,中风险 +5.1,4.9234,-0.1766,中风险,中风险 +3.8,3.5335,-0.2665,低风险,低风险 +4.0,2.7888,-1.2112,中风险,低风险 +5.0,4.7062,-0.2938,中风险,中风险 +3.8,4.2334,0.4334,低风险,中风险 +6.6,7.101,0.501,中风险,中风险 +4.5,4.4122,-0.0878,中风险,中风险 +7.1,6.9436,-0.1564,中风险,中风险 +6.4,6.0484,-0.3516,中风险,中风险 +8.5,8.2597,-0.2403,高风险,高风险 +5.5,5.8301,0.3301,中风险,中风险 +5.5,5.6649,0.1649,中风险,中风险 +5.8,6.7731,0.9731,中风险,中风险 +2.9,3.3916,0.4916,低风险,低风险 +7.9,7.6938,-0.2062,中风险,中风险 +4.2,4.8324,0.6324,中风险,中风险 +10.5,11.2153,0.7153,高风险,高风险 +5.8,5.8669,0.0669,中风险,中风险 +5.1,4.701,-0.399,中风险,中风险 +7.5,7.7756,0.2756,中风险,中风险 +7.7,7.3286,-0.3714,中风险,中风险 +6.8,6.0673,-0.7327,中风险,中风险 +8.5,8.0063,-0.4937,高风险,高风险 +5.0,6.0143,1.0143,中风险,中风险 +4.2,3.9302,-0.2698,中风险,低风险 +4.2,4.1062,-0.0938,中风险,中风险 +8.1,8.5379,0.4379,高风险,高风险 +6.8,6.7988,-0.0012,中风险,中风险 +3.0,4.2247,1.2247,低风险,中风险 +5.3,5.7456,0.4456,中风险,中风险 +4.9,4.9518,0.0518,中风险,中风险 +9.2,8.6311,-0.5689,高风险,高风险 +5.0,4.3233,-0.6767,中风险,中风险 +2.9,3.2555,0.3555,低风险,低风险 +5.9,6.6079,0.7079,中风险,中风险 +3.7,4.435,0.735,低风险,中风险 +6.0,6.9081,0.9081,中风险,中风险 +1.9,2.3708,0.4708,低风险,低风险 +6.7,6.4816,-0.2184,中风险,中风险 +7.6,8.0969,0.4969,中风险,高风险 +5.7,6.1896,0.4896,中风险,中风险 +7.8,7.9252,0.1252,中风险,中风险 +2.6,2.724,0.124,低风险,低风险 +2.1,2.6096,0.5096,低风险,低风险 +7.6,7.6782,0.0782,中风险,中风险 +4.4,4.4405,0.0405,中风险,中风险 +4.9,5.2773,0.3773,中风险,中风险 +8.3,8.0637,-0.2363,高风险,高风险 +2.8,2.5391,-0.2609,低风险,低风险 +3.7,3.5863,-0.1137,低风险,低风险 +7.6,7.6172,0.0172,中风险,中风险 +3.7,3.4418,-0.2582,低风险,低风险 +5.9,5.3133,-0.5867,中风险,中风险 +7.5,7.5391,0.0391,中风险,中风险 +5.7,5.4102,-0.2898,中风险,中风险 +6.9,7.4481,0.5481,中风险,中风险 +3.0,3.1874,0.1874,低风险,低风险 +7.3,6.8489,-0.4511,中风险,中风险 +3.0,3.2864,0.2864,低风险,低风险 +3.4,3.212,-0.188,低风险,低风险 +7.1,6.7179,-0.3821,中风险,中风险 +7.2,7.3276,0.1276,中风险,中风险 +5.5,5.8626,0.3626,中风险,中风险 +4.5,5.0647,0.5647,中风险,中风险 +2.2,2.5725,0.3725,低风险,低风险 +8.2,8.9493,0.7493,高风险,高风险 +7.3,6.6404,-0.6596,中风险,中风险 +5.4,5.5328,0.1328,中风险,中风险 +3.3,3.0342,-0.2658,低风险,低风险 +6.8,7.5553,0.7553,中风险,中风险 +7.4,6.1634,-1.2366,中风险,中风险 +4.5,5.4038,0.9038,中风险,中风险 +1.9,1.7018,-0.1982,低风险,低风险 +5.6,5.1447,-0.4553,中风险,中风险 +3.5,3.921,0.421,低风险,低风险 +5.0,4.6901,-0.3099,中风险,中风险 +3.0,1.9509,-1.0491,低风险,低风险 +6.8,6.7255,-0.0745,中风险,中风险 +7.2,7.9272,0.7272,中风险,中风险 +3.2,3.8145,0.6145,低风险,低风险 +6.8,5.6916,-1.1084,中风险,中风险 +8.6,8.2425,-0.3575,高风险,高风险 +6.0,6.2126,0.2126,中风险,中风险 +6.9,7.1386,0.2386,中风险,中风险 +2.4,4.1043,1.7043,低风险,中风险 +6.5,7.2283,0.7283,中风险,中风险 +2.9,3.2707,0.3707,低风险,低风险 +7.4,7.8319,0.4319,中风险,中风险 +11.8,10.8392,-0.9608,高风险,高风险 +7.2,6.6304,-0.5696,中风险,中风险 +5.3,5.5098,0.2098,中风险,中风险 +3.6,4.2207,0.6207,低风险,中风险 +6.8,7.642,0.842,中风险,中风险 +7.3,7.8852,0.5852,中风险,中风险 +6.7,8.0325,1.3325,中风险,高风险 +7.6,6.8734,-0.7266,中风险,中风险 +9.4,8.544,-0.856,高风险,高风险 +3.9,4.6561,0.7561,低风险,中风险 +6.9,6.2554,-0.6446,中风险,中风险 +3.6,3.4055,-0.1945,低风险,低风险 +2.1,2.7292,0.6292,低风险,低风险 +7.9,7.8292,-0.0708,中风险,中风险 +8.5,8.6782,0.1782,高风险,高风险 +8.7,8.0465,-0.6535,高风险,高风险 +8.8,8.2265,-0.5735,高风险,高风险 +6.0,5.9774,-0.0226,中风险,中风险 +7.5,6.3281,-1.1719,中风险,中风险 +3.5,3.8284,0.3284,低风险,低风险 +8.2,8.5767,0.3767,高风险,高风险 +7.3,7.4578,0.1578,中风险,中风险 +9.9,10.5087,0.6087,高风险,高风险 +4.7,5.5652,0.8652,中风险,中风险 +3.8,4.0546,0.2546,低风险,中风险 +4.4,4.3417,-0.0583,中风险,中风险 +3.8,3.981,0.181,低风险,低风险 +6.5,7.0855,0.5855,中风险,中风险 +4.6,4.5276,-0.0724,中风险,中风险 +7.6,7.4544,-0.1456,中风险,中风险 +9.6,8.9994,-0.6006,高风险,高风险 +9.5,8.6017,-0.8983,高风险,高风险 +7.2,6.9219,-0.2781,中风险,中风险 +9.2,7.949,-1.251,高风险,中风险 +9.8,7.9786,-1.8214,高风险,中风险 +5.6,5.5394,-0.0606,中风险,中风险 +7.7,7.3639,-0.3361,中风险,中风险 +9.0,8.2905,-0.7095,高风险,高风险 +4.6,4.825,0.225,中风险,中风险 +7.2,6.8087,-0.3913,中风险,中风险 +9.4,9.4728,0.0728,高风险,高风险 +2.9,2.7124,-0.1876,低风险,低风险 +11.0,9.5726,-1.4274,高风险,高风险 +7.6,6.7486,-0.8514,中风险,中风险 +7.2,6.9669,-0.2331,中风险,中风险 +6.1,5.6969,-0.4031,中风险,中风险 +3.6,3.3565,-0.2435,低风险,低风险 +7.5,7.0584,-0.4416,中风险,中风险 +6.3,5.9149,-0.3851,中风险,中风险 +6.4,6.9947,0.5947,中风险,中风险 +7.8,7.7228,-0.0772,中风险,中风险 +8.1,7.7513,-0.3487,高风险,中风险 +6.7,5.7845,-0.9155,中风险,中风险 +2.2,2.7701,0.5701,低风险,低风险 +7.1,7.8578,0.7578,中风险,中风险 +5.0,5.0323,0.0323,中风险,中风险 +12.1,10.7588,-1.3412,高风险,高风险 +4.2,3.653,-0.547,中风险,低风险 +9.0,9.2638,0.2638,高风险,高风险 +8.4,9.3555,0.9555,高风险,高风险 +6.2,6.5978,0.3978,中风险,中风险 +7.0,7.1362,0.1362,中风险,中风险 +6.8,7.0977,0.2977,中风险,中风险 +6.4,6.5601,0.1601,中风险,中风险 +2.7,2.9424,0.2424,低风险,低风险 +7.4,6.2541,-1.1459,中风险,中风险 +9.5,9.1524,-0.3476,高风险,高风险 +3.5,2.9895,-0.5105,低风险,低风险 +4.8,4.6448,-0.1552,中风险,中风险 +3.9,3.8896,-0.0104,低风险,低风险 +3.4,3.527,0.127,低风险,低风险 +8.5,8.1043,-0.3957,高风险,高风险 +7.6,7.249,-0.351,中风险,中风险 +5.3,4.0332,-1.2668,中风险,中风险 +3.6,3.0049,-0.5951,低风险,低风险 +4.6,4.2841,-0.3159,中风险,中风险 +2.0,2.1397,0.1397,低风险,低风险 +8.5,7.6234,-0.8766,高风险,中风险 +7.1,6.162,-0.938,中风险,中风险 +7.4,6.2621,-1.1379,中风险,中风险 +9.6,8.9113,-0.6887,高风险,高风险 +5.7,5.2141,-0.4859,中风险,中风险 +7.9,6.709,-1.191,中风险,中风险 +9.0,7.8722,-1.1278,高风险,中风险 +7.7,7.7749,0.0749,中风险,中风险 +7.3,7.5362,0.2362,中风险,中风险 +4.0,3.83,-0.17,中风险,低风险 +4.6,4.7554,0.1554,中风险,中风险 +7.1,7.2164,0.1164,中风险,中风险 +4.3,5.1121,0.8121,中风险,中风险 +7.5,7.6367,0.1367,中风险,中风险 +8.7,7.7807,-0.9193,高风险,中风险 +8.3,7.7125,-0.5875,高风险,中风险 +4.5,4.1583,-0.3417,中风险,中风险 +3.7,4.1263,0.4263,低风险,中风险 +2.8,3.5325,0.7325,低风险,低风险 +2.9,2.8919,-0.0081,低风险,低风险 +7.1,7.1193,0.0193,中风险,中风险 +3.9,4.2049,0.3049,低风险,中风险 +9.8,10.3381,0.5381,高风险,高风险 +7.0,6.6414,-0.3586,中风险,中风险 +8.5,8.9294,0.4294,高风险,高风险 +6.7,6.4071,-0.2929,中风险,中风险 +7.8,7.9923,0.1923,中风险,中风险 +11.6,11.3595,-0.2405,高风险,高风险 +11.5,11.6589,0.1589,高风险,高风险 +11.0,11.5079,0.5079,高风险,高风险 +4.9,5.0867,0.1867,中风险,中风险 +8.2,7.8951,-0.3049,高风险,中风险 +9.8,9.1991,-0.6009,高风险,高风险 +7.9,7.5111,-0.3889,中风险,中风险 +5.6,4.7981,-0.8019,中风险,中风险 +6.9,6.821,-0.079,中风险,中风险 +6.2,7.3818,1.1818,中风险,中风险 +2.9,2.8628,-0.0372,低风险,低风险 +7.9,8.9399,1.0399,中风险,高风险 +6.7,6.4468,-0.2532,中风险,中风险 +3.7,3.5086,-0.1914,低风险,低风险 +5.5,4.5682,-0.9318,中风险,中风险 +5.9,6.0405,0.1405,中风险,中风险 +6.6,6.0472,-0.5528,中风险,中风险 +1.9,2.4701,0.5701,低风险,低风险 +3.7,3.8704,0.1704,低风险,低风险 +4.6,3.7162,-0.8838,中风险,低风险 +6.3,6.3824,0.0824,中风险,中风险 +9.8,10.1742,0.3742,高风险,高风险 +4.3,4.7728,0.4728,中风险,中风险 +5.1,4.7556,-0.3444,中风险,中风险 +4.6,4.9442,0.3442,中风险,中风险 +4.7,4.7641,0.0641,中风险,中风险 +6.8,7.0741,0.2741,中风险,中风险 +7.3,7.7248,0.4248,中风险,中风险 +7.7,7.5508,-0.1492,中风险,中风险 +5.4,5.0332,-0.3668,中风险,中风险 +3.8,3.729,-0.071,低风险,低风险 +5.8,5.6078,-0.1922,中风险,中风险 +8.2,7.468,-0.732,高风险,中风险 +3.9,4.3078,0.4078,低风险,中风险 +7.6,6.7555,-0.8445,中风险,中风险 +5.5,5.3971,-0.1029,中风险,中风险 +5.1,4.6108,-0.4892,中风险,中风险 +3.9,3.3013,-0.5987,低风险,低风险 +7.3,6.6781,-0.6219,中风险,中风险 +4.2,3.5031,-0.6969,中风险,低风险 +6.3,5.5266,-0.7734,中风险,中风险 +4.9,5.79,0.89,中风险,中风险 +5.4,3.889,-1.511,中风险,低风险 +4.6,4.3601,-0.2399,中风险,中风险 +5.1,5.4622,0.3622,中风险,中风险 +10.7,10.1721,-0.5279,高风险,高风险 +2.5,3.5917,1.0917,低风险,低风险 +4.2,4.1363,-0.0637,中风险,中风险 +5.6,6.1071,0.5071,中风险,中风险 +9.0,9.4307,0.4307,高风险,高风险 +5.1,5.267,0.167,中风险,中风险 +9.3,8.0694,-1.2306,高风险,高风险 +7.0,7.4015,0.4015,中风险,中风险 +4.1,4.9332,0.8332,中风险,中风险 +7.5,7.3161,-0.1839,中风险,中风险 +4.8,4.6539,-0.1461,中风险,中风险 +3.2,3.4086,0.2086,低风险,低风险 +3.4,3.4066,0.0066,低风险,低风险 +5.5,5.3683,-0.1317,中风险,中风险 +7.2,6.6502,-0.5498,中风险,中风险 +8.8,7.7426,-1.0574,高风险,中风险 +4.7,3.884,-0.816,中风险,低风险 +7.1,7.0029,-0.0971,中风险,中风险 +2.8,3.3349,0.5349,低风险,低风险 +5.9,6.3324,0.4324,中风险,中风险 +4.0,3.7305,-0.2695,中风险,低风险 +6.5,6.4484,-0.0516,中风险,中风险 +6.1,6.9183,0.8183,中风险,中风险 +3.3,3.1982,-0.1018,低风险,低风险 +4.2,4.0574,-0.1426,中风险,中风险 +6.1,5.5961,-0.5039,中风险,中风险 +2.5,3.0391,0.5391,低风险,低风险 +3.1,3.4012,0.3012,低风险,低风险 +5.4,5.2101,-0.1899,中风险,中风险 +7.5,6.4255,-1.0745,中风险,中风险 +4.2,3.8983,-0.3017,中风险,低风险 +4.7,4.6821,-0.0179,中风险,中风险 +3.8,4.2771,0.4771,低风险,中风险 diff --git a/backend/requirements.txt b/backend/requirements.txt index c35d052..edd634a 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -12,6 +12,7 @@ xgboost==1.7.6 lightgbm==4.1.0 torch==2.6.0 joblib==1.3.1 +shap>=0.43.0 # Utilities python-dotenv==1.0.0 diff --git a/backend/services/jdr_service.py b/backend/services/jdr_service.py new file mode 100644 index 0000000..166ed22 --- /dev/null +++ b/backend/services/jdr_service.py @@ -0,0 +1,212 @@ +import numpy as np +import pandas as pd + +import config +from core.model_features import engineer_features +from core.preprocessing import get_clean_data + + +class JDRService: + """JD-R(工作要求-资源)理论分析服务""" + + def __init__(self): + self._df = None + + def _ensure_data(self): + if self._df is None: + self._df = get_clean_data() + self._df = engineer_features(self._df) + + def get_dimension_scores(self): + """JD-R 三维度统计分布""" + self._ensure_data() + df = self._df + + result = {} + for dim_key, col_name in [ + ('demands', '工作要求指数'), + ('resources', '工作资源指数'), + ('personal', '个人资源指数'), + ]: + if col_name not in df.columns: + continue + vals = df[col_name].dropna() + bins = np.linspace(vals.min(), vals.max(), 8) + hist, edges = np.histogram(vals, bins=bins) + result[dim_key] = { + 'mean': round(float(vals.mean()), 2), + 'std': round(float(vals.std()), 2), + 'median': round(float(vals.median()), 2), + 'distribution': [ + {'range': f'{round(edges[i], 1)}-{round(edges[i+1], 1)}', 'count': int(hist[i])} + for i in range(len(hist)) + ], + } + + # JD-R 平衡度 + if 'JD-R平衡度' in df.columns: + balance = df['JD-R平衡度'].dropna() + result['balance'] = { + 'mean': round(float(balance.mean()), 2), + 'positive_ratio': round(float((balance > 0).mean()) * 100, 1), + } + + return result + + def get_burnout_engagement_analysis(self): + """倦怠与投入分析""" + self._ensure_data() + df = self._df + + result = {} + + if '工作倦怠' in df.columns: + burnout = df['工作倦怠'].dropna() + result['burnout'] = { + 'mean': round(float(burnout.mean()), 2), + 'std': round(float(burnout.std()), 2), + 'high_risk_ratio': round(float((burnout >= 5).mean()) * 100, 1), + 'distribution': self._make_distribution(burnout, 1, 7, 7), + } + + if '工作投入' in df.columns: + engagement = df['工作投入'].dropna() + result['engagement'] = { + 'mean': round(float(engagement.mean()), 2), + 'std': round(float(engagement.std()), 2), + 'low_engagement_ratio': round(float((engagement <= 3).mean()) * 100, 1), + 'distribution': self._make_distribution(engagement, 1, 7, 7), + } + + # 相关性分析 + corr_cols = {} + if '工作倦怠' in df.columns: + corr_cols['burnout'] = '工作倦怠' + if '工作投入' in df.columns: + corr_cols['engagement'] = '工作投入' + if '工作要求指数' in df.columns: + corr_cols['demands'] = '工作要求指数' + if '工作资源指数' in df.columns: + corr_cols['resources'] = '工作资源指数' + if config.TARGET_COLUMN in df.columns: + corr_cols['absence_hours'] = config.TARGET_COLUMN + + if len(corr_cols) >= 2: + corr_df = df[[v for v in corr_cols.values()]].dropna() + corr_matrix = corr_df.corr() + correlations = {} + for k1, v1 in corr_cols.items(): + for k2, v2 in corr_cols.items(): + if k1 != k2 and v1 in corr_matrix.index and v2 in corr_matrix.columns: + correlations[f'{k1}_vs_{k2}'] = round(float(corr_matrix.loc[v1, v2]), 3) + result['correlations'] = correlations + + return result + + def get_jdr_path_analysis(self): + """JD-R 双路径中介分析""" + self._ensure_data() + df = self._df + + result = {} + + target = config.TARGET_COLUMN + + # 健康损伤路径: demands -> burnout -> absence + if all(col in df.columns for col in ['工作要求指数', '工作倦怠', target]): + cols = ['工作要求指数', '工作倦怠', target] + sub = df[cols].dropna() + if len(sub) > 30: + r_demands_burnout = sub['工作要求指数'].corr(sub['工作倦怠']) + r_burnout_absence = sub['工作倦怠'].corr(sub[target]) + r_demands_absence = sub['工作要求指数'].corr(sub[target]) + indirect = r_demands_burnout * r_burnout_absence + result['health_impairment'] = { + 'direct_effect_demands': round(float(r_demands_absence), 3), + 'indirect_via_burnout': round(float(indirect), 3), + 'mediation_ratio': round(float(indirect / r_demands_absence) if r_demands_absence != 0 else 0, 3), + 'demands_to_burnout': round(float(r_demands_burnout), 3), + 'burnout_to_absence': round(float(r_burnout_absence), 3), + } + + # 激励路径: resources -> engagement -> lower absence + if all(col in df.columns for col in ['工作资源指数', '工作投入', target]): + cols = ['工作资源指数', '工作投入', target] + sub = df[cols].dropna() + if len(sub) > 30: + r_resources_engagement = sub['工作资源指数'].corr(sub['工作投入']) + r_engagement_absence = sub['工作投入'].corr(sub[target]) + r_resources_absence = sub['工作资源指数'].corr(sub[target]) + indirect = r_resources_engagement * r_engagement_absence + result['motivational'] = { + 'direct_effect_resources': round(float(r_resources_absence), 3), + 'indirect_via_engagement': round(float(indirect), 3), + 'mediation_ratio': round(float(indirect / r_resources_absence) if r_resources_absence != 0 else 0, 3), + 'resources_to_engagement': round(float(r_resources_engagement), 3), + 'engagement_to_absence': round(float(r_engagement_absence), 3), + } + + return result + + def get_jdr_profile(self, dimension='所属行业'): + """按维度分组的 JD-R 轮廓""" + self._ensure_data() + df = self._df + + if dimension not in df.columns: + return {'error': f'Dimension {dimension} not found'} + + score_cols = ['工作要求指数', '工作资源指数', '个人资源指数', '工作倦怠', '工作投入'] + existing_cols = [c for c in score_cols if c in df.columns] + if not existing_cols: + return {'error': 'JD-R scores not computed'} + + group_cols = [dimension] + existing_cols + if config.TARGET_COLUMN in df.columns: + group_cols.append(config.TARGET_COLUMN) + + grouped = df[group_cols].groupby(dimension).agg(['mean', 'std']).round(2) + + profiles = [] + for group_name in grouped.index: + profile = {'group_name': str(group_name)} + for col in existing_cols: + profile[col] = round(float(grouped.loc[group_name, (col, 'mean')]), 2) + if config.TARGET_COLUMN in df.columns: + profile['avg_absence_hours'] = round(float(grouped.loc[group_name, (config.TARGET_COLUMN, 'mean')]), 2) + profiles.append(profile) + + return {'dimension': dimension, 'profiles': profiles} + + def get_risk_distribution(self): + """风险等级分布""" + self._ensure_data() + df = self._df + + target = config.TARGET_COLUMN + if target not in df.columns: + return {'error': 'Target column not found'} + + hours = df[target] + levels = [ + {'level': 'low', 'label': '低风险', 'color': '#22c55e', 'count': int((hours < 4).sum()), + 'percentage': round(float((hours < 4).mean()) * 100, 1), 'avg_hours': round(float(hours[hours < 4].mean()), 2) if (hours < 4).any() else 0}, + {'level': 'medium', 'label': '中风险', 'color': '#f59e0b', 'count': int(((hours >= 4) & (hours <= 8)).sum()), + 'percentage': round(float(((hours >= 4) & (hours <= 8)).mean()) * 100, 1), + 'avg_hours': round(float(hours[(hours >= 4) & (hours <= 8)].mean()), 2) if ((hours >= 4) & (hours <= 8)).any() else 0}, + {'level': 'high', 'label': '高风险', 'color': '#ef4444', 'count': int((hours > 8).sum()), + 'percentage': round(float((hours > 8).mean()) * 100, 1), 'avg_hours': round(float(hours[hours > 8].mean()), 2) if (hours > 8).any() else 0}, + ] + + return {'levels': levels, 'total': len(hours)} + + def _make_distribution(self, series, low, high, n_bins): + bins = np.linspace(low, high, n_bins + 1) + hist, edges = np.histogram(series, bins=bins) + return [ + {'range': f'{round(edges[i], 1)}-{round(edges[i+1], 1)}', 'count': int(hist[i])} + for i in range(len(hist)) + ] + + +jdr_service = JDRService() diff --git a/backend/services/predict_service.py b/backend/services/predict_service.py index 2e451b6..322e876 100644 --- a/backend/services/predict_service.py +++ b/backend/services/predict_service.py @@ -32,6 +32,8 @@ MODEL_INFO = { class PredictService: def __init__(self): self.models = {} + self.classifiers = {} + self.classification_metrics = {} self.scaler = None self.feature_names = None self.selected_features = None @@ -94,6 +96,21 @@ class PredictService: if valid_metrics: self.default_model = max(valid_metrics.items(), key=lambda item: item[1]['r2'])[0] + # 加载风险分类模型 + for name in ['random_forest', 'gradient_boosting', 'lightgbm', 'xgboost']: + path = os.path.join(config.MODELS_DIR, f'risk_{name}_classifier.pkl') + if os.path.exists(path): + try: + self.classifiers[name] = joblib.load(path) + except Exception: + pass + cls_metrics_path = os.path.join(config.MODELS_DIR, 'classification_metrics.pkl') + if os.path.exists(cls_metrics_path): + try: + self.classification_metrics = joblib.load(cls_metrics_path) + except Exception: + pass + def get_available_models(self): self._ensure_models_loaded() models = [] @@ -131,10 +148,15 @@ class PredictService: risk_level, risk_label = self._get_risk_level(predicted_hours) confidence = max(0.5, self.model_metrics.get(model_type, {}).get('r2', 0.82)) + + # 风险分类概率 + risk_probability = self._get_risk_probability(features, model_type) + return { 'predicted_hours': round(predicted_hours, 2), 'risk_level': risk_level, 'risk_label': risk_label, + 'risk_probability': risk_probability, 'confidence': round(confidence, 2), 'model_used': model_type, 'model_name_cn': MODEL_INFO.get(model_type, {}).get('name_cn', model_type), @@ -198,11 +220,65 @@ class PredictService: 'predicted_hours': round(max(0.5, base_hours), 2), 'risk_level': risk_level, 'risk_label': risk_label, + 'risk_probability': {'low': 0.0, 'medium': 1.0, 'high': 0.0}, 'confidence': 0.72, 'model_used': 'default', 'model_name_cn': '默认规则', } + def _get_risk_probability(self, features, model_type): + """获取分类器预测的风险概率""" + classifier = self.classifiers.get(model_type) + if classifier is None: + classifier = self.classifiers.get('random_forest') + if classifier is None: + return {'low': 0.0, 'medium': 1.0, 'high': 0.0} + try: + proba = classifier.predict_proba([features])[0] + classes = list(classifier.classes_) + result = {'low': 0.0, 'medium': 0.0, 'high': 0.0} + label_map = {0: 'low', 1: 'medium', 2: 'high'} + for idx, cls in enumerate(classes): + if cls in label_map: + result[label_map[cls]] = round(float(proba[idx]), 4) + return result + except Exception: + return {'low': 0.0, 'medium': 1.0, 'high': 0.0} + + def predict_risk_classification(self, data, model_type=None): + """使用分类模型直接预测风险等级""" + self._ensure_models_loaded() + model_type = model_type or self.default_model + classifier = self.classifiers.get(model_type) + if classifier is None: + classifier = self.classifiers.get('random_forest') + if classifier is None or self.scaler is None: + return None + + features = self._prepare_features(data) + try: + pred_class = int(classifier.predict([features])[0]) + proba = classifier.predict_proba([features])[0] + label_map = {0: 'low', 1: 'medium', 2: 'high'} + risk_labels_map = {'low': '低风险', 'medium': '中风险', 'high': '高风险'} + risk_level = label_map.get(pred_class, 'medium') + + classes = list(classifier.classes_) + probabilities = {'low': 0.0, 'medium': 0.0, 'high': 0.0} + for idx, cls in enumerate(classes): + if cls in label_map: + probabilities[label_map[cls]] = round(float(proba[idx]), 4) + + return { + 'risk_level': risk_level, + 'risk_label': risk_labels_map[risk_level], + 'risk_probability': probabilities, + 'model_used': model_type, + 'classification_metrics': self.classification_metrics.get(model_type, {}), + } + except Exception: + return None + def get_model_info(self): self._ensure_models_loaded() return { diff --git a/backend/services/shap_service.py b/backend/services/shap_service.py new file mode 100644 index 0000000..931e646 --- /dev/null +++ b/backend/services/shap_service.py @@ -0,0 +1,31 @@ +from core.shap_analysis import SHAPAnalyzer + + +class SHAPService: + """SHAP 可解释性分析服务""" + + def __init__(self): + self._analyzer = None + + def _ensure_analyzer(self): + if self._analyzer is None: + self._analyzer = SHAPAnalyzer() + + def get_global_importance(self, model_type='random_forest'): + self._ensure_analyzer() + return self._analyzer.global_shap_values(model_type) + + def get_local_explanation(self, data, model_type='random_forest'): + self._ensure_analyzer() + return self._analyzer.local_shap_values(data, model_type) + + def get_interactions(self, model_type='random_forest', top_n=10): + self._ensure_analyzer() + return self._analyzer.shap_interaction(model_type, top_n) + + def get_dependence(self, feature_name, model_type='random_forest'): + self._ensure_analyzer() + return self._analyzer.shap_dependence(feature_name, model_type) + + +shap_service = SHAPService() diff --git a/frontend/package-lock.json b/frontend/package-lock.json new file mode 100644 index 0000000..611c26d --- /dev/null +++ b/frontend/package-lock.json @@ -0,0 +1,1720 @@ +{ + "name": "absenteeism-analysis-frontend", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "absenteeism-analysis-frontend", + "version": "1.0.0", + "dependencies": { + "@element-plus/icons-vue": "^2.3.2", + "axios": "^1.6.2", + "echarts": "^5.4.3", + "element-plus": "^2.4.4", + "vue": "^3.4.0", + "vue-router": "^4.2.5" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.5.2", + "vite": "^5.0.10" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@ctrl/tinycolor": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-4.2.0.tgz", + "integrity": "sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/@element-plus/icons-vue": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.3.2.tgz", + "integrity": "sha512-OzIuTaIfC8QXEPmJvB4Y4kw34rSXdCJzxcD1kFStBvr8bK6X1zQAYDo0CNMjojnfTqRQCJ0I7prlErcoRiET2A==", + "license": "MIT", + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", + "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz", + "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.5", + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", + "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", + "license": "MIT" + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@popperjs/core": { + "name": "@sxzz/popperjs-es", + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.8.tgz", + "integrity": "sha512-wOwESXvvED3S8xBmcPWHs2dUuzrE4XiZeFu7e1hROIJkm02a49N120pmOXxY33sBb6hArItm5W5tcg1cBtV+HQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/lodash": { + "version": "4.17.24", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.24.tgz", + "integrity": "sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==", + "license": "MIT" + }, + "node_modules/@types/lodash-es": { + "version": "4.17.12", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", + "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "license": "MIT", + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", + "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==", + "license": "MIT" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.6.2.tgz", + "integrity": "sha512-kqf7SGFoG+80aZG6Pf+gsZIVvGSCKE98JbiWqcCV9cThtg91Jav0yvYFC9Zb+jKetNGF6ZKeoaxgZfND21fWKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.0.0 || ^5.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.30.tgz", + "integrity": "sha512-s3DfdZkcu/qExZ+td75015ljzHc6vE+30cFMGRPROYjqkroYI5NV2X1yAMX9UeyBNWB9MxCfPcsjpLS11nzkkw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@vue/shared": "3.5.30", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.30.tgz", + "integrity": "sha512-eCFYESUEVYHhiMuK4SQTldO3RYxyMR/UQL4KdGD1Yrkfdx4m/HYuZ9jSfPdA+nWJY34VWndiYdW/wZXyiPEB9g==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.30", + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.30.tgz", + "integrity": "sha512-LqmFPDn89dtU9vI3wHJnwaV6GfTRD87AjWpTWpyrdVOObVtjIuSeZr181z5C4PmVx/V3j2p+0f7edFKGRMpQ5A==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@vue/compiler-core": "3.5.30", + "@vue/compiler-dom": "3.5.30", + "@vue/compiler-ssr": "3.5.30", + "@vue/shared": "3.5.30", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.8", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.30.tgz", + "integrity": "sha512-NsYK6OMTnx109PSL2IAyf62JP6EUdk4Dmj6AkWcJGBvN0dQoMYtVekAmdqgTtWQgEJo+Okstbf/1p7qZr5H+bA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.30", + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", + "license": "MIT" + }, + "node_modules/@vue/reactivity": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.30.tgz", + "integrity": "sha512-179YNgKATuwj9gB+66snskRDOitDiuOZqkYia7mHKJaidOMo/WJxHKF8DuGc4V4XbYTJANlfEKb0yxTQotnx4Q==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.30.tgz", + "integrity": "sha512-e0Z+8PQsUTdwV8TtEsLzUM7SzC7lQwYKePydb7K2ZnmS6jjND+WJXkmmfh/swYzRyfP1EY3fpdesyYoymCzYfg==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.30", + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.30.tgz", + "integrity": "sha512-2UIGakjU4WSQ0T4iwDEW0W7vQj6n7AFn7taqZ9Cvm0Q/RA2FFOziLESrDL4GmtI1wV3jXg5nMoJSYO66egDUBw==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.30", + "@vue/runtime-core": "3.5.30", + "@vue/shared": "3.5.30", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.30.tgz", + "integrity": "sha512-v+R34icapydRwbZRD0sXwtHqrQJv38JuMB4JxbOxd8NEpGLny7cncMp53W9UH/zo4j8eDHjQ1dEJXwzFQknjtQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.30", + "@vue/shared": "3.5.30" + }, + "peerDependencies": { + "vue": "3.5.30" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.30.tgz", + "integrity": "sha512-YXgQ7JjaO18NeK2K9VTbDHaFy62WrObMa6XERNfNOkAhD1F1oDSf3ZJ7K6GqabZ0BvSDHajp8qfS5Sa2I9n8uQ==", + "license": "MIT" + }, + "node_modules/@vueuse/core": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-12.0.0.tgz", + "integrity": "sha512-C12RukhXiJCbx4MGhjmd/gH52TjJsc3G0E0kQj/kb19H3Nt6n1CA4DRWuTdWWcaFRdlTe0npWDS942mvacvNBw==", + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.20", + "@vueuse/metadata": "12.0.0", + "@vueuse/shared": "12.0.0", + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/metadata": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.0.0.tgz", + "integrity": "sha512-Yzimd1D3sjxTDOlF05HekU5aSGdKjxhuhRFHA7gDWLn57PRbBIh+SF5NmjhJ0WRgF3my7T8LBucyxdFJjIfRJQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-12.0.0.tgz", + "integrity": "sha512-3i6qtcq2PIio5i/vVYidkkcgvmTjCqrf26u+Fd4LhnbBmIT6FN8y6q/GJERp8lfcB9zVEfjdV0Br0443qZuJpw==", + "license": "MIT", + "dependencies": { + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==", + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.6.tgz", + "integrity": "sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/dayjs": { + "version": "1.11.19", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz", + "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==", + "license": "MIT" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/echarts": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.6.0.tgz", + "integrity": "sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "2.3.0", + "zrender": "5.6.1" + } + }, + "node_modules/element-plus": { + "version": "2.13.5", + "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.13.5.tgz", + "integrity": "sha512-dmY24fhSREfZN/PuUt0YZigMso7wWzl+B5o+YKNN15kQIn/0hzamsPU+ebj9SES0IbUqsLX1wkrzYmzU8VrVOQ==", + "license": "MIT", + "dependencies": { + "@ctrl/tinycolor": "^4.2.0", + "@element-plus/icons-vue": "^2.3.2", + "@floating-ui/dom": "^1.0.1", + "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7", + "@types/lodash": "^4.17.20", + "@types/lodash-es": "^4.17.12", + "@vueuse/core": "12.0.0", + "async-validator": "^4.2.5", + "dayjs": "^1.11.19", + "lodash": "^4.17.23", + "lodash-es": "^4.17.23", + "lodash-unified": "^1.0.3", + "memoize-one": "^6.0.0", + "normalize-wheel-es": "^1.2.0" + }, + "peerDependencies": { + "vue": "^3.3.0" + } + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.23.tgz", + "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==", + "license": "MIT" + }, + "node_modules/lodash-unified": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/lodash-unified/-/lodash-unified-1.0.3.tgz", + "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==", + "license": "MIT", + "peerDependencies": { + "@types/lodash-es": "*", + "lodash": "*", + "lodash-es": "*" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", + "license": "MIT" + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/normalize-wheel-es": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", + "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==", + "license": "BSD-3-Clause" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/rollup": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "license": "0BSD" + }, + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vue": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.30.tgz", + "integrity": "sha512-hTHLc6VNZyzzEH/l7PFGjpcTvUgiaPK5mdLkbjrTeWSRcEfxFrv56g/XckIYlE9ckuobsdwqd5mk2g1sBkMewg==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.30", + "@vue/compiler-sfc": "3.5.30", + "@vue/runtime-dom": "3.5.30", + "@vue/server-renderer": "3.5.30", + "@vue/shared": "3.5.30" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-router": { + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.6.4.tgz", + "integrity": "sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^6.6.4" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/zrender": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.6.1.tgz", + "integrity": "sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==", + "license": "BSD-3-Clause", + "dependencies": { + "tslib": "2.3.0" + } + } + } +} diff --git a/frontend/src/App.vue b/frontend/src/App.vue index ddef2dd..f8ccbe6 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -28,6 +28,10 @@ 员工画像 + + + JD-R分析 + @@ -67,7 +71,7 @@ + + diff --git a/frontend/src/views/Prediction.vue b/frontend/src/views/Prediction.vue index 4529b40..a7352a7 100644 --- a/frontend/src/views/Prediction.vue +++ b/frontend/src/views/Prediction.vue @@ -297,15 +297,36 @@ + + +
+ + {{ dim }}: {{ val >= 0 ? '+' : '' }}{{ val }} + +
+
+
+