Files
forsetsystem/backend/config.py
shuo e8235bf3ca feat: 添加 JD-R 理论分析模块与 SHAP 可解释性分析功能
- 后端新增 JD-R(工作要求-资源)理论维度数据生成,包含工作要求、工作资源、
    个人资源、中介变量共 16 个新特征列
  - 新增 JD-R 分析服务与 API(维度统计、倦怠投入分析、双路径中介分析、
    分组轮廓、风险分布)
  - 新增 SHAP 可解释性分析模块(全局重要性、局部解释、特征交互、依赖图)
  - 预测服务增加风险分类模型加载与概率预测能力
  - 前端新增 JD-R 分析页面(JDRAnalysis.vue),含雷达图、散点图、路径分析等可视化
  - 预测页面增加风险概率展示与 SHAP 特征解释
  - 路由与导航菜单同步更新
2026-04-04 07:15:46 +08:00

210 lines
6.8 KiB
Python

import os
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
DATA_DIR = os.path.join(BASE_DIR, 'data')
RAW_DATA_DIR = os.path.join(DATA_DIR, 'raw')
PROCESSED_DATA_DIR = os.path.join(DATA_DIR, 'processed')
MODELS_DIR = os.path.join(BASE_DIR, 'models')
RAW_DATA_FILENAME = 'china_enterprise_absence_events.csv'
RAW_DATA_PATH = os.path.join(RAW_DATA_DIR, RAW_DATA_FILENAME)
CLEAN_DATA_PATH = os.path.join(PROCESSED_DATA_DIR, 'clean_data.csv')
RF_MODEL_PATH = os.path.join(MODELS_DIR, 'rf_model.pkl')
XGB_MODEL_PATH = os.path.join(MODELS_DIR, 'xgb_model.pkl')
KMEANS_MODEL_PATH = os.path.join(MODELS_DIR, 'kmeans_model.pkl')
SCALER_PATH = os.path.join(MODELS_DIR, 'scaler.pkl')
ENCODER_PATH = os.path.join(MODELS_DIR, 'encoder.pkl')
CSV_SEPARATOR = ','
RANDOM_STATE = 42
TEST_SIZE = 0.2
TARGET_COLUMN = '缺勤时长(小时)'
EMPLOYEE_ID_COLUMN = '员工编号'
COMPANY_ID_COLUMN = '企业编号'
EVENT_SEQUENCE_COLUMN = '事件序号'
EVENT_DATE_INDEX_COLUMN = '事件日期索引'
WEEKDAY_NAMES = {
1: '周一',
2: '周二',
3: '周三',
4: '周四',
5: '周五',
6: '周六',
7: '周日',
}
SEASON_NAMES = {
1: '冬季',
2: '春季',
3: '夏季',
4: '秋季',
}
INDUSTRY_NAMES = [
'制造业',
'互联网',
'零售连锁',
'物流运输',
'金融服务',
'医药健康',
'建筑工程',
]
LEAVE_TYPE_NAMES = [
'病假',
'事假',
'年假',
'调休',
'婚假',
'丧假',
'产检育儿假',
'工伤假',
'其他',
]
REASON_CATEGORY_NAMES = [
'身体不适',
'家庭事务',
'子女照护',
'交通受阻',
'突发事件',
'职业疲劳',
'就医复查',
]
FEATURE_NAME_CN = {
'企业编号': '企业编号',
'所属行业': '所属行业',
'企业规模': '企业规模',
'所在城市等级': '所在城市等级',
'用工类型': '用工类型',
'部门条线': '部门条线',
'岗位序列': '岗位序列',
'岗位级别': '岗位级别',
'员工编号': '员工编号',
'性别': '性别',
'年龄': '年龄',
'司龄年数': '司龄年数',
'最高学历': '最高学历',
'婚姻状态': '婚姻状态',
'是否本地户籍': '是否本地户籍',
'子女数量': '子女数量',
'是否独生子女家庭负担': '独生子女家庭负担',
'居住类型': '居住类型',
'班次类型': '班次类型',
'是否夜班岗位': '是否夜班岗位',
'月均加班时长': '月均加班时长',
'近30天出勤天数': '近30天出勤天数',
'近90天缺勤次数': '近90天缺勤次数',
'近180天请假总时长': '近180天请假总时长',
'通勤时长分钟': '通勤时长分钟',
'通勤距离公里': '通勤距离公里',
'是否跨城通勤': '是否跨城通勤',
'绩效等级': '绩效等级',
'近12月违纪次数': '近12月违纪次数',
'团队人数': '团队人数',
'直属上级管理跨度': '直属上级管理跨度',
'BMI': 'BMI',
'是否慢性病史': '是否慢性病史',
'年度体检异常标记': '年度体检异常',
'近30天睡眠时长均值': '睡眠时长',
'每周运动频次': '运动频次',
'是否吸烟': '是否吸烟',
'是否饮酒': '是否饮酒',
'心理压力等级': '心理压力等级',
'是否长期久坐岗位': '是否久坐岗位',
'缺勤月份': '缺勤月份',
'星期几': '星期几',
'是否节假日前后': '节假日前后',
'季节': '季节',
'请假申请渠道': '请假申请渠道',
'请假类型': '请假类型',
'请假原因大类': '请假原因大类',
'是否提供医院证明': '医院证明',
'是否临时请假': '临时请假',
'是否连续缺勤': '连续缺勤',
'前一工作日是否加班': '前一工作日加班',
'事件日期': '事件日期',
'事件日期索引': '事件日期索引',
'事件序号': '事件序号',
'员工历史事件数': '员工历史事件数',
'缺勤时长(小时)': '缺勤时长',
'加班通勤压力指数': '加班通勤压力指数',
'家庭负担指数': '家庭负担指数',
'健康风险指数': '健康风险指数',
'岗位稳定性指数': '岗位稳定性指数',
'节假日风险标记': '节假日风险标记',
'排班压力标记': '排班压力标记',
'缺勤历史强度': '缺勤历史强度',
'生活规律指数': '生活规律指数',
'管理负荷指数': '管理负荷指数',
'工龄分层': '工龄分层',
'年龄分层': '年龄分层',
'通勤分层': '通勤分层',
'加班分层': '加班分层',
# 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'