#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 生成mockReportData - 基于真实评分数据生成报告趋势数据 """ import json from datetime import datetime, timedelta import random # 读取已生成的评价数据 with open('分析报告/generated_evaluations.json', 'r', encoding='utf-8') as f: evaluations = json.load(f) # 读取画像数据(用于能力分析) with open('分析报告/generated_portrait_data.json', 'r', encoding='utf-8') as f: portrait_data = json.load(f) # 6门课程对应的月份(2024年9月-2025年2月) COURSE_MONTHS = [ '2024-09', # SQL金融数据处理 '2024-10', # Python金融分析 '2024-11', # Matlab金融建模 '2024-12', # 金融数据可视化 '2025-01', # 证券模拟投资竞赛实战 '2025-02', # 期货模拟交易大赛实战 ] COURSE_NAMES = [ 'SQL金融数据处理', 'Python金融分析', 'Matlab金融建模', '金融数据可视化', '证券模拟投资竞赛实战', '期货模拟交易大赛实战' ] def calculate_overall_score(company_score, teacher_score, expert_score): """计算综合评分(统一百分制)""" # 所有分数已经是百分制 # 加权平均:企业30%,教师40%,专家30% overall = company_score * 0.3 + teacher_score * 0.4 + expert_score * 0.3 return round(overall, 1) def generate_development_trends(): """生成发展趋势数据""" trends = {} for student_id in range(1, 41): student_id_str = str(student_id) # 获取该学生的评价数据 company_eval = evaluations['company'].get(student_id_str, {}) teacher_eval = evaluations['teacher'].get(student_id_str, {}) expert_eval = evaluations['expert'].get(student_id_str, {}) # 基础评分(公司、教师、专家的平均分) company_base = (company_eval.get('attitude', 3.5) + company_eval.get('skills', 3.5) + company_eval.get('communication', 3.5) + company_eval.get('problemSolving', 3.5)) / 4 * 20 # 转为百分制 teacher_base = (teacher_eval.get('theory', 3.5) + teacher_eval.get('practice', 3.5) + teacher_eval.get('innovation', 3.5) + teacher_eval.get('attitude', 3.5)) / 4 * 20 expert_base = (expert_eval.get('industryKnowledge', 3.5) + expert_eval.get('technicalDepth', 3.5) + expert_eval.get('applicationAbility', 3.5) + expert_eval.get('potential', 3.5)) / 4 * 20 # 生成6个月的趋势数据(模拟学习进步曲线) monthly_scores = [] for i, month in enumerate(COURSE_MONTHS): # 初始分数基于基础评分,随着时间逐步提升 progress_factor = 1 + (i * 0.03) # 每月提升3% company_score = round(company_base * progress_factor, 1) teacher_score = round(teacher_base * progress_factor, 1) expert_score = round(expert_base * progress_factor, 1) # 计算综合分数(已经是百分制) overall = calculate_overall_score( company_score, teacher_score, expert_score ) # 互评分数(基于综合分数±5分波动) peer_score = round(overall + random.uniform(-5, 5), 1) peer_score = max(60, min(100, peer_score)) # 限制在60-100范围 monthly_scores.append({ 'month': month, 'overall': overall, 'company': company_score, 'teacher': teacher_score, 'expert': expert_score, 'peer': peer_score }) trends[student_id] = { 'monthlyScores': monthly_scores } return trends def generate_milestones(): """生成里程碑数据""" milestones = {} # 里程碑事件模板(基于6门课程) milestone_templates = [ { 'courses': [0, 1], # SQL和Python课程 'events': [ '完成{course}课程项目', '{course}期末答辩优秀', '{course}实践报告获得好评' ] }, { 'courses': [2, 3], # Matlab和数据可视化 'events': [ '完成{course}课程设计', '{course}作业获得满分', '{course}小组项目表现突出' ] }, { 'courses': [4, 5], # 两个竞赛 'events': [ '参与{course}并获得名次', '{course}表现优异', '{course}获得证书' ] } ] for student_id in range(1, 41): student_milestones = [] # 为每个学生随机生成2-4个里程碑 num_milestones = random.randint(2, 4) selected_indices = random.sample(range(6), num_milestones) for idx in sorted(selected_indices): month = COURSE_MONTHS[idx] course_name = COURSE_NAMES[idx] # 选择对应的事件模板 if idx in [0, 1]: event_template = random.choice(milestone_templates[0]['events']) elif idx in [2, 3]: event_template = random.choice(milestone_templates[1]['events']) else: event_template = random.choice(milestone_templates[2]['events']) event = event_template.format(course=course_name) # 分数基于学生该课程的表现(从portrait数据获取) portrait = portrait_data['abilityRadar'].get(str(student_id), {}) base_score = portrait.get('average', 75) score = round(base_score + random.uniform(-5, 10), 1) score = max(60, min(100, score)) student_milestones.append({ 'date': month, 'event': event, 'score': score }) milestones[student_id] = student_milestones return milestones def generate_development_suggestions(): """生成发展建议数据""" suggestions = {} # 优势模板 strengths_templates = [ '金融理论基础扎实,数据分析能力强', '学习态度认真,能够主动思考问题', '团队协作意识好,沟通能力较强', '实践能力突出,善于将理论应用于实际', '创新思维活跃,勇于尝试新方法', '代码能力扎实,熟练掌握金融工具', '逻辑思维清晰,问题分析能力强', '自学能力强,能够快速掌握新知识' ] # 劣势模板 weaknesses_templates = [ '量化投资实践经验需要积累', '创新思维有待提升', '风险识别能力需要更多练习', '金融工具使用熟练度需要提高', '理论知识体系需要进一步完善', '数据处理效率有待提升', '复杂问题分析能力需要加强', '金融市场敏感度需要培养' ] # 建议模板 suggestions_templates = [ '建议加强量化投资模型的实践学习', '多参与金融创新项目,培养创新思维', '定期参加投资论坛,提升专业表达能力', '深入学习金融科技前沿技术', '加强金融市场实时跟踪和分析', '参与更多实战项目,积累实践经验', '系统学习风险管理理论和方法', '提升编程能力,掌握更多金融工具' ] for student_id in range(1, 41): # 获取学生能力数据 portrait = portrait_data['abilityRadar'].get(str(student_id), {}) scores = portrait.get('scores', [75] * 5) avg_score = portrait.get('average', 75) # 根据平均分确定优劣势数量 if avg_score >= 85: num_strengths = 4 num_weaknesses = 2 elif avg_score >= 75: num_strengths = 3 num_weaknesses = 3 else: num_strengths = 2 num_weaknesses = 4 suggestions[student_id] = { 'strengths': random.sample(strengths_templates, min(num_strengths, 3)), 'weaknesses': random.sample(weaknesses_templates, min(num_weaknesses, 3)), 'suggestions': random.sample(suggestions_templates, 3) } return suggestions def main(): print("开始生成报告数据...") # 生成三部分数据 development_trends = generate_development_trends() milestones = generate_milestones() development_suggestions = generate_development_suggestions() # 组装完整数据 report_data = { 'developmentTrends': development_trends, 'milestones': milestones, 'developmentSuggestions': development_suggestions } # 保存到文件 output_file = '分析报告/generated_report_data.json' with open(output_file, 'w', encoding='utf-8') as f: json.dump(report_data, f, ensure_ascii=False, indent=2) print(f"✅ 报告数据生成完成!") print(f" - 发展趋势: 40名学生 × 6个月") print(f" - 里程碑: 40名学生 × 2-4个事件") print(f" - 发展建议: 40名学生") print(f" - 输出文件: {output_file}") if __name__ == '__main__': main()