Skip to main content

Generador de datos ficticios de Personas Mexicanas (nombres, CURP, RFC, teléfonos, emails)

Project description

Faker Persona MX

Python Version License: MIT

Generador profesional de datos ficticios de personas mexicanas para testing, desarrollo y demostración.

⚠️ IMPORTANTE: Las versiones 2.0.1 y 2.0.2 tienen errores fatales. NO uses estas versiones.

✅ Usa la versión 2.0.3 o superior que corrige todos los problemas.

Dataset Gigante

  • Más de 41,000 nombres mexicanos comunes
  • Más de 17,000 apellidos paternos | maternos
  • Más de 11,000 dominios de correo electrónico reales
  • Todas las ladas telefónicas de México
  • 32 estados con códigos CURP actualizados

Total de combinaciones posibles: 41,000 x 17,000 x 17,000 x 32 = 380 billones de personas únicas

Características

Datos Realistas

  • Nombres y apellidos auténticos mexicanos
  • CURP válidas (Clave Única de Registro de Población)
  • RFC válidos (Registro Federal de Contribuyentes)
  • Números telefónicos con ladas reales de México
  • Correos electrónicos con dominios personalizables

🚀 Producción Ready

  • Type hints completos (PEP 484)
  • Validaciones con Pydantic
  • Logging profesional
  • Sistema de caché inteligente
  • CLI poderoso con Typer
  • 100% testeado con pytest

🎯 Reproducible

  • Semillas configurables para datos consistentes
  • Ideal para testing automatizado
  • Datasets pre-barajados en caché

Instalación

Desde PyPI (Recomendado)

# Instalar la última versión (2.0.2 o superior)
pip install faker-persona-mx

# O especificar la versión explícitamente
pip install faker-persona-mx>=2.0.3

⚠️ Si ya tienes instalada la versión 2.0.1 o 2.0.2

Si instalaste la versión 2.0.1 o 2.0.2 (que tienen errores fatales), necesitas actualizar a la 2.0.3:

# Opción 1: Actualizar forzando reinstalación
pip install --force-reinstall faker-persona-mx==2.0.3

# Opción 2: Desinstalar y reinstalar
pip uninstall faker-persona-mx -y
pip install faker-persona-mx==2.0.3

# Opción 3: Actualizar a la última versión disponible
pip install --upgrade faker-persona-mx

Verificar que tienes la versión correcta:

pip show faker-persona-mx | grep Version
# Debe mostrar: Version: 2.0.3 (o superior)

# O desde Python
python3 -c "import faker_persona_mx; print(faker_persona_mx.__version__)"

Desde código fuente

git clone https://github.com/pedro-aaron/faker-persona-mx.git
cd faker-persona-mx

python3 -m venv .venv
source .venv/bin/activate  # En Windows: .venv\Scripts\activate

pip install -e .

Para desarrollo

pip install -e ".[dev]"

Uso Rápido

Como librería Python

from faker_persona_mx import PersonaGenerator

# Inicializar generador
generator = PersonaGenerator(seed=42)

# Generar una persona
persona = generator.generate_one()
print(persona.nombre_completo())  # "Juan Carlos García López"
print(persona.curp)               # "GALJ850815HDFRPN09"
print(persona.rfc)                # "GALJ850815ABC"
print(persona.email)              # "juan.carlos@example.com"
print(persona.telefono)           # "5512345678"

# Generar múltiples personas
personas = generator.generate_batch(100)

# Exportar a CSV
generator.export_to_csv(personas, "personas.csv")

# Exportar a JSON
generator.export_to_json(personas, "personas.json")

# Convertir a DataFrame
df = generator.to_dataframe(personas)

Desde la línea de comandos

# Generar 100 personas y mostrar en tabla
faker-persona-mx generate 100 --format table

# Generar 500 personas y exportar a CSV
faker-persona-mx generate 500 -o personas.csv -f csv

# Generar con semilla específica para reproducibilidad
faker-persona-mx generate 50 --seed 42 -o datos.json

# Generar solo teléfonos de ciertos estados
faker-persona-mx generate 100 --estados "Ciudad de México,Jalisco" -o cdmx_jalisco.csv

# Ver información de datasets
faker-persona-mx info

