web-dev-qa-db-fra.com

Utilisation de la carte groupée Pandas UDFS avec des arguments

Je veux utiliser data.groupby.apply () pour appliquer une fonction à chaque ligne de mon fichier de données PYSPark par groupe.

J'ai utilisé la carte groupée Pandas udfs. Cependant, je ne peux pas comprendre comment ajouter un autre argument à ma fonction.

J'ai essayé d'utiliser l'argument comme une variable globale mais la fonction ne le recongénitez pas (mon argument est un fichier de données PYSPark)
[.____] J'ai aussi essayé les solutions proposées dans cette question (pour pandas Dataframe) tilisez Pandas Groupby () + Appliquer () avec des arguments

      @pandas_udf(schema,PandasUDFType.GROUPED_MAP)
        def function(key,data, interval):
            interval_df=interval.filter(interval["var"]==key).toPandas()
            for value in interval_df:
                  #Apply some operations

        return Data.groupBy("msn").apply(calc_diff, ('arg1'))

Ou alors

 @pandas_udf(schema,PandasUDFType.GROUPED_MAP)
        def function(key,data, interval):
            interval_df=interval.filter(interval["var"]==key).toPandas()
            for value in interval_df:
                  #Apply some operations

        return Data.groupBy("msn").apply(lambda x: calc_diff(x,'arg1'))

Mais j'ai l'erreur:

ValueError: fonction non valide: pandas_udfs avec type de fonction grouped_map doit prendre un argument (données) ou deux arguments (clé, données).

Quelqu'un pourrait-il m'aider avec le problème ci-dessus?.

Merci

16
Yasmine

Je pense que tu pourrais faire quelque chose comme ça

def myfun(data, key, interval):
    #Apply some operations
    return something

@pandas_udf(schema, PandasUDFType.GROUPED_MAP)
def myfun_udf(data):
    return myfun(data=data, key=mykey, interval=myinterval)


mykey=1
myinterval=2

Data.groupBy("msn").apply(myfun_udf)

1
Feng

Vous pouvez créer le pandas UDF à l'intérieur de votre fonction, de sorte que les arguments de la fonction soient connus au moment de sa création. (Ou vous pouvez importer des fonctions de fonctionnement et utiliser une évaluation partielle de fonction pour faire de même chose.) Voici le exemple de la documentation de Pyspark, modifié pour réussir certains paramètres:

from pyspark.sql.functions import pandas_udf, PandasUDFType

df = spark.createDataFrame(
    [(1, 1.0), (1, 2.0), (2, 3.0), (2, 5.0), (2, 10.0)],
    ("id", "v"))


def my_function(df, by="id", column="v", value=1.0):
    schema = "{} long, {} double".format(by, column)

    @pandas_udf(schema, PandasUDFType.GROUPED_MAP)
    def subtract_value(pdf):
        # pdf is a pandas.DataFrame
        v = pdf[column]
        g = pdf[by]
        return pdf.assign(v = v - g * value)

    return df.groupby(by).apply(subtract_value)

my_function(df, by="id", column="v", value=2.0).show()
0
hwrd