大数据计算GPA...
今天班长丢了一堆数据给我让我算班里的人的GPA…于是做了一点微小的贡献, 谢谢大家
给的是大二上学期和下学期的成绩, 如下图
大二上的
大二下的
行是名字, 列是一堆课, 问题是公选课个性课大家选的都不一样, 因此有很多课只有某一个人有成绩, 就很稀疏, 就比如大二上的那个, 课就有88节, 很多都是公选个性, 对于缺失值可以取~isnan来处理, 最主要的是没有这些课对应的学分, 也就没有办法计算GPA, 所以找班长要课程对应的学分向量,
然后找班长要来了如下的数据
数万条全校所有2015-2016学年的必修选修课的名字和学分学院等的表…所以我们可以从里面提取我们需要的课程对应学分信息.
这里利用了excel的批量索引函数 match和index
找到了我们班人选到的所有课组成的列向量对应的学分向量.
excel公式如下
=INDEX('1'!B2:B5492,MATCH(A1,'1'!A2:A5492,0))
这里的index是根据列的索引找值, match就是用来找索引, 我们利用课程名称match到另一张带学分表的课程名称上, 获取它的索引, 然后利用这个索引index到课程对应的学分, 在反带回第二张表, 完成效果如下
对第二学期的重复这个操作, 就可以得到学分向量了.
那么我们有了学分向量和成绩向量, 就可以计算了.
接下来把处理好的数据导入matlab计算, 函数如下
function res = gpa(grade,credit)
len = size(grade,1);
res = zeros(len,1);
for i = 1:len
index = ~isnan(grade(i,:));
grade_temp = grade(i,index);
grade_temp(find(grade_temp<60)) = 0;
credit_temp = credit(index);
temp = (grade_temp-50)/10*credit_temp';
res(i) = temp/sum(credit_temp);
%res(i) = (result-50)/10;
end
xlswrite('result.csv',res);
end
在命令行输入
gpa(year(1:(end-1),:),year(end,:))
对结果排个序, 加个名字
OK~