MAINT: Delegate to sqlalchemy metadata

instead of maintaining our own
This commit is contained in:
Richard Frank
2015-10-02 09:58:59 -04:00
parent ea02dcfb14
commit beac4d6f16
2 changed files with 10 additions and 71 deletions
-38
View File
@@ -16,44 +16,6 @@ from zipline.assets._assets import Asset
# Define a namedtuple for use with the load_data and _load_data methods
AssetData = namedtuple('AssetData', 'equities futures exchanges root_symbols')
# Expected fields for an Asset's metadata
ASSET_TABLE_FIELDS = frozenset({
'sid',
'symbol',
'asset_name',
'start_date',
'end_date',
'first_traded',
'exchange',
})
# Expected fields for a Future's metadata
FUTURE_TABLE_FIELDS = ASSET_TABLE_FIELDS | {
'notice_date',
'expiration_date',
'auto_close_date',
'contract_multiplier',
}
# Expected fields for an Equity's metadata
EQUITY_TABLE_FIELDS = ASSET_TABLE_FIELDS | {
'company_symbol',
'share_class_symbol',
'fuzzy_symbol',
}
EXCHANGE_TABLE_FIELDS = frozenset({
'exchange',
'timezone',
})
ROOT_SYMBOL_TABLE_FIELDS = frozenset({
'root_symbol',
'root_symbol_id',
'sector',
'description',
'exchange',
})
# Default values for the equities DataFrame
_equities_defaults = {
+10 -33
View File
@@ -13,9 +13,8 @@
# limitations under the License.
from abc import ABCMeta
from functools import partial
from numbers import Integral
from operator import getitem, itemgetter
from operator import itemgetter
import warnings
from logbook import Logger
@@ -37,8 +36,6 @@ from zipline.assets import (
Asset, Equity, Future,
)
from zipline.assets.asset_writer import (
FUTURE_TABLE_FIELDS,
EQUITY_TABLE_FIELDS,
split_delimited_symbol,
)
@@ -85,7 +82,7 @@ class AssetFinder(object):
self.engine = engine
metadata = sa.MetaData(bind=engine)
self.equities = equities = sa.Table(
self.equities = sa.Table(
'equities',
metadata,
autoload=True,
@@ -103,7 +100,7 @@ class AssetFinder(object):
autoload=True,
autoload_with=engine,
)
self.futures_contracts = futures_contracts = sa.Table(
self.futures_contracts = sa.Table(
'futures_contracts',
metadata,
autoload=True,
@@ -116,29 +113,6 @@ class AssetFinder(object):
autoload_with=engine,
)
# Create the equity and future queries once.
_equity_sid = equities.c.sid
_equity_by_sid = sa.select(
tuple(map(partial(getitem, equities.c), EQUITY_TABLE_FIELDS)),
)
def select_equity_by_sid(sid):
return _equity_by_sid.where(_equity_sid == int(sid))
self.select_equity_by_sid = select_equity_by_sid
_future_sid = futures_contracts.c.sid
_future_by_sid = sa.select(
tuple(map(
partial(getitem, futures_contracts.c),
FUTURE_TABLE_FIELDS,
)),
)
def select_future_by_sid(sid):
return _future_by_sid.where(_future_sid == int(sid))
self.select_future_by_sid = select_future_by_sid
# Cache for lookup of assets by sid, the objects in the asset lookp may
# be shared with the results from equity and future lookup caches.
#
@@ -211,7 +185,7 @@ class AssetFinder(object):
Retrieve the Equity object of a given sid.
"""
return self._retrieve_asset(
sid, self._equity_cache, self.select_equity_by_sid, Equity,
sid, self._equity_cache, self.equities, Equity,
)
def _retrieve_futures_contract(self, sid):
@@ -219,17 +193,20 @@ class AssetFinder(object):
Retrieve the Future object of a given sid.
"""
return self._retrieve_asset(
sid, self._future_cache, self.select_future_by_sid, Future,
sid, self._future_cache, self.futures_contracts, Future,
)
@staticmethod
def _retrieve_asset(sid, cache, select, asset_type):
def _select_asset_by_sid(asset_tbl, sid):
return sa.select([asset_tbl]).where(asset_tbl.c.sid == int(sid))
def _retrieve_asset(self, sid, cache, asset_tbl, asset_type):
try:
return cache[sid]
except KeyError:
pass
data = select(sid).execute().fetchone()
data = self._select_asset_by_sid(asset_tbl, sid).execute().fetchone()
# Convert 'data' from a RowProxy object to a dict, to allow assignment
data = dict(data.items())
if data: