web-dev-qa-db-fra.com

Comment parcourir des colonnes de pandas dataframe pour exécuter la régression

Je suis sûr que c'est simple, mais en tant que novice complet de Python, je ne parviens pas à comprendre comment parcourir les variables dans un cadre de données pandas et exécuter une régression avec chacune d'elles.

Voici ce que je fais:

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

Je sais que je peux faire une régression comme celle-ci:

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

mais supposons que je veuille faire cela pour chaque colonne du dataframe. En particulier, je souhaite régresser FIUIX sur FSTMX, puis FSAIX sur FSTMX, puis FSAVX sur FSTMX. Après chaque régression, je veux stocker les résidus.

J'ai essayé différentes versions de ce qui suit, mais la syntaxe doit être incorrecte:

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

Je pense que le problème est que je ne sais pas comment faire référence à la colonne des retours par clé. returns[k] est donc probablement faux.

Toute indication sur la meilleure façon de procéder serait très appréciée. Peut-être y a-t-il une approche pandas commune qui me manque.

148
itzy
for column in df:
    print(df[column])
275
The Unfun Cat

Vous pouvez utiliser iteritems():

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

Cette réponse consiste à parcourir colonnes sélectionnées, ainsi que toutes les colonnes d’un fichier DF.

df.columns donne une liste contenant tous les noms des colonnes dans le DF. Maintenant, ce n'est pas très utile si vous voulez parcourir toutes les colonnes. Mais cela est pratique lorsque vous souhaitez parcourir uniquement les colonnes de votre choix.

Nous pouvons facilement découper la liste de Python pour découper df.columns en fonction de nos besoins. Par exemple, pour parcourir toutes les colonnes sauf la première, nous pouvons faire:

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

De même pour parcourir toutes les colonnes dans l'ordre inverse, nous pouvons faire:

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

En utilisant cette technique, nous pouvons parcourir toutes les colonnes de différentes manières. Rappelez-vous également que vous pouvez obtenir facilement les index de toutes les colonnes en utilisant:

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

Vous pouvez indexer les colonnes de données par la position à l'aide de ix.

df1.ix[:,1]

Ceci retourne la première colonne par exemple. (0 serait l'index)

df1.ix[0,]

Cela retourne la première ligne.

df1.ix[:,1]

Ce serait la valeur à l'intersection de la ligne 0 et de la colonne 1:

df1.ix[0,1]

etc. Ainsi, vous pouvez enumerate()returns.keys(): et utiliser le numéro pour indexer la trame de données.

19
JAB

Une solution de contournement consiste à transposer la DataFrame et à effectuer une itération sur les lignes.

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

Basé sur la réponse acceptée , si un index correspondant à chaque colonne est également désiré :

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

Le type df[column] ci-dessus est Series, qui peut simplement être converti en numpyndarrays:

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

En utilisant la compréhension par liste, vous pouvez obtenir tous les noms de colonnes (en-tête):

[column for column in df]

3
MEhsan

Je suis un peu en retard mais voici comment j'ai fait ça. Les marches:

  1. Créer une liste de toutes les colonnes
  2. Utilisez itertools pour prendre x combinaisons
  3. Ajouter chaque résultat R au carré à une image de résultat avec la liste des colonnes exclues
  4. Triez le résultat DF par ordre décroissant de R carré pour déterminer le meilleur ajustement.

C'est le code que j'ai utilisé sur DataFrame appelé aft_tmt. N'hésitez pas à extrapoler à votre cas d'utilisation ..

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)
3
Gaurav

Pour parcourir les lignes d'un cadre de données (plutôt que ses noms de colonne comme indiqué dans les autres réponses), vous pouvez utiliser

# df has 3 columns and 5 rows
df = pd.DataFrame(np.random.randint(0, 10, (5, 3)), columns=['A','B','C'])

for col in df.values:
    print(col)

qui sort

[5 5 0]
[7 4 5]
[4 1 6]
[2 3 4]
[6 0 4]

Pour itérer par colonne plutôt que par ligne, il suffit de transposer df.values:

for col in df.values.T:
    print(col)
[5 7 4 2 6]
[5 4 1 3 0]
[0 5 6 4 4]
0
Casimir