pydata / pandas-datareader

Extract data from a wide range of Internet sources into a pandas DataFrame.

Home Page:https://pydata.github.io/pandas-datareader/stable/index.html

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

get_nasdaq_symbols() is failing today. API endpoint problem?

EternalNooblet opened this issue · comments

I have been using this method daily for the last few weeks, so I know it worked on Friday. Below is the min code to cause the error. I am using python 3.11.3 and jupyter notebooks.

from pandas_datareader.nasdaq_trader import get_nasdaq_symbols
get_nasdaq_symbols()
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[1], line 2
      1 from pandas_datareader.nasdaq_trader import get_nasdaq_symbols
----> 2 get_nasdaq_symbols()

File ~/.local/lib/python3.11/site-packages/pandas_datareader/nasdaq_trader.py:107, in get_nasdaq_symbols(retry_count, timeout, pause)
    105 while retry_count > 0:
    106     try:
--> 107         _ticker_cache = _download_nasdaq_symbols(timeout=timeout)
    108         retry_count = -1
    109     except RemoteDataError:
    110         # retry on any exception

File ~/.local/lib/python3.11/site-packages/pandas_datareader/nasdaq_trader.py:70, in _download_nasdaq_symbols(timeout)
     65 # For pandas >= 0.20.0, the Python parser issues a warning if
     66 # both a converter and dtype are specified for the same column.
     67 # However, this measure is probably temporary until the read_csv
     68 # behavior is better formalized.
     69 with warnings.catch_warnings(record=True):
---> 70     data = read_csv(
     71         StringIO("\n".join(lines[:-1])),
     72         "|",
     73         dtype=_TICKER_DTYPE,
     74         converters=converter_map,
     75         index_col=1,
     76     )
     78 # Properly cast enumerations
     79 for cat in _CATEGORICAL:

TypeError: read_csv() takes 1 positional argument but 2 positional arguments (and 3 keyword-only arguments) were given

`import pandas_datareader.data as web

import pandas as pd

import datetime as dt

df = web.DataReader('GE', 'yahoo', start='2019-09-10', end='2019-10-09')

df.head() ---------------------------------------------------------------------------`
TypeError Traceback (most recent call last)
~\AppData\Local\Temp\ipykernel_12248\1576652786.py in
5 import datetime as dt
6
----> 7 df = web.DataReader('GE', 'yahoo', start='2019-09-10', end='2019-10-09')
8
9 df.head()

~\anaconda3\envs\Machine-Learning-Environment\lib\site-packages\pandas\util_decorators.py in wrapper(*args, **kwargs)
209 else:
210 kwargs[new_arg_name] = new_arg_value
--> 211 return func(*args, **kwargs)
212
213 return cast(F, wrapper)