# Ver versión
faker-persona-mx version

# Eliminar caché (con confirmación)
faker-persona-mx clear-cache

# Eliminar caché sin confirmación
faker-persona-mx clear-cache --force

Ejemplos Avanzados

Generar con configuración personalizada

from faker_persona_mx import PersonaGenerator

# Deshabilitar caché y especificar estados
generator = PersonaGenerator(
    seed=123,
    cache_enabled=False,
    estados_activos=["Ciudad de México", "Nuevo León", "Jalisco"]
)

# Generación lazy con stream (memory efficient)
for persona in generator.generate_stream(10000):
    print(f"{persona.nombre_completo()} - {persona.email}")

Integración con pandas

import pandas as pd
from faker_persona_mx import PersonaGenerator

generator = PersonaGenerator(seed=42)
personas = generator.generate_batch(1000)

# Convertir a DataFrame
df = generator.to_dataframe(personas)

# Análisis de datos
print(df.describe())
print(df['telefono'].value_counts())

# Filtrar por criterios
df_cdmx = df[df['telefono'].str.startswith('55')]

Testing automatizado

import pytest
from faker_persona_mx import PersonaGenerator

@pytest.fixture
def personas_test():
    """Fixture con datos de prueba reproducibles."""
    generator = PersonaGenerator(seed=0)
    return generator.generate_batch(10)

def test_mi_funcion(personas_test):
    # Usar datos ficticios en tests
    resultado = mi_funcion_que_procesa_personas(personas_test)
    assert len(resultado) == 10

Sistema de Seed (Reproducibilidad)

El sistema de seed (semilla) permite generar datos de manera determinística y reproducible, ideal para testing automatizado, debugging y datasets consistentes.

¿Cómo funciona?

La semilla controla el generador de números aleatorios utilizado para:

  • Seleccionar nombres y apellidos de los datasets
  • Elegir el orden de barajado de los datos
  • Generar fechas de nacimiento
  • Asignar estados y ladas telefónicas
  • Calcular dígitos verificadores de CURP/RFC

La misma semilla siempre produce exactamente los mismos datos.

Ejemplos de uso

Reproducibilidad básica

from faker_persona_mx import PersonaGenerator

# Dos generadores con la misma semilla producen datos idénticos
gen1 = PersonaGenerator(seed=42)
gen2 = PersonaGenerator(seed=42)

persona1 = gen1.generate_one()
persona2 = gen2.generate_one()

assert persona1.nombre == persona2.nombre
assert persona1.curp == persona2.curp
# Todos los campos serán idénticos

Testing con datos consistentes

import pytest
from faker_persona_mx import PersonaGenerator

class TestProcesadorPersonas:
    @pytest.fixture
    def dataset_prueba(self):
        """Siempre retorna las mismas 100 personas."""
        gen = PersonaGenerator(seed=123)
        return gen.generate_batch(100)

    def test_filtrado_por_estado(self, dataset_prueba):
        # El test siempre usará los mismos datos
        cdmx = [p for p in dataset_prueba if p.telefono.startswith('55')]
        assert len(cdmx) > 0

    def test_validacion_curp(self, dataset_prueba):
        # Datos reproducibles facilitan debugging
        for persona in dataset_prueba:
            assert len(persona.curp) == 18

Diferentes semillas para variedad

from faker_persona_mx import PersonaGenerator

# Generar diferentes datasets para diferentes propósitos
gen_dev = PersonaGenerator(seed=1)      # Para desarrollo
gen_test = PersonaGenerator(seed=2)     # Para testing
gen_demo = PersonaGenerator(seed=3)     # Para demos

# Cada uno produce datos diferentes pero reproducibles
personas_dev = gen_dev.generate_batch(50)
personas_test = gen_test.generate_batch(100)

Seed desde línea de comandos

# Siempre genera los mismos 1000 registros
faker-persona-mx generate 1000 --seed 42 -o dataset_fijo.csv

# Útil para compartir datasets exactos entre equipos
faker-persona-mx generate 500 --seed 2024 -o equipo_qa.json

Configuración de seed

Por defecto (variable de entorno)

# En .env
DEFAULT_SEED=12345
# Usa el seed por defecto del .env
gen = PersonaGenerator()

