Llamando iterativamente pandas datareader

Tengo un dict de python con una lista de acciones. Trato de usar las claves (el símbolo de stock, ver más abajo) en un bucle for para hacer iterativamente múltiples DataFrames de pandas para todas las acciones (nombradas para el símbolo de stock) que se llena con precio / volumen a través del DataReader de pandas. Creo que tengo un problema básico de Python en el código siguiente porque el único DataFrame que se crea es “stockName”. Gracias por tu ayuda

print stocks.keys() ['TSO', 'WDC', 'EBIX', 'AAPL', 'GTAT', 'MSFT', 'BKE', 'VFSTX', 'ORCL', 'UIS', 'HSII', 'PETS', 'BBBY', 'RPXC', 'TZOO', 'DLB', 'SPLS', 'CHE', 'INTC', 'CF', 'GTN', 'FFIV', 'ATML', 'BAH', 'DHX', 'HRB', 'VIAB', 'LMT', 'NOC', 'VWO', 'ROST'] for stockName in stocks.keys(): stockName = DataReader(stockName, "yahoo", datetime(2013,1,1), datetime(2013,8,1)) 

Si solo está iterando sobre acciones, puede llamarlo directamente con stocks

 DataReader(stocks, 'yahoo', datetime(2013, 1, 1), datetime(2013, 8, 1)) 

No necesitas iterar ya que get_data_yahoo hace por ti. Obtendrá un Panel que puede usar como un DataFrame de DataFrame s. Ni siquiera necesita llamar a stocks.keys() desde

 for key in dict(a=1, b=2, c=3): print key 

imprimirá

 a b c 

Aquí está el resultado:

 In [3]: p = DataReader(stocks, 'yahoo', datetime.datetime(2013, 1, 1), datetime.datetime(2013, 8, 1)) In [4]: p Out[4]:  Dimensions: 6 (items) x 147 (major_axis) x 31 (minor_axis) Items axis: Open to Adj Close Major_axis axis: 2013-01-02 00:00:00 to 2013-08-01 00:00:00 Minor_axis axis: AAPL to WDC 

Si desea poder acceder a los símbolos de valores a través del atributo de acceso, haga

 In [7]: p.swapaxes('items', 'minor').AAPL Out[7]:  DatetimeIndex: 147 entries, 2013-01-02 00:00:00 to 2013-08-01 00:00:00 Data columns (total 6 columns): Open 147 non-null values High 147 non-null values Low 147 non-null values Close 147 non-null values Volume 147 non-null values Adj Close 147 non-null values dtypes: float64(6) 

EDITAR: Será mucho más fácil manipular el Panel resultante que llenar un dict y hacer algo con eso.

Hay todo tipo de cosas divertidas que podrías hacer con esto. Aquí está el cambio porcentual agrupado por metric , stock y date :

 In [127]: df = p.to_frame(filter_observations=False) In [128]: res = df.stack().reset_index() In [129]: res.columns = ['date', 'metric', 'stock', 'value'] In [130]: res.set_index('date').groupby(['metric', 'stock']).apply(lambda x: x.value.pct_change()).stack() Out[130]: metric stock date Adj Close AAPL 2013-01-03 -0.013 2013-01-04 -0.028 2013-01-07 -0.006 2013-01-08 0.003 2013-01-09 -0.016 2013-01-10 0.012 2013-01-11 -0.006 2013-01-14 -0.036 2013-01-15 -0.032 2013-01-16 0.042 2013-01-17 -0.007 2013-01-18 -0.005 2013-01-22 0.010 2013-01-23 0.018 2013-01-24 -0.124 ... Volume WDC 2013-07-12 -0.083 2013-07-15 -0.179 2013-07-16 -0.302 2013-07-17 -0.168 2013-07-18 0.589 2013-07-19 0.003 2013-07-22 0.049 2013-07-23 0.526 2013-07-24 0.176 2013-07-25 0.616 2013-07-26 -0.363 2013-07-29 -0.357 2013-07-30 0.554 2013-07-31 -0.252 2013-08-01 -0.158 Length: 27010, dtype: float64 

¡El cielo es el límite con los pandas !

stockName es una variable que se repite en la lista del marcador de cotizaciones. Contiene la cadena de teletipo. Cuando le asigna el DataFrame, este DataFrame se pierde en el siguiente giro del bucle for .

Cree otra variable, un dict por ejemplo, donde asigne los datos de stock a:

 stockdata = {} for stockName in stocks: stockdata[stockName] = DataReader(stockName, "yahoo", datetime(2013,1,1), datetime(2013,8,1))