ZhangQiPro/generate_portrait_data.py
sladro 01ad9c18ea feat: 完成Mock数据替换-基于Word文档真实数据
## 数据来源
- 239个Word文档(.doc格式)
- 6门金融课程真实评分数据
- 40名学生(233061301101-140)

## 完成工作

###  第一批次:基础数据
- 学生名单:40名真实学生
- 课程项目:6门真实课程
- 年级/班级:2023级金融工程1班

###  第二批次:评价数据
- 企业评价:40条(百分制→5分制)
- 教师评价:40条(基于Word学校评分)
- 专家评价:40条(综合评分)

###  第三批次:画像数据
- 能力维度:5个真实维度(数据采集、数据清洗、数据分析、结果解读、工具实操)
- abilityRadar:40名学生的5维能力分数(基于Word文档计算平均值)
- gradeDistribution:40名学生的6门课程真实总分

## 核心原则
 所有mock数据完全基于Word文档真实数据
 可以计算组合现有数据,但禁止随意编造
 Word文档不包含的内容,保持现有或标记为空

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-01 16:25:56 +08:00

147 lines
5.1 KiB
Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
基于Word文档评分生成学生画像数据
严格使用Word文档中实际存在的5个能力维度
"""
import json
# 读取提取的评分数据
with open('分析报告/extracted_scores.json', 'r', encoding='utf-8') as f:
scores = json.load(f)
# Word文档中实际存在的5个能力维度
DIMENSIONS = ['数据采集', '数据清洗', '数据分析', '结果解读', '工具实操']
def calculate_ability_scores(student_data):
"""
计算学生在5个维度的平均分
基于6门课程的学校评分和企业评分的平均值
"""
dimension_scores = {dim: [] for dim in DIMENSIONS}
for course_name, course_data in student_data['courses'].items():
# 数据采集
if '数据采集_学校' in course_data:
dimension_scores['数据采集'].append(course_data['数据采集_学校'])
if '数据采集_企业' in course_data:
dimension_scores['数据采集'].append(course_data['数据采集_企业'])
# 数据清洗
if '数据清洗_学校' in course_data:
dimension_scores['数据清洗'].append(course_data['数据清洗_学校'])
if '数据清洗_企业' in course_data:
dimension_scores['数据清洗'].append(course_data['数据清洗_企业'])
# 数据分析
if '数据分析_学校' in course_data:
dimension_scores['数据分析'].append(course_data['数据分析_学校'])
if '数据分析_企业' in course_data:
dimension_scores['数据分析'].append(course_data['数据分析_企业'])
# 结果解读
if '结果解读_学校' in course_data:
dimension_scores['结果解读'].append(course_data['结果解读_学校'])
if '结果解读_企业' in course_data:
dimension_scores['结果解读'].append(course_data['结果解读_企业'])
# 工具实操
if '工具实操_学校' in course_data:
dimension_scores['工具实操'].append(course_data['工具实操_学校'])
if '工具实操_企业' in course_data:
dimension_scores['工具实操'].append(course_data['工具实操_企业'])
# 计算每个维度的平均分
avg_scores = []
for dim in DIMENSIONS:
if dimension_scores[dim]:
avg = sum(dimension_scores[dim]) / len(dimension_scores[dim])
avg_scores.append(round(avg, 1))
else:
avg_scores.append(0)
return avg_scores
def calculate_grade_distribution(student_data):
"""
计算学生在6门课程的成绩分布
返回6门课程的总分
"""
# 真实的6门课程
real_courses = [
'SQL金融数据处理',
'Python金融分析',
'Matlab金融建模',
'金融数据可视化',
'证券模拟投资竞赛实战',
'期货模拟交易大赛实战'
]
course_scores = []
for course in real_courses:
if course in student_data['courses']:
course_scores.append(student_data['courses'][course]['totalScore'])
else:
course_scores.append(0)
return course_scores
# 生成所有学生的画像数据
portrait_data = {
'abilityRadar': {},
'gradeDistribution': {}
}
# 只处理学号格式正确的学生(233061301101-140)
valid_students = {
sid: data for sid, data in scores.items()
if sid.startswith('233061301') and len(sid) == 12 and sid[-2:].isdigit()
}
# 按学号排序
sorted_students = sorted(valid_students.items(), key=lambda x: x[0])
for idx, (student_id, student_data) in enumerate(sorted_students, 1):
# 能力雷达图数据
ability_scores = calculate_ability_scores(student_data)
average_score = round(sum(ability_scores) / len(ability_scores), 1) if ability_scores else 0
portrait_data['abilityRadar'][idx] = {
'name': student_data['name'],
'studentId': student_id,
'scores': ability_scores,
'average': average_score
}
# 成绩分布数据
grade_scores = calculate_grade_distribution(student_data)
portrait_data['gradeDistribution'][idx] = {
'subjects': [
'SQL金融数据处理',
'Python金融分析',
'Matlab金融建模',
'金融数据可视化',
'证券模拟投资竞赛实战',
'期货模拟交易大赛实战'
],
'scores': grade_scores
}
# 计算班级排名(基于平均分)
students_with_avg = [(k, v['average']) for k, v in portrait_data['abilityRadar'].items()]
students_with_avg.sort(key=lambda x: x[1], reverse=True)
for rank, (student_idx, _) in enumerate(students_with_avg, 1):
portrait_data['abilityRadar'][student_idx]['rank'] = rank
portrait_data['abilityRadar'][student_idx]['totalStudents'] = len(students_with_avg)
# 保存结果
with open('分析报告/generated_portrait_data.json', 'w', encoding='utf-8') as f:
json.dump(portrait_data, f, ensure_ascii=False, indent=2)
print('✅ 学生画像数据已生成!')
print(f' - 能力维度: {DIMENSIONS}')
print(f' - 学生人数: {len(portrait_data["abilityRadar"])}')
print(f' - 课程数量: 6门真实课程')