2017-09-27 4 views
-1

J'ai une liste de 6 stocks. J'ai mis en place mon code pour référencer le nom de stock de la liste vs codage dur dans le nom de stock ... d'abord avec SPY qui est en position 0. Le code ci-dessous la liste renverra le prix de clôture d'hier d'actions.Lecture des stocks de plusieurs sources à l'aide de Pandas Datareader

Ma question est: comment puis-je faire défiler le code dans chaque action de la liste pour imprimer le cours de clôture des 6 actions? Je pense que je dois utiliser des boucles mais je ne les comprends pas.

Des idées? CODE:

#import packages 

import pandas_datareader.data as web 
import datetime as dt 

#create list of stocks to reference later 

stocks = ['SPY', 'QQQ', 'IWM', 'AAPL', 'FB', 'GDX'] 

#define prior day close price 

start = dt.datetime(2010, 1, 1) 
end = dt.datetime(2030, 1, 27) 
ticker = web.DataReader(stocks[0], 'google', start, end) 
prior_day = ticker.iloc[-1] 
PDL = list(prior_day) 
prior_close = PDL[3] 
#print the name of the stock from the stocks list, and the prior close price 

print(stocks[0]) 
print('Prior Close') 
print(prior_close) 

RETOURS:

SPY 
Prior Close 
249.08 

Répondre

1

Vous pouvez simplement utiliser une boucle for

for stock in stocks: 
    start = dt.datetime(2010, 1, 1) 
    end = dt.datetime(2030, 1, 27) 
    ticker = web.DataReader(stock, 'google', start, end) 
    prior_day = ticker.iloc[-1] 
    PDL = list(prior_day) 
    prior_close = PDL[3] 

    print(stock) 
    print('Prior Close') 
    print(prior_close) 
1

Vous pouvez utiliser une boucle, mais vous n'avez pas besoin de boucles pour cela. Passez votre liste complète de stocks au DataReader. Cela devrait être moins cher que de faire plusieurs appels.

stocks = ['SPY', 'QQQ', 'IWM', 'AAPL', 'FB', 'GDX'] 
ticker = web.DataReader(stocks, 'google', start, end) 

close = ticker.to_frame().tail()['Close'].to_frame('Prior Close')  
print(close) 
        Prior Close 
Date  minor    
2017-09-26 FB   164.21 
      GDX   23.35 
      IWM   144.61 
      QQQ   143.17 
      SPY   249.08 

Détails

ticker est un panneau, mais peut être converti en un dataframe en utilisant to_frame:

print(ticker) 
<class 'pandas.core.panel.Panel'> 
Dimensions: 5 (items) x 251 (major_axis) x 6 (minor_axis) 
Items axis: Open to Volume 
Major_axis axis: 2016-09-28 00:00:00 to 2017-09-26 00:00:00 
Minor_axis axis: AAPL to SPY 

df = ticker.to_frame() 

Vous pouvez voir toutes les dates enregistrées des stocks en utilisant df.index.get_level_values:

print(df.index.get_level_values('Date')) 
DatetimeIndex(['2016-09-28', '2016-09-28', '2016-09-28', '2016-09-28', 
       '2016-09-28', '2016-09-28', '2016-09-29', '2016-09-29', 
       '2016-09-29', '2016-09-29', 
       ... 
       '2017-09-25', '2017-09-25', '2017-09-25', '2017-09-25', 
       '2017-09-26', '2017-09-26', '2017-09-26', '2017-09-26', 
       '2017-09-26', '2017-09-26'], 
       dtype='datetime64[ns]', name='Date', length=1503, freq=None) 

Si vous souhaitez afficher tous les stocks pour une date particulière, vous pouvez utiliser df.loc avec un slice. Pour votre cas, vous voulez voir les stocks de clôture à la dernière date, vous pouvez utiliser df.tail:

print(df.tail()['Close'].to_frame()) 
        Close 
Date  minor   
2017-09-26 FB  164.21 
      GDX  23.35 
      IWM 144.61 
      QQQ 143.17 
      SPY 249.08 
0

Je vais vous faire une fonction que vous pouvez toujours passer pour une liste des stocks et que vous FOURNIT une série chronologique. ;) J'utilise cette fonction pour de nombreux tickers

tickers = ['SPY', 'QQQ', 'EEM', 'INDA', 'AAPL', 'MSFT'] # add as many tickers 
start = dt.datetime(2010, 3,31) 
end = dt.datetime.today() 

# Function starts here 
def get_previous_close(strt, end, tick_list, this_price): 
    """ arg: `this_price` can take str Open, High, Low, Close, Volume""" 
    #make an empty dataframe in which we will append columns 
    adj_close = pd.DataFrame([]) 
    # loop here. 
    for idx, i in enumerate(tick_list): 
     total = web.DataReader(i, 'google', strt, end) 
     adj_close[i] = total[this_price] 
    return adj_close 

#call the function 
get_previous_close(start, end, tickers, 'Close') 

Vous pouvez utiliser cette série chronologique de quelque façon que possible. Il est toujours bon d'utiliser une fonction qui a la maintenabilité et la réutilisabilité. En outre, cette fonction peut prendre yahoo au lieu de google

+0

Merci beaucoup à tous! Je suis nouveau à Python et c'est tellement génial de pouvoir poser des questions et obtenir des réponses! Très appréciée. – pmillerhk

+0

Pourriez-vous expliquer comment le code ci-dessus n'est pas utile? – rko