Programáticamente

from faker_persona_mx.utils.config import config

# Cambiar seed global
config.DEFAULT_SEED = 999

# Todos los generadores sin seed explícito usarán 999
gen = PersonaGenerator()

Seed dinámico (para datos aleatorios reales)

import time

# Usar timestamp como seed para datos únicos cada vez
gen = PersonaGenerator(seed=int(time.time()))
personas = gen.generate_batch(100)

Mejores prácticas

  1. Testing: Usa semillas fijas (0, 42, 123) para tests reproducibles
  2. Desarrollo: Usa semillas conocidas para debugging consistente
  3. Producción/Demos: Usa semillas basadas en fecha/hora para variedad
  4. CI/CD: Documenta las semillas usadas en pipelines
  5. Datasets compartidos: Comparte tanto los datos como la semilla usada

Sistema de Caché

El sistema de caché optimiza el rendimiento al pre-barajar y almacenar datasets en disco, evitando el shuffle costoso en cada ejecución.

¿Cómo funciona?

  1. Primera ejecución con una semilla:

    • Carga los CSVs originales de nombres, apellidos, dominios
    • Los baraja usando la semilla especificada
    • Guarda los datasets barajados en data/cache/ con hash único
    • Usa los datos barajados para generar personas
  2. Ejecuciones posteriores con la misma semilla:

    • Detecta si ya existe caché para esa semilla
    • Carga directamente los datasets pre-barajados (mucho más rápido)
    • Genera personas sin necesidad de shuffle

Estructura de caché

src/faker_persona_mx/data/cache/
├── nombres_seed_42_41234.csv
├── apellidos_paterno_seed_42_17123.csv
├── apellidos_materno_seed_42_17089.csv
└── dominios_seed_42_11456.csv

Formato: {dataset}_seed_{seed}_{num_registros}.csv

Configuración de caché

Habilitar/Deshabilitar

from faker_persona_mx import PersonaGenerator

# Con caché (por defecto, recomendado)
gen = PersonaGenerator(seed=42, cache_enabled=True)

# Sin caché (más lento, útil para desarrollo)
gen = PersonaGenerator(seed=42, cache_enabled=False)

Variables de entorno

# En .env
ENABLE_CACHE=true                # Habilitar caché globalmente
CACHE_SIZE_TOLERANCE=0.01        # Tolerancia de tamaño (1%)

Tolerancia de tamaño de caché

El sistema valida que el caché tenga aproximadamente el mismo número de registros que el dataset original:

# Si el dataset original tiene 41,000 nombres
# y CACHE_SIZE_TOLERANCE=0.01 (1%)
# El caché debe tener entre 40,590 y 41,410 registros

Esto previene usar cachés corruptos o incompletos.

Gestión de caché

Limpiar caché con el CLI

# Eliminar caché con confirmación interactiva
faker-persona-mx clear-cache

# Eliminar caché sin confirmación (útil para scripts)
faker-persona-mx clear-cache --force

Limpiar caché manualmente

