Roberto Alsina 3 months ago
parent
commit
ac621f63aa
  1. 75
      nombres/busqueda/handler.py

75
nombres/busqueda/handler.py

@ -29,54 +29,8 @@ class Género:
def split_por_genero(nombres):
no_clasificados = set()
# Veamos cuales de estos nombres ya están clasificados
for nombre in nombres:
clasificador = remove_accents(
nombre.nombre.split()[0]
) # genderize no aprecia acentos para AR
genero = Género.get(nombre=clasificador)
if not genero:
# No está clasificado
no_clasificados.add(urllib.parse.quote(clasificador))
if no_clasificados:
print(f"Tengo {len(no_clasificados)} sin clasificar")
no_clasificados = list(no_clasificados)
# Averiguar los no clasificados
# Partimos en bloques de a 10 (API de genderize)
for i in range(len(no_clasificados) // 10 + 1):
chunk = no_clasificados[i * 10 : (i + 1) * 10]
url = f'https://api.genderize.io/?name[]={"&name[]=".join(chunk)}&country_id=AR'
clasificados = requests.get(url)
for resultado in clasificados.json():
if not resultado["name"]:
continue # No me importa
if resultado["gender"] == "male":
masc = resultado["probability"]
elif resultado["gender"] == "female":
masc = 1 - resultado["probability"]
else:
# Probablemente un acento o algo así
print(f"Raro:{resultado}")
masc = None
# Metemos en la base
print(f"Clasificando {resultado}: {masc}")
Género(nombre=resultado["name"], masculinidad=masc)
nombres_f = []
nombres_m = []
for nombre in nombres:
clasificador = remove_accents(nombre.nombre.split()[0])
genero = Género.get(nombre=clasificador)
if not genero or genero.masculinidad is None: # No clasificado, en ambos
nombres_f.append(nombre)
nombres_m.append(nombre)
elif 0.4 < genero.masculinidad:
nombres_m.append(nombre)
elif 0.6 > genero.masculinidad:
nombres_f.append(nombre)
return {"f": nombres_f, "m": nombres_m}
# TODO: reimplementar usando datos de España de género asignado
return {"f": nombres, "m": nombres}
def handle(req):
@ -92,7 +46,6 @@ def handle(req):
"""
try:
data = loads(req)
except Exception as e:
@ -107,11 +60,11 @@ def handle(req):
año = None
except Exception as e:
prefijo = genero = año = None
return f"{req} -- {e}", 400
if prefijo is not None:
prefijo = prefijo.strip().lower()
if genero not in ("f", "m"):
genero = None
@ -126,7 +79,7 @@ def handle(req):
cursor.execute(sql)
datos = [(r["total"], r["nombre"]) for r in cursor.fetchall()]
elif prefijo is None and año is not None: # Totales por año
elif prefijo is None and año is not None: # Totales por año
with connection.cursor() as cursor:
sql = """
SELECT contador, nombre
@ -136,21 +89,21 @@ def handle(req):
ORDER BY contador DESC
LIMIT 50
"""
cursor.execute(sql, {'anio': año})
cursor.execute(sql, {"anio": año})
datos = [(r["contador"], r["nombre"]) for r in cursor.fetchall()]
elif prefijo is not None and año is None:
with connection.cursor() as cursor:
sql = """
SELECT contador, nombre
FROM nombres
SELECT total, nombre
FROM totales
WHERE
nombre LIKE :nombre
ORDER BY contador DESC
ORDER BY total DESC
LIMIT 50
"""
cursor.execute(sql, {"nombre": "{prefijo}%"})
datos = [(r["contador"], r["nombre"]) for r in cursor.fetchall()]
cursor.execute(sql, {"nombre": f"{prefijo}%"})
datos = [(r["total"], r["nombre"]) for r in cursor.fetchall()]
else:
with connection.cursor() as cursor:
sql = """
@ -162,7 +115,7 @@ def handle(req):
ORDER BY contador DESC
LIMIT 50
"""
cursor.execute(sql, {"anio": año, "nombre": "{prefijo}%"})
cursor.execute(sql, {"anio": año, "nombre": f"{prefijo}%"})
datos = [(r["contador"], r["nombre"]) for r in cursor.fetchall()]
if genero:
@ -180,4 +133,8 @@ def handle(req):
chart.title = "¡No esssistís!"
chart.add("", [contador for contador, _ in datos[::-1]])
return chart.render(is_unicode=True), 200, {"Content-Typei": "image/svg+xml"}
return (
chart.render(is_unicode=True),
200,
{"Content-Type": "image/svg+xml"},
)

Loading…
Cancel
Save