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}"