> 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
-~----------~----~----~----~------~----~------~--~---

Reply via email to