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

View file

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