首页 > 解决方案 > 使用 sklearn 查找每组数据帧的系数

问题描述

我有一个包含一些值和多个组的数据框(df1)。我想对每个组执行线性回归,所以我可以使用系数来完成 df2,然后将它们连接起来(df3)。到目前为止,我对我的整个数据框都进行了管理

from sklearn import linear_model
import pandas as pd

def ols (X, y):
    return linear_model.LinearRegression().fit(X, y)

X = df1[["day"]]
y = df1["value"]

results = linear_model.LinearRegression().fit(df1[["day"]], df1["value"])

df2['value'] = results.coef_*df2['day']+results.intercept_

df3 = pd.concat([df1, df2])

这可行,但是当我尝试使用 groupby 并应用时,就像result = df1.groupby('id').apply(ols(df1[["day"]], df1["value"]))我收到错误一样TypeError: 'LinearRegression' object is not callable ,我知道我没有初始化 LinearRegression 类的实例,但是如何使用 groupby 来做到这一点?

df1 = pd.DataFrame({'id': ['a', 'a', 'b', 'b'],
                    'day' : [179,194, 184, 194],
                    'value' :  [0.667, 1.229, 1.079, 1.69 ]
                            })

df2 = pd.DataFrame({'id': ['a', 'b'],
                    'day' : [191, 192],
                    'value' :  ['lai', 'lai']
                            })

df1 = pd.DataFrame({'id': ['a', 'a','a', 'b', 'b', 'b'],
                    'day' : [179,191, 194, 184, 192, 194],
                    'value' :  [0.667, 1.1166, 1.229, 1.079,1.5678,, 1.69 ]
                            })

标签: pythongroup-byscikit-learn

解决方案


这里有多个问题:

  1. pandasapply()需要一个函数作为输入,而不是函数的返回值,所以你只能这样做:

    df1.groupby('id').apply(ols)
    

    不像你所做的那样。ols(df1[["day"]], df1["value"])返回一个LinearRegression不被接受的对象,apply因此返回错误。

  2. groupby('id').apply(...)将根据df. 因此,您不能简单地将整个数据df1[["day"]], df1["value"]提供给该ols方法并期望它适合不同的组。

除此之外,这个问题非常不清楚。你到底想做什么?你想使用你df1的训练数据来学习每个组的系数('id'),然后用它们来预测df2相同的值'id'吗?


推荐阅读