Skip to content

Commit 9aeec06

Browse files
committed
Reduces import footprint of IEX, adds docstrings, fixes DEEP API test after market hours
1 parent 429013f commit 9aeec06

File tree

3 files changed

+120
-24
lines changed

3 files changed

+120
-24
lines changed

pandas_datareader/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22

33
from .data import (get_components_yahoo, get_data_famafrench, get_data_google, get_data_yahoo, get_data_enigma, # noqa
44
get_data_yahoo_actions, get_quote_google, get_quote_yahoo, get_tops_iex, get_last_iex, get_markets_iex, # noqa
5-
get_data_iex, get_summary_iex, get_records_iex, get_recent_iex, get_iex_symbols, get_iex_book, # noqa
5+
get_dailysummary_iex, get_summary_iex, get_records_iex, get_recent_iex, get_iex_symbols, get_iex_book, # noqa
66
DataReader, Options) # noqa

pandas_datareader/data.py

+112-16
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,9 @@
1414
from pandas_datareader.yahoo.options import Options as YahooOptions
1515
from pandas_datareader.google.options import Options as GoogleOptions
1616

17-
from pandas_datareader.iex.stats import DailySummaryReader as IEXHistorical
18-
from pandas_datareader.iex.stats import MonthlySummaryReader as IEXMonthSummary
1917
from pandas_datareader.iex.deep import Deep as IEXDeep
20-
from pandas_datareader.iex.stats import RecentReader as IEXRecents
21-
from pandas_datareader.iex.stats import RecordsReader as IEXRecords
22-
from pandas_datareader.iex.market import MarketReader as IEXMarkets
2318
from pandas_datareader.iex.tops import LastReader as IEXLasts
2419
from pandas_datareader.iex.tops import TopsReader as IEXTops
25-
from pandas_datareader.iex.ref import SymbolsReader as IEXSymbols
2620

2721
from pandas_datareader.eurostat import EurostatReader
2822
from pandas_datareader.fred import FredReader
@@ -75,31 +69,118 @@ def get_last_iex(*args, **kwargs):
7569

7670

7771
def get_markets_iex(*args, **kwargs):
78-
return IEXMarkets(*args, **kwargs).read()
72+
"""
73+
Returns near-real time volume data across markets segregated by tape
74+
and including a percentage of overall volume during the session
75+
76+
This endpoint does not accept any parameters.
77+
78+
Reference: https://www.iextrading.com/developer/docs/#markets
79+
80+
:return: DataFrame
81+
"""
82+
from pandas_datareader.iex.market import MarketReader
83+
return MarketReader(*args, **kwargs).read()
7984

8085

81-
def get_data_iex(*args, **kwargs):
82-
return IEXHistorical(*args, **kwargs).read()
86+
def get_dailysummary_iex(*args, **kwargs):
87+
"""
88+
Returns a summary of daily market volume statistics. Without parameters,
89+
this will return the most recent trading session by default.
90+
91+
:param start:
92+
A datetime object - the beginning of the date range.
93+
:param end:
94+
A datetime object - the end of the date range.
95+
96+
Reference: https://www.iextrading.com/developer/docs/#historical-daily
97+
98+
:return: DataFrame
99+
"""
100+
from pandas_datareader.iex.stats import DailySummaryReader
101+
return DailySummaryReader(*args, **kwargs).read()
83102

84103

85104
def get_summary_iex(*args, **kwargs):
86-
return IEXMonthSummary(*args, **kwargs).read()
105+
"""
106+
Returns an aggregated monthly summary of market volume and a variety of
107+
related metrics for trades by lot size, security market cap, and venue.
108+
In the absence of parameters, this will return month-to-date statistics.
109+
For ranges spanning multiple months, this will return one row per month.
110+
111+
:param start:
112+
A datetime object - the beginning of the date range.
113+
:param end:
114+
A datetime object - the end of the date range.
115+
116+
:return: DataFrame
117+
"""
118+
from pandas_datareader.iex.stats import MonthlySummaryReader
119+
return MonthlySummaryReader(*args, **kwargs).read()
87120

88121

89122
def get_records_iex(*args, **kwargs):
90-
return IEXRecords(*args, **kwargs).read()
123+
"""
124+
Returns the record value, record date, recent value, and 30-day average for
125+
market volume, # of symbols traded, # of routed trades and notional value.
126+
This function accepts no additional parameters.
127+
128+
Reference: https://www.iextrading.com/developer/docs/#records
129+
130+
:return: DataFrame
131+
"""
132+
from pandas_datareader.iex.stats import RecordsReader
133+
return RecordsReader(*args, **kwargs).read()
91134

92135

93136
def get_recent_iex(*args, **kwargs):
94-
return IEXRecents(*args, **kwargs).read()
137+
"""
138+
Returns market volume and trade routing statistics for recent sessions.
139+
Also reports IEX's relative market share, lit share volume and a boolean
140+
halfday indicator.
141+
142+
Reference: https://www.iextrading.com/developer/docs/#recent
143+
144+
:return: DataFrame
145+
"""
146+
from pandas_datareader.iex.stats import RecentReader
147+
return RecentReader(*args, **kwargs).read()
95148

96149

97150
def get_iex_symbols(*args, **kwargs):
98-
return IEXSymbols(*args, **kwargs).read()
151+
"""
152+
Returns a list of all equity symbols available for trading on IEX. Accepts
153+
no additional parameters.
154+
155+
Reference: https://www.iextrading.com/developer/docs/#symbols
156+
157+
:return: DataFrame
158+
"""
159+
from pandas_datareader.iex.ref import SymbolsReader
160+
return SymbolsReader(*args, **kwargs).read()
99161

