Pārlūkot izejas kodu

教研数据计算验证

xiaof 4 gadi atpakaļ
vecāks
revīzija
e3be9d117d

+ 4 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/mapper/CourseReportMapper.java

@@ -6,6 +6,7 @@ import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * @Description:
@@ -17,4 +18,7 @@ public interface CourseReportMapper {
     List<ExamBaseInfo> findExamTotalByExamId(@Param("examId") Long examId);
 
     List<CollegeCourseInfo> findCollegeCourseInfo(@Param("examId") Long examId,@Param("collegeId") Long collegeId);
+
+    List<Map<String, Object>> list1();
+
 }

+ 23 - 0
teachcloud-report-business/src/main/resources/mapper/CourseReportMapper.xml

@@ -55,4 +55,27 @@
         WHERE
             exam_id = #{examId}
     </select>
+    <select id="list1" resultType="java.util.Map">
+        SELECT
+	d.exam_student_id id,
+	e.small_question_number num,
+	t.score,
+	e.full_score,
+	f.inspect_college_id
+FROM
+	(
+SELECT
+	*
+FROM
+	t_b_answer a
+WHERE
+	a.exam_record_id IN ( SELECT id FROM t_b_exam_record b WHERE b.exam_student_id IN ( SELECT id FROM t_b_exam_student WHERE course_code = 1001 ) )
+	) t
+	JOIN t_b_exam_record d ON t.exam_record_id = d.id
+	JOIN t_b_exam_student f ON d.exam_student_id = f.id
+	JOIN t_b_paper_struct e ON d.paper_id = e.paper_id
+	AND t.number_type = e.number_type
+	AND t.main_number = e.big_question_number
+	AND t.sub_number = e.small_question_number
+    </select>
 </mapper>

+ 219 - 0
teachcloud-report/src/test/java/com/qmth/teachcloud/report/XfTest.java

