此处有类似问题:Pass Pandas DataFrame to 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)
答案 0 :(得分:0)
首先,优良作法是使用行上的观察值格式化数据。也就是说,每个观察都由其他列中的维度(变量(x1-4))描述。然后,您可以将解释变量与响应(y)一起传递给模型函数,该响应可以是数据框的一列,也可以位于数据框的外部,但行数相同。
显然,linregress函数仅将单个解释变量拟合到响应变量上。
对于二维建模,我建议使用其他软件包,例如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())