Browse Source

更新标准差计算

zhouj1203@hotmail.com 4 năm trước cách đây
mục cha
commit
c9b03e8330

+ 47 - 4
TEAMModelFunction/TriggerExam.cs

@@ -339,6 +339,10 @@ namespace TEAMModelFunction
                     double score = 0;
                     double allScore = 0;
                     int stuCount = 0;
+                    //整体平均分
+                    double average = 0;
+                    //标准差
+                    double powSum = 0;
                     List<string> losStu = new List<string>();
                     //先与第一个值取并集
                     if (examResults.Count >0 ) {
@@ -353,19 +357,31 @@ namespace TEAMModelFunction
                                 }
                                 stuCount = examResult.studentIds.Count;
                             }
+                            //powSum += Math.Pow(score - examResult.studentIds.Count > 0 ? Math.Round(score * 1.0 / examResult.studentIds.Count, 2) : 0, 2);
                             //取交集
                             losStu = losStu.Intersect(examResult.lostStus).ToList();
                         }
-                    }                                      
-                    double ascore = stuCount > 0 ? Math.Round(score * 1.0 / stuCount, 2) : 0;
+                    }
+                    double NewsRateScore = stuCount > 0 ? Math.Round(score * 1.0 / stuCount, 2) : 0;
                     foreach (PaperSimple simple in info.papers)
                     {
                         allScore += simple.point.Sum();
                     }
-                    double  NewsRate= allScore > 0 ? Math.Round(ascore / allScore * 100,2) : 0;
+                    //计算全科标准差
+                    foreach (string id in examResults[0].studentIds) {
+                        double sc = 0;
+                        foreach (ExamResult result in examResults) {
+                            sc += result.studentScores[result.studentIds.IndexOf(id)].Sum();
+                        }
+                        powSum += Math.Pow(sc - examResults[0].studentIds.Count > 0 ? Math.Round(score * 1.0 / examResults[0].studentIds.Count, 2) : 0, 2);
+                    }
+                    info.standard = examResults[0].studentIds.Count > 0 ? Math.Pow(powSum / examResults[0].studentIds.Count, 0.5) : 0;
+                    double  NewsRate= allScore > 0 ? Math.Round(NewsRateScore / allScore * 100,2) : 0;
                     info.lostStu = losStu;
-                    if (info.sRate != NewsRate) {
+                    //判断均分是否发生变化,便于实时的更新评测基本信息
+                    if (info.sRate != NewsRate || info.average != NewsRateScore) {
                         info.sRate = NewsRate;
+                        info.average = NewsRateScore;
                         await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync<ExamInfo>(info, info.id, new Azure.Cosmos.PartitionKey(info.code));
                     }
                    
@@ -420,6 +436,8 @@ namespace TEAMModelFunction
             int Count = 0;
             int m = 0;
             double score = 0;
+            //标准差
+            double powSum = 0;
             double allScore = info.papers[no].point.Sum();
             List<ClassRange> classRanges = new List<ClassRange>();
             List<string> lostStu = new List<string>();
@@ -478,11 +496,36 @@ namespace TEAMModelFunction
                         result.studentIds.Add(id);
                     }
                     csRate.Add(result.studentIds.Count > 0 ? Math.Round(classSrate * 1.0 / classResult.studentIds.Count, 2) : 0 / allScore);
+                    //powSum += Math.Pow(classSrate - result.average, 2);
+                }
+            }
+            foreach (ExamClassResult classResult in examClassResults) {
+
+                double classSrate = 0;
+                if (classResult.subjectId.Equals(subject.id))
+                {
+
+                    foreach (List<double> scores in classResult.studentScores)
+                    {
+                        List<double> newScores = new List<double>();
+                        foreach (double sc in scores)
+                        {
+                            newScores.Add(sc > -1 ? sc : 0);
+
+                        }
+                        classSrate += newScores.Sum();
+                    }
                 }
+                foreach (string id in classResult.studentIds)
+                {
+                    powSum += Math.Pow(classSrate - result.studentIds.Count > 0 ? Math.Round(score * 1.0 / result.studentIds.Count, 2) : 0, 2);
+                }                
             }
+            result.standard = Math.Round(result.studentIds.Count > 0 ? Math.Pow(powSum / result.studentIds.Count, 0.5) : 0,2);
             result.csRate = csRate;
             result.lostStus = lostStu;
             result.sRate =result.studentIds.Count> 0 ? Math.Round(score *1.0 / result.studentIds.Count ,2 ): 0 / allScore;
