Python-Pandas: Wie man mehrere univariate Regression nach Gruppe durchführt

Angenommen, ich habe ein DataFrame mit einer Spalte von y Variable und viele Spalten von x Variablen. Ich möchte in der Lage sein, mehrere univariate Regressionen von y vs x1 , y vs x2 , …, etc laufen und speichern die Vorhersagen wieder in die DataFrame . Auch muss ich dies durch eine Gruppenvariable tun.

 import statsmodels.api as sm import pandas as pd df = pd.DataFrame({ 'y': np.random.randn(20), 'x1': np.random.randn(20), 'x2': np.random.randn(20), 'grp': ['a', 'b'] * 10}) def ols_res(x, y): return sm.OLS(y, x).fit().predict() df.groupby('grp').apply(ols_res) # This does not work 

Der Code oben funktioniert offensichtlich nicht. Es ist mir nicht klar, wie man das feste y auf die Funktion korrekt x1 , während es durch die x Spalten ( x1 , x2 , …) iteriert wird. Ich vermute, es könnte eine sehr kluge Ein-Linie-Lösung sein, dies zu tun. Irgendeine Idee?

One Solution collect form web for “Python-Pandas: Wie man mehrere univariate Regression nach Gruppe durchführt”

Die Funktion, die Sie übergeben, muss ein pandas.DataFrame als erstes Argument nehmen, können Sie zusätzliche pandas.DataFrame oder Positionsargumente übergeben, die an die angewendete Funktion übergeben werden. Also, Ihr Beispiel würde mit einer kleinen Änderung arbeiten. Ändere ols_res zu

 def ols_res(df, xcols, ycol): return sm.OLS(df[ycol], df[xcols]).fit().predict() 

Dann können Sie groupby und so apply

 df.grouby('grp').apply(ols_res, xcols=['x1', 'x2'], ycol='y') 

Oder

 df.grouby('grp').apply(ols_res, ['x1', 'x2'], 'y') 

BEARBEITEN

Der obige Code führt nicht mehrere univariate Regressionen durch. Stattdessen läuft eine multivariate Regression pro Gruppe. Mit (einer anderen) leichten Modifikation wird es aber.

 def ols_res(df, xcols, ycol): return pd.DataFrame({xcol : sm.OLS(df[ycol], df[xcol]).fit().predict() for xcol in xcols}) 

BEARBEITEN 2

Obwohl die obige Lösung funktioniert, denke ich, das folgende ist ein wenig mehr Pandas-y

 import statsmodels.api as sm import pandas as pd import numpy as np df = pd.DataFrame({ 'y': np.random.randn(20), 'x1': np.random.randn(20), 'x2': np.random.randn(20), 'grp': ['a', 'b'] * 10}) def ols_res(x, y): return pd.Series(sm.OLS(y, x).fit().predict()) df.groupby('grp').apply(lambda x : x[['x1', 'x2']].apply(ols_res, y=x['y'])) 

Aus irgendeinem Grund, wenn ich ols_res() definiere, wie es ursprünglich war, hat das resultierende DataFrame nicht das Gruppenetikett im Index.

  • Erstellen Sie einen neuen DataFrame aus einer vorhandenen mit einer Spalte mit einer Liste (füllen Sie neue Zeilen mit einer Liste)
  • Konvertieren Sie timedelta64 [ns] Spalte in Sekunden in Python Pandas DataFrame
  • Wie konvertiert man SQL Query Ergebnis in PANDAS Data Struktur?
  • Wie bekomme ich alle eindeutigen Wörter im Datenrahmen?
  • Pandas: Funktion auf DataFrame anwenden, die mehrere Zeilen zurückgeben kann
  • Hinzufügen von Werten zu pandas dataframe mit Funktion auf der Grundlage einer anderen Spalte in dataframe
  • Pandas unstack funktioniert nicht
  • Pandas Shift wandelt meine Spalte von Integer zu Float.
  • Multiprocessing-Map mit einem Pandas-Dataframe verwenden?
  • Wie man zwei barh in einer achse plotten
  • Verknüpfung von TimeSeries unterschiedlicher Länge mit Pandas
  • Python ist die beste Programmiersprache der Welt.