Make openreviews generate quartiles instead of just median.

By reporting 1,2,3 quartiles instead of just the 2nd (median) we can get a
better insight into what the distribution looks like. For example if
the median is good, but the 1st quartile is very low and the 3rd is very
high it means we have some patches would be waiting much longer then
others, but our average(median) may still be good.

Change-Id: I3427e562ab39dc6915ac0d2e42347e0d6e0123bc
This commit is contained in:
Joe Gordon 2013-10-14 10:14:04 -07:00
parent 0a585e73cb
commit 7603a774b7
1 changed files with 34 additions and 7 deletions

View File

@ -60,12 +60,19 @@ def average_age(changes, key='age'):
return sec_to_period_string(avg_age)
def median_age(changes, key='age'):
def quartile_age(changes, quartile=2, key='age'):
"""Quartile age
quartile 1: 25%
quartile 2: 50% (median) default
quartile 3: 75%
"""
if not changes:
return 0
changes = sorted(changes, key=lambda change: change[key])
median_age = changes[len(changes)/2][key]
return sec_to_period_string(median_age)
quartile_age = changes[len(changes) * quartile/4][key]
return sec_to_period_string(quartile_age)
def number_waiting_more_than(changes, seconds, key='age'):
@ -103,8 +110,14 @@ def gen_stats(projects, waiting_on_reviewer, waiting_on_submitter, options):
latest_rev_stats = []
latest_rev_stats.append(('Average wait time', '%s'
% (average_age(waiting_on_reviewer))))
latest_rev_stats.append(('1rd quartile wait time', '%s'
% (quartile_age(waiting_on_reviewer,
quartile=1))))
latest_rev_stats.append(('Median wait time', '%s'
% (median_age(waiting_on_reviewer))))
% (quartile_age(waiting_on_reviewer))))
latest_rev_stats.append(('3rd quartile wait time', '%s'
% (quartile_age(waiting_on_reviewer,
quartile=3))))
latest_rev_stats.append((
'Number waiting more than %i days' % options.waiting_more,
'%i' % (number_waiting_more_than(
@ -115,17 +128,31 @@ def gen_stats(projects, waiting_on_reviewer, waiting_on_submitter, options):
last_without_nack_stats.append(('Average wait time', '%s'
% (average_age(waiting_on_reviewer,
key='age3'))))
last_without_nack_stats.append(('1rd quartile wait time', '%s'
% (quartile_age(waiting_on_reviewer,
quartile=1,
key='age3'))))
last_without_nack_stats.append(('Median wait time', '%s'
% (median_age(waiting_on_reviewer,
key='age3'))))
% (quartile_age(waiting_on_reviewer,
key='age3'))))
last_without_nack_stats.append(('3rd quartile wait time', '%s'
% (quartile_age(waiting_on_reviewer,
quartile=3,
key='age3'))))
stats.append(('Stats since the last revision without -1 or -2 '
'(ignoring jenkins)', last_without_nack_stats))
first_rev_stats = []
first_rev_stats.append(('Average wait time', '%s'
% (average_age(waiting_on_reviewer, key='age2'))))
first_rev_stats.append(('1st quartile wait time', '%s'
% (quartile_age(waiting_on_reviewer, quartile=1,
key='age2'))))
first_rev_stats.append(('Median wait time', '%s'
% (median_age(waiting_on_reviewer, key='age2'))))
% (quartile_age(waiting_on_reviewer, key='age2'))))
first_rev_stats.append(('3rd quartile wait time', '%s'
% (quartile_age(waiting_on_reviewer, quartile=3,
key='age2'))))
stats.append(('Stats since the first revision (total age)',
first_rev_stats))