~\anaconda3\envs\Machine-Learning-Environment\lib\site-packages\pandas_datareader\data.py in DataReader(name, data_source, start, end, retry_count, pause, session, api_key)
368
369 if data_source == "yahoo":
--> 370 return YahooDailyReader(
371 symbols=name,
372 start=start,

~\anaconda3\envs\Machine-Learning-Environment\lib\site-packages\pandas_datareader\base.py in read(self)
251 # If a single symbol, (e.g., 'GOOG')
252 if isinstance(self.symbols, (string_types, int)):
--> 253 df = self._read_one_data(self.url, params=self._get_params(self.symbols))
254 # Or multiple symbols, (e.g., ['GOOG', 'AAPL', 'MSFT'])
255 elif isinstance(self.symbols, DataFrame):

~\anaconda3\envs\Machine-Learning-Environment\lib\site-packages\pandas_datareader\yahoo\daily.py in _read_one_data(self, url, params)
151 try:
152 j = json.loads(re.search(ptrn, resp.text, re.DOTALL).group(1))
--> 153 data = j["context"]["dispatcher"]["stores"]["HistoricalPriceStore"]
154 except KeyError:
155 msg = "No data fetched for symbol {} using {}"

TypeError: string indices must be integers

I have been using this method daily for the last few weeks, so I know it worked on Friday. Below is the min code to cause the error. I am using python 3.11.3 and jupyter notebooks.

from pandas_datareader.nasdaq_trader import get_nasdaq_symbols
get_nasdaq_symbols()
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[1], line 2
      1 from pandas_datareader.nasdaq_trader import get_nasdaq_symbols
----> 2 get_nasdaq_symbols()

File ~/.local/lib/python3.11/site-packages/pandas_datareader/nasdaq_trader.py:107, in get_nasdaq_symbols(retry_count, timeout, pause)
    105 while retry_count > 0:
    106     try:
--> 107         _ticker_cache = _download_nasdaq_symbols(timeout=timeout)
    108         retry_count = -1
    109     except RemoteDataError:
    110         # retry on any exception

File ~/.local/lib/python3.11/site-packages/pandas_datareader/nasdaq_trader.py:70, in _download_nasdaq_symbols(timeout)
     65 # For pandas >= 0.20.0, the Python parser issues a warning if
     66 # both a converter and dtype are specified for the same column.
     67 # However, this measure is probably temporary until the read_csv
     68 # behavior is better formalized.
     69 with warnings.catch_warnings(record=True):
---> 70     data = read_csv(
     71         StringIO("\n".join(lines[:-1])),
     72         "|",
     73         dtype=_TICKER_DTYPE,
     74         converters=converter_map,
     75         index_col=1,
     76     )
     78 # Properly cast enumerations
     79 for cat in _CATEGORICAL:

TypeError: read_csv() takes 1 positional argument but 2 positional arguments (and 3 keyword-only arguments) were given

same problem for me!

I found that it works with (pandas 1.5.3, pandas-datareader 0.10.0) but not with (pandas 2.0.3, pandas-datareader 0.10.0).

Consider the following environment files

 % cat env_test_pandas_153.yml
name: test_pandas_153
channels:
  - defaults
dependencies:
  - python=3.11
  - pandas=1.5.3
  - pandas-datareader=0.10.0
 % cat env_test_pandas_203.yml
name: test_pandas_203
channels:
  - defaults
dependencies:
  - python=3.11
  - pandas=2.0.3
  - pandas-datareader=0.10.0

Create the respective environments with

 % conda env create -f env_test_pandas_153.yml
 % conda env create -f env_test_pandas_203.yml

Sample code works with test_pandas_153 environment

 % conda activate test_pandas_153             

 % which python
/opt/rajulocal/miniconda3/envs/test_pandas_153/bin/python

 % python
Python 3.11.5 (main, Sep 11 2023, 13:54:46) [GCC 11.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from pandas_datareader.nasdaq_trader import get_nasdaq_symbols
>>> traded_symbols = get_nasdaq_symbols()
>>> traded_symbols.shape
(11321, 11)

 % conda deactivate

The same code does not work with test_pandas_203 environment

 % conda activate test_pandas_203

 % which python
/opt/rajulocal/miniconda3/envs/test_pandas_203/bin/python

 % python
Python 3.11.5 (main, Sep 11 2023, 13:54:46) [GCC 11.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from pandas_datareader.nasdaq_trader import get_nasdaq_symbols
>>> traded_symbols = get_nasdaq_symbols()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/rajulocal/miniconda3/envs/test_pandas_203/lib/python3.11/site-packages/pandas_datareader/nasdaq_trader.py", line 107, in get_nasdaq_symbols
    _ticker_cache = _download_nasdaq_symbols(timeout=timeout)
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/rajulocal/miniconda3/envs/test_pandas_203/lib/python3.11/site-packages/pandas_datareader/nasdaq_trader.py", line 70, in _download_nasdaq_symbols
    data = read_csv(
           ^^^^^^^^^
TypeError: read_csv() takes 1 positional argument but 2 positional arguments (and 3 keyword-only arguments) were given

 % conda deactivate

I'm facing this issue too.

How would one go about correcting either the get_nasdaq_symbols() or the read_csv() scripts to make this work again?

You can fix the error locally as follows:

In pandas_datareader/nasdaq_trader.py, change

    with warnings.catch_warnings(record=True):
        data = read_csv(
            StringIO("\n".join(lines[:-1])),
            "|",
            dtype=_TICKER_DTYPE,
            converters=converter_map,
            index_col=1,
        )

to

    with warnings.catch_warnings(record=True):
        data = read_csv(
            StringIO("\n".join(lines[:-1])),
            sep="|",
            dtype=_TICKER_DTYPE,
            converters=converter_map,
            index_col=1,
        )

That is explicitly specify the parameter name ("sep") when calling read_csv.

FWIW, @FidoDido1982 raised a pull request https://github.com/pydata/pandas-datareader/pull/968/files for this and it is merged into the main branch. If and when a new version of pandas-datareader is released we should be good, I think.

Wow, thank you so much. This fixed it!