3
3
import json
4
4
import re
5
5
import time
6
- import warnings
7
-
8
- import numpy as np
9
- import pandas .compat as compat
10
- from pandas import (Panel , DataFrame , to_datetime , notnull , isnull )
11
- from pandas_datareader ._utils import (RemoteDataError , SymbolWarning )
12
- from pandas_datareader .base import (_DailyBaseReader , _in_chunks )
6
+ from pandas import (DataFrame , to_datetime , notnull , isnull )
7
+ from pandas_datareader ._utils import RemoteDataError
8
+ from pandas_datareader .base import _DailyBaseReader
13
9
14
10
15
11
class YahooDailyReader (_DailyBaseReader ):
16
12
"""
17
- Returns DataFrame/Panel of with historical over date range, start to end.
13
+ Returns DataFrame of with historical over date range,
14
+ start to end.
18
15
To avoid being penalized by Yahoo! Finance servers, pauses between
19
16
downloading 'chunks' of symbols can be specified.
20
17
@@ -96,6 +93,10 @@ def __init__(self, symbols=None, start=None, end=None, retry_count=3,
96
93
def get_actions (self ):
97
94
return self ._get_actions
98
95
96
+ @property
97
+ def url (self ):
98
+ return 'https://finance.yahoo.com/quote/{}/history'
99
+
99
100
def _get_params (self , symbol ):
100
101
unix_start = int (time .mktime (self .start .timetuple ()))
101
102
day_end = self .end .replace (hour = 23 , minute = 59 , second = 59 )
@@ -106,31 +107,17 @@ def _get_params(self, symbol):
106
107
'period2' : unix_end ,
107
108
'interval' : self .interval ,
108
109
'frequency' : self .interval ,
109
- 'filter' : 'history'
110
+ 'filter' : 'history' ,
111
+ 'symbol' : symbol
110
112
}
111
113
return params
112
114
113
- def read (self ):
114
- """Read data"""
115
- try :
116
- # If a single symbol, (e.g., 'GOOG')
117
- if isinstance (self .symbols , (compat .string_types , int )):
118
- dfs = self ._read_one_data (self .symbols )
119
-
120
- # Or multiple symbols, (e.g., ['GOOG', 'AAPL', 'MSFT'])
121
- elif isinstance (self .symbols , DataFrame ):
122
- dfs = self ._dl_mult_symbols (self .symbols .index )
123
- else :
124
- dfs = self ._dl_mult_symbols (self .symbols )
125
-
126
- return dfs
127
- finally :
128
- self .close ()
129
-
130
- def _read_one_data (self , symbol ):
115
+ def _read_one_data (self , url , params ):
131
116
""" read one data from specified symbol """
132
- url = 'https://finance.yahoo.com/quote/{}/history' .format (symbol )
133
- params = self ._get_params (symbol )
117
+
118
+ symbol = params ['symbol' ]
119
+ del params ['symbol' ]
120
+ url = url .format (symbol )
134
121
135
122
resp = self ._get_response (url , params = params )
136
123
ptrn = r'root\.App\.main = (.*?);\n}\(this\)\);'
@@ -195,39 +182,10 @@ def _read_one_data(self, symbol):
195
182
196
183
return prices
197
184
198
- def _dl_mult_symbols (self , symbols ):
199
- stocks = {}
200
- failed = []
201
- passed = []
202
- for sym_group in _in_chunks (symbols , 1 ): # ignoring chunksize
203
- for sym in sym_group :
204
- try :
205
- stocks [sym ] = self ._read_one_data (sym )
206
- passed .append (sym )
207
- except IOError :
208
- msg = 'Failed to read symbol: {0!r}, replacing with NaN.'
209
- warnings .warn (msg .format (sym ), SymbolWarning )
210
- failed .append (sym )
211
-
212
- if len (passed ) == 0 :
213
- msg = "No data fetched using {0!r}"
214
- raise RemoteDataError (msg .format (self .__class__ .__name__ ))
215
- try :
216
- if len (stocks ) > 0 and len (failed ) > 0 and len (passed ) > 0 :
217
- df_na = stocks [passed [0 ]].copy ()
218
- df_na [:] = np .nan
219
- for sym in failed :
220
- stocks [sym ] = df_na
221
- return Panel (stocks ).swapaxes ('items' , 'minor' )
222
- except AttributeError :
223
- # cannot construct a panel with just 1D nans indicating no data
224
- msg = "No data fetched using {0!r}"
225
- raise RemoteDataError (msg .format (self .__class__ .__name__ ))
226
-
227
185
228
186
def _adjust_prices (hist_data , price_list = None ):
229
187
"""
230
- Return modifed DataFrame or Panel with adjusted prices based on
188
+ Return modifed DataFrame with adjusted prices based on
231
189
'Adj Close' price. Adds 'Adj_Ratio' column.
232
190
"""
233
191
if price_list is None :
0 commit comments