【问题标题】:Loading data from Yahoo! Finance with pandas从 Yahoo! 加载数据用熊猫理财
【发布时间】:2014-07-01 18:33:17
【问题描述】:

我正在阅读 Wes McKinney 的《Python For Data Analysis》一书以及第 139 页的 Correlation and Covariance 下的内容,当我尝试运行他的代码以从 Yahoo! 获取数据时出现错误。金融。

这是我正在运行的:

#CORRELATION AND COVARIANCE
import pandas.io.data as web

all_data = {}
for ticker in ['AAPL', 'IBM', 'MSFT', 'GOOG']:
    all_data[ticker] = web.get_data_yahoo(ticker, '1/1/2003', '1/1/2013')

price = DataFrame({tic: data['Adj Close']
                   for tic, data in all_data.iteritems()})
volume = DataFrame({tic: data['Volume']
                    for tic, data in all_data.iteritems()})

这是我得到的错误:

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "C:\Users\eMachine\WinPython-64bit-2.7.5.3\python-2.7.5.amd64\lib\site-packages\pandas\io\data.py", line 390, in get_data_yahoo
    adjust_price, ret_index, chunksize, 'yahoo', name)
  File "C:\Users\eMachine\WinPython-64bit-2.7.5.3\python-2.7.5.amd64\lib\site-packages\pandas\io\data.py", line 336, in _get_data_from
    hist_data = src_fn(symbols, start, end, retry_count, pause)
  File "C:\Users\eMachine\WinPython-64bit-2.7.5.3\python-2.7.5.amd64\lib\site-packages\pandas\io\data.py", line 190, in _get_hist_yahoo
    return _retry_read_url(url, retry_count, pause, 'Yahoo!')
  File "C:\Users\eMachine\WinPython-64bit-2.7.5.3\python-2.7.5.amd64\lib\site-packages\pandas\io\data.py", line 169, in _retry_read_url
    "return a 200 for url %r" % (retry_count, name, url))
IOError: after 3 tries, Yahoo! did not return a 200 for url 'http://ichart.yahoo.com/table.csv?s=GOOG&a=0&b=1&c=2000&d=0&e=1&f=2010&g=d&ignore=.csv'
>>> ... >>> >>> ... >>> 

知道问题出在哪里吗?

【问题讨论】:

  • 我认为 google 的代码发生了变化。试试看:GOOGL
  • 不错! @Karl D. 感谢您的快速帮助!

标签: python pandas


【解决方案1】:

我正在使用下面的代码 sn-p 来加载雅虎财经数据。

import pandas_datareader as pdr
from datetime import datetime
from pandas import DataFrame as df

def get_data(selection, sdate, edate):
    data = pdr.get_data_yahoo(symbols=selection, start=sdate, end=edate)
    data =  df(data['Adj Close'])
    return data

start_date = datetime(2017, 1, 1)
end_date = datetime(2019,4,28)

selected = [ 'TD.TO', 'AC.TO', 'BNS.TO', 'ENB.TO', 'MFC.TO','RY.TO','BCE.TO']

print(get_data(selected, start_date, end_date).head(1))

https://repl.it/repls/DevotedBetterAlgorithms

【讨论】:

    【解决方案2】:

    截至 2017 年 6 月 1 日,我从这个页面和其他几个页面拼凑了以下内容:

    from pandas_datareader import data as web
    # import pandas.io.data as web
    import fix_yahoo_finance
    import datetime
    
    start = datetime.datetime(2010, 1, 1)
    end = datetime.datetime(2017, 6, 1)
    
    all_data={}
    for ticker in ['AAPL', 'IBM', 'MSFT', 'GOOGL']:
        all_data[ticker] = web.get_data_yahoo(ticker, start, end)
    
    price = DataFrame({tic: data['Adj Close'] 
                       for tic, data in all_data.iteritems()})
    volume = DataFrame({tic: data['Volume']
                         for tic, data in all_data.iteritems()})
    

    【讨论】:

      【解决方案3】:

      一旦您按照这些说明从 pandas.io.data 切换到 pandas_datareader.data 后,遇到同样的问题并且将“GOOG”更改为“GOOGL”似乎可行。

      http://pandas-datareader.readthedocs.org/en/latest/remote_data.html#yahoo-finance

      【讨论】:

        【解决方案4】:

        正如 Karl 所指出的,股票代码已经改变,意味着雅虎返回一个“未找到页面”。

        从网络轮询数据时,最好将调用包装在 try except 中

        all_data = {}
        for ticker in ['AAPL', 'IBM', 'MSFT', 'GOOG']:
            try:
                all_data[ticker] = web.get_data_yahoo(ticker, '1/1/2003', '1/1/2013')
                price = DataFrame({tic: data['Adj Close']
                            for tic, data in all_data.iteritems()})
                volume = DataFrame({tic: data['Volume']
                            for tic, data in all_data.iteritems()})
            except:
                print "Cant find ", ticker
        

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-31
        • 2020-07-10
        • 1970-01-01
        • 1970-01-01
        • 2021-01-18
        • 2014-05-24
        • 1970-01-01
        • 2018-10-20
        相关资源
        最近更新 更多