pandas_datareader, ImportError: невозможно импортировать имя 'urlencode'

Я отлично работаю с pandas_datareader, а сегодня я установил оба yahoo finance из приведенной ниже ссылки, пытаясь решить другую проблему.

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

person roudan    schedule 15.09.2020    source источник


Ответы (4)


Я столкнулся с точно такой же ошибкой. Я использую версию python anaconda 2020_07.

Решение - использовать последнюю версию pandas-datareader v0.9 из пакета anaconda. Если вы используете пакет pandas-datareader от conda-forge, который использует более старую версию v0.81, вы столкнетесь с ошибкой. Это статус по состоянию на 20 декабря 2020 года.

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

Я выполнил команду ниже, чтобы установить последний пакет pandas-datareader.

conda install -c anaconda pandas-datareader

Сообщение об ошибке исчезло, и проблема была устранена.

РЕДАКТИРОВАТЬ: если conda позже понизит pandas-datareader до более старой версии conda-forge, есть исправление. См. https://stackoverflow.com/a/65386464/1709088

person user781486    schedule 20.12.2020

хорошо, я решил эту проблему, обновив pandas datareader

pip install pandas-datareader --upgrade
``

Thanks
person roudan    schedule 15.09.2020

Причина в том, что панды удалили urlencode из своей библиотеки. Таким образом, с более новыми версиями панд это никогда не сработает. Установка других библиотек или обновление НЕ решит проблему.

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

Исправление заключается в использовании версии urlencode для Python3. К счастью, Python3, похоже, не имеет замены:

Замените это:

from pandas.io.common import urlencode

С участием:

from urllib.parse import urlencode

И используйте urlencode как обычно

person Frederick Ollinger    schedule 24.10.2020
comment
У меня такая же проблема. Я также использую yfinance с pandas-datareader. Я также вижу ту же ошибку при импорте urlencode pandas.io.common, и я щелкнул вашу ссылку на github (я должен признать, что я не очень опытен и с трудом понимаю). Я вижу на github из pandas.io.common import urlencode красный и знак минус ... а из urllib.parse import urlencode зеленый и знак плюс ... Я могу сделать вывод, что он говорит то же самое, что вы говорите ... заменить x на y ... но как заменить x на y? - person XCELLGUY; 14.11.2020
comment
Откройте свой код в редакторе кодирования / IDE и, когда вы увидите X, используйте функцию вырезания, чтобы удалить его и заменить на Y. Сохраните, затем запустите повторно. Не уверен, что вижу проблему за пределами этого. Это никак не связано с git. - person Frederick Ollinger; 15.11.2020
comment
5 лет спустя ... все та же ошибка, pandas-datareader (0.8.1) последняя версия, доступная на conda-forge, и в любом случае нет упоминания об исправлении в их история изменений. Этот модуль не очень хорошо поддерживается, или мне что-то не хватает. - person mins; 13.12.2020
comment
Вы что-то упускаете. Модуль был удален, потому что за пределами pandas есть дубликат с аналогичным api. Попробуйте мое решение выше, и я думаю, что это будет иметь больше смысла. - person Frederick Ollinger; 14.12.2020

Ответ правильный. Я просто написал код, который его реализует:

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)
person Michael Tiemann    schedule 05.06.2021