71 lines
2.9 KiB
Python
71 lines
2.9 KiB
Python
import os
|
|
import random
|
|
import pandas as pd
|
|
from dotenv import load_dotenv
|
|
from entrypoint import ENV_PATH
|
|
|
|
# Cargar variables de entorno desde ENV_PATH
|
|
load_dotenv(ENV_PATH)
|
|
|
|
class GeneradorNombre_Spanish:
|
|
def __init__(self):
|
|
# Obtener ruta base del proyecto
|
|
project_path = os.getenv("PROJECT_PATH")
|
|
if not project_path:
|
|
raise ValueError("La variable PROJECT_PATH no está definida en el archivo .env")
|
|
|
|
# Construir rutas absolutas a los archivos
|
|
self.ruta_hombres = os.path.join(project_path, "data", "files", "txt", "nombres_español", "hombres.csv")
|
|
self.ruta_mujeres = os.path.join(project_path, "data", "files", "txt", "nombres_español", "mujeres.csv")
|
|
self.ruta_apellidos = os.path.join(project_path, "data", "files", "txt", "nombres_español", "apellidos.csv")
|
|
|
|
# Cargar datos
|
|
self.df_hombres = pd.read_csv(self.ruta_hombres)
|
|
self.df_mujeres = pd.read_csv(self.ruta_mujeres)
|
|
self.df_apellidos = pd.read_csv(self.ruta_apellidos)
|
|
|
|
# Limpiar y normalizar columnas
|
|
for df in (self.df_hombres, self.df_mujeres):
|
|
df.columns = df.columns.str.strip().str.lower()
|
|
df['frec'] = pd.to_numeric(df['frec'], errors='coerce')
|
|
df['edad_media'] = pd.to_numeric(df['edad_media'], errors='coerce')
|
|
df.dropna(subset=['frec', 'edad_media'], inplace=True)
|
|
|
|
self.df_apellidos.columns = self.df_apellidos.columns.str.strip().str.lower()
|
|
self.df_apellidos['frec_pri'] = pd.to_numeric(self.df_apellidos['frec_pri'], errors='coerce')
|
|
self.df_apellidos['frec_seg'] = pd.to_numeric(self.df_apellidos['frec_seg'], errors='coerce')
|
|
self.df_apellidos.dropna(subset=['frec_pri', 'frec_seg'], inplace=True)
|
|
|
|
def generar_nombre(self, sexo: str = None, edad_aprox: float = None) -> str:
|
|
if sexo not in {'hombre', 'mujer'}:
|
|
sexo = random.choice(['hombre', 'mujer'])
|
|
|
|
df = self.df_hombres if sexo == 'hombre' else self.df_mujeres
|
|
|
|
if edad_aprox is not None:
|
|
df = df[
|
|
(df['edad_media'] >= edad_aprox - 5) &
|
|
(df['edad_media'] <= edad_aprox + 5)
|
|
]
|
|
|
|
if df.empty:
|
|
raise ValueError(f"No hay nombres disponibles para edad {edad_aprox} y sexo {sexo}")
|
|
|
|
nombre = random.choices(df['nombre'].tolist(), weights=df['frec'].tolist(), k=1)[0]
|
|
return nombre
|
|
|
|
def generar_nombre_completo(self, sexo: str = None, edad_aprox: float = None) -> str:
|
|
nombre = self.generar_nombre(sexo, edad_aprox)
|
|
|
|
primer_apellido = random.choices(
|
|
self.df_apellidos['apellido'].tolist(),
|
|
weights=self.df_apellidos['frec_pri'].tolist(), k=1
|
|
)[0]
|
|
|
|
segundo_apellido = random.choices(
|
|
self.df_apellidos['apellido'].tolist(),
|
|
weights=self.df_apellidos['frec_seg'].tolist(), k=1
|
|
)[0]
|
|
|
|
return f"{nombre} {primer_apellido} {segundo_apellido}"
|