This commit is contained in:
Roberto Alsina 2022-07-19 15:44:48 -03:00
parent a1c2ca7d06
commit ac621f63aa
1 changed files with 16 additions and 59 deletions

View File

@ -29,54 +29,8 @@ class Género:
def split_por_genero(nombres): def split_por_genero(nombres):
no_clasificados = set() # TODO: reimplementar usando datos de España de género asignado
# Veamos cuales de estos nombres ya están clasificados return {"f": nombres, "m": nombres}
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}
def handle(req): def handle(req):
@ -92,7 +46,6 @@ def handle(req):
""" """
try: try:
data = loads(req) data = loads(req)
except Exception as e: except Exception as e:
@ -107,11 +60,11 @@ def handle(req):
año = None año = None
except Exception as e: except Exception as e:
prefijo = genero = año = None prefijo = genero = año = None
return f"{req} -- {e}", 400
if prefijo is not None: if prefijo is not None:
prefijo = prefijo.strip().lower() prefijo = prefijo.strip().lower()
if genero not in ("f", "m"): if genero not in ("f", "m"):
genero = None genero = None
@ -126,7 +79,7 @@ def handle(req):
cursor.execute(sql) cursor.execute(sql)
datos = [(r["total"], r["nombre"]) for r in cursor.fetchall()] 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: with connection.cursor() as cursor:
sql = """ sql = """
SELECT contador, nombre SELECT contador, nombre
@ -136,21 +89,21 @@ def handle(req):
ORDER BY contador DESC ORDER BY contador DESC
LIMIT 50 LIMIT 50
""" """
cursor.execute(sql, {'anio': año}) cursor.execute(sql, {"anio": año})
datos = [(r["contador"], r["nombre"]) for r in cursor.fetchall()] datos = [(r["contador"], r["nombre"]) for r in cursor.fetchall()]
elif prefijo is not None and año is None: elif prefijo is not None and año is None:
with connection.cursor() as cursor: with connection.cursor() as cursor:
sql = """ sql = """
SELECT contador, nombre SELECT total, nombre
FROM nombres FROM totales
WHERE WHERE
nombre LIKE :nombre nombre LIKE :nombre
ORDER BY contador DESC ORDER BY total DESC
LIMIT 50 LIMIT 50
""" """
cursor.execute(sql, {"nombre": "{prefijo}%"}) cursor.execute(sql, {"nombre": f"{prefijo}%"})
datos = [(r["contador"], r["nombre"]) for r in cursor.fetchall()] datos = [(r["total"], r["nombre"]) for r in cursor.fetchall()]
else: else:
with connection.cursor() as cursor: with connection.cursor() as cursor:
sql = """ sql = """
@ -162,7 +115,7 @@ def handle(req):
ORDER BY contador DESC ORDER BY contador DESC
LIMIT 50 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()] datos = [(r["contador"], r["nombre"]) for r in cursor.fetchall()]
if genero: if genero:
@ -180,4 +133,8 @@ def handle(req):
chart.title = "¡No esssistís!" chart.title = "¡No esssistís!"
chart.add("", [contador for contador, _ in datos[::-1]]) 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"},
)