This repository has been archived on 2025-11-27. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
Fitz_Studio/utils/Generar_nombres.py
2025-05-05 02:21:55 +02:00

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