def moving_median_abs_dev(self, year=None, month=None, day=None, weeks=4): """ The moving median absolute deviation of cycle time for every day in the last N weeks. See http://en.wikipedia.org/wiki/Median_absolute_deviation """ end_date = make_end_date(year, month, day) start_date = end_date - relativedelta(weeks=weeks) start_date = make_start_date(date=start_date) qs = self.done().filter( done_date__lte=end_date, done_date__gte=start_date, ).scalar('_cycle_time') cycle_times = [t for t in qs if t is not None] median_cycle_time = median(cycle_times) if median_cycle_time is not None: absolute_deviations = [math.fabs(median_cycle_time - c) for c in cycle_times] mad = median(absolute_deviations) else: mad = None if mad is None: mad = 0 return int(round(mad))
def moving_median_abs_dev(self, year=None, month=None, day=None, weeks=4): """ The moving median absolute deviation of cycle time for every day in the last N weeks. See http://en.wikipedia.org/wiki/Median_absolute_deviation """ end_date = make_end_date(year, month, day) start_date = end_date - relativedelta(weeks=weeks) start_date = make_start_date(date=start_date) qs = self.done().filter( done_date__lte=end_date, done_date__gte=start_date, ).scalar('_cycle_time') cycle_times = [t for t in qs if t is not None] median_cycle_time = median(cycle_times) if median_cycle_time is not None: absolute_deviations = [ math.fabs(median_cycle_time - c) for c in cycle_times ] mad = median(absolute_deviations) else: mad = None if mad is None: mad = 0 return int(round(mad))
def state_transition_counts(state, months, count_type="exit", raw=False): end = make_end_date(date=datetime.datetime.now()) start = end - relativedelta(months=months) start = make_start_date(date=start) counts = [] data = [] current_date = start while current_date <= end: if current_date.weekday() == 5: # Saturday current_date += relativedelta(days=2) elif current_date.weekday() == 6: # Sunday current_date += relativedelta(days=1) range_start = make_start_date(date=current_date) range_end = make_end_date(date=current_date) if count_type == "exit": kwargs = dict( exited__gte=range_start, exited__lte=range_end, ) elif count_type == "enter": kwargs = dict( entered__gte=range_start, entered__lte=range_end, ) count = StateLog.objects.filter( state=state, **kwargs ).count() data.append((current_date, count)) counts.append(count) current_date = current_date + relativedelta(days=1) counts.sort() print "%s\t%s" % (start, end) print "Median\t%s" % median(counts) print "Average\t%s" % average(counts) print "Min\t%s" % counts[0] print "Max\t%s" % counts[-1] hist = histogram(counts) keys = hist.keys() keys.sort() for k in keys: print "%s\t%s" % (k, hist[k]) if raw is True: for date, count in data: print "%s\t%s" % (date, count)
def state_transition_counts(state, months, count_type="exit", raw=False): end = make_end_date(date=datetime.datetime.now()) start = end - relativedelta(months=months) start = make_start_date(date=start) counts = [] data = [] current_date = start while current_date <= end: if current_date.weekday() == 5: # Saturday current_date += relativedelta(days=2) elif current_date.weekday() == 6: # Sunday current_date += relativedelta(days=1) range_start = make_start_date(date=current_date) range_end = make_end_date(date=current_date) if count_type == "exit": kwargs = dict( exited__gte=range_start, exited__lte=range_end, ) elif count_type == "enter": kwargs = dict( entered__gte=range_start, entered__lte=range_end, ) count = StateLog.objects.filter(state=state, **kwargs).count() data.append((current_date, count)) counts.append(count) current_date = current_date + relativedelta(days=1) counts.sort() print "%s\t%s" % (start, end) print "Median\t%s" % median(counts) print "Average\t%s" % average(counts) print "Min\t%s" % counts[0] print "Max\t%s" % counts[-1] hist = histogram(counts) keys = hist.keys() keys.sort() for k in keys: print "%s\t%s" % (k, hist[k]) if raw is True: for date, count in data: print "%s\t%s" % (date, count)
def median(self, weeks=4): med = median(self.cycle_times(weeks)) if med is not None: med = int(round(med)) return med