def test_compute_lifetimes(self, env=None): num_assets = 4 trading_day = env.trading_day first_start = pd.Timestamp('2015-04-01', tz='UTC') frame = make_rotating_asset_info( num_assets=num_assets, first_start=first_start, frequency=env.trading_day, periods_between_starts=3, asset_lifetime=5 ) finder = AssetFinder(frame) all_dates = pd.date_range( start=first_start, end=frame.end_date.max(), freq=trading_day, ) for dates in all_subindices(all_dates): expected_mask = full( shape=(len(dates), num_assets), fill_value=False, dtype=bool, ) for i, date in enumerate(dates): it = frame[['start_date', 'end_date']].itertuples() for j, start, end in it: if start <= date <= end: expected_mask[i, j] = True # Filter out columns with all-empty columns. expected_result = pd.DataFrame( data=expected_mask, index=dates, columns=frame.sid.values, ) actual_result = finder.lifetimes(dates) assert_frame_equal(actual_result, expected_result)
def test_compute_lifetimes(self, env=None): num_assets = 4 trading_day = env.trading_day first_start = pd.Timestamp('2015-04-01', tz='UTC') frame = make_rotating_asset_info(num_assets=num_assets, first_start=first_start, frequency=env.trading_day, periods_between_starts=3, asset_lifetime=5) finder = AssetFinder(frame) all_dates = pd.date_range( start=first_start, end=frame.end_date.max(), freq=trading_day, ) for dates in all_subindices(all_dates): expected_mask = full( shape=(len(dates), num_assets), fill_value=False, dtype=bool, ) for i, date in enumerate(dates): it = frame[['start_date', 'end_date']].itertuples() for j, start, end in it: if start <= date <= end: expected_mask[i, j] = True # Filter out columns with all-empty columns. expected_result = pd.DataFrame( data=expected_mask, index=dates, columns=frame.sid.values, ) actual_result = finder.lifetimes(dates) assert_frame_equal(actual_result, expected_result)
class BaseFFCTestCase(TestCase): def setUp(self): self.__calendar = date_range('2014', '2015', freq=trading_day) self.__assets = assets = Int64Index(arange(1, 20)) self.__finder = AssetFinder( make_simple_asset_info( assets, self.__calendar[0], self.__calendar[-1], ), db_path=':memory:', create_table=True, ) self.__mask = self.__finder.lifetimes(self.__calendar[-10:]) @property def default_shape(self): """Default shape for methods that build test data.""" return self.__mask.shape def run_terms(self, terms, initial_workspace, mask=None): """ Compute the given terms, seeding the workspace of our FFCEngine with `initial_workspace`. Parameters ---------- terms : dict Mapping from termname -> term object. Returns ------- results : dict Mapping from termname -> computed result. """ engine = SimpleFFCEngine( ExplodingObject(), self.__calendar, self.__finder, ) mask = mask if mask is not None else self.__mask return engine.compute_chunk(TermGraph(terms), mask, initial_workspace) def build_mask(self, array): ndates, nassets = array.shape return DataFrame( array, # Use the **last** N dates rather than the first N so that we have # space for lookbacks. index=self.__calendar[-ndates:], columns=self.__assets[:nassets], dtype=bool, ) @with_default_shape def arange_data(self, shape, dtype=float): """ Build a block of testing data from numpy.arange. """ return arange(prod(shape), dtype=dtype).reshape(shape) @with_default_shape def randn_data(self, seed, shape): """ Build a block of testing data from numpy.random.randn. """ random_seed(seed) return randn(*shape)