%load_ext django_orm_magic %%django_orm from django.db import models from django.db.models import Sum class Municipio(models.Model): nombre = models.CharField(max_length=100) def __unicode__(self): return self.nombre class Circuito(models.Model): numero = models.CharField(max_length=100) municipio = models.ForeignKey('Municipio', null=True) def __unicode__(self): return u"Circuito %s (%s)" % (self.numero, self.municipio) class Mesa(models.Model): circuito = models.ForeignKey('Circuito', null=True) numero = models.CharField(max_length=100, unique=True) url = models.URLField() @property def computados(self): return self.votomesa_set.aggregate(Sum('votos'))['votos__sum'] def __unicode__(self): return u"Mesa %s (%s)" % (self.numero, self.circuito) class Opcion(models.Model): # partido, blanco, etc. nombre = models.CharField(max_length=100, unique=True) def __unicode__(self): return self.nombre class VotoMesa(models.Model): mesa = models.ForeignKey('Mesa') opcion = models.ForeignKey('Opcion') votos = models.IntegerField() def __unicode__(self): return u"%s: %d" % (self.opcion, self.votos) class Meta: unique_together = ('mesa', 'opcion') from django.db.models import Sum from IPython.display import HTML, display_html mesas = Mesa.objects.annotate(Sum('votomesa__votos')).order_by('-votomesa__votos__sum')[0:50] for mesa in mesas: display_html(HTML("%s - Total computados: %d" % (mesa.url, mesa, mesa.computados))) mesas0 = Mesa.objects.annotate(Sum('votomesa__votos')).filter(votomesa__votos__sum=0) print mesas0.count() for mesa in mesas0: display_html(HTML("%s - Total computados: %d" % (mesa.url, mesa, mesa.computados))) result = {} for opcion in Opcion.objects.all(): cantidad = Mesa.objects.annotate(computados=Sum('votomesa__votos')).filter(computados__gt=0, votomesa__votos=0, votomesa__opcion=opcion).count() result[opcion] = cantidad result from django.db.models import Avg proyeccion = {} for opcion, mesas_0 in result.items(): prom = VotoMesa.objects.filter(opcion=opcion).aggregate(Avg('votos'))['votos__avg'] proyeccion[opcion] = prom * mesas_0 sorted(proyeccion.items(), key=lambda a: a[1], reverse=True) result = [] for mun in Municipio.objects.all(): total = VotoMesa.objects.filter(mesa__circuito__municipio=mun).aggregate(Sum('votos'))['votos__sum'] nulos = VotoMesa.objects.filter(mesa__circuito__municipio=mun, opcion__nombre='Votos nulos').aggregate(Sum('votos'))['votos__sum'] if total: porcent = (nulos / float(total)) * 100 result.append((mun, total, nulos, porcent)) for r in sorted(result, key=lambda r: r[3], reverse=True): print "%s - Total: %d - nulos %d (%.2f%%)" % r result_circ = [] for circuito in Circuito.objects.filter(municipio=r[0]): total = VotoMesa.objects.filter(mesa__circuito=circuito).aggregate(Sum('votos'))['votos__sum'] nulos = VotoMesa.objects.filter(mesa__circuito=circuito, opcion__nombre='Votos nulos').aggregate(Sum('votos'))['votos__sum'] if total: porcent = (nulos / float(total)) * 100 result_circ.append((circuito.numero, total, nulos, porcent)) for rc in sorted(result_circ, key=lambda r: r[3], reverse=True): print " Circuito %s - Total: %d - nulos %d (%.2f%%)" % rc contador = 0 for mesa in Mesa.objects.annotate(Sum('votomesa__votos')).filter(votomesa__votos__sum__gt=0): nulos = mesa.votomesa_set.filter(opcion__nombre='Votos nulos').aggregate(Sum('votos'))['votos__sum'] porcentaje_nulo = (nulos / float(mesa.computados)) * 100 votos_fit = mesa.votomesa_set.get(opcion__nombre='FRENTE DE IZQUIERDA Y DE LOS TRABAJADORES').votos porcentaje_fit = (votos_fit / float(mesa.computados)) * 100 if nulos >= 9 and porcentaje_nulo >= 3 and porcentaje_fit <= 3: contador += 1 display_html(HTML("%s - Nulos %d, (%.2f%%) - FIT %d (%.2f %%)" % (mesa.url, mesa, nulos, porcentaje_nulo, votos_fit, porcentaje_fit))) contador from django.db.models import Avg for circuito in Circuito.objects.all(): promedio_ucr_circuito = VotoMesa.objects.filter(mesa__circuito=circuito, opcion__nombre='UNION CIVICA RADICAL').aggregate(Avg('votos'))['votos__avg'] if not promedio_ucr_circuito: continue for mesa in Mesa.objects.filter(circuito=circuito, votomesa__votos__gte=promedio_ucr_circuito * 1.5, votomesa__opcion__nombre='UNION CIVICA RADICAL'): votos_ucr = mesa.votomesa_set.get(opcion__nombre='UNION CIVICA RADICAL').votos porc_ucr = (votos_ucr / float(mesa.computados)) * 100 display_html(HTML("%s - Total computados: %d, UCR: %d (%.2f%%) Promedio UCR/circ: %.2f votos" % (mesa.url, mesa, mesa.computados, votos_ucr, porc_ucr, promedio_ucr_circuito)))