PERF: Use scalar lookups for TradingCalendar.schedule

When retrieving the open and close for a given session, we only care
about the scalar values, so using DataFrame.at instead of DataFrame.loc
is significantly faster.
This commit is contained in:
Andrew Daniels
2017-04-10 17:16:36 -04:00
parent bd1b7f263c
commit 6dd1616c15
2 changed files with 15 additions and 8 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(
+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')