From c494dec971e21000ba9687372dee800bada256b0 Mon Sep 17 00:00:00 2001 From: Saehui Date: Thu, 22 Jul 2021 09:32:46 -0700 Subject: [PATCH 1/5] use use_numexpr for engine --- pandas/core/computation/eval.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pandas/core/computation/eval.py b/pandas/core/computation/eval.py index 57ba478a9157b..26748eadb4c85 100644 --- a/pandas/core/computation/eval.py +++ b/pandas/core/computation/eval.py @@ -43,9 +43,10 @@ def _check_engine(engine: str | None) -> str: Engine name. """ from pandas.core.computation.check import NUMEXPR_INSTALLED + from pandas.core.computation.expressions import USE_NUMEXPR if engine is None: - engine = "numexpr" if NUMEXPR_INSTALLED else "python" + engine = "numexpr" if USE_NUMEXPR else "python" if engine not in ENGINES: valid_engines = list(ENGINES.keys()) From fdb1ed670460753388cb40c463b622cb8254e484 Mon Sep 17 00:00:00 2001 From: Saehui Date: Thu, 22 Jul 2021 09:54:23 -0700 Subject: [PATCH 2/5] BUG: compute.use_numexpr option not respected --- doc/source/whatsnew/v1.4.0.rst | 2 +- pandas/tests/computation/test_eval.py | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/doc/source/whatsnew/v1.4.0.rst b/doc/source/whatsnew/v1.4.0.rst index 8d96d49daba4f..dcaab9c211599 100644 --- a/doc/source/whatsnew/v1.4.0.rst +++ b/doc/source/whatsnew/v1.4.0.rst @@ -201,7 +201,7 @@ Numeric ^^^^^^^ - Bug in :meth:`DataFrame.rank` raising ``ValueError`` with ``object`` columns and ``method="first"`` (:issue:`41931`) - Bug in :meth:`DataFrame.rank` treating missing values and extreme values as equal (for example ``np.nan`` and ``np.inf``), causing incorrect results when ``na_option="bottom"`` or ``na_option="top`` used (:issue:`41931`) -- +- Bug in ``numexpr`` engine still being used when the option ``compute.use_numexpr`` is set to ``False`` (:issue:`32556`) Conversion ^^^^^^^^^^ diff --git a/pandas/tests/computation/test_eval.py b/pandas/tests/computation/test_eval.py index b6c6baf6cc7e4..148d210a29aa3 100644 --- a/pandas/tests/computation/test_eval.py +++ b/pandas/tests/computation/test_eval.py @@ -1865,6 +1865,16 @@ def test_invalid_engine(): pd.eval("x + y", local_dict={"x": 1, "y": 2}, engine="asdf") +@td.skip_if_no_ne +def test_numexpr_option_respected(): + # GH 32556 + from pandas.core.computation.eval import _check_engine + + with pd.option_context("compute.use_numexpr", False): + result = _check_engine(None) + assert result == "python" + + @td.skip_if_no_ne def test_invalid_parser(): msg = "Invalid parser 'asdf' passed" From 46f19af31b595a1cb046648add499cb57ae6361d Mon Sep 17 00:00:00 2001 From: Saehui Date: Sun, 25 Jul 2021 10:06:48 -0700 Subject: [PATCH 3/5] parametrized True False for numexpr --- pandas/tests/computation/test_eval.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/pandas/tests/computation/test_eval.py b/pandas/tests/computation/test_eval.py index 148d210a29aa3..d923371545f7c 100644 --- a/pandas/tests/computation/test_eval.py +++ b/pandas/tests/computation/test_eval.py @@ -1866,13 +1866,17 @@ def test_invalid_engine(): @td.skip_if_no_ne -def test_numexpr_option_respected(): +@pytest.mark.parametrize("use_numexpr", [True, False]) +def test_numexpr_option_respected(use_numexpr): # GH 32556 from pandas.core.computation.eval import _check_engine - with pd.option_context("compute.use_numexpr", False): + with pd.option_context("compute.use_numexpr", use_numexpr): result = _check_engine(None) - assert result == "python" + if use_numexpr: + assert result == "numexpr" + else: + assert result == "python" @td.skip_if_no_ne From 2c3b292d14b32dc5064085378734990e574161d6 Mon Sep 17 00:00:00 2001 From: Saehui Date: Sun, 25 Jul 2021 10:36:38 -0700 Subject: [PATCH 4/5] added user perspective test for numexpr option respected --- pandas/tests/computation/test_eval.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/pandas/tests/computation/test_eval.py b/pandas/tests/computation/test_eval.py index d923371545f7c..60440fc33b64a 100644 --- a/pandas/tests/computation/test_eval.py +++ b/pandas/tests/computation/test_eval.py @@ -1879,6 +1879,18 @@ def test_numexpr_option_respected(use_numexpr): assert result == "python" +@td.skip_if_no_ne +def test_numexpr_option_incompatible_op(): + # GH 32556 + with pd.option_context("compute.use_numexpr", False): + df = DataFrame( + {"A": [True, False, True, False, None, None], "B": [1, 2, 3, 4, 5, 6]} + ) + result = df.query("A.isnull()") + expected = DataFrame({"A": [None, None], "B": [5, 6]}, index=[4, 5]) + tm.assert_frame_equal(result, expected) + + @td.skip_if_no_ne def test_invalid_parser(): msg = "Invalid parser 'asdf' passed" From a6cdd7373a46bf0d1d4dda88a9e50db72803d3a9 Mon Sep 17 00:00:00 2001 From: Saehui Date: Mon, 26 Jul 2021 11:14:19 -0700 Subject: [PATCH 5/5] reduced logic in test by parametrizing expected result --- pandas/tests/computation/test_eval.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/pandas/tests/computation/test_eval.py b/pandas/tests/computation/test_eval.py index 60440fc33b64a..f27112dbd3956 100644 --- a/pandas/tests/computation/test_eval.py +++ b/pandas/tests/computation/test_eval.py @@ -1866,17 +1866,20 @@ def test_invalid_engine(): @td.skip_if_no_ne -@pytest.mark.parametrize("use_numexpr", [True, False]) -def test_numexpr_option_respected(use_numexpr): +@pytest.mark.parametrize( + ("use_numexpr", "expected"), + ( + (True, "numexpr"), + (False, "python"), + ), +) +def test_numexpr_option_respected(use_numexpr, expected): # GH 32556 from pandas.core.computation.eval import _check_engine with pd.option_context("compute.use_numexpr", use_numexpr): result = _check_engine(None) - if use_numexpr: - assert result == "numexpr" - else: - assert result == "python" + assert result == expected @td.skip_if_no_ne