100162

101163
def get_iex_book(*args, **kwargs):
102-
return IEXDeep(*args, **kwargs).read()
164+
"""
165+
Returns an array of dictionaries with depth of book data from IEX for up to
166+
10 securities at a time. Returns a dictionary of the bid and ask books.
167+
168+
:param symbols:
169+
A string or list of strings of valid tickers
170+
:param service:
171+
'book': Live depth of book data
172+
'op-halt-status': Checks to see if the exchange has instituted a halt
173+
'security-event': Denotes individual security related event
174+
'ssr-status': Short Sale Price Test restrictions, per reg 201 of SHO
175+
'system-event': Relays current feed status (i.e. market open)
176+
'trades': Retrieves recent executions, trade size/price and flags
177+
'trade-breaks': Lists execution breaks for the current trading session
178+
'trading-status': Returns status and cause codes for securities
179+
180+
:return: Object
181+
"""
182+
from pandas_datareader.iex.deep import Deep
183+
return Deep(*args, **kwargs).read()
103184

104185

105186
def DataReader(name, data_source=None, start=None, end=None,
@@ -129,7 +210,9 @@ def DataReader(name, data_source=None, start=None, end=None,
129210
single value given for symbol, represents the pause between retries.
130211
session : Session, default None
131212
requests.sessions.Session instance to be used
132-
213+
access_key : (str, None)
214+
Optional parameter to specify an API key for certain data sources.
215+
133216
Examples
134217
----------
135218
@@ -142,7 +225,14 @@ def DataReader(name, data_source=None, start=None, end=None,
142225
143226
# Data from Google Finance
144227
aapl = DataReader("AAPL", "google")
145-
228+
229+
# Price and volume data from IEX
230+
tops = DataReader(["GS", "AAPL"], "iex-tops")
231+
# Top of book executions from IEX
232+
gs = DataReader("GS", "iex-last")
233+
# Real-time depth of book data from IEX
234+
gs = DataReader("GS", "iex-book")
235+
146236
# Data from FRED
147237
vix = DataReader("VIXCLS", "fred")
148238
@@ -166,6 +256,7 @@ def DataReader(name, data_source=None, start=None, end=None,
166256
return YahooActionReader(symbols=name, start=start, end=end,
167257
retry_count=retry_count, pause=pause,
168258
session=session).read()
259+
169260
elif data_source == "yahoo-dividends":
170261
return YahooDailyReader(symbols=name, start=start, end=end,
171262
adjust_price=False, chunksize=25,
@@ -209,25 +300,30 @@ def DataReader(name, data_source=None, start=None, end=None,
209300
return OECDReader(symbols=name, start=start, end=end,
210301
retry_count=retry_count, pause=pause,
211302
session=session).read()
303+
212304
elif data_source == "eurostat":
213305
return EurostatReader(symbols=name, start=start, end=end,
214306
retry_count=retry_count, pause=pause,
215307
session=session).read()
308+
216309
elif data_source == "edgar-index":
217310
return EdgarIndexReader(symbols=name, start=start, end=end,
218311
retry_count=retry_count, pause=pause,
219312
session=session).read()
313+
220314
elif data_source == "oanda":
221315
return get_oanda_currency_historical_rates(
222316
start, end,
223317
quote_currency="USD", base_currency=name,
224318
reversed=True, session=session
225319
)
320+
226321
elif data_source == 'nasdaq':
227322
if name != 'symbols':
228323
raise ValueError("Only the string 'symbols' is supported for "
229324
"Nasdaq, not %r" % (name,))
230325
return get_nasdaq_symbols(retry_count=retry_count, pause=pause)
326+
231327
else:
232328
msg = "data_source=%r is not implemented" % data_source
233329
raise NotImplementedError(msg)

pandas_datareader/tests/test_iex.py

+7-7
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@
33
import pandas.util.testing as tm
44

55
from pandas import DataFrame
6-
from datetime import datetime
6+
from datetime import datetime, timedelta
77
from pandas_datareader.data import (DataReader, get_summary_iex, get_last_iex,
8-
get_data_iex, get_iex_symbols)
8+
get_dailysummary_iex, get_iex_symbols,
9+
get_iex_book)
910

1011

1112
class TestIEX(object):
@@ -27,7 +28,7 @@ def test_false_ticker(self):
2728
tm.assert_frame_equal(df, DataFrame())
2829

2930
def test_daily(self):
30-
df = get_data_iex(start=datetime(2017, 5, 5), end=datetime(2017, 5, 6))
31+
df = get_dailysummary_iex(start=datetime(2017, 5, 5), end=datetime(2017, 5, 6)) #noqa
3132
assert df['routedVolume'].iloc[0] == 39974788
3233

3334
def test_symbols(self):
@@ -41,7 +42,6 @@ def test_live_prices(self):
4142
assert df["price"].mean() > 0
4243

4344
def test_deep(self):
44-
dob = DataReader('GS', 'iex-book')
45-
assert 'GS' in dob
46-
assert 'asks' in dob['GS']
47-
assert dob['GS']['bids'][0]['price'] > 0
45+
dob = get_iex_book('GS', service='system-event')
46+
assert len(dob['eventResponse']) > 0
47+
assert dob['timestamp'] > datetime.now() - timedelta(days=1)

0 commit comments

Comments
 (0)