create_all
Intuição
Quando você está explorando a biblioteca ou construindo um dataset para ML, é comum querer gerar várias features de uma vez.
create_all faz isso automaticamente: ela percorre as features públicas do quantmaster.features (via __all__), calcula cada feature com parâmetros default quando possível e adiciona o resultado ao DataFrame.
Comportamento
- Retorna um novo
DataFrame por padrão (inplace=False).
- Não sobrescreve colunas existentes por padrão (
overwrite=False).
- Features que exigem argumentos extras (ex.:
benchmark) são puladas se você não fornecer.
- Features com dependências opcionais (ex.:
path_signature_features) podem ser puladas automaticamente.
- Por padrão, executa somente features com status
approved.
- Você pode controlar o comportamento com
include, exclude, include_statuses e errors.
Uso
from quantmaster.features.utils import create_all
# adiciona todas as features possíveis com defaults
# (as que dependem de benchmark/dependência opcional podem ser puladas)
df = create_all(df)
# com benchmark para habilitar betas e spread_zscore
# df = create_all(df, benchmark=spx_close)
# gerar apenas um subconjunto
# df = create_all(df, include=["rsi", "har_rv"])
# incluir também features experimentais
# df = create_all(df, include_statuses=["approved", "experimental"])
API
Source code in src/quantmaster/features/utils.py
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144 | def create_all(
data: pd.DataFrame,
*,
benchmark: pd.Series | None = None,
inplace: bool = False,
overwrite: bool = False,
include: Iterable[str] | None = None,
exclude: Iterable[str] | None = None,
include_statuses: Iterable[str] | None = None,
errors: str = "ignore",
) -> pd.DataFrame:
if not isinstance(data, pd.DataFrame):
raise TypeError(f"data must be a pandas.DataFrame, got {type(data).__name__}")
if errors not in {"ignore", "warn", "raise"}:
raise ValueError(f"errors must be one of 'ignore', 'warn', 'raise', got {errors!r}")
if inplace:
out_df = data
else:
out_df = data.copy()
include_set = set(include) if include is not None else None
exclude_set = set(exclude) if exclude is not None else set()
exclude_set |= DEFAULT_CREATE_ALL_EXCLUDE
status_filter = normalize_status_filter(include_statuses)
from quantmaster import features as _features
names = [n for n in getattr(_features, "__all__", []) if isinstance(n, str)]
for name in names:
if include_set is not None and name not in include_set:
continue
if name in exclude_set:
continue
if status_filter is not None and get_feature_status(name) not in status_filter:
continue
fn = getattr(_features, name, None)
if not callable(fn):
continue
try:
sig = inspect.signature(fn)
except (TypeError, ValueError):
continue
params = sig.parameters
kwargs: dict[str, object] = {}
if "benchmark" in params:
p = params["benchmark"]
if benchmark is None and p.default is inspect._empty:
continue
if benchmark is not None:
kwargs["benchmark"] = benchmark
try:
res = fn(out_df, **kwargs)
except Exception as exc:
if errors == "raise":
raise
if errors == "warn":
warnings.warn(f"create_all skipped '{name}': {exc}", RuntimeWarning)
continue
if isinstance(res, pd.Series):
if res.isna().all():
continue
col = res.name or name
if (not overwrite) and (col in out_df.columns):
continue
out_df[col] = res
continue
if isinstance(res, pd.DataFrame):
if res.isna().all(axis=None):
continue
for c in res.columns:
if (not overwrite) and (c in out_df.columns):
continue
out_df[c] = res[c]
continue
if errors == "raise":
raise TypeError(f"Feature '{name}' returned unsupported type {type(res).__name__}")
if errors == "warn":
warnings.warn(
f"create_all skipped '{name}': unsupported return type {type(res).__name__}",
RuntimeWarning,
)
return out_df
|