полиномиальное подгонка с использованием pandas dataframe и numpy - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть скрипт, в котором я беру фрейм данных, который выглядит примерно так:

enter image description here

и преобразую некоторые столбцы в массивы с нуля для обработки,Затем я использую небольшую написанную мной функцию, которая использует statsmodels.api для вычисления линейной регрессии на основе двух массивов, которые я передаю в функцию.Затем функция возвращает статистику и уравнение линейного соответствия:

def computeLinearStats(x, y, yName, calc_tau = False):
    '''
    Takes as an argument two numpy arrays, one for x and one y, and a string for the
    name of the y-variable, and a boolean for whether to calculate tau.
    Uses Ordinary Least Squares to compute the statistical parameters for the
    array against log(z), and determines the equation for the line of best fit.
    Returns the results summary, residuals, statistical parameters in a list,
    the best fit equation, and Kendall's tau.
    '''

    #   Mask NaN values in both axes
    mask = ~np.isnan(y) & ~np.isnan(x)
    #   Compute model parameters
    model = sm.OLS(y[mask], sm.add_constant(x[mask]), missing= 'drop')
    results = model.fit()
    residuals = results.resid
    if calc_tau:
        tau = stats.kendalltau(x, y, nan_policy= 'omit')
    else:
        tau = [1, 1]    #   Use this to exclude computation of tau
#    

    #   Compute fit parameters
    params = stats.linregress(x[mask], y[mask])
    fit = params[0]*x + params[1]
    fitEquation = '$(%s)=(%.4g \pm %.4g) \\times log_{10}(redshift)+%.4g$'%(yName,
                    params[0],  #   slope
                    params[4],  #   stderr in slope
                    params[1])  #   y-intercept
    return results, residuals, params, fit, fitEquation, tau

Например, скажем, я ищу линейное соответствие между loz(z) и 'BI' из кадра данных.После вычисления этих переменных я бы назвал

results, residuals, params, fit, equation, tau = qf.computeLinearStats(log_z, (B-I), 'B-I', calc_tau = False)

, чтобы получить линейное соответствие.

Все работает нормально, но теперь мне нужно соответствовать полиному, а не линейному соответствию.

Я пробовал

sources['log_z'] = np.log10(sources.z)
mask = ~np.isnan((B-I)) & ~np.isnan(log_z)
model = ols(formula='(B-I) ~ log_z', data = [log_z[mask], (B-I) 
[mask]]).fit()

и

model = ols(formula='(B-I) + np.power((U-R),2) ~ log_z', data = [log_z[mask], (B-I)[mask]]).fit()

Но я получаю

PatsyError: Error evaluating factor: TypeError: list indices must be integers or slices, not str
    (B-I) ~ log_z
            ^^^^^

, даже если x и y являются массивами, а не строками.

Какой самый простой способ найти совпадение полинома в этой ситуации - скажем, что-то вроде (B-I) + (U-R)**2 против log(z)?Слайд 41 и далее на этот сайт кажется отправной точкой, но я не совсем понимаю, как его применить.

...