# Eliminar todos los archivos de caché
rm -rf src/faker_persona_mx/data/cache/*.csv
import shutil
from pathlib import Path

# Desde Python
cache_dir = Path("src/faker_persona_mx/data/cache")
shutil.rmtree(cache_dir)
cache_dir.mkdir(exist_ok=True)

Verificar caché actual

# Ver archivos de caché
ls -lh src/faker_persona_mx/data/cache/

# Ver información del generador (incluye estado de caché)
faker-persona-mx info

Ventajas del sistema de caché

  1. Performance: 10-50x más rápido en ejecuciones posteriores
  2. Consistencia: Garantiza mismos datos con misma semilla
  3. Disco vs RAM: Usa espacio en disco (barato) para ahorrar CPU
  4. Automático: Se gestiona sin intervención del usuario

Desventajas y cuándo deshabilitarlo

  • Espacio en disco: Cada semilla genera ~200MB de caché
  • Desarrollo de datasets: Si modificas los CSVs originales, elimina el caché
  • Testing del shuffle: Para probar el algoritmo de barajado
# Deshabilitado para testing
gen = PersonaGenerator(seed=42, cache_enabled=False)

Mejores prácticas

  1. Desarrollo normal: Mantén caché habilitado (más rápido)
  2. CI/CD: Considera deshabilitar caché en pipelines efímeros
  3. Modificación de datasets: Limpia caché después de actualizar CSVs
  4. Espacio limitado: Monitorea tamaño del directorio cache/
  5. Semillas múltiples: Cada semilla crea su propio caché (considerar espacio)

Estructura del Proyecto

faker-persona-mx/
├── src/
│   └── faker_persona_mx/
│       ├── core/           # Modelos y generador principal
│       ├── generators/     # Generadores individuales
│       ├── data/           # Datasets y loader
│       │   ├── datasets/   # CSVs con datos seed
│       │   └── cache/      # Caché de datasets barajados
│       └── utils/          # Configuración y logging
├── tests/                  # Suite de tests
├── examples/               # Ejemplos de uso
├── docs/                   # Documentación adicional
├── pyproject.toml         # Configuración del proyecto
└── README.md

Datasets Incluidos

  • Nombres: ~41,000 nombres mexicanos comunes
  • Apellidos: ~17,000 apellidos paternos y maternos
  • Dominios Email: ~11,000 dominios reales
  • Ladas México: Todas las ladas telefónicas por estado
  • Estados: 32 estados de México con códigos CURP

Desarrollo

Configurar entorno de desarrollo

# Clonar repositorio
git clone https://github.com/pedro-aaron/faker-persona-mx.git
cd faker-persona-mx

# Crear entorno virtual
python -m venv .venv
source .venv/bin/activate  # En Windows: .venv\Scripts\activate

# Instalar dependencias de desarrollo
pip install -e ".[dev]"

# Instalar pre-commit hooks
pre-commit install

Ejecutar tests

# Todos los tests
pytest

# Con cobertura
pytest --cov

# Tests específicos
pytest tests/test_generators.py -v

Code Quality

# Formatear código
black src/ tests/

# Linting
ruff src/ tests/

# Type checking
mypy src/

Configuración

Variables de entorno

Crear archivo .env en la raíz del proyecto:

# Logging
LOG_LEVEL=INFO
LOG_FILE=/tmp/faker_persona_mx.log

# Cache
ENABLE_CACHE=true
CACHE_SIZE_TOLERANCE=0.01

# Seed
DEFAULT_SEED=0

Configuración programática

from faker_persona_mx.utils.config import config

# Modificar configuración
config.DEFAULT_SEED = 42
config.ENABLE_CACHE = False

Roadmap

Próximas versiones

  • v0.2.0: Release inicial en PyPI
  • v0.3.0: Asociación de nombres con sexo biológico
    • Clasificar nombres del dataset como masculinos, femeninos o unisex
    • Garantizar coherencia entre nombre y sexo en CURP
    • Permitir filtrado por sexo en generación
    • Estadísticas de distribución por sexo
  • v0.4.0: Direcciones completas mexicanas
    • Calles, colonias, códigos postales reales
    • Integración con datos del SEPOMEX
    • Validación de direcciones por estado
  • v0.5.0: Documentos de identidad
    • Generación de INE (credencial de elector)
    • Números de pasaporte mexicano
    • Licencias de conducir
  • v0.6.0: Personas morales
    • Generación de empresas mexicanas (Razón Social)
    • RFC de personas morales
    • Giros empresariales

Trabajo futuro

  • API REST opcional con FastAPI
  • Integración como provider de Faker library
  • Dashboard web interactivo para generar datasets
  • Exportación a formatos adicionales (Parquet, Avro, XML)
  • Generación de relaciones familiares (padres, hijos, hermanos)
  • Históricos de datos (cambios de domicilio, empleos)
  • Plugin para pytest-fixtures
  • Soporte para datos sensibles con encriptación

Limitaciones conocidas

Importante: En la versión actual (v0.2.0), los nombres no están asociados con el sexo biológico. Esto significa que:

  • Un nombre típicamente masculino puede asignarse con sexo 'M' o 'H' en la CURP de forma aleatoria
  • Un nombre típicamente femenino puede tener sexo 'H' en la CURP
  • La asignación de sexo es puramente aleatoria e independiente del nombre

Solución planificada: La versión v0.3.0 incluirá un dataset clasificado de nombres por sexo, garantizando coherencia entre el nombre y el indicador de sexo en CURP/RFC.

Changelog

v2.0.3 (2026-03-06) - 🔥 HOTFIX CRÍTICO

✅ CORREGIDO: Rutas de archivos CSV incorrectas en paquetes instalados

  • Problema: Las versiones 2.0.1 y 2.0.2 tenían errores al localizar los archivos CSV cuando el paquete se instalaba vía pip. El código usaba Path(__file__).parent.parent.parent.parent que no funciona en paquetes instalados.
  • Solución: Implementada función _get_package_data_dir() en config.py que usa importlib.resources (Python 3.9+) con fallback a rutas relativas al módulo actual. Ahora funciona correctamente tanto en desarrollo como en paquetes instalados.
  • Cambios técnicos:
    • Nuevo helper _get_package_data_dir() para localizar archivos de datos
    • Soporte para importlib.resources.files() (Python 3.9+)
    • Fallback robusto usando __file__ relativo al módulo
    • Eliminada dependencia de PROJECT_ROOT que causaba problemas
  • Acción requerida: Si instalaste v2.0.1 o v2.0.2, actualiza inmediatamente:
    pip install --force-reinstall faker-persona-mx==2.0.3
    

v2.0.2 (2026-03-06) - ❌ NO USAR (Error fatal de rutas)

⚠️ Esta versión tiene un error crítico y no debe usarse. Aunque los CSV se incluyen en el paquete, el código no puede localizarlos correctamente cuando se instala vía pip, causando FileNotFoundError.

v2.0.1 (2026-03-05) - ❌ NO USAR (Error fatal de empaquetado)

⚠️ Esta versión tiene un error crítico y no debe usarse. Los archivos CSV no se incluyen en la distribución, haciendo que el paquete sea completamente inoperable.

v2.0.0 (2026-03-04)

  • Refactorización completa de la arquitectura
  • Sistema de caché optimizado
  • CLI mejorado con Typer
  • Validaciones con Pydantic
  • Type hints completos
  • Logging profesional

Contribuir

¡Las contribuciones son bienvenidas! Por favor:

  1. Fork el proyecto
  2. Crea una rama para tu feature (git checkout -b feature/AmazingFeature)
  3. Commit tus cambios (git commit -m 'Add: amazing feature')
  4. Push a la rama (git push origin feature/AmazingFeature)
  5. Abre un Pull Request

Licencia

Este proyecto está bajo la Licencia MIT. Ver archivo LICENSE para más detalles.

Mantenedores

Lead Developer: @pedro-aaron

Soporte

Autor

pedro-aaron GitHub: @pedro-aaron

Si este proyecto te resulta útil, considera darle una ⭐ en GitHub.


Hecho con ❤️ en México 🇲🇽

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

faker_persona_mx-2.0.3.tar.gz (610.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

faker_persona_mx-2.0.3-py3-none-any.whl (609.7 kB view details)

Uploaded Python 3

File details

Details for the file faker_persona_mx-2.0.3.tar.gz.

File metadata

  • Download URL: faker_persona_mx-2.0.3.tar.gz
  • Upload date:
  • Size: 610.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for faker_persona_mx-2.0.3.tar.gz
Algorithm Hash digest
SHA256 063c71a7596c06b069445908667d9e9716e9df41b5e1a4086a7b49ae79795187
MD5 266fd0f0fc120763bd03abb27dad3697
BLAKE2b-256 1b6cebcecd414d1eb4880eae71b487f6b780d4fd399dc82b119b3e72b3c6c552

See more details on using hashes here.

File details

Details for the file faker_persona_mx-2.0.3-py3-none-any.whl.

File metadata

File hashes

Hashes for faker_persona_mx-2.0.3-py3-none-any.whl
Algorithm Hash digest
SHA256 78c4553420613f9b2452f3cabb61ac2a240f0d0e500e0b8cf446904516abaf8a
MD5 ea9a44b1c78713fae136608696a4db48
BLAKE2b-256 e8e62796d8c41ff867e99d839f59ec72f696c6b30c3407fc33279a4c3e685000

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page