Reputation: 4208
I am working fine with pandas_datareader, then today I installed below both yahoo finance from the below link trying to solve another issue.
No data fetched Web.DataReader Panda
pip install yfinance
pip install fix_yahoo_finance
After the above installtion, pandas_datareader cannot be used anymore. I googled it and I did add the below import, and pandas_datareader is still not working.
from urllib.parse import urlencode
Here is the error:
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'
Upvotes: 8
Views: 8670
Reputation: 28030
I encountered exactly the same error. I am using python anaconda 2020_07 version.
The solution is to use the latest pandas-datareader v0.9 from anaconda channel. If you use the pandas-datareader package from conda-forge which is using older version v0.8.1, you will encounter the error. This is the status as of 20Dec2020.
I ran the command below to install the latest pandas-datareader
package.
conda install -c anaconda pandas-datareader
The error message disappeared and the problem has been fixed.
EDIT: If conda later downgrades pandas-datareader
back to conda-forge older version, there's a fix. See https://stackoverflow.com/a/65386464/1709088
Upvotes: 5
Reputation: 4208
ok, I solved this problem by upgrading pandas datareader
pip install pandas-datareader --upgrade
Upvotes: 17
Reputation: 281
The answer above is correct. I just wrote some code in that implements it:
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)
Upvotes: 0
Reputation: 777
The reason is that pandas removed urlencode from their library. Thus, with newer versions of pandas this will never work. Installing other libraries or upgrading will NOT address the issue.
The fix is to use Python3's version of urlencode. Fortunately, Python3 seems to have a drop in replacement:
Replace this:
from pandas.io.common import urlencode
With:
from urllib.parse import urlencode
And use urlencode as usual
Upvotes: 5