refactor result data structure, fix rank calculation, add team rank

This commit is contained in:
Helmut Merz 2014-05-24 14:49:29 +02:00
parent b04daf0c51
commit 0f03b894f4
2 changed files with 30 additions and 23 deletions

View file

@ -69,14 +69,14 @@ Grouped feedback items
>>> qugroup.feedbackItems = [fi01, fi02, fi03] >>> qugroup.feedbackItems = [fi01, fi02, fi03]
>>> res = resp01.getGroupedResult() >>> res = resp01.getGroupedResult()
>>> for qugroup, fi, score in res: >>> for r in res:
... print fi.text, round(score, 2) ... print r['feedback'].text, round(r['score'], 2), r['rank']
fi02 0.58 fi02 0.58 1
>>> res = resp02.getGroupedResult() >>> res = resp02.getGroupedResult()
>>> for qugroup, fi, score in res: >>> for r in res:
... print fi.text, round(score, 2) ... print r['feedback'].text, round(r['score'], 2), r['rank']
fi03 0.75 fi03 0.75 1
Team evaluation Team evaluation
--------------- ---------------
@ -84,11 +84,11 @@ Team evaluation
>>> resp03 = Response(quest, 'mary') >>> resp03 = Response(quest, 'mary')
>>> resp03.values = {qu01: 1, qu02: 2, qu03: 4} >>> resp03.values = {qu01: 1, qu02: 2, qu03: 4}
>>> resp01.values[qugroup] = resp01.getGroupedResult()[0][2] >>> resp01.values[qugroup] = resp01.getGroupedResult()[0]['score']
>>> resp03.values[qugroup] = resp03.getGroupedResult()[0][2] >>> resp03.values[qugroup] = resp03.getGroupedResult()[0]['score']
>>> ranks, averages = resp01.getTeamResult(resp03.getGroupedResult(), >>> teamData = resp01.getTeamResult(resp03.getGroupedResult(),
... [resp01, resp03]) ... [resp01, resp03])
>>> ranks, averages >>> teamData
([1], [0.6666...]) [{'average': 0.6666...}]

View file

@ -107,19 +107,26 @@ class Response(object):
if scoreMax > 0.0: if scoreMax > 0.0:
relScore = score / scoreMax relScore = score / scoreMax
wScore = relScore * len(qugroup.feedbackItems) - 0.00001 wScore = relScore * len(qugroup.feedbackItems) - 0.00001
result.append((qugroup, qugroup.feedbackItems[int(wScore)], relScore)) result.append(dict(
group=qugroup,
feedback=qugroup.feedbackItems[int(wScore)],
score=relScore))
ranks = getRanks([r['score'] for r in result])
for idx, r in enumerate(result):
r['rank'] = ranks[idx]
return result return result
def getTeamResult(self, mine, teamData): def getTeamResult(self, mine, teamData):
averages = [] result = []
ranks = []
for idx, qgdata in enumerate(mine): for idx, qgdata in enumerate(mine):
total = 0.0 values = [data.values[qgdata['group']] for data in teamData]
values = sorted([data.values[qgdata[0]] for data in teamData]) avg = sum(values) / len(teamData)
for j, value in enumerate(values): result.append(dict(group=qgdata['group'], average=avg))
total += value ranks = getRanks([r['average'] for r in result])
if qgdata[2] >= value: for idx, r in enumerate(result):
pos = len(teamData) - j r['rank'] = ranks[idx]
ranks.append(pos) return result
averages.append(total / len(teamData))
return ranks, averages def getRanks(values):
ordered = list(reversed(sorted(values)))
return [ordered.index(v) + 1 for v in values]