我正在使用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
在将这些结果恢复到原始数据框中的任何帮助将不胜感激。还有许多其他与此主题相关的帖子,但是在这种情况下,没有一种解决方案对我有用。
答案 0 :(得分:0)
更新:
我已经用一种相对简单的方法解决了这个问题,在该方法中,我将系列转换为列表,并在数据框中设置了与列表相等的新列。但是,我真的很想知道其他人是否对此问题有更好/不同/独特的解决方案。谢谢!
答案 1 :(得分:0)
要在将预测值插入缺失值时不放松位置,可以使用这种方法,例如:
要获得完整的数据并合并到一个熊猫数据框中,请先将已知部分放在一起:
# 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
如果没有缺失的值,则可以完成工作。