Merge pull request #1747 from quantopian/calendar-perf-improvements

Improve TradingCalendar perf with scalar-optimized accesses
This commit is contained in:
Andrew Daniels
2017-04-11 10:15:28 -04:00
committed by GitHub
3 changed files with 16 additions and 9 deletions
+4 -2
View File
@@ -452,8 +452,10 @@ class ExchangeCalendarTestBase(object):
(2, 1),
])
def test_minute_index_to_session_labels(self, interval, offset):
minutes = self.calendar.minutes_for_sessions_in_range('2011-01-04',
'2011-04-04')
minutes = self.calendar.minutes_for_sessions_in_range(
pd.Timestamp('2011-01-04', tz='UTC'),
pd.Timestamp('2011-04-04', tz='UTC'),
)
minutes = minutes[range(offset, len(minutes), interval)]
np.testing.assert_array_equal(
+1 -1
View File
@@ -521,7 +521,7 @@ class MinuteResampleSessionBarReader(SessionBarReader):
sessions = self._calendar.sessions_in_range(start_dt, end_dt)
m_closes = np.zeros(len(sessions), dtype=np.dtype('datetime64[ns]'))
for i, s in enumerate(sessions):
close = self._calendar.open_and_close_for_session(s)[1]
close = self._calendar.session_close(s)
m_closes[i] = close.value
m_locs = np.searchsorted(dts, m_closes)
results = []
+11 -6
View File
@@ -460,7 +460,10 @@ class TradingCalendar(with_metaclass(ABCMeta)):
pd.DateTimeIndex
All the minutes for the given session.
"""
return self.minutes_in_range(*self.schedule.loc[session_label])
return self.minutes_in_range(
start_minute=self.schedule.at[session_label, 'market_open'],
end_minute=self.schedule.at[session_label, 'market_close'],
)
def minutes_window(self, start_dt, count):
start_dt_nanos = start_dt.value
@@ -635,22 +638,24 @@ class TradingCalendar(with_metaclass(ABCMeta)):
(Timestamp, Timestamp)
The open and close for the given session.
"""
o_and_c = self.schedule.loc[session_label]
sched = self.schedule
# `market_open` and `market_close` should be timezone aware, but pandas
# 0.16.1 does not appear to support this:
# http://pandas.pydata.org/pandas-docs/stable/whatsnew.html#datetime-with-tz # noqa
return (o_and_c['market_open'].tz_localize('UTC'),
o_and_c['market_close'].tz_localize('UTC'))
return (
sched.at[session_label, 'market_open'].tz_localize('UTC'),
sched.at[session_label, 'market_close'].tz_localize('UTC'),
)
def session_open(self, session_label):
return self.schedule.loc[
return self.schedule.at[
session_label,
'market_open'
].tz_localize('UTC')
def session_close(self, session_label):
return self.schedule.loc[
return self.schedule.at[
session_label,
'market_close'
].tz_localize('UTC')