【问题标题】:Pandas Datareader with Morningstar带有 Morningstar 的 Pandas 数据阅读器
【发布时间】:2018-05-25 00:30:54
【问题描述】:

我正在使用 pandas 进行网络抓取并使用 Morningstar 的 API。我时不时地用晨星挣扎的股票代码抓取一个网站并崩溃 python。

我在下面包含了相关行,它几乎总是有效,我认为我的代码不会导致错误,但我无法绕过 pandas 冻结我。这里的日期是一个变量,它的格式对 DataReader 来说是正确的,它不会引发问题。

import pandas as pd
import pandas_datareader.data as web

df = web.DataReader(ticker, "morningstar", date)

如果代码卡住了,几分钟后 pandas 将打印(它自己,不是我的打印语句)短语“添加(在此处插入代码)重试列表”。消息弹出后不久,我会弹出一个窗口,提示“Python 意外退出”。

我尝试将 datareader 包装在一个带有计时器的 while 循环中,以停止它并转到下一个代码,但它不起作用。我假设这是因为控制流。 我也尝试过使用 interruptingcow 模块,希望它能有所帮助,但得到的结果与常规计时器相同。

有没有办法解决这个问题?它每次都会使我的脚本崩溃。 我遇到的一些令人痛苦的代码是“BBXTB”、“CRXPF”、“IMMVD”和“FFRMF”

【问题讨论】:

    标签: python pandas web-scraping error-handling timer


    【解决方案1】:

    我仍然不知道为什么代码会失败并正在调查。但是,我可以通过直接修改pandas_datareader\mstar\daily.py 来让脚本不崩溃。

    我的版本是0.6.0。说明仅适用于该版本。

    第 134 - 138 行如下所示:

    if len(failed) > 0 and self.retry_count > 0:
        # TODO: This appears to do nothing since
        # TODO: successful symbols are not added to
        self._dl_mult_symbols(symbols=failed)
        self.retry_count -= 1
    

    计数器放错了位置,需要和上面一行交换一下,如:

    if len(failed) > 0 and self.retry_count > 0:
        # TODO: This appears to do nothing since
        # TODO: successful symbols are not added to
        self.retry_count -= 1
        self._dl_mult_symbols(symbols=failed)
    

    这应该允许失败的调用优雅地退出而不会导致堆栈溢出。

    顺便说一句,https://github.com/pydata/pandas-datareader/blob/master/pandas_datareader/mstar/daily.py 表明 @dtemkin 已直接修复了 pandas_datareader 的当前版本,因此可能会在下一个版本中发布/解决。

    您可以通过定位 python 存储其库的位置找到此文件。我通过Visual Studio 2017安装了anaconda,文件位置在:C:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\lib\site-packages\pandas_datareader\mstar\daily.py

    【讨论】:

      【解决方案2】:

      我认为您的问题与this question 类似。

      下面的 sn-p 应该会有所帮助:

      import pandas_datareader
      import datetime
      
      start = datetime.datetime(2018, 5, 1)
      end = datetime.datetime(2018, 5, 30)
      
      def get_data(ticker):
          try:
              df = pandas_datareader.data.DataReader('%s' % (ticker), 'morningstar', start, end, retry_count=0)
              print(df.tail(5))
          except ValueError:
           print('Ticker Symbol %s is not available!' % (ticker))
      
      get_data('TSLA') #valid Symbol
      get_data('yyfy') #not a valid Symbol
      

      retry_countValueError 让它对我有用。

      【讨论】:

        【解决方案3】:

        在 0.7.0 发布之前,建议从 Github repository 的 master 分支下载最新的 Pandas Datareader 开发版本。如果你使用pip,我会推荐:

        $ pip install git+https://github.com/pydata/pandas-datareader
        

        【讨论】:

          【解决方案4】:

          根据数据阅读器文档,Yahoo!、Google Options、Google Quotes 和 EDGAR 已被立即弃用,因为它们的 API 发生了很大变化并且没有稳定的替代品。改用“iex”

          import pandas_datareader.data as web
          import datetime as dt    
          
          start = dt.datetime(2018,1,1)
          end = dt.datetime(2019,1,1)
          
          aapl = web.DataReader('AAPL', 'iex', start, end)
          
          aapl.shape
          (251, 5)
          
          aapl.head()
          
              open    high    low close   volume
          date                    
          2018-01-02  167.6431    169.7514    166.7564    169.7120    25555934
          2018-01-03  169.9780    171.9682    169.4165    169.6825    29517899
          2018-01-04  169.9879    170.9041    169.5347    170.4707    22434597
          2018-01-05  170.8746    172.7760    170.4904    172.4115    23660018
          2018-01-08  171.7711    173.0125    171.3573    171.7711    20567766
          

          【讨论】:

            猜你喜欢
            • 2017-05-20
            • 1970-01-01
            • 1970-01-01
            • 2018-01-04
            • 1970-01-01
            • 1970-01-01
            • 2020-10-21
            • 1970-01-01
            • 2013-01-25
            相关资源
            最近更新 更多