> al_1 = Alert.objects.filter(creation_date__regex=today).values > ('dimension1').annotate(Sum('metric1')).order_by('dimension1') > > and > > al_2 = Alert.objects.filter(creation_date__regex=yesterday).values > ('dimension1').annotate(Sum('metric1')).order_by('dimension1') > > They are almost the same except that al_1 is for today's data and al_2 > is for yesterday's data. They summarize data in column "metric1" that > is grouped and ordered by "dimension1". > > Sample data from al_1: > > [{'metric1__sum': 0.0, 'dimension1': u'1'}, {'metric1__sum': 14.0, [snip] > What I need to do is to find a ratio value for each "dimension1" > between its today's value and yesterday's value. For example, for > dimension1 = '110085', I need to find 2758.0 / 2658.0 = 1.04. > Then I compare this value "1.04" with a threshold and process > further.
You can do something like >>> map1 = dict((d['dimension1'], d['metric1__sum']) for d in al_1) >>> map2 = dict((d['dimension1'], d['metric1__sum']) for d in al_2) >>> ratios = [(dim, metric/map2[dim]) for dim, metric in map1.iteritems() if map2.get(dim, 0) != 0] >>> results = [(dim, ratio) for dim, ratio in ratios if ratio >= threshold] It may lose ordering if that is significant (dicts aren't ordered by default), and skips over those where there are problems (items don't exist in the opposite map, or the previous value was 0 making for a divide-by-zero problem). Things might change a little depending on what you'd expect on those edge cases (dim in a1 but not in a2; dim in a2 but not in a1; a2.metric = 0) -tim --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Django users" group. To post to this group, send email to django-users@googlegroups.com To unsubscribe from this group, send email to django-users+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/django-users?hl=en -~----------~----~----~----~------~----~------~--~---