Как передать фрейм данных pandas в `scipy.optimize.curve_fit` или` scipy.stats.linregress` - PullRequest
0 голосов
/ 20 ноября 2018

Аналогичный вопрос здесь: Передать Pandas DataFrame в Scipy.optimize.curve_fit

Теперь у меня есть кадр данных с формой = (100, 4), то есть четыре зависимые переменные от Y1 до Y4. С другим независимым массивом m = [1, 2, 3, 4]. Мне нужно сделать линейную модель из Ys и m, генерируя прогнозируемое значение Y.

Как я могу сделать это для всего кадра данных, не делая это в цикле for с каждой строкой кадра данных?

import numpy as np
import pandas as pd
from scipy.optimize import curve_fit
from scipy.stats import linregress

Y = np.random.randn(100, 4) 
m = np.array([1, 2, 3, 4])    

df = pd.DataFrame(Y, columns=['y1', 'y2', 'y3', 'y4'])
for index, row in df.iterrows():
    slope, intercept, r_value, p_value, std_err = linregress(m, row.values)
    print(slope, intercept)

1 Ответ

0 голосов
/ 20 ноября 2018

Во-первых, рекомендуется форматировать данные с помощью наблюдений в строках.То есть каждое наблюдение описывается измерениями в других столбцах переменных (х1-4).После этого вы можете передать свои объясняющие переменные в функцию модели вместе с ответом (y), который может быть одним столбцом вашего фрейма данных или за его пределами, но с таким же количеством строк.

Очевидно, функция linregress подходит толькоединственная объясняющая переменная для переменной ответа.

Для> 2-мерного моделирования я бы предложил использовать другие пакеты, такие как statsmodels или sklearn.linear_model.LinearRegression

Ниже я продолжу с первымпредложение:

import numpy as np
import pandas as pd
from statsmodels.formula.api import ols

data = np.random.randn(100, 4)
y = np.random.randn(100)
df = pd.DataFrame(data, columns=['x1', 'x2', 'x3', 'x4'])

x1 = df['x1']
x2 = df['x2']
x3 = df['x3']
x4 = df['x4']

model = ols("y ~ x1 + x2 + x3 + x4", df).fit()
print(model.summary())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...