%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)))