Saltar a contenido

Faker

Datos sintéticos

Tal como define la Agencia Española de Protección de Datos entendemos por datos sintéticos los

"datos generados artificialmente, a diferencia de los datos reales que se recopilan de la realidad".

Los datos sintéticos deben preservar las características y propiedades de los datos reales para un caso de uso específico.

Por ejemplo, los utilizaremos durante las fases de desarrollo, prueba y validación de servicios de aprendizaje automático, donde los datos reales no están disponibles en las cantidades necesarias, o incluso dichos datos reales no existen.

También nos permite utilizarlos como técnica de privacidad, cuando se utilizan para crear conjuntos de datos no personales con la misma utilidad que los personales.

Faker

Si necesitamos generar muchos datos, es muy útil emplear una librería como Faker para generar datos sintéticos.

Primero hemos de instalarla mediante pip:

pip3 install faker

Vamos a realizar un ejemplo para mostrar algunos datos aleatorios y comprobar su funcionamiento:

holaFaker.py
from faker import Faker

fake = Faker()
fake = Faker('es_ES')   # cambiamos el locale a español

print("Nombre:", fake.name())
print("Dirección:", fake.address())
print("Nombre de hombre:", fake.first_name_male())
print("Número de teléfono:", fake.phone_number())
print("Color:", fake.color_name())
print("Fecha:", fake.date())
print("Email:", fake.email())
print("Frase de 10 palabras", fake.sentence(nb_words=10))
Nombre: Dani Pla Chico
Dirección: Cuesta de Emiliano Milla 66
Albacete, 83227
Nombre de hombre: Matías
Número de teléfono: +34 818 779 827
Color: Salmón oscuro
Fecha: 1984-09-29
Email: btome@example.net
Frase de 10 palabras Perferendis saepe consequatur saepe sapiente est impedit eaque omnis temporibus excepturi repellat ducimus.

Los diferentes grupos de datos que genera se agrupan en Providers: de dirección, fechas, relacionados con internet, bancarios, códigos de barra, isbn, etc... Se recomienda consultar la documentación en https://faker.readthedocs.io/en/master/providers.html.

Locale ES

Al trabajar con el idioma en español, puede que algunos métodos no funcionen (más que no funcionar, posiblemente tengan otro nombre). Es recomendable comprobar las opciones disponibles en https://faker.readthedocs.io/en/master/locales/es_ES.html

Generando CSV

Vamos a generar un CSV con datos de 1000 personas. Primero creamos una lista con los encabezados y los escribimos en el fichero, para posteriormente, línea a línea, generar los datos de cada persona:

generaCSV.py
from faker import Faker
import csv

output = open('datosFaker.csv', 'w')

fake = Faker('es_ES')   # cambiamos el locale a español
header = ['nombre', 'edad', 'calle', 'ciudad',
        'provincia', 'cp', 'longitud', 'latitud']
mywriter = csv.writer(output)
mywriter.writerow(header)

for r in range(1000):
    mywriter.writerow([fake.name(),
                    fake.random_int(min=18, max=80, step=1),
                    fake.street_address(),
                    fake.city(),
                    fake.state(),
                    fake.postcode(),
                    fake.longitude(),
                    fake.latitude()])
output.close()
datosFaker.csv
nombre,edad,calle,ciudad,provincia,cp,longitud,latitud
Jenaro Verdú Suarez,26,Urbanización Mohamed Vallés 122,Sevilla,Guipúzcoa,73198,2.657719,-69.679293
Eugenio Calzada Revilla,57,Camino Vanesa Amor 36 Piso 9 ,Huesca,Álava,75590,34.041399,-52.924628
Flavio del Lumbreras,76,Avenida de Beatriz Amaya 92,Ciudad,Murcia,86420,58.248903,-17.924926

Generando JSON

Y a continuación repetimos el mismo ejemplo, pero ahora generando un documento JSON. La principal diferencia es que primero vamos a rellenar un diccionario con toda la información, y luego persistimos el diccionario:

generaJSON.py
from faker import Faker
import json

fake = Faker('es_ES')   # cambiamos el locale a español

# Preparamos los datos
datos = {}
datos['registros'] = []

for x in range(1000):
    persona = {"datos": fake.name(),
            "edad": fake.random_int(min=18, max=80, step=1),
            "calle": fake.street_address(),
            "ciudad": fake.city(),
            "provincia": fake.state(),
            "cp": fake.postcode(),
            "longitud": float(fake.longitude()),
            "latitud": float(fake.latitude())}
    datos['registros'].append(persona)

# Los metemos en el fichero
output = open('datosFaker.json', 'w')
json.dump(datos, output)
datosFaker.json
{
    "registros": [
        {
            "datos": "Merche Moreno Roman",
            "edad": 51,
            "calle": "Paseo Amelia Folch 967",
            "ciudad": "Segovia",
            "provincia": "M\u00e1laga",
            "cp": "71721",
            "longitud": 84.603801,
            "latitud": 58.941349
        },
        {
            "datos": "Miguel Abascal Sanz",
            "edad": 21,

Referencias