我想使用pandas和statsmodels在数据框的子集上拟合线性模型并返回预测值。但是,我不知道该使用何种正确的pandas习惯用法。以下是我的尝试:
import pandas as pd
import statsmodels.formula.api as sm
import seaborn as sns
tips = sns.load_dataset("tips")
def fit_predict(df):
m = sm.ols("tip ~ total_bill", df).fit()
return pd.Series(m.predict(df), index=df.index)
tips["predicted_tip"] = tips.groupby("day").transform(fit_predict)
这会引发以下错误:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-139-b3d2575e2def> in <module>()
----> 1 tips["predicted_tip"] = tips.groupby("day").transform(fit_predict)
/Users/mwaskom/anaconda/lib/python2.7/site-packages/pandas/core/groupby.pyc in transform(self, func, *args, **kwargs)
3033 return self._transform_general(func, *args, **kwargs)
3034 except:
-> 3035 return self._transform_general(func, *args, **kwargs)
3036
3037 # a reduction transform
/Users/mwaskom/anaconda/lib/python2.7/site-packages/pandas/core/groupby.pyc in _transform_general(self, func, *args, **kwargs)
2988 group.T.values[:] = res
2989 else:
-> 2990 group.values[:] = res
2991
2992 applied.append(group)
ValueError: could not broadcast input array from shape (62) into shape (62,6)
错误很有道理,因为我认为
.transform
想要将 DataFrame 映射到 DataFrame。但是有没有一种方法可以在 DataFrame 上执行 groupby 操作,将每个块传递到一个函数中,将其减少为一个 Series(具有相同的索引),然后将生成的 Series 组合成可插入原始 DataFrame 的东西?
day
是一种分类对象的错误。我想知道这是否是 pandas 中的一个 bug。 - mwaskom.transform
应该是正确的方法,但它要求输出具有相同的索引和列。 - TomAugspurger