私はpandasとstatsmodelsを使用して、データフレームのサブセットに線形モデルをフィットさせ、予測値を返したいと考えています。しかし、私は使用するために正しいパンダのイディオムを考え出すことに問題があります。ここで私が何をしようとしていますものです:pandas groupbyはDataFrameをSeriesに変換できますか?
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でgroupby操作を行い、各チャンクをSeries(同じインデックスを持つ)に縮小する関数に渡し、結果のSeriesを元のデータフレームに挿入できるものに結合する方法がありますか?
興味深いことに、これは海の先端のデータセットでは機能しません。これは、「日」がカテゴリのオブジェクトであるというエラーが原因です。それがパンダのバグかどうか疑問に思います。 – mwaskom
パンダマスターで働きます。ジョイント/コンカチにフラグがないカテゴリカルのバグがありました。 – TomAugspurger
Cool。 @TomAugspurger、これはパンダでこれを行うための最も慣用的な方法だとお考えですか?私は正しいとマークします。 – mwaskom