def standardize(x: np.ndarray, groups: np.ndarray = None, ddof=1) -> np.ndarray: if groups is not None: groups = group_mapping(groups) mean_values = transform(groups, x, 'mean') std_values = transform(groups, x, 'std', ddof) return (x - mean_values) / np.maximum(std_values, 1e-8) else: return (x - simple_mean(x, axis=0)) / np.maximum(simple_std(x, axis=0, ddof=ddof), 1e-8)
def winsorize_normal(x: np.ndarray, num_stds: int = 3, groups: np.ndarray = None) -> np.ndarray: if groups is not None: groups = group_mapping(groups) mean_values = transform(groups, x, 'mean') std_values = transform(groups, x, 'std') res = mask_values_2d(x, mean_values, std_values, num_stds) else: std_values = simple_std(x, axis=0) mean_values = simple_mean(x, axis=0) res = mask_values_1d(x, mean_values, std_values, num_stds) return res
def projection(x: np.ndarray, groups: np.ndarray=None, axis=1) -> np.ndarray: if groups is not None and axis == 0: groups = group_mapping(groups) projected = transform(groups, x, 'project') return projected else: return x / simple_sqrsum(x, axis=axis).reshape((-1, 1))
def long_short_build(er: np.ndarray, leverage: float=1., groups: np.ndarray=None) -> np.ndarray: if er.ndim == 1: er = er.reshape((-1, 1)) if groups is None: return er / simple_abssum(er, axis=0) * leverage else: groups = group_mapping(groups) return transform(groups, er, 'scale', scale=leverage)
def winsorize_normal(x: np.ndarray, num_stds: int = 3, ddof=1, groups: np.ndarray = None, method: str = 'flat', interval: float = 0.5) -> np.ndarray: if groups is not None: groups = group_mapping(groups) mean_values = transform(groups, x, 'mean') std_values = transform(groups, x, 'std', ddof) if method == 'flat': res = mask_values_2d(x, mean_values, std_values, num_stds) else: res = interp_values_2d(x, groups, mean_values, std_values, num_stds, interval) else: std_values = simple_std(x, axis=0, ddof=ddof) mean_values = simple_mean(x, axis=0) if method == 'flat': res = mask_values_1d(x, mean_values, std_values, num_stds) else: res = interp_values_1d(x, mean_values, std_values, num_stds, interval) return res
def long_short_builder(er: np.ndarray, leverage: float = 1., groups: np.ndarray = None, masks: np.ndarray = None) -> np.ndarray: er = er.copy() if masks is not None: er[masks] = 0. er[~masks] = er[~masks] - er[~masks].mean() if er.ndim == 1: er = er.reshape((-1, 1)) if groups is None: return er / simple_abssum(er, axis=0) * leverage else: groups = group_mapping(groups) return transform(groups, er, 'scale', scale=leverage)