From ab79c54e0688636822ed1c0db66362abfcfb64bb Mon Sep 17 00:00:00 2001 From: Francesc Alted Date: Mon, 13 Feb 2017 10:36:27 +0100 Subject: [PATCH 01/16] Require numexpr 2.6.2 --- doc/source/whatsnew/v0.20.0.txt | 6 +++++- pandas/computation/__init__.py | 15 +++------------ 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/doc/source/whatsnew/v0.20.0.txt b/doc/source/whatsnew/v0.20.0.txt index aa620bce0df59..edad63f9de9ce 100644 --- a/doc/source/whatsnew/v0.20.0.txt +++ b/doc/source/whatsnew/v0.20.0.txt @@ -1,12 +1,16 @@ .. _whatsnew_0200: -v0.20.0 (????, 2016) +v0.20.0 (????, 2017) -------------------- This is a major release from 0.19 and includes a small number of API changes, several new features, enhancements, and performance improvements along with a large number of bug fixes. We recommend that all users upgrade to this version. +.. warning:: + + Due to important fixes and performance improvements, ``numexpr`` version is now required to be >= 2.6.2 and it will not be used at all if this requisite is not fullfilled (:issue:`15213`). + Highlights include: - Building pandas for development now requires ``cython >= 0.23`` (:issue:`14831`) diff --git a/pandas/computation/__init__.py b/pandas/computation/__init__.py index 9e94215eecf62..65778c455fe0e 100644 --- a/pandas/computation/__init__.py +++ b/pandas/computation/__init__.py @@ -7,22 +7,13 @@ try: import numexpr as ne ver = ne.__version__ - _NUMEXPR_INSTALLED = ver >= LooseVersion('2.1') + _NUMEXPR_INSTALLED = ver >= LooseVersion('2.6.2') - # we specifically disallow 2.4.4 as - # has some hard-to-diagnose bugs - if ver == LooseVersion('2.4.4'): - _NUMEXPR_INSTALLED = False - warnings.warn( - "The installed version of numexpr {ver} is not supported " - "in pandas and will be not be used\n".format(ver=ver), - UserWarning) - - elif not _NUMEXPR_INSTALLED: + if not _NUMEXPR_INSTALLED: warnings.warn( "The installed version of numexpr {ver} is not supported " "in pandas and will be not be used\nThe minimum supported " - "version is 2.1\n".format(ver=ver), UserWarning) + "version is 2.6.2\n".format(ver=ver), UserWarning) except ImportError: # pragma: no cover pass From ac62653f41bf7e89570fa8fb0ef4edd6716f0d13 Mon Sep 17 00:00:00 2001 From: Francesc Alted Date: Mon, 13 Feb 2017 11:49:19 +0100 Subject: [PATCH 02/16] Require numexpr 2.4.6 --- doc/source/install.rst | 2 +- doc/source/whatsnew/v0.20.0.txt | 2 +- pandas/computation/__init__.py | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/source/install.rst b/doc/source/install.rst index 1c7cbc9326614..80a5d7e7d375b 100644 --- a/doc/source/install.rst +++ b/doc/source/install.rst @@ -226,7 +226,7 @@ Recommended Dependencies * `numexpr `__: for accelerating certain numerical operations. ``numexpr`` uses multiple cores as well as smart chunking and caching to achieve large speedups. - If installed, must be Version 2.1 or higher (excluding a buggy 2.4.4). Version 2.4.6 or higher is highly recommended. + If installed, must be Version 2.4.6 or higher. * `bottleneck `__: for accelerating certain types of ``nan`` evaluations. ``bottleneck`` uses specialized cython routines to achieve large speedups. diff --git a/doc/source/whatsnew/v0.20.0.txt b/doc/source/whatsnew/v0.20.0.txt index edad63f9de9ce..3e56a857ec880 100644 --- a/doc/source/whatsnew/v0.20.0.txt +++ b/doc/source/whatsnew/v0.20.0.txt @@ -9,7 +9,7 @@ users upgrade to this version. .. warning:: - Due to important fixes and performance improvements, ``numexpr`` version is now required to be >= 2.6.2 and it will not be used at all if this requisite is not fullfilled (:issue:`15213`). + Due to important fixes and performance improvements, ``numexpr`` version is now required to be >= 2.4.6 and it will not be used at all if this requisite is not fullfilled (:issue:`15213`). Highlights include: diff --git a/pandas/computation/__init__.py b/pandas/computation/__init__.py index 65778c455fe0e..53d560e751e29 100644 --- a/pandas/computation/__init__.py +++ b/pandas/computation/__init__.py @@ -7,13 +7,13 @@ try: import numexpr as ne ver = ne.__version__ - _NUMEXPR_INSTALLED = ver >= LooseVersion('2.6.2') + _NUMEXPR_INSTALLED = ver >= LooseVersion('2.4.6') if not _NUMEXPR_INSTALLED: warnings.warn( "The installed version of numexpr {ver} is not supported " "in pandas and will be not be used\nThe minimum supported " - "version is 2.6.2\n".format(ver=ver), UserWarning) + "version is 2.4.6\n".format(ver=ver), UserWarning) except ImportError: # pragma: no cover pass From 6e12e29313a071fb88c875eba6b55467fdb76be2 Mon Sep 17 00:00:00 2001 From: Francesc Alted Date: Mon, 13 Feb 2017 11:54:27 +0100 Subject: [PATCH 03/16] Added a notice on the recommended numexpr version --- doc/source/install.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/install.rst b/doc/source/install.rst index 80a5d7e7d375b..adc68d45ae61e 100644 --- a/doc/source/install.rst +++ b/doc/source/install.rst @@ -226,7 +226,7 @@ Recommended Dependencies * `numexpr `__: for accelerating certain numerical operations. ``numexpr`` uses multiple cores as well as smart chunking and caching to achieve large speedups. - If installed, must be Version 2.4.6 or higher. + If installed, must be Version 2.4.6 or higher. Numexpr 2.6.2 or higher is strongly recommended. * `bottleneck `__: for accelerating certain types of ``nan`` evaluations. ``bottleneck`` uses specialized cython routines to achieve large speedups. From e45b742b141f6548d0f958a92435ddd5127c828c Mon Sep 17 00:00:00 2001 From: Francesc Alted Date: Mon, 13 Feb 2017 12:43:36 +0100 Subject: [PATCH 04/16] Moved pinned versions in CI folder to 2.4.6 --- ci/requirements-2.7_COMPAT.run | 2 +- ci/requirements-3.4_SLOW.run | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ci/requirements-2.7_COMPAT.run b/ci/requirements-2.7_COMPAT.run index d27b6a72c2d15..87e464b17c32d 100644 --- a/ci/requirements-2.7_COMPAT.run +++ b/ci/requirements-2.7_COMPAT.run @@ -5,7 +5,7 @@ scipy=0.11.0 xlwt=0.7.5 xlrd=0.9.2 bottleneck=0.8.0 -numexpr=2.2.2 +numexpr=2.4.6 pytables=3.0.0 html5lib=1.0b2 beautiful-soup=4.2.0 diff --git a/ci/requirements-3.4_SLOW.run b/ci/requirements-3.4_SLOW.run index 39018439a1223..90156f62c6e71 100644 --- a/ci/requirements-3.4_SLOW.run +++ b/ci/requirements-3.4_SLOW.run @@ -9,7 +9,7 @@ html5lib patsy beautiful-soup scipy -numexpr=2.4.4 +numexpr=2.4.6 pytables matplotlib lxml From 8bd4ed1b247f41cdc22b2f536c7dd546aae8166f Mon Sep 17 00:00:00 2001 From: Francesc Alted Date: Mon, 13 Feb 2017 13:00:42 +0100 Subject: [PATCH 05/16] numexpr 2.4.6 requirement moved to other enhancements section --- doc/source/whatsnew/v0.20.0.txt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/doc/source/whatsnew/v0.20.0.txt b/doc/source/whatsnew/v0.20.0.txt index 3e56a857ec880..cae1d50207cf7 100644 --- a/doc/source/whatsnew/v0.20.0.txt +++ b/doc/source/whatsnew/v0.20.0.txt @@ -7,10 +7,6 @@ This is a major release from 0.19 and includes a small number of API changes, se enhancements, and performance improvements along with a large number of bug fixes. We recommend that all users upgrade to this version. -.. warning:: - - Due to important fixes and performance improvements, ``numexpr`` version is now required to be >= 2.4.6 and it will not be used at all if this requisite is not fullfilled (:issue:`15213`). - Highlights include: - Building pandas for development now requires ``cython >= 0.23`` (:issue:`14831`) @@ -157,11 +153,13 @@ Other enhancements - ``Series/DataFrame.resample.asfreq`` have gained a ``fill_value`` parameter, to fill missing values during resampling (:issue:`3715`). - ``pandas.tools.hashing`` has gained a ``hash_tuples`` routine, and ``hash_pandas_object`` has gained the ability to hash a ``MultiIndex`` (:issue:`15224`) - ``Series/DataFrame.squeeze()`` have gained the ``axis`` parameter. (:issue:`15339`) +- ``numexpr`` version is now required to be >= 2.4.6 and it will not be used at all if this requisite is not fulfilled (:issue:`15213`). .. _ISO 8601 duration: https://en.wikipedia.org/wiki/ISO_8601#Durations .. _whatsnew_0200.api_breaking: + Backwards incompatible API changes ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From f22559876b130891e7c834cf269d1289307e3fa3 Mon Sep 17 00:00:00 2001 From: Francesc Alted Date: Mon, 13 Feb 2017 13:04:58 +0100 Subject: [PATCH 06/16] Updated test_compat for numexpr 2.4.6 --- pandas/tests/computation/test_compat.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pandas/tests/computation/test_compat.py b/pandas/tests/computation/test_compat.py index 599d0c10336dc..693697f3f03bb 100644 --- a/pandas/tests/computation/test_compat.py +++ b/pandas/tests/computation/test_compat.py @@ -21,9 +21,7 @@ def test_compat(): try: import numexpr as ne ver = ne.__version__ - if ver == LooseVersion('2.4.4'): - assert not _NUMEXPR_INSTALLED - elif ver < LooseVersion('2.1'): + elif ver < LooseVersion('2.4.6'): with tm.assert_produces_warning(UserWarning, check_stacklevel=False): assert not _NUMEXPR_INSTALLED From 3b6e58bf5daeb5eb4de99e91d958fe227c96edeb Mon Sep 17 00:00:00 2001 From: Francesc Alted Date: Mon, 13 Feb 2017 13:15:44 +0100 Subject: [PATCH 07/16] Removed recomendation for numexpr 2.6.2 --- doc/source/install.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/install.rst b/doc/source/install.rst index adc68d45ae61e..80a5d7e7d375b 100644 --- a/doc/source/install.rst +++ b/doc/source/install.rst @@ -226,7 +226,7 @@ Recommended Dependencies * `numexpr `__: for accelerating certain numerical operations. ``numexpr`` uses multiple cores as well as smart chunking and caching to achieve large speedups. - If installed, must be Version 2.4.6 or higher. Numexpr 2.6.2 or higher is strongly recommended. + If installed, must be Version 2.4.6 or higher. * `bottleneck `__: for accelerating certain types of ``nan`` evaluations. ``bottleneck`` uses specialized cython routines to achieve large speedups. From 93f54aa24755420dcaae419f5531404ca432eaf5 Mon Sep 17 00:00:00 2001 From: Francesc Alted Date: Mon, 13 Feb 2017 13:21:58 +0100 Subject: [PATCH 08/16] numexpr section moved to Other API changes section --- doc/source/whatsnew/v0.20.0.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/whatsnew/v0.20.0.txt b/doc/source/whatsnew/v0.20.0.txt index cae1d50207cf7..1fd93e308bc83 100644 --- a/doc/source/whatsnew/v0.20.0.txt +++ b/doc/source/whatsnew/v0.20.0.txt @@ -153,7 +153,6 @@ Other enhancements - ``Series/DataFrame.resample.asfreq`` have gained a ``fill_value`` parameter, to fill missing values during resampling (:issue:`3715`). - ``pandas.tools.hashing`` has gained a ``hash_tuples`` routine, and ``hash_pandas_object`` has gained the ability to hash a ``MultiIndex`` (:issue:`15224`) - ``Series/DataFrame.squeeze()`` have gained the ``axis`` parameter. (:issue:`15339`) -- ``numexpr`` version is now required to be >= 2.4.6 and it will not be used at all if this requisite is not fulfilled (:issue:`15213`). .. _ISO 8601 duration: https://en.wikipedia.org/wiki/ISO_8601#Durations @@ -430,6 +429,7 @@ Other API Changes - ``DataFrame.asof()`` will return a null filled ``Series`` instead the scalar ``NaN`` if a match is not found (:issue:`15118`) - The :func:`pd.read_gbq` method now stores ``INTEGER`` columns as ``dtype=object`` if they contain ``NULL`` values. Otherwise they are stored as ``int64``. This prevents precision lost for integers greather than 2**53. Furthermore ``FLOAT`` columns with values above 10**4 are no more casted to ``int64`` which also caused precision lost (:issue: `14064`, :issue:`14305`). - Reorganization of timeseries development tests (:issue:`14854`) +- ``numexpr`` version is now required to be >= 2.4.6 and it will not be used at all if this requisite is not fulfilled (:issue:`15213`). .. _whatsnew_0200.deprecations: From 7a275ce974fbd85cbbf65f2feda32b06ea836917 Mon Sep 17 00:00:00 2001 From: Francesc Alted Date: Mon, 13 Feb 2017 19:04:13 +0100 Subject: [PATCH 09/16] Fixed a typo --- pandas/tests/computation/test_compat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/tests/computation/test_compat.py b/pandas/tests/computation/test_compat.py index 693697f3f03bb..2145c2a1db323 100644 --- a/pandas/tests/computation/test_compat.py +++ b/pandas/tests/computation/test_compat.py @@ -21,7 +21,7 @@ def test_compat(): try: import numexpr as ne ver = ne.__version__ - elif ver < LooseVersion('2.4.6'): + if ver < LooseVersion('2.4.6'): with tm.assert_produces_warning(UserWarning, check_stacklevel=False): assert not _NUMEXPR_INSTALLED From 7575ba2cd1fe81f90b2fbea57d75833699b78cc6 Mon Sep 17 00:00:00 2001 From: Francesc Alted Date: Mon, 13 Feb 2017 20:17:22 +0100 Subject: [PATCH 10/16] Using constants instead of literals for numexpr version --- pandas/computation/__init__.py | 6 ++++-- pandas/tests/computation/test_compat.py | 10 +++++----- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/pandas/computation/__init__.py b/pandas/computation/__init__.py index 53d560e751e29..6942edf6cb0d7 100644 --- a/pandas/computation/__init__.py +++ b/pandas/computation/__init__.py @@ -3,17 +3,19 @@ from distutils.version import LooseVersion _NUMEXPR_INSTALLED = False +_MIN_NUMEXPR_VERSION = "2.4.6" try: import numexpr as ne ver = ne.__version__ - _NUMEXPR_INSTALLED = ver >= LooseVersion('2.4.6') + _NUMEXPR_INSTALLED = ver >= LooseVersion(_MIN_NUMEXPR_VERSION) if not _NUMEXPR_INSTALLED: warnings.warn( "The installed version of numexpr {ver} is not supported " "in pandas and will be not be used\nThe minimum supported " - "version is 2.4.6\n".format(ver=ver), UserWarning) + "version is {min_ver}\n".format(ver=ver, + min_ver=_MIN_NUMEXPR_VERSION), UserWarning) except ImportError: # pragma: no cover pass diff --git a/pandas/tests/computation/test_compat.py b/pandas/tests/computation/test_compat.py index 2145c2a1db323..3fa82295e99a2 100644 --- a/pandas/tests/computation/test_compat.py +++ b/pandas/tests/computation/test_compat.py @@ -10,6 +10,8 @@ from pandas.computation.engines import _engines import pandas.computation.expr as expr +from pandas.computation import _MIN_NUMEXPR_VERSION + ENGINES_PARSERS = list(product(_engines, expr._parsers)) @@ -21,7 +23,7 @@ def test_compat(): try: import numexpr as ne ver = ne.__version__ - if ver < LooseVersion('2.4.6'): + if ver < LooseVersion(_MIN_NUMEXPR_VERSION): with tm.assert_produces_warning(UserWarning, check_stacklevel=False): assert not _NUMEXPR_INSTALLED @@ -49,12 +51,10 @@ def testit(): except ImportError: pytest.skip("no numexpr") else: - if ne.__version__ < LooseVersion('2.1'): + if ne.__version__ < LooseVersion(_MIN_NUMEXPR_VERSION): with tm.assertRaisesRegexp(ImportError, "'numexpr' version is " - ".+, must be >= 2.1"): + ".+, must be >= %s" % _MIN_NUMEXPR_VERSION): testit() - elif ne.__version__ == LooseVersion('2.4.4'): - pytest.skip("numexpr version==2.4.4") else: testit() else: From c1aae19d8cd10a6488ee1698fe01bd18844586fd Mon Sep 17 00:00:00 2001 From: Francesc Alted Date: Tue, 14 Feb 2017 10:35:10 +0100 Subject: [PATCH 11/16] Fixed a lint error --- pandas/computation/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/computation/__init__.py b/pandas/computation/__init__.py index 6942edf6cb0d7..e13faf890d1f8 100644 --- a/pandas/computation/__init__.py +++ b/pandas/computation/__init__.py @@ -14,8 +14,8 @@ warnings.warn( "The installed version of numexpr {ver} is not supported " "in pandas and will be not be used\nThe minimum supported " - "version is {min_ver}\n".format(ver=ver, - min_ver=_MIN_NUMEXPR_VERSION), UserWarning) + "version is {min_ver}\n".format( + ver=ver, min_ver=_MIN_NUMEXPR_VERSION), UserWarning) except ImportError: # pragma: no cover pass From 0d4ab9a668035f30959ffdbccd5db3f91bf0a67e Mon Sep 17 00:00:00 2001 From: Francesc Alted Date: Tue, 14 Feb 2017 10:50:00 +0100 Subject: [PATCH 12/16] Restored the old numexpr version dependencies to adjust for old requirements --- ci/requirements-2.7_COMPAT.run | 2 +- ci/requirements-3.4_SLOW.run | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ci/requirements-2.7_COMPAT.run b/ci/requirements-2.7_COMPAT.run index 87e464b17c32d..d27b6a72c2d15 100644 --- a/ci/requirements-2.7_COMPAT.run +++ b/ci/requirements-2.7_COMPAT.run @@ -5,7 +5,7 @@ scipy=0.11.0 xlwt=0.7.5 xlrd=0.9.2 bottleneck=0.8.0 -numexpr=2.4.6 +numexpr=2.2.2 pytables=3.0.0 html5lib=1.0b2 beautiful-soup=4.2.0 diff --git a/ci/requirements-3.4_SLOW.run b/ci/requirements-3.4_SLOW.run index 90156f62c6e71..39018439a1223 100644 --- a/ci/requirements-3.4_SLOW.run +++ b/ci/requirements-3.4_SLOW.run @@ -9,7 +9,7 @@ html5lib patsy beautiful-soup scipy -numexpr=2.4.6 +numexpr=2.4.4 pytables matplotlib lxml From 73f03197b6191e9e737418db18499d317ae6cba2 Mon Sep 17 00:00:00 2001 From: Francesc Alted Date: Tue, 14 Feb 2017 15:43:15 +0100 Subject: [PATCH 13/16] numexpr requisite raised to 2.4.6 --- ci/requirements-3.4_SLOW.run | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/requirements-3.4_SLOW.run b/ci/requirements-3.4_SLOW.run index 39018439a1223..90156f62c6e71 100644 --- a/ci/requirements-3.4_SLOW.run +++ b/ci/requirements-3.4_SLOW.run @@ -9,7 +9,7 @@ html5lib patsy beautiful-soup scipy -numexpr=2.4.4 +numexpr=2.4.6 pytables matplotlib lxml From c081199fe35de6b4d3510e56a9ab4621e03bbe16 Mon Sep 17 00:00:00 2001 From: Francesc Alted Date: Tue, 14 Feb 2017 16:17:59 +0100 Subject: [PATCH 14/16] Relax the exact message for the ImportError --- pandas/tests/computation/test_compat.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pandas/tests/computation/test_compat.py b/pandas/tests/computation/test_compat.py index 3fa82295e99a2..cadb8abf59b3f 100644 --- a/pandas/tests/computation/test_compat.py +++ b/pandas/tests/computation/test_compat.py @@ -52,8 +52,7 @@ def testit(): pytest.skip("no numexpr") else: if ne.__version__ < LooseVersion(_MIN_NUMEXPR_VERSION): - with tm.assertRaisesRegexp(ImportError, "'numexpr' version is " - ".+, must be >= %s" % _MIN_NUMEXPR_VERSION): + with tm.assertRaises(ImportError): testit() else: testit() From e1b34a9e558cb2f3a3a836b1d03a9b4b8bc89a99 Mon Sep 17 00:00:00 2001 From: Francesc Alted Date: Wed, 15 Feb 2017 10:04:19 +0100 Subject: [PATCH 15/16] Force a reload of pd.computation for actually triggering the UserWarning --- pandas/tests/computation/test_compat.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/pandas/tests/computation/test_compat.py b/pandas/tests/computation/test_compat.py index cadb8abf59b3f..b38b5b39594d7 100644 --- a/pandas/tests/computation/test_compat.py +++ b/pandas/tests/computation/test_compat.py @@ -11,7 +11,11 @@ from pandas.computation.engines import _engines import pandas.computation.expr as expr from pandas.computation import _MIN_NUMEXPR_VERSION - +# Get reload for Python 3.4 and on, if not, use internal reload() +try: + from importlib import reload +except ImportError: + pass ENGINES_PARSERS = list(product(_engines, expr._parsers)) @@ -26,7 +30,8 @@ def test_compat(): if ver < LooseVersion(_MIN_NUMEXPR_VERSION): with tm.assert_produces_warning(UserWarning, check_stacklevel=False): - assert not _NUMEXPR_INSTALLED + reload(pd.computation) + assert not _NUMEXPR_INSTALLED else: assert _NUMEXPR_INSTALLED From c417fe2bcde23dbe7ea7516dc703cd7554fd5cb3 Mon Sep 17 00:00:00 2001 From: Francesc Alted Date: Wed, 15 Feb 2017 14:33:14 +0100 Subject: [PATCH 16/16] Simplify and remove UserWarning testing on numexpr import --- pandas/tests/computation/test_compat.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/pandas/tests/computation/test_compat.py b/pandas/tests/computation/test_compat.py index b38b5b39594d7..77994ac6d2f53 100644 --- a/pandas/tests/computation/test_compat.py +++ b/pandas/tests/computation/test_compat.py @@ -11,11 +11,6 @@ from pandas.computation.engines import _engines import pandas.computation.expr as expr from pandas.computation import _MIN_NUMEXPR_VERSION -# Get reload for Python 3.4 and on, if not, use internal reload() -try: - from importlib import reload -except ImportError: - pass ENGINES_PARSERS = list(product(_engines, expr._parsers)) @@ -28,13 +23,9 @@ def test_compat(): import numexpr as ne ver = ne.__version__ if ver < LooseVersion(_MIN_NUMEXPR_VERSION): - with tm.assert_produces_warning(UserWarning, - check_stacklevel=False): - reload(pd.computation) assert not _NUMEXPR_INSTALLED else: assert _NUMEXPR_INSTALLED - except ImportError: pytest.skip("not testing numexpr version compat")