【问题标题】:Merge regression results back to original dataframe将回归结果合并回原始数据框
【发布时间】:2019-10-23 03:35:04
【问题描述】:

我正在使用 statsmodels.api.OLS 进行简单的时间序列线性回归,并基于标识符变量对数据组运行这些回归。我已经能够使分组回归工作,但现在我希望将回归的结果合并回原始数据框并遇到索引错误。

我的原始数据框的简化版本,我们称之为“df”,如下所示:

id    value    time
a      1        1
a      1.5      2
a      2        3
a      2.5      4
b      1        1
b      1.5      2
b      2        3
b      2.5      4

我进行回归的功能如下:

def ols_reg(df, xcol, ycol):
   x = df[xcol]
   y = df[ycol]
   x = sm.add_constant(x)
   model = sm.OLS(y, x, missing='drop').fit()
   predictions = model.predict()
   return pd.Series(predictions)

然后我定义一个变量,用于存储在我的数据集上执行此函数的结果,按 id 列分组。这段代码如下:

var = df.groupby('id').apply(ols_reg, 
    xcol='time',ycol='value')

这会返回与原始数据集长度相同的一系列预测线性值,如下所示:

id
a   0  0.5
    1  1
    2  2.5
    3  3
b   0  0.5
    1  1
    2  2.5
    3  3

以 0.5 开头的列(忽略值;不是实际输出)是具有回归预测值的列。如函数返回所示,这是一个熊猫系列。

我现在想将这些结果合并回原始数据框,如下所示:

id    value    time   results
a      1        1      0.5
a      1.5      2       1
a      2        3      2.5
a      2.5      4       3
b      1        1      0.5
b      1.5      2       1
b      2        3      2.5
b      2.5      4       3

我尝试了很多方法,例如在原始数据集中设置一个新列等于系列,但得到以下错误:

TypeError: incompatible index of inserted column with frame index

非常感谢任何有关将这些结果恢复到原始数据框中的帮助。还有许多与此主题相对应的其他帖子,但在这种情况下,没有一个解决方案对我有用。

【问题讨论】:

    标签: python-3.x regression pandas-groupby


    【解决方案1】:

    为了在缺失值中插入预测时不丢失位置,您可以使用这种方法,例如:

    • X_train:训练数据是对应已知真实结果的 pandas 数据帧(在 y_train 中)。
    • X_test:测试数据是pandas数据框,没有对应的已知真实结果。需要预测。
    • y_train:训练数据为 pandas serie 真实已知结果
    • 预测:预测是熊猫系列对象

    要将完整数据合并到一个 pandas 数据帧中,首先将已知部分放在一起:

    # merge train part of the data into a dataframe    
    X_train = X_train.sort_index()
        y_train = y_train.sort_index()
        result = pd.concat([X_train,X_test])
    
    # if need to convert numpy array to pandas series: 
    # prediction = pd.Series(prediction)
    
    
    # here is the magic
    result['specie'][result['specie'].isnull()] = prediction.values
    

    如果没有缺失值就可以了。

    【讨论】:

      【解决方案2】:

      更新:

      我用一种相对简单的方法解决了这个问题,我将系列转换为一个列表,并在数据框中设置一个与列表相等的新列。但是,我真的很想知道其他人是否有更好/不同/独特的解决方案来解决这个问题。谢谢!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-19
        • 1970-01-01
        • 2015-03-17
        • 2017-05-04
        相关资源
        最近更新 更多