Как использовать UDF Pandas в классе - PullRequest
0 голосов
/ 30 сентября 2019

Я пытаюсь выяснить, как использовать self в PandasUDF.GroupBy.Apply в методе класса в Python, а также передать аргументы в нем. Я пробовал много разных способов заставить это работать, но не мог заставить это работать. Я также активно искал в интернете пример PandasUDF, который используется внутри класса с self и аргументами, но не смог найти ничего подобного. Я знаю, как сделать все вышеупомянутые вещи с Pandas.GroupBy.Apply, но когда я применяю ту же логику в PandasUDF.GroupBy.Apply, она не работает.

Единственный способ, которым я мог заставить это работать, былобъявив его статическим методом

class Train:
    return_type = StructType([
        StructField("div_nbr", FloatType()),
        StructField("store_nbr", FloatType()),
        StructField("model_str", BinaryType())
    ])
    function_type = PandasUDFType.GROUPED_MAP

    def __init__(self):
       ............

    def run_train(self):
         output = sp_df.groupby(['A', 'B']).apply(self.model_train)
         output.show(10)

    @staticmethod
    @pandas_udf(return_type, function_type)
    def model_train(pd_df):
        features_name = ['days_into_year', 'months_into_year', 'minutes_into_day', 'hour_of_day', 'recency']

        X = pd_df[features_name].copy()
        Y = pd.DataFrame(pd_df['trans_type_value']).copy()

        estimator_1 = XGBRegressor(max_depth=3, learning_rate=0.1, n_estimators=300, verbosity=1,
                                   objective='reg:squarederror', booster='gbtree', n_jobs=-1, gamma=0,
                                   min_child_weight=5, max_delta_step=0, subsample=0.6, colsample_bytree=0.8,
                                   colsample_bylevel=1, colsample_bynode=1, reg_alpha=0, reg_lambda=1,
                                   scale_pos_weight=1, base_score=0.5, random_state=1234, missing=None,
                                   importance_type='gain')
        estimator_1.fit(X, Y)
        df_to_return = pd_df[['div_nbr', 'store_nbr']].drop_duplicates().copy()
        df_to_return['model_str'] = pickle.dumps(estimator_1)

        return df_to_return

Что я хотел бы добиться в реальности, так это объявить return_type и function_type, features_name в __init__(), затем использовать его в PandasUDF, а также передать параметрыдля использования внутри функции при выполнении Pandas.GroupBy.Apply

Если кто-нибудь может мне помочь, я был бы очень признателен. Я немного новичок в PySpark.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...