Come eseguire l'iterazione su colonne di frame di dati Panda per eseguire la regressione


187

Sono sicuro che questo è semplice, ma come principiante completo di Python, ho difficoltà a capire come iterare su variabili in un pandasframe di dati ed eseguire una regressione con ciascuno.

Ecco cosa sto facendo:

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()

So di poter eseguire una regressione come questa:

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

ma supponiamo che io voglia fare questo per ogni colonna nel frame di dati. In particolare, desidero regredire FIUIX su FSTMX, quindi FSAIX su FSTMX e infine FSAVX su FSTMX. Dopo ogni regressione voglio archiviare i residui.

Ho provato varie versioni di quanto segue, ma devo sbagliare la sintassi:

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

Penso che il problema sia che non so come fare riferimento alla colonna dei resi per chiave, quindi returns[k]probabilmente è sbagliato.

Qualsiasi consiglio sul modo migliore per farlo sarebbe molto apprezzato. Forse c'è un approccio panda comune che mi manca.


1
Puoi for i in len(df): if i + 1 != len(df): # sm.OLS(returns[returns.coloumns[i]], returns[returns.columns[ i+1]]), fit()
iscrivere

Risposte:


343
for column in df:
    print(df[column])

1
Mi sembra di recuperare l'intestazione della colonna solo quando uso questo metodo. Quindi ad esempio: print (df) mi mostra i dati nelle colonne del frame di dati ma per c in df: print (c) stampa solo l'intestazione e non i dati.
user1761806

5
Ok, ignorami: stavo facendo print (colonna) non print (df [colonna])
user1761806

14
Fai attenzione alle colonne con lo stesso nome!
Freethebees,

4
È carino e conciso. Mi aspetto for x in dfdi ripetere le righe, però. : - /
Eric Duminil,

7
for idx, row in df.iterrows()scorre su righe. Dal momento che le operazioni basate su colonne sono vettorizzate, è naturale che l'iterazione principale sia su colonne :)
The Unfun Cat

69

Puoi usare iteritems():

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

33

Questa risposta consiste nell'iterare le colonne selezionate e tutte le colonne in un DF.

df.columnsfornisce un elenco contenente tutti i nomi delle colonne nel DF. Ora non è molto utile se si desidera scorrere su tutte le colonne. Ma è utile quando si desidera scorrere solo le colonne di propria scelta.

Possiamo usare la suddivisione dell'elenco di Python per tagliare facilmente df.columns in base alle nostre esigenze. Ad esempio, per scorrere su tutte le colonne tranne la prima, possiamo fare:

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

Analogamente per scorrere su tutte le colonne in ordine inverso, possiamo fare:

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

Possiamo iterare su tutte le colonne in molti modi interessanti usando questa tecnica. Ricorda inoltre che puoi ottenere facilmente gli indici di tutte le colonne usando:

for ind, column in enumerate(df.columns):
    print(ind, column)

21

È possibile indicizzare le colonne del frame di dati in base alla posizione utilizzando ix.

df1.ix[:,1]

Ciò restituisce ad esempio la prima colonna. (0 sarebbe l'indice)

df1.ix[0,]

Questo restituisce la prima riga.

df1.ix[:,1]

Questo sarebbe il valore all'intersezione tra la riga 0 e la colonna 1:

df1.ix[0,1]

e così via. Quindi puoi enumerate() returns.keys():e usare il numero per indicizzare il dataframe.


8
ixè deprecato, utilizzareiloc
Yohan Obadia

8

Una soluzione alternativa consiste nel trasporre DataFramee scorrere le righe.

for column_name, column in df.transpose().iterrows():
    print column_name

4
La trasposizione è piuttosto costosa :)
The Unfun Cat

Potrebbe essere costoso, ma questa è un'ottima soluzione per frame di dati relativamente piccoli. Grazie kdauria!
elPastor l'

5

Usando la comprensione dell'elenco, puoi ottenere tutti i nomi delle colonne (intestazione):

[column for column in df]


2
Versione più breve: list(df.columns)oppure[c for c in df]
The Unfun Cat,

4

In base alla risposta accettata , se si desidera anche un indice corrispondente a ciascuna colonna :

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

Il df[column]tipo sopra è Series, che può essere semplicemente convertito in numpy ndarrays:

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

3

Sono un po 'in ritardo, ma ecco come l'ho fatto. I passi:

  1. Crea un elenco di tutte le colonne
  2. Usa itertools per prendere combinazioni x
  3. Aggiungi ogni valore R al quadrato di risultato a un frame di dati di risultato insieme all'elenco di colonne escluso
  4. Ordinare il risultato DF in ordine decrescente di R al quadrato per vedere qual è la soluzione migliore.

Questo è il codice che ho usato su DataFrame chiamato aft_tmt. Sentiti libero di estrapolare il tuo caso d'uso ..

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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.