使用Pandas Datareader从多个来源读取股票

时间:2017-09-27 12:35:56

标签: python pandas iteration pandas-datareader

我有6个股票的清单。我已经设置了我的代码来引用列表中的股票名称与股票名称中的硬编码...首先是SPY,它位于第0位。列表下面的代码将返回昨天的股票收盘价。

我的问题是:如何通过列表中的每个股票循环代码,以便打印出所有6种股票的收盘价?

我想我需要使用循环,但我不理解它们。

有什么想法吗? 代码:

#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)

返回值:

SPY
Prior Close
249.08

3 个答案:

答案 0 :(得分:1)

您可以使用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 :(得分:1)

你可以使用一个循环,但你不需要循环。将整个UserControl列表传递给<TextBlock Text="{Binding DataContext.SomeProperty, RelativeSource={RelativeSource AncestorType=Window}}"> 。这应该比拨打多个电话便宜。

stocks

<强>详情

DataReader是一个面板,但可以使用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 转换为数据框:

ticker

您可以使用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()

如果您想查看特定日期的所有股票,可以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) 。对于您的情况,您希望查看最后日期的收盘股票,因此您可以使用df.loc

slice

答案 2 :(得分:0)

我将为您提供一个功能,您可以随时传递一个股票列表,并为您提供时间序列。 ;) 我将这个功能用于多个代码

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')

您可以以任何可能的方式使用此时间序列。使用具有可维护性和可重用性的功能总是好的。此外,此功能可以采取雅虎而不是谷歌