def map_reduce_between(self, other=None, map_func_nb=None, map_args=None, reduce_func_nb=None, reduce_args=None, broadcast_kwargs=None): """See `vectorbt.signals.nb.map_reduce_between_nb`. If `other` specified, see `vectorbt.signals.nb.map_reduce_between_two_nb`. Both will be broadcast using `vectorbt.base.reshape_fns.broadcast` with `broadcast_kwargs`. Note that `map_args` and `reduce_args` won't be broadcast. ## Example Get average distance between signals in `sig`: ```python-repl >>> distance_map_nb = njit(lambda from_i, to_i, col: to_i - from_i) >>> mean_reduce_nb = njit(lambda col, a: np.nanmean(a)) >>> sig.vbt.signals.map_reduce_between( ... map_func_nb=distance_map_nb, ... reduce_func_nb=mean_reduce_nb) a NaN b 2.0 c 1.0 dtype: float64 ``` """ if broadcast_kwargs is None: broadcast_kwargs = {} checks.assert_not_none(map_func_nb) checks.assert_not_none(reduce_func_nb) checks.assert_numba_func(map_func_nb) checks.assert_numba_func(reduce_func_nb) if map_args is None: map_args = () if reduce_args is None: reduce_args = () if other is None: # One input array result = nb.map_reduce_between_nb(self.to_2d_array(), map_func_nb, map_args, reduce_func_nb, reduce_args) if isinstance(self._obj, pd.Series): return result[0] return pd.Series(result, index=self.wrapper.columns) else: # Two input arrays obj, other = reshape_fns.broadcast(self._obj, other, **broadcast_kwargs) checks.assert_dtype(other, np.bool) result = nb.map_reduce_between_two_nb(obj.vbt.to_2d_array(), other.vbt.to_2d_array(), map_func_nb, map_args, reduce_func_nb, reduce_args) return obj.vbt.wrapper.wrap_reduced(result)
def map_reduce_between(self, *args, other=None, map_func_nb=None, reduce_func_nb=None, broadcast_kwargs={}): """See `vectorbt.signals.nb.map_reduce_between_nb`. If `other` specified, see `vectorbt.signals.nb.map_reduce_between_two_nb`. Arguments will be broadcasted using `vectorbt.utils.reshape_fns.broadcast` with `broadcast_kwargs`. Example: Get maximum distance between signals in `signals`: ```python-repl >>> distance_map_nb = njit(lambda col, prev_i, next_i: next_i - prev_i) >>> max_reduce_nb = njit(lambda col, a: np.nanmax(a)) >>> print(signals.vbt.signals.map_reduce_between( ... map_func_nb=distance_map_nb, reduce_func_nb=max_reduce_nb)) a 3.0 b 3.0 c NaN dtype: float64 ```""" checks.assert_not_none(map_func_nb) checks.assert_not_none(reduce_func_nb) checks.assert_numba_func(map_func_nb) checks.assert_numba_func(reduce_func_nb) if other is None: # One input array result = nb.map_reduce_between_nb(self.to_2d_array(), map_func_nb, reduce_func_nb, *args) if isinstance(self._obj, pd.Series): return result[0] return pd.Series(result, index=self.columns) else: # Two input arrays obj, other = reshape_fns.broadcast(self._obj, other, **broadcast_kwargs) other.vbt.signals.validate() result = nb.map_reduce_between_two_nb(self.to_2d_array(), other.vbt.to_2d_array(), map_func_nb, reduce_func_nb, *args) if isinstance(obj, pd.Series): return result[0] return pd.Series(result, index=obj.vbt.columns)
def map_reduce_between(self, *args, other=None, map_func_nb=None, reduce_func_nb=None, broadcast_kwargs={}): """See `vectorbt.signals.nb.map_reduce_between_nb`. If `other` specified, see `vectorbt.signals.nb.map_reduce_between_two_nb`. Arguments will be broadcasted using `vectorbt.base.reshape_fns.broadcast` with `broadcast_kwargs`. Example: Get average distance between signals in `sig`: ```python-repl >>> distance_map_nb = njit(lambda col, from_i, to_i: to_i - from_i) >>> mean_reduce_nb = njit(lambda col, a: np.nanmean(a)) >>> print(sig.vbt.signals.map_reduce_between( ... map_func_nb=distance_map_nb, reduce_func_nb=mean_reduce_nb)) a NaN b 2.0 c 1.0 dtype: float64 ```""" checks.assert_not_none(map_func_nb) checks.assert_not_none(reduce_func_nb) checks.assert_numba_func(map_func_nb) checks.assert_numba_func(reduce_func_nb) if other is None: # One input array result = nb.map_reduce_between_nb(self.to_2d_array(), map_func_nb, reduce_func_nb, *args) if isinstance(self._obj, pd.Series): return result[0] return pd.Series(result, index=self.columns) else: # Two input arrays obj, other = reshape_fns.broadcast(self._obj, other, **broadcast_kwargs) checks.assert_dtype(other, np.bool_) result = nb.map_reduce_between_two_nb(self.to_2d_array(), other.vbt.to_2d_array(), map_func_nb, reduce_func_nb, *args) return self.wrap_reduced(result)
def map_reduce_between( self, other: tp.Optional[tp.ArrayLike] = None, map_func_nb: tp.Optional[tp.SignalMapFunc] = None, map_args: tp.Optional[tp.Args] = None, reduce_func_nb: tp.Optional[tp.SignalReduceFunc] = None, reduce_args: tp.Optional[tp.Args] = None, broadcast_kwargs: tp.KwargsLike = None, wrap_kwargs: tp.KwargsLike = None) -> tp.MaybeSeries: """See `vectorbt.signals.nb.map_reduce_between_nb`. If `other` specified, see `vectorbt.signals.nb.map_reduce_between_two_nb`. Both will broadcast using `vectorbt.base.reshape_fns.broadcast` with `broadcast_kwargs`. Note that `map_args` and `reduce_args` won't be broadcast. ## Example Get average distance between signals in `sig`: ```python-repl >>> distance_map_nb = njit(lambda from_i, to_i, col: to_i - from_i) >>> mean_reduce_nb = njit(lambda col, a: np.nanmean(a)) >>> sig.vbt.signals.map_reduce_between( ... map_func_nb=distance_map_nb, ... reduce_func_nb=mean_reduce_nb) a NaN b 2.0 c 1.0 dtype: float64 ``` """ if broadcast_kwargs is None: broadcast_kwargs = {} checks.assert_not_none(map_func_nb) checks.assert_not_none(reduce_func_nb) checks.assert_numba_func(map_func_nb) checks.assert_numba_func(reduce_func_nb) if map_args is None: map_args = () if reduce_args is None: reduce_args = () wrap_kwargs = merge_dicts(dict(name_or_index='map_reduce_between'), wrap_kwargs) if other is None: # One input array result = nb.map_reduce_between_nb(self.to_2d_array(), map_func_nb, map_args, reduce_func_nb, reduce_args) return self.wrapper.wrap_reduced(result, **wrap_kwargs) else: # Two input arrays obj, other = reshape_fns.broadcast(self._obj, other, **broadcast_kwargs) checks.assert_dtype(other, np.bool_) result = nb.map_reduce_between_two_nb(obj.vbt.to_2d_array(), other.vbt.to_2d_array(), map_func_nb, map_args, reduce_func_nb, reduce_args) return obj.vbt.wrapper.wrap_reduced(result, **wrap_kwargs)