Пример #1
0
    def prepare_next_tree(self):
        """Prepare conditional U matrix for next tree."""
        for edge in self.edges:
            copula_theta = edge.theta

            if self.level == 1:
                left_u = self.u_matrix[:, edge.L]
                right_u = self.u_matrix[:, edge.R]

            else:
                left_parent, right_parent = edge.parents
                left_u, right_u = Edge.get_conditional_uni(
                    left_parent, right_parent)

            # compute conditional cdfs C(i|j) = dC(i,j)/duj and dC(i,j)/du
            left_u = [x for x in left_u if x is not None]
            right_u = [x for x in right_u if x is not None]
            X_left_right = np.array([[x, y] for x, y in zip(left_u, right_u)])
            X_right_left = np.array([[x, y] for x, y in zip(right_u, left_u)])

            copula = Bivariate(edge.name)
            copula.fit(X_left_right)
            left_given_right = copula.partial_derivative(
                X_left_right, copula_theta)
            right_given_left = copula.partial_derivative(
                X_right_left, copula_theta)

            # correction of 0 or 1
            left_given_right[left_given_right == 0] = EPSILON
            right_given_left[right_given_left == 0] = EPSILON
            left_given_right[left_given_right == 1] = 1 - EPSILON
            right_given_left[right_given_left == 1] = 1 - EPSILON
            edge.U = np.array([left_given_right, right_given_left])
Пример #2
0
    def test_fit(self):
        """fit checks that the given values are independent."""
        # Setup
        instance = Bivariate(CopulaTypes.INDEPENDENCE)
        data = np.array([[1, 2], [4, 3]])

        # Run
        instance.fit(data)

        # Check
        instance.tau is None
        instance.theta is None
Пример #3
0
    def test_partial_derivative_scalar(self, derivative_mock):
        """partial_derivative_scalar calls partial_derivative with its arguments in an array."""
        # Setup
        instance = Bivariate(copula_type=CopulaTypes.CLAYTON)
        instance.fit(self.X)

        # Run
        result = instance.partial_derivative_scalar(0.5, 0.1)

        # Check
        assert result == derivative_mock.return_value

        expected_args = ((np.array([[0.5, 0.1]]), 0), {})
        assert len(expected_args) == len(derivative_mock.call_args)
        assert (derivative_mock.call_args[0][0] == expected_args[0][0]).all()
Пример #4
0
    def test_to_dict(self):
        """To_dict returns the defining parameters of a copula in a dict."""
        # Setup
        instance = Bivariate('frank')
        instance.fit(self.X)

        expected_result = {
            'copula_type': 'FRANK',
            "tau": 0.014492753623188406,
            "theta": 0.13070829945417198
        }

        # Run
        result = instance.to_dict()

        # Check
        assert result == expected_result
Пример #5
0
    def test_to_dict(self):
        """To_dict returns the defining parameters of a copula in a dict."""
        # Setup
        instance = Bivariate(copula_type='frank')
        instance.fit(self.X)

        expected_result = {
            'copula_type': 'FRANK',
            "tau": 0.9128709291752769,
            "theta": 44.2003852484162
        }

        # Run
        result = instance.to_dict()

        # Check
        assert result == expected_result
Пример #6
0
    def test_save(self, json_mock):
        """Save stores the internal dictionary as a json in a file."""
        # Setup
        instance = Bivariate('frank')
        instance.fit(self.X)

        expected_content = {
            "copula_type": "FRANK",
            "tau": 0.014492753623188406,
            "theta": 0.13070829945417198
        }

        # Run
        instance.save('test.json')

        # Check
        assert json_mock.called
        compare_nested_dicts(json_mock.call_args[0][0], expected_content)
Пример #7
0
    def test_save(self, json_mock, open_mock):
        """Save stores the internal dictionary as a json in a file."""
        # Setup
        instance = Bivariate(copula_type='frank')
        instance.fit(self.X)

        expected_content = {
            "copula_type": "FRANK",
            "tau": 0.9128709291752769,
            "theta": 44.2003852484162
        }

        # Run
        instance.save('test.json')

        # Check
        assert open_mock.called_once_with('test.json', 'w')
        assert json_mock.called
        compare_nested_dicts(json_mock.call_args[0][0], expected_content)
