pandas_datareader,ImportError:无法导入名称“urlencode”

Posted

技术标签:

【中文标题】pandas_datareader,ImportError:无法导入名称“urlencode”【英文标题】:pandas_datareader, ImportError: cannot import name 'urlencode' 【发布时间】:2021-01-01 18:11:10 【问题描述】:

我在 pandas_datareader 上工作得很好,然后今天我从下面的链接安装了两个 yahoo Finance,试图解决另一个问题。

No data fetched Web.DataReader Panda

pip install yfinance
pip install fix_yahoo_finance

以上安装后,pandas_datareader 无法再使用。我用谷歌搜索了一下,确实添加了以下导入,但 pandas_datareader 仍然无法正常工作。

from urllib.parse import urlencode

这是错误:非常感谢您的帮助。

from pandas_datareader import data

  File "C:\Users\yongn\Anaconda3\lib\site-packages\pandas_datareader\__init__.py", line 2, in <module>
    from .data import (
  File "C:\Users\yongn\Anaconda3\lib\site-packages\pandas_datareader\data.py", line 11, in <module>
    from pandas_datareader.av.forex import AVForexReader
  File "C:\Users\yongn\Anaconda3\lib\site-packages\pandas_datareader\av\__init__.py", line 6, in <module>
    from pandas_datareader.base import _BaseReader
  File "C:\Users\yongn\Anaconda3\lib\site-packages\pandas_datareader\base.py", line 7, in <module>
    from pandas.io.common import urlencode
ImportError: cannot import name 'urlencode'
'''

【问题讨论】:

【参考方案1】:

好的,我通过升级 pandas datareader 解决了这个问题

pip install pandas-datareader --upgrade
``

Thanks

【讨论】:

【参考方案2】:

我遇到了完全相同的错误。我使用的是python anaconda 2020_07版本。

解决方案是使用 anaconda 包中最新的 pandas-datareader v0.9。如果你使用 conda-forge 的 pandas-datareader 包,它使用的是旧版本 v0.81,你会遇到错误。这是截至 2020 年 12 月 20 日的状态。

https://anaconda.org/anaconda/pandas-datareader

我运行下面的命令来安装最新的pandas-datareader 包。

conda install -c anaconda pandas-datareader

错误信息消失,问题已修复。

编辑:如果 conda 稍后将 pandas-datareader 降级回 conda-forge 旧版本,则有一个修复程序。见https://***.com/a/65386464/1709088

【讨论】:

【参考方案3】:

原因是 pandas 从他们的库中删除了 urlencode。因此,对于较新版本的 pandas,这将永远无法工作。安装其他库或升级不会解决问题。

https://github.com/pydata/pandas-datareader/pull/793/commits/558862104028dd7dbf5e845b3b6c5fcfc0d568e5

解决方法是使用 Python3 的 urlencode 版本。幸运的是,Python3 的替代品似乎有所下降:

替换这个:

from pandas.io.common import urlencode

与:

from urllib.parse import urlencode

像往常一样使用 urlencode

【讨论】:

我遇到了同样的问题。我也在使用 yfinance 和 pandas-datareader。我在“from pandas.io.common import urlencode”上也看到了完全相同的错误,我点击了您指向 github 的链接(我必须承认我对此不是很有经验并且很难真正理解)。我在 github 上看到“from pandas.io.common import urlencode”是红色和一个减号……而“from urllib.parse import urlencode”是绿色和一个加号……我可以推断出它的意思是一样的你在说什么......用“y”替换“x”......但是如何用y替换x? 在编码编辑器/IDE 中打开您的代码,当您看到 X 时,使用剪切功能将其删除并替换为 Y。保存然后重新运行。不确定我是否看到了除此之外的问题。它与 git 没有任何有意义的关系。 5 年后...仍然是同样的错误,pandas-datareader (0.8.1) 是 conda-forge 提供的最新版本,而且无论如何在 their history of revisions 中没有提及修复。这个模块似乎没有得到很好的维护,或者我遗漏了一些东西。 您缺少的东西。该模块已被删除,因为在 pandas 之外有一个具有类似 api 的副本。试试我上面的解决方案,我认为这会更有意义。【参考方案4】:

上面的答案是正确的。我刚刚写了一些代码来实现它:

import os

basePath = os.path.join(os.path.dirname(os.__file__),'site-packages','pandas_datareader','base.py')

# read base.py
with open(basePath, 'r') as f:
    lines = f.read()

find = 'from pandas.io.common import urlencode'

replace = """from urllib.parse import urlencode"""

# add new text
lines = lines.replace(find,replace)

# overwrite old 'basedatatypes.py'
with open(basePath, 'w') as f:   
    f.write(lines)

initPath = os.path.join(os.path.dirname(os.__file__),'site-packages','pandas_datareader','iex','__init__.py')
# read iex/__init__.py
with open(initPath, 'r') as f:
    lines = f.read()

# add new text
lines = lines.replace(find,replace)

# overwrite old 'basedatatypes.py'
with open(initPath, 'w') as f:   
    f.write(lines)

【讨论】:

以上是关于pandas_datareader,ImportError:无法导入名称“urlencode”的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 pandas_datareader 从雅虎获取股票数据

pandas_datareader.data 不返回从开始到结束日期的所有股票值

导入 pandas_datareader 时遇到问题

pandas_datareader下载雅虎财经股价数据

pandas_datareader 在 jupyter-notebook (Anaconda) 中不起作用

pandas_datareader 在从 Yahoo 获取股票拆分时出错