2015-01-29 5 views
66

Sono sicuro che è semplice, ma come newbie completo di python, sto avendo problemi a capire come iterare su variabili in un dataframe pandas ed eseguire una regressione con ogni.Come eseguire l'iterazione su colonne di dataframe panda per eseguire la regressione

Ecco quello che 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 correre una regressione in questo modo:

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

ma supponiamo che io voglio fare questo per ogni colonna della dataframe. In particolare, voglio regredire FIUIX su FSTMX, quindi FSAIX su FSTMX e poi su FSAVX su FSTMX. Dopo ogni regressione voglio conservare i residui.

ho provato varie versioni di quanto segue, ma devo essere sempre dalla parte del torto sintassi:

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

Credo che il problema è che non so come fare riferimento alla colonna rendimenti a chiave, quindi returns[k] è probabilmente sbagliato.

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

+0

È possibile pedice i colli in questo modo: 'for i in len (df): se i + 1 = len (df):! # Sm .OLS (restituisce [returns.columns [i]], restituisce [returns.columns [i + 1]]), fit() 'os simile – EdChum

risposta

132
for column in df: 
    print(df[column]) 
+0

Mi sembra di tornare indietro l'intestazione della colonna quando utilizzo questo metodo. Ad esempio: print (df) mi mostra i dati nelle colonne del dataframe ma per c in df: stampa (c) stampa solo l'intestazione non i dati. – user1761806

+1

Ok ignorami - stavo facendo stampare (colonna) non stampare (df [colonna]) – user1761806

+1

Fai attenzione alle colonne con lo stesso nome! – freethebees

12

È possibile indicizzare le colonne del dataframe in base alla posizione utilizzando ix.

df1.ix[:,1] 

Questo restituisce la prima colonna per esempio. (0 sarebbe l'indice)

df1.ix[0,] 

Questo restituisce la prima riga.

df1.ix[:,1] 

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

df1.ix[0,1] 

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

+0

' ix' è deprecato, usa 'iloc' –

5

Una soluzione alternativa è di trasporre lo DataFrame e iterare sulle righe.

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

È possibile utilizzare iteritems():

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

Usando di lista, è possibile ottenere tutti i nomi delle colonne (intestazione):

[column for column in df]

1

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

  1. creare un elenco di tutte le colonne
  2. Utilizzare itertools prendere combinazioni x
  3. Append ogni risultato R al quadrato valore a un dataframe risultato con elenco di colonne esclusi
  4. Ordina il risultato DF in ordine decrescente di R al quadrato per vedere quale è la misura migliore.

Questo è il codice che ho usato su dataframe chiamato aft_tmt. Sentitevi liberi di estrapolare al vostro 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) 
5

Questa risposta è quella di iterare colonne selezionate così come tutte le colonne in una DF.

df.columns fornisce un elenco contenente tutti i nomi di colonne nel DF. Questo non è molto utile se vuoi scorrere tutte le colonne. Ma è utile quando vuoi scorrere su colonne di tua scelta.

Possiamo usare l'elenco di Python che affetta facilmente per tagliare df.columns in base alle nostre esigenze. Per esempio, a iterare su tutte le colonne, ma la prima, che possiamo fare:

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

Allo stesso modo per iterare su tutte le colonne in ordine inverso, possiamo fare:

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

Possiamo iterare tutte le colonne in molti modi interessanti con questa tecnica. Inoltre ricorda che è possibile ottenere gli indici di tutte le colonne facilmente utilizzando:

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