mirror of
https://github.com/wassname/catalyst.git
synced 2026-07-07 16:15:18 +08:00
26fd6fda8b
- Fixes an error where Modeling API data known as of the close of `day N` would be shown to algorithms during `before_trading_start` as of the close of the same day. Algorithms should now only receive data during `before_trading_start/handle_data` that was known as of the simulation time at which the function would be called. - All Term instances now have a `mask` attribute that must be a `Filter` or an instance of `AssetExists()`. `mask` can be used to specify that a Factor should be computed in a manner that ignores the values that were not `True` in the mask. - Changed the interface for `FFCLoader.load_adjusted_array` and `Term._compute` from `(columns, mask)`, with mask as a DataFrame, to `(columns, dates, assets, mask)`, where mask is a numpy array. This is primarily to avoid having to reconstruct extra DataFrames when using masks produced by non `AssetExists` filters. - Adds `BoundColumn.latest`, which gives the most-recently-known value of a column.
112 lines
2.6 KiB
Python
112 lines
2.6 KiB
Python
"""
|
|
dataset.py
|
|
"""
|
|
from six import (
|
|
iteritems,
|
|
with_metaclass,
|
|
)
|
|
|
|
from zipline.modelling.term import Term
|
|
from zipline.modelling.factor import Latest
|
|
|
|
|
|
class Column(object):
|
|
"""
|
|
An abstract column of data, not yet associated with a dataset.
|
|
"""
|
|
|
|
def __init__(self, dtype):
|
|
self.dtype = dtype
|
|
|
|
def bind(self, dataset, name):
|
|
"""
|
|
Bind a column to a concrete dataset.
|
|
"""
|
|
return BoundColumn(dtype=self.dtype, dataset=dataset, name=name)
|
|
|
|
|
|
class BoundColumn(Term):
|
|
"""
|
|
A Column of data that's been concretely bound to a particular dataset.
|
|
"""
|
|
|
|
def __new__(cls, dtype, dataset, name):
|
|
return super(BoundColumn, cls).__new__(
|
|
cls,
|
|
inputs=(),
|
|
window_length=0,
|
|
domain=dataset.domain,
|
|
dtype=dtype,
|
|
dataset=dataset,
|
|
name=name,
|
|
)
|
|
|
|
def _init(self, dataset, name, *args, **kwargs):
|
|
self._dataset = dataset
|
|
self._name = name
|
|
return super(BoundColumn, self)._init(*args, **kwargs)
|
|
|
|
@classmethod
|
|
def static_identity(cls, dataset, name, *args, **kwargs):
|
|
return (
|
|
super(BoundColumn, cls).static_identity(*args, **kwargs),
|
|
dataset,
|
|
name,
|
|
)
|
|
|
|
@property
|
|
def dataset(self):
|
|
return self._dataset
|
|
|
|
@property
|
|
def name(self):
|
|
return self._name
|
|
|
|
@property
|
|
def qualname(self):
|
|
"""
|
|
Fully qualified of this column.
|
|
"""
|
|
return '.'.join([self.dataset.__name__, self.name])
|
|
|
|
@property
|
|
def latest(self):
|
|
return Latest(inputs=(self,), dtype=self.dtype)
|
|
|
|
def __repr__(self):
|
|
return "{qualname}::{dtype}".format(
|
|
qualname=self.qualname,
|
|
dtype=self.dtype.__name__,
|
|
)
|
|
|
|
def short_repr(self):
|
|
return self.qualname
|
|
|
|
|
|
class DataSetMeta(type):
|
|
"""
|
|
Metaclass for DataSets
|
|
|
|
Supplies name and dataset information to Column attributes.
|
|
"""
|
|
|
|
def __new__(mcls, name, bases, dict_):
|
|
newtype = type.__new__(mcls, name, bases, dict_)
|
|
_columns = []
|
|
for maybe_colname, maybe_column in iteritems(dict_):
|
|
if isinstance(maybe_column, Column):
|
|
bound_column = maybe_column.bind(newtype, maybe_colname)
|
|
setattr(newtype, maybe_colname, bound_column)
|
|
_columns.append(bound_column)
|
|
|
|
newtype._columns = _columns
|
|
return newtype
|
|
|
|
@property
|
|
def columns(self):
|
|
return self._columns
|
|
|
|
|
|
class DataSet(with_metaclass(DataSetMeta)):
|
|
domain = None
|