Estoy seguro de que esto es simple, pero como un novato completo en Python, tengo problemas para descubrir cómo iterar sobre las variables en un pandas
marco de datos y ejecutar una regresión con cada una.
Esto es lo que estoy haciendo:
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()
Sé que puedo ejecutar una regresión como esta:
regs = sm.OLS(returns.FIUIX,returns.FSTMX).fit()
pero supongamos que quiero hacer esto para cada columna en el marco de datos. En particular, quiero regresar FIUIX en FSTMX, y luego FSAIX en FSTMX, y luego FSAVX en FSTMX. Después de cada regresión quiero almacenar los residuos.
He probado varias versiones de lo siguiente, pero debo estar equivocando la sintaxis:
resids = {}
for k in returns.keys():
reg = sm.OLS(returns[k],returns.FSTMX).fit()
resids[k] = reg.resid
Creo que el problema es que no sé cómo referirme a la columna de devoluciones por clave, por returns[k]
lo que probablemente esté mal.
Cualquier orientación sobre la mejor manera de hacer esto sería muy apreciada. Tal vez hay un enfoque de pandas común que me falta.
fuente
for i in len(df): if i + 1 != len(df): # sm.OLS(returns[returns.coloumns[i]], returns[returns.columns[ i+1]]), fit()
os similarRespuestas:
fuente
for x in df
embargo, esperaría iterar sobre filas. : - /for idx, row in df.iterrows()
itera sobre filas. Dado que las operaciones colbasadas están vectorizadas, es natural que la iteración principal sea sobre columnas :)Puedes usar
iteritems()
:fuente
Esta respuesta es iterar sobre las columnas seleccionadas , así como todas las columnas en un DF.
df.columns
da una lista que contiene todos los nombres de las columnas en el DF. Ahora eso no es muy útil si desea iterar sobre todas las columnas. Pero resulta útil cuando desea iterar sobre columnas de su elección solamente.Podemos usar la división de la lista de Python fácilmente para cortar columnas df. según nuestras necesidades. Por ejemplo, para iterar sobre todas las columnas excepto la primera, podemos hacer:
De manera similar, para iterar sobre todas las columnas en orden inverso, podemos hacer:
Podemos iterar sobre todas las columnas de muchas maneras geniales usando esta técnica. También recuerde que puede obtener los índices de todas las columnas fácilmente usando:
fuente
Puede indexar las columnas del marco de datos por posición usando
ix
.Esto devuelve la primera columna, por ejemplo. (0 sería el índice)
Esto devuelve la primera fila.
Este sería el valor en la intersección de la fila 0 y la columna 1:
y así. Entonces puede
enumerate()
returns.keys():
y usar el número para indexar el marco de datos.fuente
ix
está en desuso, useiloc
Una solución alternativa es transponer
DataFrame
e iterar sobre las filas.fuente
Usando la comprensión de la lista, puede obtener todos los nombres de columnas (encabezado):
[column for column in df]
fuente
list(df.columns)
o[c for c in df]
Según la respuesta aceptada , si también se desea un índice correspondiente a cada columna :
El
df[column]
tipo anterior esSeries
, que simplemente se puede convertir ennumpy
ndarray
s:fuente
Llego un poco tarde, pero así es como hice esto. Los pasos:
Este es el código que usé en DataFrame llamado
aft_tmt
. Siéntase libre de extrapolar a su caso de uso.fuente