我正在尝试复制此解决方案Python pandas: how to run multiple univariate regression by group,但使用sklearn线性回归而不是statsmodels。
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
df = pd.DataFrame({
'y': np.random.randn(20),
'x1': np.random.randn(20),
'x2': np.random.randn(20),
'grp': ['a', 'b'] * 10})
def ols_res(x, y):
return pd.Series(LinearRegression.fit(x,y).predict(x))
results = df.groupby('grp').apply(lambda x : x[['x1', 'x2']].apply(ols_res, y=x['y']))
print(results)
我得到:
TypeError: ("fit() missing 1 required positional argument: 'y'", 'occurred at index x1')
结果应与我链接的文章相同,即:
x1 x2
grp
a 0 -0.102766 -0.205196
1 -0.073282 -0.102290
2 0.023832 0.033228
3 0.059369 -0.017519
4 0.003281 -0.077150
... ...
b 5 0.072874 -0.002919
6 0.180362 0.000502
7 0.005274 0.050313
8 -0.065506 -0.005163
9 0.003419 -0.013829
最佳答案
您的代码有两个小问题:
您没有实例化LinearRegression
对象,因此您的代码实际上尝试调用fit
类的未绑定LinearRegression
方法。
即使您修复此问题,LinearRegression
实例也将无法执行fit
和transform
,因为它需要2D数组并获得1D数组。因此,您还需要调整每个Series
中包含的数组的形状。
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
df = pd.DataFrame({
'y': np.random.randn(20),
'x1': np.random.randn(20),
'x2': np.random.randn(20),
'grp': ['a', 'b'] * 10})
def ols_res(x, y):
x_2d = x.values.reshape(len(x), -1)
return pd.Series(LinearRegression().fit(x_2d, y).predict(x_2d))
results = df.groupby('grp').apply(lambda df: df[['x1', 'x2']].apply(ols_res, y=df['y']))
print(results)
输出:
x1 x2
grp
a 0 -0.126680 0.137907
1 -0.441300 -0.595972
2 -0.285903 -0.385033
3 -0.252434 0.560938
4 -0.046632 -0.718514
5 -0.267396 -0.693155
6 -0.364425 -0.476643
7 -0.221493 -0.779082
8 -0.203781 0.722860
9 -0.106912 -0.090262
b 0 -0.015384 0.092137
1 0.478447 0.032881
2 0.366102 0.059832
3 -0.055907 0.055388
4 -0.221876 0.013941
5 -0.054299 0.048263
6 0.043979 0.024594
7 -0.307831 0.059972
8 -0.226570 -0.024809
9 0.394460 0.038921
关于python - 如何使用sklearn按组运行多个单变量回归?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55584296/