from pyquery import PyQuery
def parse_telegrama(url):
pq = PyQuery(url)
resultado_mesa = {}
for tr in pq('.tablon tbody tr, .TVOTOS tbody tr'):
resultado_mesa[pq('th', tr).text()] = int(pq('td', tr).text().replace('.', ''))
return resultado_mesa
escrutinio = parse_telegrama('http://www.resultados.gob.ar/telegramas/04/001/0013J/040010013J2669.htm')
escrutinio
sum(escrutinio.values())
def crawl(base_url):
"""
Devuelve un arbol con los resultados de cada mesa
Puede tardar mucho.
>>> crawl("http://www.resultados.gob.ar/telegramas/IMUN04.htm")
"""
arbol = {}
pq = PyQuery(base_url)
pq = pq.make_links_absolute(base_url='http://www.resultados.gob.ar/telegramas/')
for anchor in pq('a'):
url = pq(anchor).attr('href')
if '04/' in url:
# mesa
data = parse_telegrama(url)
else:
# abrir nueva rama
data = crawl(url)
arbol[pq(anchor).text()] = data
return arbol
%install_ext https://gist.github.com/mgaitan/7207448/raw/ce87e68226ef4ad12cb1aabfa42ebacaf66b3bce/django_orm_magic.py
%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 import IntegrityError
def crawl2(base_url, nivel='prov', parent=None):
pq = PyQuery(base_url)
pq = pq.make_links_absolute(base_url='http://www.resultados.gob.ar/telegramas/')
anchors = pq('a')
if nivel == 'circuito' and parent and parent.mesa_set.count() == len(anchors):
return
for anchor in anchors:
url = pq(anchor).attr('href')
text = pq(anchor).text()
if nivel == 'circuito':
# mesa
try:
mesa = Mesa.objects.create(numero=text, circuito=parent, url=url)
except IntegrityError:
continue
for opcion, votos in parse_telegrama(url).iteritems():
opcion, _ = Opcion.objects.get_or_create(nombre=opcion)
try:
VotoMesa.objects.create(mesa=mesa, opcion=opcion, votos=votos)
except: #not unique
continue
elif nivel == 'prov':
municipio, _ = Municipio.objects.get_or_create(nombre=text)
crawl2(url, nivel="muni", parent=municipio)
elif nivel == 'muni':
circuito, _ = Circuito.objects.get_or_create(numero=text, municipio=parent)
crawl2(url, nivel="circuito", parent=circuito)
!wget -r http://lab.nqnwebs.com/descargas/db.sqlite
# todas las opciones de voto
for opcion in Opcion.objects.all():
print opcion
#total votos blancos en Capital
from django.db.models import Sum
cap = Municipio.objects.get(nombre='001 - Capital')
VotoMesa.objects.filter(mesa__circuito__municipio=cap, opcion__nombre='Votos en blanco').aggregate(Sum('votos'))
Fit = Opcion.objects.get(nombre='FRENTE DE IZQUIERDA Y DE LOS TRABAJADORES')
from IPython.display import display_html, HTML
for mesa in Mesa.objects.filter(votomesa__votos=0, votomesa__opcion=Fit):
if mesa.computados != 0:
display_html(HTML("%s - Total computados: %d" % (mesa.url, mesa, mesa.computados)))
from django.db.models import Avg
for circuito in Circuito.objects.all():
promedio_fit_circuito = VotoMesa.objects.filter(mesa__circuito=circuito, opcion=Fit).aggregate(Avg('votos'))['votos__avg']
if not promedio_fit_circuito:
continue
for mesa in Mesa.objects.filter(circuito=circuito, votomesa__votos__gt=0,
votomesa__votos__lte=promedio_fit_circuito/2,
votomesa__opcion=Fit):
display_html(HTML("%s - Total computados: %d, Promedio FIT/circ = %f" % (mesa.url, mesa,
mesa.computados, promedio_fit_circuito)))