Можно ли передать скалярное значение в функцию UDF Pandas вместе с серией Pandas - PullRequest
2 голосов
/ 10 октября 2019

Я пытаюсь использовать функцию scipy.optimize.minimize в двух столбцах pyspark dataframe.

при передаче параметра x0 в виде массива в функцию UDF Pandas, я получаю следующую ошибку:

TypeError: Invalid argument, not a string or column: [0.9  0.5  2.5  5.   0.33] of type <class 'numpy.ndarray'>. For column literals, use 'lit', 'array', 'struct' or 'create_map' function.

Это функция, которую я пытаюсь свести к минимуму

def eb_func(theta, n, e):
    """
    # Function to be Minimized

    :param theta: float
    :param n: Pandas.Series
    :param e: Pandas.Series
    :return: float

    """
    print("Entering EB_Func")
    res = res = np.prod(theta[4] * neg_bin(n, e, theta[0], theta[1]) + (1 - theta[4]) * neg_bin(n, e, theta[2], theta[3]))
    return res

Это моя функция neg_bin:

@pandas_udf('double', PandasUDFType.SCALAR)
def neg_bin(n, e, alpha, beta):
    """

    :param n:
    :param e:
    :param alpha:
    :param beta:
    :return:
    """
    res_expo = gammaln(alpha + n) - gammaln(n + 1) - gammaln(alpha)
    res = np.exp(res_expo)
    res = res / (1 + beta / (e + 0.01)) ** n
    res = res / (1 + e / beta) ** alpha
    return res

Это мои параметры:

x0 = np.array([0.9, 0.5, 2.5, 5, 0.33])
bounds = ([0.000001, 200], [0.000001, 200], [0.000001, 200], [0.000001, 200], [0.000001, 1])

Здесь я пытаюсь вызвать функцию scipy.optimize.minimize.

# Define a function to call minimize function
def RunMinimize(data):
    Result = minimize(eb_func, x0, args=(data.Adolescent_a, data.Adolescent_e), method='L-BFGS-B', bounds=bounds, options={'disp': True, 'maxiter': 1000, 'eps': np.repeat(1e-4, 5)})
    return Result.x


RunMinimize(df_adol)

Я новичок в PySpark, я могу сделать это в Pandas, но теперь у меня огромный набор данных, и Pandas требует многовремени для обработки этого.

Ниже приведен ожидаемый формат вывода: Это то, что я получаю в качестве вывода в Pandas

[1.00000000e-06, 1.46304225e+00, 1.00000000e-06, 6.39066185e+00, 1.00000000e-06])

У меня проблемы с передачей тета-значений в функцию neg_bin. Потому что функция neg_bin ожидает только ввода pandas.Series. Я ищу обходной путь для отправки тэта-значений в виде скаляров вместе с pandas.Series как входные данные для функции neg_bin, если это возможно.

Любая помощь приветствуется. ТИА.

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