So iterieren Sie über Spalten des Pandas-Datenrahmens, um die Regression auszuführen

186

Ich bin mir sicher, dass dies einfach ist, aber als pandasabsoluter Neuling in Python habe ich Probleme herauszufinden, wie ich Variablen in einem Datenrahmen durchlaufen und mit jedem eine Regression ausführen kann.

Folgendes mache ich:

all_data = {}
for ticker in ['FIUIX', 'FSAIX', 'FSAVX', 'FSTMX']:
    all_data[ticker] = web.get_data_yahoo(ticker, '1/1/2010', '1/1/2015')

prices = DataFrame({tic: data['Adj Close'] for tic, data in all_data.iteritems()})  
returns = prices.pct_change()

Ich weiß, dass ich eine solche Regression durchführen kann:

regs = sm.OLS(returns.FIUIX,returns.FSTMX).fit()

Angenommen, ich möchte dies für jede Spalte im Datenrahmen tun. Insbesondere möchte ich FIUIX auf FSTMX und dann FSAIX auf FSTMX und dann FSAVX auf FSTMX zurückführen. Nach jeder Regression möchte ich die Residuen speichern.

Ich habe verschiedene Versionen der folgenden Versionen ausprobiert, aber ich muss die Syntax falsch verstehen:

resids = {}
for k in returns.keys():
    reg = sm.OLS(returns[k],returns.FSTMX).fit()
    resids[k] = reg.resid

Ich denke, das Problem ist, dass ich nicht weiß, wie ich mit Schlüssel auf die Rückgabespalte verweisen soll, also returns[k]ist es wahrscheinlich falsch.

Jede Anleitung, wie dies am besten zu tun ist, wäre sehr dankbar. Vielleicht fehlt mir ein allgemeiner Pandas-Ansatz.

juckend
quelle
1
Sie können die Spalten wie for i in len(df): if i + 1 != len(df): # sm.OLS(returns[returns.coloumns[i]], returns[returns.columns[ i+1]]), fit()
folgt abonnieren

Antworten:

341
for column in df:
    print(df[column])
Die Unfun Cat
quelle
1
Ich bekomme den Spaltenkopf nur zurück, wenn ich diese Methode verwende. Zum Beispiel: print (df) zeigt mir die Daten in den Datenrahmenspalten, aber für c in df: print (c) druckt nur den Header, nicht die Daten.
user1761806
5
Ok, ignoriere mich - ich habe gedruckt (Spalte) nicht gedruckt (df [Spalte])
user1761806
14
Achten Sie auf gleichnamige Spalten!
Freethebees
4
Es ist schön und prägnant. Ich würde jedoch erwarten for x in df, über Zeilen zu iterieren. : - /
Eric Duminil
7
for idx, row in df.iterrows()iteriert über Zeilen. Da colbasierte Operationen vektorisiert sind, ist es natürlich, dass die Hauptiteration über Spalten liegt :)
The Unfun Cat
68

Sie können verwenden iteritems():

for name, values in df.iteritems():
    print('{name}: {value}'.format(name=name, value=values[0]))
mdh
quelle
33

Diese Antwort besteht darin, ausgewählte Spalten sowie alle Spalten in einem DF zu durchlaufen.

df.columnsgibt eine Liste mit allen Spaltennamen im DF an. Das ist nicht sehr hilfreich, wenn Sie alle Spalten durchlaufen möchten. Dies ist jedoch praktisch, wenn Sie nur über Spalten Ihrer Wahl iterieren möchten.

Wir können Pythons Listen-Slicing einfach verwenden, um df.columns gemäß unseren Anforderungen zu schneiden. Um beispielsweise alle Spalten außer der ersten zu durchlaufen, können wir Folgendes tun:

for column in df.columns[1:]:
    print(df[column])

In ähnlicher Weise können wir alle Spalten in umgekehrter Reihenfolge durchlaufen:

for column in df.columns[::-1]:
    print(df[column])