Пример #8
0
class TestFrank(TestCase):

    def setUp(self):
        self.X = np.array([
            [2641.16233666, 180.2425623],
            [921.14476418, 192.35609972],
            [-651.32239137, 150.24830291],
            [1223.63536668, 156.62123653],
            [3233.37342355, 173.80311908],
            [1373.22400821, 191.0922843],
            [1959.28188858, 163.22252158],
            [1076.99295365, 190.73280428],
            [2029.25100261, 158.52982435],
            [1835.52188141, 163.0101334],
            [1170.03850556, 205.24904026],
            [739.42628394, 175.42916046],
            [1866.65810627, 208.31821984],
            [3703.49786503, 178.98351969],
            [1719.45232017, 160.50981075],
            [258.90206528, 163.19294974],
            [219.42363944, 173.30395132],
            [609.90212377, 215.18996298],
            [1618.44207239, 164.71141696],
            [2323.2775272, 178.84973821],
            [3251.78732274, 182.99902513],
            [1430.63989981, 217.5796917],
            [-180.57028875, 201.56983421],
            [-592.84497457, 174.92272693]
        ])
        self.copula = Bivariate(CopulaTypes.FRANK)

    def test_fit(self):
        """On fit, theta and tau attributes are set."""
        # Setup
        expected_theta = 0.1307082
        expected_tau = 0.01449275

        # Run
        self.copula.fit(self.X)
        actual_theta = self.copula.theta
        actual_tau = self.copula.tau

        # Check
        self.assertAlmostEqual(actual_theta, expected_theta, places=3)
        self.assertAlmostEqual(actual_tau, expected_tau)

    def test_probability_density(self):
        """Probability_density returns the probability density for the given values."""
        # Setup
        self.copula.fit(self.X)
        expected_result = 0.999672586804842

        # Run
        result = self.copula.probability_density(np.array([[0.1, 0.5]]))

        # Check
        assert np.isclose(result, expected_result).all()
        assert isinstance(result, np.ndarray)

    def test_cumulative_distribution(self):
        """Cumulative_density returns the probability distribution value for a point."""
        # Setup
        self.copula.fit(self.X)
        expected_result = 0.05147003

        # Run
        result = self.copula.cumulative_distribution(np.array([[0.1, 0.5]]))

        # Check
        assert np.isclose(result, expected_result).all()
        assert isinstance(result, np.ndarray)

    def test_sample(self):
        """After being fit, copula can produce samples."""
        # Setup
        self.copula.fit(self.X)

        # Run
        result = self.copula.sample(10)

        # Check
        assert isinstance(result, np.ndarray)
        assert result.shape == (10, 2)
