def _ttest_multivariate()

in kats/detectors/detector_consts.py [0:0]


    def _ttest_multivariate(self) -> None:
        num_series = self.num_series
        p_value_start = np.zeros(num_series)
        t_value_start = np.zeros(num_series)

        n_1 = len(self.previous)
        n_2 = len(self.current)

        if n_1 == 1 and n_2 == 1:
            self._t_score = np.inf * np.ones(num_series)
            self._p_value = np.zeros(num_series)
            return
        elif n_1 == 1 or n_2 == 1:
            t_value_start, p_value_start = self._ttest_manual()
        else:
            current_data = self.current.data
            prev_data = self.previous.data
            if current_data is None or prev_data is None:
                raise ValueError("Interval data not set")
            for i in range(num_series):
                current_slice = current_data[:, i]
                prev_slice = prev_data[:, i]
                t_value_start[i], p_value_start[i] = ttest_ind(
                    current_slice, prev_slice, equal_var=True, nan_policy="omit"
                )

        # The new p-values are the old p-values rescaled so that self.alpha is still the threshold for rejection
        _, self._p_value, _, _ = multitest.multipletests(
            p_value_start, alpha=self.alpha, method=self.method
        )
        self._t_score = np.zeros(num_series)
        # We are using a two-sided test here, so we take inverse_tcdf(self._p_value / 2) with df = len(self.current) + len(self.previous) - 2

        _t_score: np.ndarray = self._t_score
        _p_value: np.ndarray = cast(np.ndarray, self._p_value)
        for i in range(self.current.num_series):
            if t_value_start[i] < 0:
                _t_score[i] = t.ppf(_p_value[i] / 2, self._get_df())
            else:
                _t_score[i] = t.ppf(1 - _p_value[i] / 2, self._get_df())
        self._t_score = _t_score