KeyError on pandas_datareader.get_data_yahoo

Viewed 419

I am trying to download the data for several hundreds of stocks using pandas_datareader's .get_data_yahoo function. To speed up the process i want to use multithreading with python's concurrent.futures. One can see a stripped down version of my code in the code window below trying to download the stocks contained in the german DAX.

from pandas_datareader import data as pdr
from pytickersymbols import PyTickerSymbols
import concurrent.futures
import yfinance as yf
import datetime
import os
from time import sleep
yf.pdr_override()


def download_stockdata(ticker):
    print(f"Downloading {ticker} \n")
    df = pdr.get_data_yahoo(ticker, datetime.datetime.now() - datetime.timedelta(days=365), datetime.date.today())
    print(f"{ticker} downloaded \n")
    return df

if __name__ == '__main__':

    tickers = []
    index_to_scan = "DAX"
    for element in list(PyTickerSymbols().get_stocks_by_index(index_to_scan)):
        if element["symbols"]:
            tickers.append(element.get("symbols")[0].get("yahoo"))

    print(f"Symbols in {index_to_scan}: {tickers} \n")                        

    print("Starting multi thread download")
    
    futures = []
        
    with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
        for ticker in tickers:
            future = executor.submit(download_stockdata, ticker)
            futures.append(future)
        
        futures, _ = concurrent.futures.wait(futures)
        for future in futures:
            print(future.result())

When running this code i get the following error:

KeyError                                  Traceback (most recent call last)
<ipython-input-1-2e4c65895072> in <module>
     36         futures, _ = concurrent.futures.wait(futures)
     37         for future in futures:
---> 38             print(future.result())

~\anaconda3\envs\Trading\lib\concurrent\futures\_base.py in result(self, timeout)
    430                 raise CancelledError()
    431             elif self._state == FINISHED:
--> 432                 return self.__get_result()
    433 
    434             self._condition.wait(timeout)

~\anaconda3\envs\Trading\lib\concurrent\futures\_base.py in __get_result(self)
    386     def __get_result(self):
    387         if self._exception:
--> 388             raise self._exception
    389         else:
    390             return self._result

~\anaconda3\envs\Trading\lib\concurrent\futures\thread.py in run(self)
     55 
     56         try:
---> 57             result = self.fn(*self.args, **self.kwargs)
     58         except BaseException as exc:
     59             self.future.set_exception(exc)

<ipython-input-1-2e4c65895072> in download_stockdata(ticker)
     11 def download_stockdata(ticker):
     12     print(f"Downloading {ticker} \n")
---> 13     df = pdr.get_data_yahoo(ticker, datetime.datetime.now() - datetime.timedelta(days=365), datetime.date.today())
     14     print(f"{ticker} downloaded \n")
     15     return df

~\anaconda3\envs\Trading\lib\site-packages\yfinance\multi.py in download(tickers, start, end, actions, threads, group_by, auto_adjust, back_adjust, progress, period, interval, prepost, proxy, rounding, **kwargs)
    117 
    118     if len(tickers) == 1:
--> 119         return shared._DFS[tickers[0]]
    120 
    121     try:

KeyError: 'BMW.F'

I tried different ways of multithreading like threading.Thread(), the ThreadPool from multiprocessing.pool and concurrent.futures. All methods result in a KeyError with a key that is not the same but varies from run to run. From this point on i have no more ideas how i could handle the Error. Can someone help me, to solve the KeyError?

0 Answers
Related