Пример #9
0
class TestFrank(TestCase):
    def setUp(self):
        self.X = np.array([[2641.16233666, 180.2425623],
                           [921.14476418, 192.35609972],
                           [-651.32239137, 150.24830291],
                           [1223.63536668, 156.62123653],
                           [3233.37342355, 173.80311908],
                           [1373.22400821, 191.0922843],
                           [1959.28188858, 163.22252158],
                           [1076.99295365, 190.73280428],
                           [2029.25100261, 158.52982435],
                           [1835.52188141, 163.0101334],
                           [1170.03850556, 205.24904026],
                           [739.42628394, 175.42916046],
                           [1866.65810627, 208.31821984],
                           [3703.49786503, 178.98351969],
                           [1719.45232017, 160.50981075],
                           [258.90206528, 163.19294974],
                           [219.42363944, 173.30395132],
                           [609.90212377, 215.18996298],
                           [1618.44207239, 164.71141696],
                           [2323.2775272, 178.84973821],
                           [3251.78732274, 182.99902513],
                           [1430.63989981, 217.5796917],
                           [-180.57028875, 201.56983421],
                           [-592.84497457, 174.92272693]])
        self.copula = Bivariate(CopulaTypes.FRANK)

    def test_fit(self):
        """On fit, theta and tau attributes are set."""
        # Setup
        expected_theta = 0.1307082
        expected_tau = 0.01449275

        # Run
        self.copula.fit(self.X)
        actual_theta = self.copula.theta
        actual_tau = self.copula.tau

        # Check
        self.assertAlmostEqual(actual_theta, expected_theta, places=3)
        self.assertAlmostEqual(actual_tau, expected_tau)

    def test_probability_density(self):
        """Probability_density returns the probability density for the given values."""
        # Setup
        self.copula.fit(self.X)
        expected_result = 0.999672586804842

        # Run
        result = self.copula.probability_density(np.array([[0.1, 0.5]]))

        # Check
        assert np.isclose(result, expected_result).all()
        assert isinstance(result, np.ndarray)

    def test_cumulative_distribution(self):
        """Cumulative_density returns the probability distribution value for a point."""
        # Setup
        self.copula.fit(self.X)
        expected_result = 0.05147003

        # Run
        result = self.copula.cumulative_distribution(np.array([[0.1, 0.5]]))

        # Check
        assert np.isclose(result, expected_result).all()
        assert isinstance(result, np.ndarray)

    @patch('copulas.bivariate.base.np.random.uniform')
    def test_sample(self, uniform_mock):
        """Sample use the inverse-transform method to generate new samples."""
        # Setup
        instance = Bivariate(CopulaTypes.FRANK)
        instance.tau = 0.5
        instance.theta = instance.compute_theta()

        uniform_mock.return_value = np.array([0.1, 0.2, 0.4, 0.6, 0.8])

        expected_result = np.array([[6.080069565509917e-06, 0.1],
                                    [6.080069565509917e-06, 0.2],
                                    [6.080069565509917e-06, 0.4],
                                    [6.080069565509917e-06, 0.6],
                                    [4.500185268624483e-06, 0.8]])

        expected_uniform_call_args_list = [((0, 1, 5), {}), ((0, 1, 5), {})]

        # Run
        result = instance.sample(5)

        # Check
        assert isinstance(result, np.ndarray)
        assert result.shape == (5, 2)
        compare_nested_iterables(result, expected_result)
        assert uniform_mock.call_args_list == expected_uniform_call_args_list

    def test_cdf_zero_if_single_arg_is_zero(self):
        """Test of the analytical properties of copulas on a range of values of theta."""
        # Setup
        instance = Bivariate(CopulaTypes.FRANK)
        tau_values = np.linspace(-1.0, 1.0, 20)[1:-1]

        # Run/Check
        for tau in tau_values:
            instance.tau = tau
            instance.theta = instance.compute_theta()
            copula_zero_if_arg_zero(instance)

    def test_cdf_value_if_all_other_arg_are_one(self):
        """Test of the analytical properties of copulas on a range of values of theta."""
        # Setup
        instance = Bivariate(CopulaTypes.FRANK)
        tau_values = np.linspace(-1.0, 1.0, 20)[1:-1]

        # Run/Check
        for tau in tau_values:
            instance.tau = tau
            instance.theta = instance.compute_theta()
            copula_single_arg_not_one(instance, tolerance=1E-03)

    def test_sample_random_state(self):
        """If random_state is set, the samples are the same."""
        # Setup
        instance = Bivariate(CopulaTypes.FRANK, random_seed=0)
        instance.tau = 0.5
        instance.theta = instance.compute_theta()

        expected_result = np.array([[3.66330927e-06, 5.48813504e-01],
                                    [6.08006957e-06, 7.15189366e-01],
                                    [5.27582646e-06, 6.02763376e-01],
                                    [5.58315848e-06, 5.44883183e-01],
                                    [6.08006957e-06, 4.23654799e-01]])

        # Run
        result = instance.sample(5)

        # Check
        compare_nested_iterables(result, expected_result)
