Primer commit
This commit is contained in:
@@ -0,0 +1,70 @@
|
||||
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}"
|
||||
Reference in New Issue
Block a user