Vorrei utilizzare pandas e statsmodels per adattare un modello lineare su sottoinsiemi di un dataframe e restituire i valori previsti. Tuttavia, sto avendo difficoltà a capire l'idioma panda giusto da usare. Ecco quello che sto cercando di fare:Il gruppo panda può trasformare un DataFrame in una serie?
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)
Questo solleva il seguente errore:
---------------------------------------------------------------------------
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)
L'errore ha un senso in quanto penso .transform
vuole mappare un dataframe ad un dataframe. Ma esiste un modo per eseguire un'operazione di groupby su un DataFrame, passare ogni blocco in una funzione che lo riduce a una serie (con lo stesso indice) e quindi combinare le serie risultanti in qualcosa che può essere inserito nel dataframe originale?
Interessante, questo non funziona con il set di dati di Seaborn Tips a causa di un errore che implica che 'day' è un oggetto categoriale. Mi chiedo se sia un bug nei panda. – mwaskom
Funziona su master panda. C'era un bug con Categoricals che non aveva un flag per joins/concats. – TomAugspurger
Fresco. @ Tom Augspurger, diresti che questo è il modo più idiomatico per farlo in Panda? Segnalo correttamente se è così. – mwaskom