Пример #10
0
class TestClayton(TestCase):
    def setUp(self):
        self.copula = Bivariate(CopulaTypes.CLAYTON)
        self.X = np.array([[2641.16233666, 180.2425623],
                           [921.14476418, 192.35609972],
                           [-651.32239137, 150.24830291],
                           [1223.63536668, 156.62123653],
                           [3233.37342355, 173.80311908],
                           [1373.22400821, 191.0922843],
                           [1959.28188858, 163.22252158],
                           [1076.99295365, 190.73280428],
                           [2029.25100261, 158.52982435],
                           [1835.52188141, 163.0101334],
                           [1170.03850556, 205.24904026],
                           [739.42628394, 175.42916046],
                           [1866.65810627, 208.31821984],
                           [3703.49786503, 178.98351969],
                           [1719.45232017, 160.50981075],
                           [258.90206528, 163.19294974],
                           [219.42363944, 173.30395132],
                           [609.90212377, 215.18996298],
                           [1618.44207239, 164.71141696],
                           [2323.2775272, 178.84973821],
                           [3251.78732274, 182.99902513],
                           [1430.63989981, 217.5796917],
                           [-180.57028875, 201.56983421],
                           [-592.84497457, 174.92272693]])

    def test_fit(self):
        """On fit, theta and tau attributes are set."""
        # Setup
        expected_theta = 0.0294117
        expected_tau = 0.01449275

        # Run
        self.copula.fit(self.X)
        actual_theta = self.copula.theta
        actual_tau = self.copula.tau

        # Check
        self.assertAlmostEqual(actual_theta, expected_theta, places=3)
        self.assertAlmostEqual(actual_tau, expected_tau)

    def test_probability_density(self):
        """Probability_density returns the probability density for the given values."""
        # Setup
        self.copula.fit(self.X)
        expected_result = np.array([0.98854645, 0.98607539])

        # Run
        result = self.copula.probability_density(
            np.array([[0.1, 0.5], [0.2, 0.8]]))

        # Check
        assert isinstance(result, np.ndarray)
        assert np.isclose(result, expected_result).all()

    def test_cumulative_distribution(self):
        """Cumulative_density returns the probability distribution value for a point."""
        # Setup
        self.copula.fit(self.X)
        expected_result = np.array([1.06658093e+06, 0.16165401])

        # Run
        result = self.copula.cumulative_distribution(
            np.array([[1500, 180], [0.2, 0.8]]))

        # Check
        assert isinstance(result, np.ndarray)
        assert np.isclose(result, expected_result).all()

    def test_inverse_cumulative_percentile_point(self):
        """The percentile point and cumulative_distribution should be inverse one of the other."""
        # Setup
        self.copula.fit(self.X)

        # Run
        # percentile = self.copula.percent_point(0.1, 0.5)
        # derivative = self.copula.partial_derivative([0.1], [0.5])
        # result = self.copula.cumulative_distribution(derivative, percentile)

        # Check
        # assert point == result

    @patch('copulas.bivariate.base.np.random.uniform')
    def test_sample(self, uniform_mock):
        """Sample use the inverse-transform method to generate new samples."""
        # Setup
        instance = Bivariate(CopulaTypes.CLAYTON)
        instance.tau = 0.5
        instance.theta = instance.compute_theta()

        uniform_mock.return_value = np.array([0.1, 0.2, 0.4, 0.6, 0.8])

        expected_result = np.array([[0.05233100, 0.1], [0.14271095, 0.2],
                                    [0.39959746, 0.4], [0.68567125, 0.6],
                                    [0.89420523, 0.8]])

        expected_uniform_call_args_list = [((0, 1, 5), {}), ((0, 1, 5), {})]

        # Run
        result = instance.sample(5)

        # Check
        assert isinstance(result, np.ndarray)
        assert result.shape == (5, 2)
        compare_nested_iterables(result, expected_result)
        assert uniform_mock.call_args_list == expected_uniform_call_args_list

    def test_cdf_zero_if_single_arg_is_zero(self):
        """Test of the analytical properties of copulas on a range of values of theta."""
        # Setup
        instance = Bivariate(CopulaTypes.CLAYTON)
        tau_values = np.linspace(-1.0, 1.0, 20)[1:-1]

        # Run/Check
        for tau in tau_values:
            instance.tau = tau
            instance.theta = instance.compute_theta()
            copula_zero_if_arg_zero(instance)

    def test_cdf_value_if_all_other_arg_are_one(self):
        """Test of the analytical properties of copulas on a range of values of theta."""
        # Setup
        instance = Bivariate(CopulaTypes.CLAYTON)
        tau_values = np.linspace(-1.0, 1.0, 20)[1:-1]

        # Run/Check
        for tau in tau_values:
            instance.tau = tau
            instance.theta = instance.compute_theta()
            copula_single_arg_not_one(instance)

    def test_sample_random_state(self):
        """If random_state is set, the samples are the same."""
        # Setup
        instance = Bivariate(CopulaTypes.CLAYTON, random_seed=0)
        instance.tau = 0.5
        instance.theta = instance.compute_theta()

        expected_result = np.array([[0.68627770, 0.54881350],
                                    [0.64059280, 0.71518937],
                                    [0.90594782, 0.60276338],
                                    [0.96040856, 0.54488318],
                                    [0.40876969, 0.42365480]])

        # Run
        result = instance.sample(5)

        # Check
        compare_nested_iterables(result, expected_result)