我的总体目标是找到最佳的工作流程,以根据多种模型生成预测。这是一个示例,说明如何尝试在DataFrame中按组拟合模型并获得预测以及用于预测的数据:
from sklearn.linear_model import LinearRegression
import pandas as pd
start_data = pd.DataFrame({
'group': ['a'] * 3 + ['b'] * 3,
'x1': [1, 2, 3] * 2,
'x2': [4, 5, 6] * 2,
'y': [1, 3, 5, 2, 4, 6]
})
start_models = start_data\
.groupby('group')\
.apply(lambda group: LinearRegression().fit(group[['x1', 'x2']], group['y']))\
.to_frame(name = 'model')
new_data = pd.DataFrame({'x1': [11, 12, 13] * 2, 'x2': [7, 8, 9] * 2})
start_models['preds'] = start_models.model.apply(lambda model: model.predict(new_data))
start_models['newx1'] = start_models.model.apply(lambda model: new_data.x1.tolist())
start_models['newx2'] = start_models.model.apply(lambda model: new_data.x2.tolist())
这提供了一个DataFrame,每行包含一个模型及其相关的预测。
start_models
model ... newx2
group ...
a LinearRegression(copy_X=True, fit_intercept=Tr... ... [7, 8, 9, 7, 8, 9]
b LinearRegression(copy_X=True, fit_intercept=Tr... ... [7, 8, 9, 7, 8, 9]
在R中,使用tidyr::unnest
可以轻松解决。在这里,我发现this question提供了以下解决方案,但也建议在pandas
中最好避免首先创建嵌套的DataFrame。
start_models.drop(columns='model')\
.apply(lambda listcol: listcol.apply(pd.Series).stack())\
.reset_index()\
.drop(columns='level_1')
group preds newx1 newx2
0 a 14.0 11 7
1 a 16.0 12 8
2 a 18.0 13 9
3 a 14.0 11 7
4 a 16.0 12 8
5 a 18.0 13 9
6 b 15.0 11 7
7 b 17.0 12 8
8 b 19.0 13 9
9 b 15.0 11 7
10 b 17.0 12 8
11 b 19.0 13 9
所以问题是,应该如何考虑将模型和预测结合在pandas
中?换句话说,如何在不使用列表列的情况下从start_data
转到上面的long
输出?
使用列表列也可能很好,但是我想问一下。我认为这种方式对于我拥有的数据不会太慢,但是apply(pd.Series).stack()
的笨拙向我暗示,应该有一种更好或更有针对性的方式来解决此问题。特别是,我感到非常惊奇的是,从apply
返回Series的函数合并到DataFrame的行中,特别是在Series.apply
文档中没有提到的情况下(尽管它在DataFrame.apply
中)并且不适用于列表。如果您明白我的意思,那感觉更像是一种变通方法,而不是适当的工作流程!