我来设计一个综合Python案例,模拟一个真实的"员工晋级评估系统"。

案例场景:公司员工晋级评估系统
需求说明
公司需要从5名员工中选出晋级者,评估标准包括:
- 工作绩效(KPI)
- 技能水平
- 团队协作
- 项目贡献
- 领导潜力
完整实现代码
import json
import random
from datetime import datetime
from typing import List, Dict
import pandas as pd
import numpy as np
class Employee:
"""员工类"""
def __init__(self, name, dept, position, years):
self.name = name
self.dept = dept
self.position = position
self.years = years
self.scores = {} # 各维度评分
self.total_score = 0
self.ranking = 0
def set_scores(self, kpi, skill, teamwork, project, leadership):
"""设置各维度评分"""
self.scores = {
'KPI': kpi,
'技能水平': skill,
'团队协作': teamwork,
'项目贡献': project,
'领导潜力': leadership
}
# 加权计算总分
weights = {'KPI': 0.3, '技能水平': 0.2, '团队协作': 0.2,
'项目贡献': 0.2, '领导潜力': 0.1}
self.total_score = sum(self.scores[k] * weights[k]
for k in self.scores.keys())
class PromotionSystem:
"""晋级评估系统"""
def __init__(self):
self.employees = []
self.history = [] # 历史评估记录
def add_employee(self, emp: Employee):
"""添加员工"""
self.employees.append(emp)
def generate_scores(self):
"""生成评分数据(模拟真实评估)"""
# 各维度基准分数(不同部门水平不同)
dept_baseline = {
'技术部': {'KPI': 85, '技能水平': 88},
'市场部': {'KPI': 90, '技能水平': 82},
'运营部': {'KPI': 88, '技能水平': 80},
'人事部': {'KPI': 82, '技能水平': 85}
}
for emp in self.employees:
base = dept_baseline.get(emp.dept, {'KPI': 85, '技能水平': 85})
# 模拟工作年限加分
exp_bonus = min(emp.years * 1.5, 10)
kpi = min(base['KPI'] + random.uniform(-8, 8) + exp_bonus * 0.3, 100)
skill = min(base['技能水平'] + random.uniform(-10, 10), 100)
teamwork = random.uniform(75, 98)
project = random.uniform(70, 100)
leadership = random.uniform(65, 95) + random.uniform(-5, 10)
emp.set_scores(kpi, skill, teamwork, project, leadership)
def evaluate(self):
"""执行评估"""
# 生成评分
self.generate_scores()
# 按总分排序
self.employees.sort(key=lambda x: x.total_score, reverse=True)
# 设置排名
for i, emp in enumerate(self.employees, 1):
emp.ranking = i
# 晋级规则处理
result = self.apply_promotion_rules()
# 记录历史
self.save_history()
return result
def apply_promotion_rules(self):
"""应用晋级规则"""
rules_checked = []
promoted = []
for emp in self.employees:
checks = {
'name': emp.name,
'dept': emp.dept,
'total_score': round(emp.total_score, 2),
'ranking': emp.ranking,
# 规则1: 总分达到晋级线 (>=85)
'rule_score_pass': emp.total_score >= 85,
# 规则2: 工作年限 >= 2年
'rule_years_pass': emp.years >= 2,
# 规则3: 无单项低于70分
'rule_min_score_pass': all(v >= 70 for v in emp.scores.values()),
# 规则4: 领导力 >= 75(管理岗位)
'rule_leadership_pass': emp.scores['领导潜力'] >= 75
}
# 综合判断是否晋级
checks['qualified'] = (checks['rule_score_pass'] and
checks['rule_years_pass'] and
checks['rule_min_score_pass'] and
checks['rule_leadership_pass'])
if checks['qualified']:
promoted.append(emp)
rules_checked.append(checks)
return {'promoted': promoted, 'details': rules_checked}
def save_history(self):
"""保存评估记录到文件"""
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
filename = f"evaluation_{timestamp}.json"
data = []
for emp in self.employees:
data.append({
'name': emp.name,
'dept': emp.dept,
'ranking': emp.ranking,
'total_score': emp.total_score,
'scores': emp.scores
})
with open(filename, 'w', encoding='utf-8') as f:
json.dump(data, f, indent=2, ensure_ascii=False)
return filename
class DataAnalyzer:
"""数据分析器"""
@staticmethod
def analyze_results(results: Dict):
"""分析评估结果"""
print("=" * 50)
print("🎯 晋级评估结果")
print("=" * 50)
promoted_names = [emp.name for emp in results['promoted']]
for detail in results['details']:
status = "✅ 晋级" if detail['qualified'] else "❌ 未晋级"
print(f"\n{detail['name']} ({detail['dept']}) - 第{detail['ranking']}名")
print(f"总分: {detail['total_score']}")
print(f"状态: {status}")
print("规则检查:")
print(f" - 总分达标: {'✓' if detail['rule_score_pass'] else '✗'}")
print(f" - 工作年限: {'✓' if detail['rule_years_pass'] else '✗'}")
print(f" - 单项最低: {'✓' if detail['rule_min_score_pass'] else '✗'}")
print(f" - 领导潜力: {'✓' if detail['rule_leadership_pass'] else '✗'}")
# 统计分析
print("\n" + "=" * 50)
print("📊 统计分析")
print("=" * 50)
scores = [d['total_score'] for d in results['details']]
avg_score = np.mean(scores)
med_score = np.median(scores)
std_score = np.std(scores)
print(f"平均分: {avg_score:.2f}")
print(f"中位数: {med_score:.2f}")
print(f"标准差: {std_score:.2f}")
print(f"最高分: {max(scores):.2f}")
print(f"最低分: {min(scores):.2f}")
# 部门分布
dept_promoted = {}
for emp in results['promoted']:
dept_promoted[emp.dept] = dept_promoted.get(emp.dept, 0) + 1
print(f"\n晋级名单:")
for name in promoted_names:
print(f" ⭐ {name}")
@staticmethod
def save_excel_report(results: Dict, filename="promotion_report.xlsx"):
"""导出Excel报告"""
rows = []
for detail in results['details']:
rows.append({
'姓名': detail['name'],
'部门': detail['dept'],
'排名': detail['ranking'],
'总分': detail['total_score'],
'是否晋级': '是' if detail['qualified'] else '否'
})
df = pd.DataFrame(rows)
df.to_excel(filename, index=False)
print(f"\n📁 Excel报告已保存: {filename}")
# 生成图表数据
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 6))
scores = [row['总分'] for row in rows]
names = [row['姓名'] for row in rows]
colors = plt.cm.viridis(np.linspace(0.2, 0.9, len(names)))
plt.bar(names, scores, color=colors)
plt.title('员工晋级评估分数')
plt.ylabel('总分')
plt.xticks(rotation=45)
plt.tight_layout()
plt.savefig('scores_bar_chart.png')
print("📊 图表已保存: scores_bar_chart.png")
class AdvancedFeatures:
"""高级功能演示"""
@staticmethod
def monte_carlo_simulation(system, iterations=1000):
"""蒙特卡洛模拟 - 评估晋级概率"""
promotion_count = {}
for _ in range(iterations):
# 重置员工数据
for emp in system.employees:
pass
# 模拟评估
result = system.evaluate()
for emp in result['promoted']:
promotion_count[emp.name] = promotion_count.get(emp.name, 0) + 1
# 计算概率
probabilities = {name: (count/iterations*100) for name, count in promotion_count.items()}
print("\n" + "=" * 50)
print("🎲 蒙特卡洛模拟结果 (1000次)")
print("=" * 50)
sorted_prob = sorted(probabilities.items(), key=lambda x: x[1], reverse=True)
for name, prob in sorted_prob:
print(f"{name}: {prob:.1f}%")
return probabilities
def main():
"""主函数"""
print("🚀 员工晋级评估系统启动")
print("-" * 30)
# 创建系统
system = PromotionSystem()
# 添加员工
employees_data = [
Employee("张伟", "技术部", "高级工程师", 5),
Employee("李娜", "市场部", "市场经理", 3),
Employee("王强", "技术部", "工程师", 2),
Employee("刘洋", "运营部", "运营专员", 1),
Employee("陈晨", "人事部", "HR主管", 4)
]
for emp in employees_data:
system.add_employee(emp)
# 执行评估
results = system.evaluate()
# 分析结果
analyzer = DataAnalyzer()
analyzer.analyze_results(results)
# 导出报告
analyzer.save_excel_report(results)
# 高级分析
advanced = AdvancedFeatures()
# 由于蒙特卡洛模拟会重置数据,单独运行
# advanced.monte_carlo_simulation(system)
print("\n" + "=" * 50)
print("💡 评估总结")
print("=" * 50)
# 找出晋级者和未晋级者
qualified = [emp for emp in system.employees if emp.ranking <= 3]
print(f"\n晋级名额: 3人")
print(f"本次晋级候选人:")
for emp in system.employees[:3]:
print(f" {emp.ranking}. {emp.name} - 总分: {emp.total_score:.2f}")
# 预测和洞察
print("\n📌 分析建议:")
print("1. 如果考量部门平衡,可以调整晋级名额")
print("2. 技术部员工在技能方面表现突出")
print("3. 建议对低分维度进行针对性培训")
if __name__ == "__main__":
main()
额外功能:数据可视化
# 可添加到系统中的可视化模块
def visualize_scores(results):
"""雷达图展示各维度评分"""
import matplotlib.pyplot as plt
import numpy as np
categories = ['KPI', '技能水平', '团队协作', '项目贡献', '领导潜力']
N = len(categories)
# 创建子图
fig, axes = plt.subplots(2, 3, figsize=(15, 10))
for idx, (detail, ax) in enumerate(zip(results['details'], axes.flat)):
if idx >= len(results['details']):
break
# 找到对应员工的评分
emp = next(e for e in system.employees if e.name == detail['name'])
scores = [emp.scores[cat] for cat in categories]
# 雷达图数据
angles = np.linspace(0, 2 * np.pi, N, endpoint=False).tolist()
scores += scores[:1]
angles += angles[:1]
# 绘制雷达图
ax.plot(angles, scores, 'o-', linewidth=2)
ax.fill(angles, scores, alpha=0.25)
ax.set_xticks(np.linspace(0, 2 * np.pi, N, endpoint=False))
ax.set_xticklabels(categories)
ax.set_ylim(0, 100)
ax.set_title(f"{detail['name']} - Rank {detail['ranking']}")
plt.tight_layout()
plt.savefig('employee_radar.png')
print("📊 雷达图已保存: employee_radar.png")
代码特点说明
这个案例综合了很多Python核心知识点:
- 面向对象编程:Employee类和PromotionSystem类
- 数据处理:使用Pandas和NumPy
- 文件操作:JSON和Excel文件导出
- 算法实现:排序、过滤、统计计算
- 模拟预测:蒙特卡洛模拟
- 数据可视化:Matplotlib图表
- 异常处理:可以增强健壮性
- 模块化设计:不同职责分离
运行结果示例
🚀 员工晋级评估系统启动
------------------------------
==================================================
🎯 晋级评估结果
==================================================
张伟 (技术部) - 第1名
总分: 91.23
状态: ✅ 晋级
规则检查:
- 总分达标: ✓
- 工作年限: ✓
- 单项最低: ✓
- 领导潜力: ✓
...
==================================================
📊 统计分析
==================================================
平均分: 84.56
中位数: 86.20
标准差: 5.12
最高分: 91.23
最低分: 78.45
这个案例实现了真实的评估逻辑,包含了丰富的业务规则和数据分析功能,很适合用来综合练习Python技能。