2017-03-04 4 views
1

Ich habe einen Code-Block, der funktioniert, jedoch bekomme ich Speicherfehler oder extrem lange Laufzeiten, gibt es eine elegantere Lösung, die weniger Speicher benötigt oder in einer kürzeren Zeit ausgeführt werden kann Zeitraum?Speicherfehler auf web.datareader mit Pandas

import pandas as pd 
import pandas.io.data as web 
import datetime 

#Grabs tickers from html 
exchList = pd.read_html('https://en.wikipedia.org/wiki/List_of_S%26P_500_companies', infer_types=False) 
sp500 = [] 
for ticker in exchList[0][0][1:]: 
    sp500.append(ticker) 
sp500 = [w.replace('.','-') for w in sp500] 

#sets date for data fetch 
start = datetime.datetime(2000,1,1) 
end = datetime.date.today() 

#fetches data from yahoo and prints to csv 
p = web.DataReader(sp500, "yahoo", start, end) 
main_df = p.to_frame() 
noIndex = main_df.reset_index() 
noIndex.columns.values[1]= 'Name' 
indexed = noIndex.set_index('Date') 
csv = indexed.to_csv('edata.csv') 

Antwort

1

import pandas.io.data ist in modernen Pandas Versionen veraltet:

In [113]: import pandas.io.data 
... 
ImportError: The pandas.io.data module is moved to a separate package (pandas-datareader). After installing the pandas-datareader package (h 
ttps://github.com/pandas-dev/pandas-datareader), you can change the import ``from pandas.io import data, wb`` to ``from pandas_datareader im 
port data, wb``. 

Also sollten wir pandas_datareader statt:

from pandas_datareader import data as web 

url = 'https://en.wikipedia.org/wiki/List_of_S%26P_500_companies' 
sp500 = pd.read_html(url)[0].iloc[1:, 0].str.replace('\.', '-') 
df = web.DataReader(sp500, "yahoo", '2000-01-01').to_frame() 

Speichernutzung:

In [112]: df.memory_usage() 
Out[112]: 
Index   7974167 
Open   15870936 
High   15870936 
Low   15870936 
Close  15870936 
Volume  15870936 
Adj Close 15870936 
dtype: int64 

executio n Zeit:

In [115]: %timeit -n 1 -r 1 web.DataReader(sp500, "yahoo", '2000-01-01').to_frame() 
1 loop, best of 1: 1min 57s per loop