Je suis sûr que c'est simple, mais en tant que novice complet en python, j'ai du mal à comprendre comment itérer sur des variables dans un pandas
dataframe et exécuter une régression avec chacune.
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 exécuter une régression comme celle-ci:
regs = sm.OLS(returns.FIUIX,returns.FSTMX).fit()
mais supposons que je veuille le faire pour chaque colonne du dataframe. En particulier, je veux régresser FIUIX sur FSTMX, puis FSAIX sur FSTMX, puis FSAVX sur FSTMX. Après chaque régression, je souhaite stocker les résidus.
J'ai essayé différentes versions de ce qui suit, mais je dois me tromper dans la syntaxe:
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 aux retours colonne par clé, donc returns[k]
c'est probablement faux.
Toute orientation sur la meilleure façon de procéder serait très appréciée. Il me manque peut-être une approche commune aux pandas.
la source
for i in len(df): if i + 1 != len(df): # sm.OLS(returns[returns.coloumns[i]], returns[returns.columns[ i+1]]), fit()
Réponses:
la source
for x in df
à parcourir les lignes. : - /for idx, row in df.iterrows()
itère sur les lignes. Étant donné que les opérations basées sur col sont vectorisées, il est naturel que l'itération principale soit sur les colonnes :)Vous pouvez utiliser
iteritems()
:la source
Cette réponse consiste à parcourir les colonnes sélectionnées ainsi que toutes les colonnes d'un DF.
df.columns
donne une liste contenant tous les noms de 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 utiliser le découpage de liste de Python pour découper les df.columns en fonction de nos besoins. Par exemple, pour parcourir toutes les colonnes sauf la première, nous pouvons faire:
De même pour parcourir toutes les colonnes dans l'ordre inverse, nous pouvons faire:
Nous pouvons parcourir toutes les colonnes de nombreuses manières intéressantes en utilisant cette technique. N'oubliez pas que vous pouvez facilement obtenir les indices de toutes les colonnes en utilisant:
la source
Vous pouvez indexer les colonnes de dataframe en fonction de la position à l'aide de
ix
.Cela renvoie la première colonne par exemple. (0 serait l'indice)
Cela renvoie la première ligne.
Ce serait la valeur à l'intersection de la ligne 0 et de la colonne 1:
etc. Vous pouvez donc
enumerate()
returns.keys():
et utiliser le nombre pour indexer la trame de données.la source
ix
est obsolète, utiliseziloc
Une solution de contournement consiste à transposer
DataFrame
et à itérer sur les lignes.la source
En utilisant la compréhension de liste, vous pouvez obtenir tous les noms de colonnes (en-tête):
[column for column in df]
la source
list(df.columns)
ou[c for c in df]
En fonction de la réponse acceptée , si un index correspondant à chaque colonne est également souhaité :
Le
df[column]
type ci-dessus estSeries
, qui peut simplement être converti ennumpy
ndarray
s:la source
Je suis un peu en retard mais voici comment je l'ai fait. Les marches:
C'est le code que j'ai utilisé sur DataFrame appelé
aft_tmt
. N'hésitez pas à extrapoler à votre cas d'utilisation.la source