@@ -0,0 +1,219 @@
+package com.qmth.teachcloud.report;
+
+import com.alibaba.fastjson.JSONObject;
+import com.qmth.teachcloud.report.business.mapper.CourseReportMapper;
+import org.junit.Test;
+import org.junit.platform.commons.util.CollectionUtils;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@SpringBootTest(classes = {TeachcloudReportApplication.class})
+@RunWith(SpringRunner.class)
+public class XfTest {
+
+
+    @Resource
+    private CourseReportMapper courseReportMapper;
+
+    /**
+     * 中等难度
+     */
+    @Test
+    public void trail() {
+        List<Map<String, Object>> studentPaperList = courseReportMapper.list1();
+
+        Map<String, List<Map<String, Object>>> scoreRateListMap = studentPaperList.stream().collect(Collectors.groupingBy(m -> m.get("num").toString()));
+        List<Map<String, Object>> finalList = new ArrayList<>();
+        for (Map.Entry<String, List<Map<String, Object>>> entry : scoreRateListMap.entrySet()) {
+            Map<String, Object> scoreRateMap = new HashMap<>();
+            scoreRateMap.put("num", entry.getKey());
+            double avgScoreRate = entry.getValue().stream().map(m -> {
+                double rate = new BigDecimal(m.get("score").toString()).divide(new BigDecimal(m.get("full_score").toString()), 8, BigDecimal.ROUND_HALF_UP).doubleValue();
+                return rate;
+            }).collect(Collectors.averagingDouble(m -> m));
+            scoreRateMap.put("scoreRate", new BigDecimal(avgScoreRate).setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue());
+            scoreRateMap.put("scoreRate8", avgScoreRate);
+            finalList.add(scoreRateMap);
+        }
+
+        List<String> nums = finalList.stream().filter(m -> Double.parseDouble(m.get("scoreRate").toString()) >= 0.3 && Double.parseDouble(m.get("scoreRate").toString()) <= 0.7).map(m -> m.get("num").toString()).collect(Collectors.toList());
+        System.out.println("中等难度题:" + JSONObject.toJSONString(nums));
+
+        List<Map<String, Object>> mapList = studentPaperList.stream().filter(m -> nums.contains(m.get("num").toString())).collect(Collectors.toList());
+        double middleScoreRate = mapList.stream().map(m -> {
+            double rate = new BigDecimal(m.get("score").toString()).divide(new BigDecimal(m.get("full_score").toString()), 8, BigDecimal.ROUND_HALF_UP).doubleValue();
+            return rate;
+        }).collect(Collectors.averagingDouble(m -> m));
+
+        System.out.println("全校中等难度得分率:" + middleScoreRate);
+
+
+        List<Map<String, Object>> mapList2 = studentPaperList.stream().filter(m -> nums.contains(m.get("num").toString()) && Objects.equals(m.get("inspect_college_id").toString(), "135697788569649152")).collect(Collectors.toList());
+        double middleScoreRate2 = mapList2.stream().map(m -> {
+            double rate = new BigDecimal(m.get("score").toString()).divide(new BigDecimal(m.get("full_score").toString()), 8, BigDecimal.ROUND_HALF_UP).doubleValue();
+            return rate;
+        }).collect(Collectors.averagingDouble(m -> m));
+
+        System.out.println("本院中等难度得分率:" + middleScoreRate2);
+    }
+
+
+    /**
+     * 效度
+     */
+    @Test
+    public void trail1() {
+        List<Map<String, Object>> studentPaperList = courseReportMapper.list1();
+
+        // 所有题卡
+        List<String> nums = studentPaperList.stream().map(m -> m.get("num").toString()).collect(Collectors.toList());
+
+        Map<String, List<Map<String, Object>>> studentMap = studentPaperList.stream().collect(Collectors.groupingBy(m -> m.get("id").toString()));
+        List<Map<String, Object>> studentScoreList = new ArrayList<>();
+        // 计算单个考生总分
+        for (Map.Entry<String, List<Map<String, Object>>> entry : studentMap.entrySet()) {
+            Map<String, Object> scoreRateMap = new HashMap<>();
+            scoreRateMap.put("id", entry.getKey());
+            double totalScore = entry.getValue().stream().map(m -> new BigDecimal(m.get("score").toString()).setScale(8, BigDecimal.ROUND_HALF_UP).doubleValue()).collect(Collectors.summingDouble(m -> m));
+            scoreRateMap.put("totalScore", totalScore);
+            studentScoreList.add(scoreRateMap);
+        }
+
+        // 计算百分等级
+        List<Map<String, Object>> newList = studentScoreList.stream().map(m -> {
+            double score = Double.parseDouble(m.get("totalScore").toString());
+            long lowCount = studentScoreList.stream().filter(m1 -> Double.parseDouble(m1.get("totalScore").toString()) < score).count();
+            long equelCount = studentScoreList.stream().filter(m1 -> Double.parseDouble(m1.get("totalScore").toString()) == score).count();
+            BigDecimal one = new BigDecimal(lowCount).add(new BigDecimal(equelCount).divide(new BigDecimal("2")));
+            int grade = one.multiply(new BigDecimal("100")).divide(new BigDecimal(studentScoreList.size()), 0, BigDecimal.ROUND_DOWN).intValue();
+            m.put("grade", grade);
+            return m;
+        }).collect(Collectors.toList());
+
+        int count27 = new BigDecimal(newList.size()).multiply(new BigDecimal("27")).divide(new BigDecimal("100"), 0, BigDecimal.ROUND_DOWN).intValue();
+        // 前27%考生
+        newList.sort((o1, o2) -> Integer.parseInt(o2.get("grade").toString()) - Integer.parseInt(o1.get("grade").toString()));
+        List<String> before27Ids = newList.stream().limit(count27).map(m -> m.get("id").toString()).collect(Collectors.toList());
+
+        List<Map<String, Object>> before27 = studentPaperList.stream().filter(m -> before27Ids.contains(m.get("id").toString())).collect(Collectors.toList());
+        Map<String, List<Map<String, Object>>> scoreRateListMap = before27.stream().collect(Collectors.groupingBy(m -> m.get("num").toString()));
+        Map<String, Object> amap = new HashMap<>();
+        for (Map.Entry<String, List<Map<String, Object>>> entry : scoreRateListMap.entrySet()) {
+            double avgScoreRate = entry.getValue().stream().map(m -> {
+                double rate = new BigDecimal(m.get("score").toString()).divide(new BigDecimal(m.get("full_score").toString()), 8, BigDecimal.ROUND_HALF_UP).doubleValue();
+                return rate;
+            }).collect(Collectors.averagingDouble(m -> m));
+            amap.put(entry.getKey(), new BigDecimal(avgScoreRate).setScale(8, BigDecimal.ROUND_HALF_UP).doubleValue());
+        }
+
+        // 后27%考生
+        newList.sort(Comparator.comparingInt(o -> Integer.parseInt(o.get("grade").toString())));
+
+        List<String> after27Ids = newList.stream().limit(count27).map(m -> m.get("id").toString()).collect(Collectors.toList());
+        List<Map<String, Object>> after27 = studentPaperList.stream().filter(m -> after27Ids.contains(m.get("id").toString())).collect(Collectors.toList());
+
+        Map<String, List<Map<String, Object>>> scoreRateListMap2 = after27.stream().collect(Collectors.groupingBy(m -> m.get("num").toString()));
+        Map<String, Object> bmap = new HashMap<>();
+        for (Map.Entry<String, List<Map<String, Object>>> entry : scoreRateListMap2.entrySet()) {
+            double avgScoreRate = entry.getValue().stream().map(m -> {
+                double rate = new BigDecimal(m.get("score").toString()).divide(new BigDecimal(m.get("full_score").toString()), 8, BigDecimal.ROUND_HALF_UP).doubleValue();
+                return rate;
+            }).collect(Collectors.averagingDouble(m -> m));
+            bmap.put(entry.getKey(), new BigDecimal(avgScoreRate).setScale(8, BigDecimal.ROUND_HALF_UP).doubleValue());
+        }
+
+        // 效度
+        Map<String, Object> finalMap = new HashMap<>();
+        for (String num : nums) {
+            double a27 = Double.parseDouble(amap.get(num).toString());
+            double b27 = Double.parseDouble(bmap.get(num).toString());
+            finalMap.put(num, a27 - b27);
+        }
+
+        System.out.println("效度:" + JSONObject.toJSONString(finalMap));
+    }
+
+    /**
+     * 效度
+     */
+    @Test
+    public void trail2() {
+        List<Map<String, Object>> studentPaperList = courseReportMapper.list1();
+
+        // 所有题卡
+        List<String> nums = studentPaperList.stream().map(m -> m.get("num").toString()).collect(Collectors.toList());
+
+        Map<String, List<Map<String, Object>>> studentMap = studentPaperList.stream().collect(Collectors.groupingBy(m -> m.get("id").toString()));
+        List<Map<String, Object>> studentScoreList = new ArrayList<>();
+        // 计算单个考生总分
+        for (Map.Entry<String, List<Map<String, Object>>> entry : studentMap.entrySet()) {
+            Map<String, Object> scoreRateMap = new HashMap<>();
+            scoreRateMap.put("id", entry.getKey());
+            double totalScore = entry.getValue().stream().map(m -> new BigDecimal(m.get("score").toString()).setScale(8, BigDecimal.ROUND_HALF_UP).doubleValue()).collect(Collectors.summingDouble(m -> m));
+            scoreRateMap.put("totalScore", totalScore);
+            studentScoreList.add(scoreRateMap);
+        }
+
+        // 计算百分等级
+        List<Map<String, Object>> newList = studentScoreList.stream().map(m -> {
+            double score = Double.parseDouble(m.get("totalScore").toString());
+            long lowCount = studentScoreList.stream().filter(m1 -> Double.parseDouble(m1.get("totalScore").toString()) < score).count();
+            long equelCount = studentScoreList.stream().filter(m1 -> Double.parseDouble(m1.get("totalScore").toString()) == score).count();
+            BigDecimal one = new BigDecimal(lowCount).add(new BigDecimal(equelCount).divide(new BigDecimal("2")));
+            int grade = one.multiply(new BigDecimal("100")).divide(new BigDecimal(studentScoreList.size()), 0, BigDecimal.ROUND_DOWN).intValue();
+            m.put("grade", grade);
+            return m;
+        }).collect(Collectors.toList());
+
+        int count27 = new BigDecimal(newList.size()).multiply(new BigDecimal("27")).divide(new BigDecimal("100"), 0, BigDecimal.ROUND_DOWN).intValue();
+        // 前27%考生
+        newList.sort((o1, o2) -> Integer.parseInt(o2.get("grade").toString()) - Integer.parseInt(o1.get("grade").toString()));
+        int beforeGrade = Integer.parseInt(newList.get(count27).get("grade").toString());
+        List<String> before27Ids = newList.stream().filter(m -> Integer.parseInt(m.get("grade").toString()) >= beforeGrade).map(m->m.get("id").toString()).collect(Collectors.toList());
+
+        List<Map<String, Object>> before27 = studentPaperList.stream().filter(m -> before27Ids.contains(m.get("id").toString())).collect(Collectors.toList());
+        Map<String, List<Map<String, Object>>> scoreRateListMap = before27.stream().collect(Collectors.groupingBy(m -> m.get("num").toString()));
+        Map<String, Object> amap = new HashMap<>();
+        for (Map.Entry<String, List<Map<String, Object>>> entry : scoreRateListMap.entrySet()) {
+            double avgScoreRate = entry.getValue().stream().map(m -> {
+                double rate = new BigDecimal(m.get("score").toString()).divide(new BigDecimal(m.get("full_score").toString()), 8, BigDecimal.ROUND_HALF_UP).doubleValue();
+                return rate;
+            }).collect(Collectors.averagingDouble(m -> m));
+            amap.put(entry.getKey(), new BigDecimal(avgScoreRate).setScale(8, BigDecimal.ROUND_HALF_UP).doubleValue());
+        }
+
+        // 后27%考生
+        newList.sort(Comparator.comparingInt(o -> Integer.parseInt(o.get("grade").toString())));
+        int afterGrade = Integer.parseInt(newList.get(count27).get("grade").toString());
+        List<String> after27Ids = newList.stream().filter(m -> Integer.parseInt(m.get("grade").toString()) <= afterGrade).map(m->m.get("id").toString()).collect(Collectors.toList());
+//        List<String> after27Ids = newList.stream().limit(count27).map(m -> m.get("id").toString()).collect(Collectors.toList());
+        List<Map<String, Object>> after27 = studentPaperList.stream().filter(m -> after27Ids.contains(m.get("id").toString())).collect(Collectors.toList());
+
+        Map<String, List<Map<String, Object>>> scoreRateListMap2 = after27.stream().collect(Collectors.groupingBy(m -> m.get("num").toString()));
+        Map<String, Object> bmap = new HashMap<>();
+        for (Map.Entry<String, List<Map<String, Object>>> entry : scoreRateListMap2.entrySet()) {
+            double avgScoreRate = entry.getValue().stream().map(m -> {
+                double rate = new BigDecimal(m.get("score").toString()).divide(new BigDecimal(m.get("full_score").toString()), 8, BigDecimal.ROUND_HALF_UP).doubleValue();
+                return rate;
+            }).collect(Collectors.averagingDouble(m -> m));
+            bmap.put(entry.getKey(), new BigDecimal(avgScoreRate).setScale(8, BigDecimal.ROUND_HALF_UP).doubleValue());
+        }
+
+        // 效度
+        Map<String, Object> finalMap = new HashMap<>();
+        for (String num : nums) {
+            double a27 = Double.parseDouble(amap.get(num).toString());
+            double b27 = Double.parseDouble(bmap.get(num).toString());
+            finalMap.put(num, a27 - b27);
+        }
+
+        System.out.println("效度:" + JSONObject.toJSONString(finalMap));
+    }
+
+}