+            result.average = result.studentIds.Count > 0 ? Math.Round(score * 1.0 / result.studentIds.Count, 2) : 0;
             result.classes = classRanges;
             result.code = "ExamResult-" + info.id;
             result.school = info.school;

+ 1 - 0
TEAMModelOS.SDK/Models/Cosmos/School/ExamInfo.cs

@@ -88,6 +88,7 @@ namespace TEAMModelOS.SDK.Models
         public double sRate { get; set; }
         //缺考人数
         public List<string> lostStu { get; set; } = new List<string>();
+        public double standard { get; set; }
     }
     public class Custom {
         public string id { get; set; }

+ 2 - 0
TEAMModelOS.SDK/Models/Cosmos/School/ExamResult.cs

@@ -36,9 +36,11 @@ namespace TEAMModelOS.SDK.Models
         public string examId { get; set; }
         public string school { get; set; }
         public int year { get; set; }
+        public double average { get; set; }
         public double sRate { get; set; }
         public List<double> csRate { get; set; } = new List<double>();
         public List<string> lostStus { get; set; } = new List<string>();
+        public double standard { get; set; }
     }
     public class ClassRange {
 

+ 15 - 10
TEAMModelOS/Controllers/Analysis/AnalysisController.cs

@@ -132,13 +132,13 @@ namespace TEAMModelOS.Controllers.Analysis
             //获取进线标准以及踩线分数
             int touch = 0;
             int income = 0;
+            List<ExamResult> examResults = new List<ExamResult>();
             try
             {
                 var client = _azureCosmos.GetCosmosClient();
                 //获取本次评测所有科目结算结果
                 info = await client.GetContainer("TEAMModelOS", "Common").ReadItemAsync<ExamInfo>(id.ToString(), new PartitionKey($"Exam-{code}"));
                 School school = await client.GetContainer("TEAMModelOS", "School").ReadItemAsync<School>(code.ToString(), new PartitionKey($"Base"));
-                List<ExamResult> examResults = new List<ExamResult>();
                 var query = $"select c.id,c.name,c.subjectId,c.studentScores,c.studentIds,c.paper,c.classes from c where c.examId =  '{id}' ";
                 await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryIterator<ExamResult>(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"ExamResult-{id}") }))
                 {
@@ -287,9 +287,11 @@ namespace TEAMModelOS.Controllers.Analysis
                     }
                     subjectTotal.Add(examResult.subjectId, StuSubjectTotals);
                 }
+                //double powAll = 0;
                 foreach (StudentAys student1 in students) {
                     gradeTotal.Add(student1.total);
                     student1.sRate = totalAll > 0 ? Math.Round(student1.total / totalAll, 2) : 0;
+                    //powAll += Math.Pow(student1.total - examResult.studentIds.Count > 0 ? Math.Round(score * 1.0 / examResult.studentIds.Count, 2) : 0, 2);
                 }
                 //处理进线分数
                 gradeTotal.Sort((s1, s2) => { return s2.CompareTo(s1); });
@@ -529,16 +531,19 @@ namespace TEAMModelOS.Controllers.Analysis
                         });
                     });
                 });
-                var sub = info.subjects.Select(x => new {
-                    id = x.id,
-                    name = x.name,
-                    sRate = examResults.FirstOrDefault(c => c.id == x.id).sRate
-                });
+               
             }
-
             catch (Exception ex) {
                 BadRequest(ex.StackTrace);
-            }          
+            }
+            var sub = info.subjects.Select(x => new {
+                id = x.id,
+                name = x.name,
+                sRate = examResults.FirstOrDefault(c => c.id == x.id).sRate,
+                average = examResults.FirstOrDefault(c => c.id == x.id).average,
+                standard = examResults.FirstOrDefault(c => c.id == x.id).standard
+            });
+            var subAll = new {sRate = info.sRate, average = info.average ,standard = info.standard };
             return Ok(new { students,
                 classes,
                 grades,
@@ -560,8 +565,8 @@ namespace TEAMModelOS.Controllers.Analysis
                 fieldPer = fieldPerDatas,
                 fieldAllPer = fieldAllPerDatas,
                 kScores = knowScoreDatas,
-                fScores = fieldScoreDatas
-
+                fScores = fieldScoreDatas,
+                all = subAll
             });
         }