es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Convertir un marco de datos dinámico con datos falsos generados al azar a un marco de datos estático.

Estoy intentando agregar una columna de datos ficticios a un dataframe. No importa cuál sea el contenido del dataframe. Solo quiero agregar una columna de datos ficticios generados al azar, por ejemplo, nombres generados al azar con un nombre por línea. Aquí hay algunos datos ficticios con los que jugar, pero repito, no importa el contenido del dataframe:

from faker import Faker

faker = Faker("en_GB")

contact = [faker.profile() for i in range(0, 100)]
contact = spark.createDataFrame(contact)

Estoy tratando de crear una clase con funciones para hacer esto para diferentes columnas de la siguiente manera:

class anonymise:

 @staticmethod
 def FstName():
     def FstName_values():
         faker = Faker("en_GB")
         return faker.first_name()

     FstName_udf = udf(FstName_values, StringType())
     return FstName_udf()

La clase anterior tiene una función como ejemplo, pero la clase real tiene múltiples funciones con exactamente la misma plantilla, solo para diferentes columnas, por ejemplo, LastName.

Luego, estoy agregando las nuevas columnas de la siguiente manera:

contact = contact \
.withColumn("FstName", anonymise.FstName())

Estoy utilizando este proceso para reemplazar datos reales por datos ficticios generados al azar que parecen realistas.

Esto parece funcionar bien y se ejecuta rápidamente. Sin embargo, noté que cada vez que muestro el nuevo dataframe, intentará generar una columna completamente nueva:

Primer intento:

Segundo intento inmediatamente después del primero:

Esto significa que el dataframe no es solo un dataframe estático con datos y tratará de generar una nueva columna para cada comando subsiguiente. Esto me está causando problemas más adelante cuando intento escribir los datos en un archivo externo.

Me gustaría que genere la columna una vez con algunos datos estáticos que sean fácilmente accesibles. Ni siquiera quiero que genere los mismos datos nuevamente. El proceso de generación debería ocurrir una vez.

He intentado copiar en un dataframe de pandas, pero el dataframe es demasiado grande para que esto funcione (1,3 millones de filas) y no puedo escribir una versión más pequeña en un archivo externo de todos modos.

¡Cualquier ayuda sobre este problema es apreciada!

Muchas gracias,
Carolina

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para generar la nueva columna una sola vez con datos estáticos, puedes usar el método cache() para almacenar en caché el dataframe en memoria para que las llamadas posteriores no vuelvan a calcular los datos. Así es como puedes modificar tu código para lograr esto:

    class anonymise:
    
        @staticmethod
        def FstName():
            if not hasattr(anonymise, '_FstName'):
                faker = Faker("en_GB")
                values = [faker.first_name() for _ in range(100)]
                anonymise._FstName = spark.createDataFrame([(v,) for v in values], ["FstName"])
                anonymise._FstName.cache()
    
            return anonymise._FstName["FstName"]
    

    En este código modificado, el atributo _FstName se utiliza para almacenar los valores generados como un dataframe con una columna llamada “FstName”. Si el atributo aún no existe, se genera el dato falso y se crea el dataframe, y luego se llama al método cache() para almacenarlo en caché en memoria. La próxima vez que se llame a la función, simplemente devolverá el dataframe en caché sin regenerar los datos. La declaración de retorno también devuelve la columna como una expresión utilizando el método __getitem__ del dataframe en lugar de crear una nueva columna en contact.

    Con esta modificación, llamar a contact.withColumn("FstName", anonymise.FstName()) ahora debería devolver los mismos datos estáticos cada vez.

Comments are closed.