## 数据来源 - 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>
147 lines
5.1 KiB
Python
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门真实课程')
|