pmillerhk
pmillerhk

Reputation: 171

Reading stocks from multiple sources using Pandas Datareader

I have a list of 6 stocks. I have set up my code to reference the stock name from the list vs hard coding in the stock name ... first with SPY which is in position 0. The code below the list will return yesterday's closing price of stock.

My question is: how do I loop the code through each stock in the list so that I print out the closing price for all 6 stocks?

I think I need to use loops but I don't understand them.

Any ideas? 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)

RETURNS:

SPY
Prior Close
249.08

Upvotes: 0

Views: 3965

Answers (3)

rko
rko

Reputation: 314

I'll make you a function that you can always pass for a list of stocks and that provides you a time series. ;) I use this function for numerous 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')

You can use this time series in any way possible. It's always good to use a function that has maintainability and re-usability. Also, this function can take yahoo instead of google

Upvotes: 0

cs95
cs95

Reputation: 403100

You could use a loop, but you don't need loops for this. Pass your entire list of stocks to the DataReader. This should be cheaper than making multiple calls.

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

Details

ticker is a panel, but can be converted to a dataframe using 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()

You can view all recorded dates of stocks using 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)

If you want to view all stocks for a particular date, you can use df.loc with a slice. For your case, you want to see the closing stocks on the last date, so you can use 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

Upvotes: 3

Cory Kramer
Cory Kramer

Reputation: 118011

You can just use a for loop

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)

Upvotes: 1

Related Questions