Mit dieser Technik können wir alle Spalten auf viele coole Arten durchlaufen. Denken Sie auch daran, dass Sie die Indizes aller Spalten einfach abrufen können, indem Sie:

for ind, column in enumerate(df.columns):
    print(ind, column)
Abhinav Gupta
quelle
21

Sie können Datenrahmenspalten anhand der Position mit indizieren ix.

df1.ix[:,1]

Dies gibt beispielsweise die erste Spalte zurück. (0 wäre der Index)

df1.ix[0,]

Dies gibt die erste Zeile zurück.

df1.ix[:,1]

Dies wäre der Wert am Schnittpunkt von Zeile 0 und Spalte 1:

df1.ix[0,1]

und so weiter. Sie können also enumerate() returns.keys():die Nummer verwenden, um den Datenrahmen zu indizieren.

JAB
quelle
7
ixist veraltet, verwenden Sieiloc
Yohan Obadia
8

Eine Problemumgehung besteht darin, das zu transponieren DataFrameund über die Zeilen zu iterieren.

for column_name, column in df.transpose().iterrows():
    print column_name
kdauria
quelle
3
Die Umsetzung ist ziemlich teuer :)
The Unfun Cat
Könnte teuer sein, aber dies ist eine großartige Lösung für relativ kleine Datenrahmen. Danke kdauria!
elPastor
5

Mit dem Listenverständnis können Sie alle Spaltennamen (Kopfzeile) abrufen:

[column for column in df]

MEhsan
quelle
2
Kürzere Version: list(df.columns)oder[c for c in df]
The Unfun Cat
4

Basierend auf der akzeptierten Antwort , wenn ein Index für jede Spalte ebenfalls gewünscht wird :

for i, column in enumerate(df):
    print i, df[column]

Der obige df[column]Typ ist Series, der einfach in numpy ndarrays konvertiert werden kann :

for i, column in enumerate(df):
    print i, np.asarray(df[column])
Herpes-freier Ingenieur
quelle
3

Ich bin etwas spät dran, aber so habe ich das gemacht. Die Schritte:

  1. Erstellen Sie eine Liste aller Spalten
  2. Verwenden Sie itertools, um x-Kombinationen zu verwenden
  3. Hängen Sie jeden R-Quadrat-Ergebniswert zusammen mit der Liste der ausgeschlossenen Spalten an einen Ergebnisdatenrahmen an
  4. Sortieren Sie das Ergebnis DF in absteigender Reihenfolge von R im Quadrat, um festzustellen, welches am besten passt.

Dies ist der Code, den ich in DataFrame verwendet habe aft_tmt. Fühlen Sie sich frei, auf Ihren Anwendungsfall zu extrapolieren.

import pandas as pd
# setting options to print without truncating output
pd.set_option('display.max_columns', None)
pd.set_option('display.max_colwidth', None)

import statsmodels.formula.api as smf
import itertools

# This section gets the column names of the DF and removes some columns which I don't want to use as predictors.
itercols = aft_tmt.columns.tolist()
itercols.remove("sc97")
itercols.remove("sc")
itercols.remove("grc")
itercols.remove("grc97")
print itercols
len(itercols)

# results DF
regression_res = pd.DataFrame(columns = ["Rsq", "predictors", "excluded"])

# excluded cols
exc = []

# change 9 to the number of columns you want to combine from N columns.
#Possibly run an outer loop from 0 to N/2?
for x in itertools.combinations(itercols, 9):
    lmstr = "+".join(x)
    m = smf.ols(formula = "sc ~ " + lmstr, data = aft_tmt)
    f = m.fit()
    exc = [item for item in x if item not in itercols]
    regression_res = regression_res.append(pd.DataFrame([[f.rsquared, lmstr, "+".join([y for y in itercols if y not in list(x)])]], columns = ["Rsq", "predictors", "excluded"]))

regression_res.sort_values(by="Rsq", ascending = False)
Gaurav
quelle