Векторизовать только некоторые аргументы в функции при расчете на базе данных Pandas - PullRequest
0 голосов
/ 20 ноября 2018

Я написал функцию, предназначенную для вычисления нового столбца данных на основе двух других столбцов, в виде нескольких точек данных из другого кадра данных. Я хочу применить эту функцию векторизованным способом к основному кадру данных, чтобы 2 столбца вычислялись таким образом. В то же время я хочу, чтобы третий аргумент представлял собой постоянный фрейм данных, который используется для отдельного вычисления интерполяции (т.е. не векторизовано). Как это можно сделать?

Основная функция (как пример):

def calc_fitted_values(L, option, df_ref):
    '''
    This calculates an outputval for each combination of L and option, based
    on intermediate calculations involving fitted values from df_ref.
    - L is some column in my main dataframe
    - option is a second column in the main dataframe
    - df_ref is a separate data frame used in the pre-calculations here
    '''
    df_ref_option = df_ref[df_ref['option']==option]  # take slice of df_ref based on option
    x = df_ref_option['x'].values                         # get data columns to be used for polyfit
    y = df_ref_option['y'].values
    C = np.polyfit(np.log(x), np.log(y), 1);   # use polyfit to get log fit of the reference data
    a = np.exp(C[1]);
    b = C[0];  
    outputval = a*(L**b)
    return outputval

Требуемое использование от функции:

df['outputval']] = calc_fitted_values(df['L'], df['option'], df_ref)

В этом примере L и option будут значениями массива, полученными из столбцов моего основного фрейма данных (df), но df_ref не имеет отношения к форме и размеру.

Как мне лучше всего написать функцию для ситуации такого типа?

Спасибо.

РЕДАКТИРОВАТЬ: мое текущее "решение" заключается в использовании лямбда ...

f = lambda L, option : calc_fitted_values(L, option, df_ref)
df['outputval'] = np.vectorize(f)(df['L'].values, df['option'].values)

Но, похоже, это очень медленно. Может быть из-за вычисления каждый раз с df_ref, так что было бы лучше иметь функцию, которая возвращает лямбда-определенную функцию? Не уверен в наилучшем подходе к этому.

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