mirror of
https://github.com/microsoft/qlib.git
synced 2026-07-09 22:10:56 +08:00
Merge remote-tracking branch 'qlib/main' into save_inst
This commit is contained in:
@@ -33,7 +33,7 @@ from ..utils import (
|
||||
from ..log import get_module_logger
|
||||
from .base import Feature
|
||||
|
||||
from .ops import *
|
||||
from .ops import Operators
|
||||
|
||||
|
||||
class QlibCacheException(RuntimeError):
|
||||
|
||||
@@ -19,17 +19,12 @@ from multiprocessing import Pool
|
||||
|
||||
from .cache import H
|
||||
from ..config import C
|
||||
from .ops import *
|
||||
from .ops import Operators
|
||||
from ..log import get_module_logger
|
||||
from ..utils import parse_field, read_bin, hash_args, normalize_cache_fields, code_to_fname
|
||||
from .base import Feature
|
||||
from .cache import DiskDatasetCache, DiskExpressionCache
|
||||
from ..utils import (
|
||||
Wrapper,
|
||||
init_instance_by_config,
|
||||
register_wrapper,
|
||||
get_module_by_module_path,
|
||||
)
|
||||
from ..utils import Wrapper, init_instance_by_config, register_wrapper, get_module_by_module_path
|
||||
|
||||
|
||||
class CalendarProvider(abc.ABC):
|
||||
@@ -471,11 +466,10 @@ class DatasetProvider(abc.ABC):
|
||||
|
||||
"""
|
||||
# FIXME: Windows OS or MacOS using spawn: https://docs.python.org/3.8/library/multiprocessing.html?highlight=spawn#contexts-and-start-methods
|
||||
global C
|
||||
C = g_config
|
||||
# NOTE: This place is compatible with windows, windows multi-process is spawn
|
||||
if getattr(ExpressionD, "_provider", None) is None:
|
||||
register_all_wrappers()
|
||||
if not C.registered:
|
||||
C.set_conf_from_C(g_config)
|
||||
C.register()
|
||||
|
||||
obj = dict()
|
||||
for field in column_names:
|
||||
@@ -1058,7 +1052,7 @@ DatasetD: DatasetProviderWrapper = Wrapper()
|
||||
D: BaseProviderWrapper = Wrapper()
|
||||
|
||||
|
||||
def register_all_wrappers():
|
||||
def register_all_wrappers(C):
|
||||
"""register_all_wrappers"""
|
||||
logger = get_module_logger("data")
|
||||
module = get_module_by_module_path("qlib.data")
|
||||
|
||||
131
qlib/data/ops.py
131
qlib/data/ops.py
@@ -23,53 +23,6 @@ except ImportError as err:
|
||||
)
|
||||
raise
|
||||
|
||||
__all__ = (
|
||||
"Ref",
|
||||
"Max",
|
||||
"Min",
|
||||
"Sum",
|
||||
"Mean",
|
||||
"Std",
|
||||
"Var",
|
||||
"Skew",
|
||||
"Kurt",
|
||||
"Med",
|
||||
"Mad",
|
||||
"Slope",
|
||||
"Rsquare",
|
||||
"Resi",
|
||||
"Rank",
|
||||
"Quantile",
|
||||
"Count",
|
||||
"EMA",
|
||||
"WMA",
|
||||
"Corr",
|
||||
"Cov",
|
||||
"Delta",
|
||||
"Abs",
|
||||
"Sign",
|
||||
"Log",
|
||||
"Power",
|
||||
"Add",
|
||||
"Sub",
|
||||
"Mul",
|
||||
"Div",
|
||||
"Greater",
|
||||
"Less",
|
||||
"And",
|
||||
"Or",
|
||||
"Not",
|
||||
"Gt",
|
||||
"Ge",
|
||||
"Lt",
|
||||
"Le",
|
||||
"Eq",
|
||||
"Ne",
|
||||
"Mask",
|
||||
"IdxMax",
|
||||
"IdxMin",
|
||||
"If",
|
||||
)
|
||||
|
||||
np.seterr(invalid="ignore")
|
||||
|
||||
@@ -1441,3 +1394,87 @@ class Cov(PairRolling):
|
||||
|
||||
def __init__(self, feature_left, feature_right, N):
|
||||
super(Cov, self).__init__(feature_left, feature_right, N, "cov")
|
||||
|
||||
|
||||
OpsList = [
|
||||
Ref,
|
||||
Max,
|
||||
Min,
|
||||
Sum,
|
||||
Mean,
|
||||
Std,
|
||||
Var,
|
||||
Skew,
|
||||
Kurt,
|
||||
Med,
|
||||
Mad,
|
||||
Slope,
|
||||
Rsquare,
|
||||
Resi,
|
||||
Rank,
|
||||
Quantile,
|
||||
Count,
|
||||
EMA,
|
||||
WMA,
|
||||
Corr,
|
||||
Cov,
|
||||
Delta,
|
||||
Abs,
|
||||
Sign,
|
||||
Log,
|
||||
Power,
|
||||
Add,
|
||||
Sub,
|
||||
Mul,
|
||||
Div,
|
||||
Greater,
|
||||
Less,
|
||||
And,
|
||||
Or,
|
||||
Not,
|
||||
Gt,
|
||||
Ge,
|
||||
Lt,
|
||||
Le,
|
||||
Eq,
|
||||
Ne,
|
||||
Mask,
|
||||
IdxMax,
|
||||
IdxMin,
|
||||
If,
|
||||
]
|
||||
|
||||
|
||||
class OpsWrapper(object):
|
||||
"""Ops Wrapper"""
|
||||
|
||||
def __init__(self):
|
||||
self._ops = {}
|
||||
|
||||
def register(self, ops_list):
|
||||
for operator in ops_list:
|
||||
if not issubclass(operator, ExpressionOps):
|
||||
raise TypeError("operator must be subclass of ExpressionOps, not {}".format(operator))
|
||||
|
||||
if operator.__name__ in self._ops:
|
||||
get_module_logger(self.__class__.__name__).warning(
|
||||
"The custom operator [{}] will override the qlib default definition".format(operator.__name__)
|
||||
)
|
||||
self._ops[operator.__name__] = operator
|
||||
|
||||
def __getattr__(self, key):
|
||||
if key not in self._ops:
|
||||
raise AttributeError("The operator [{0}] is not registered".format(key))
|
||||
return self._ops[key]
|
||||
|
||||
|
||||
Operators = OpsWrapper()
|
||||
Operators.register(OpsList)
|
||||
|
||||
|
||||
def register_custom_ops(C):
|
||||
"""register custom operator"""
|
||||
logger = get_module_logger("ops")
|
||||
if getattr(C, "custom_ops", None) is not None:
|
||||
Operators.register(C.custom_ops)
|
||||
logger.debug("register custom operator {}".format(C.custom_ops))
|
||||
|
||||
Reference in New Issue
Block a user