From cdd2a47fbb5bb4ee75c57963429685add70d3965 Mon Sep 17 00:00:00 2001 From: symeneses Date: Sat, 12 Nov 2022 11:15:12 -0500 Subject: [PATCH 1/4] :children_crossing: add warning if observed is dict --- pymc/distributions/distribution.py | 4 ++++ pymc/tests/distributions/test_distribution.py | 15 +++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/pymc/distributions/distribution.py b/pymc/distributions/distribution.py index 13cad0cf5d..e8fb67e669 100644 --- a/pymc/distributions/distribution.py +++ b/pymc/distributions/distribution.py @@ -577,6 +577,10 @@ def random(mu, rng=None, size=None): def __new__(cls, name, *args, **kwargs): kwargs.setdefault("class_name", name) + if "observed" in kwargs.keys() and isinstance(kwargs["observed"], dict): + raise TypeError( + "The observed parameter should be of type `pd.Series`, " "`np.array`, or `pm.Data`." + ) return super().__new__(cls, name, *args, **kwargs) @classmethod diff --git a/pymc/tests/distributions/test_distribution.py b/pymc/tests/distributions/test_distribution.py index 73810f3fd9..9116f8ea55 100644 --- a/pymc/tests/distributions/test_distribution.py +++ b/pymc/tests/distributions/test_distribution.py @@ -148,6 +148,21 @@ def test_density_dist_with_random(self, size): assert obs.eval().shape == (100,) + size + def test_density_dist_with_random_invalid_observed(self): + with pytest.raises( + TypeError, + match="The observed parameter should be of type `pd.Series`, `np.array`, or `pm.Data`", + ): + size = (3,) + with pm.Model() as model: + mu = pm.Normal("mu", 0, 1) + pm.DensityDist( + "density_dist", + mu, + random=lambda mu, rng=None, size=None: rng.normal(loc=mu, scale=1, size=size), + observed={"values": np.random.randn(100, *size)}, + ) + def test_density_dist_without_random(self): with pm.Model() as model: mu = pm.Normal("mu", 0, 1) From 5ed46bbbef5fdb4286377c94b9f8f6cc5accf5ee Mon Sep 17 00:00:00 2001 From: Sandra Yojana Meneses Date: Sat, 12 Nov 2022 12:46:46 -0500 Subject: [PATCH 2/4] Improve validation Co-authored-by: Michael Osthege --- pymc/distributions/distribution.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pymc/distributions/distribution.py b/pymc/distributions/distribution.py index e8fb67e669..0ba1fb63b2 100644 --- a/pymc/distributions/distribution.py +++ b/pymc/distributions/distribution.py @@ -577,7 +577,7 @@ def random(mu, rng=None, size=None): def __new__(cls, name, *args, **kwargs): kwargs.setdefault("class_name", name) - if "observed" in kwargs.keys() and isinstance(kwargs["observed"], dict): + if isinstance(kwargs.get("observed", None), dict): raise TypeError( "The observed parameter should be of type `pd.Series`, " "`np.array`, or `pm.Data`." ) From f753c6b942a4b19a98bd6223544678deaf8190bf Mon Sep 17 00:00:00 2001 From: Sandra Yojana Meneses Date: Sat, 12 Nov 2022 12:46:58 -0500 Subject: [PATCH 3/4] Fix typo Co-authored-by: Michael Osthege --- pymc/distributions/distribution.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pymc/distributions/distribution.py b/pymc/distributions/distribution.py index 0ba1fb63b2..4985ee2176 100644 --- a/pymc/distributions/distribution.py +++ b/pymc/distributions/distribution.py @@ -579,7 +579,7 @@ def __new__(cls, name, *args, **kwargs): kwargs.setdefault("class_name", name) if isinstance(kwargs.get("observed", None), dict): raise TypeError( - "The observed parameter should be of type `pd.Series`, " "`np.array`, or `pm.Data`." + "The observed parameter should be of type `pd.Series`, `np.array`, or `pm.Data`." ) return super().__new__(cls, name, *args, **kwargs) From e933fea79ac19bfd4430ffe2b30f2e53d31c24b4 Mon Sep 17 00:00:00 2001 From: symeneses Date: Tue, 15 Nov 2022 11:23:49 -0500 Subject: [PATCH 4/4] :ok_hand: update error message --- pymc/distributions/distribution.py | 6 +++++- pymc/tests/distributions/test_distribution.py | 9 +++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/pymc/distributions/distribution.py b/pymc/distributions/distribution.py index 4985ee2176..e234760a56 100644 --- a/pymc/distributions/distribution.py +++ b/pymc/distributions/distribution.py @@ -579,7 +579,11 @@ def __new__(cls, name, *args, **kwargs): kwargs.setdefault("class_name", name) if isinstance(kwargs.get("observed", None), dict): raise TypeError( - "The observed parameter should be of type `pd.Series`, `np.array`, or `pm.Data`." + "Since ``v4.0.0`` the ``observed`` parameter should be of type" + " ``pd.Series``, ``np.array``, or ``pm.Data``." + " Previous versions allowed passing distribution parameters as" + " a dictionary in ``observed``, in the current version these " + "parameters are positional arguments." ) return super().__new__(cls, name, *args, **kwargs) diff --git a/pymc/tests/distributions/test_distribution.py b/pymc/tests/distributions/test_distribution.py index 9116f8ea55..ed0afeefe5 100644 --- a/pymc/tests/distributions/test_distribution.py +++ b/pymc/tests/distributions/test_distribution.py @@ -145,13 +145,18 @@ def test_density_dist_with_random(self, size): random=lambda mu, rng=None, size=None: rng.normal(loc=mu, scale=1, size=size), observed=np.random.randn(100, *size), ) - assert obs.eval().shape == (100,) + size def test_density_dist_with_random_invalid_observed(self): with pytest.raises( TypeError, - match="The observed parameter should be of type `pd.Series`, `np.array`, or `pm.Data`", + match=( + "Since ``v4.0.0`` the ``observed`` parameter should be of type" + " ``pd.Series``, ``np.array``, or ``pm.Data``." + " Previous versions allowed passing distribution parameters as" + " a dictionary in ``observed``, in the current version these " + "parameters are positional arguments." + ), ): size = (3,) with pm.Model() as model: