Skip to content

Commit a1ad150

Browse files
committed
TST: Use fixtures for engine/parser where possible.
1 parent 55fc03f commit a1ad150

File tree

1 file changed

+18
-73
lines changed

1 file changed

+18
-73
lines changed

pandas/tests/computation/test_eval.py

+18-73
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
from pandas.computation import pytables
2121
from pandas.computation.engines import _engines, NumExprClobberingError
2222
from pandas.computation.expr import PythonExprVisitor, PandasExprVisitor
23+
from pandas.computation.expressions import _USE_NUMEXPR, _NUMEXPR_INSTALLED
2324
from pandas.computation.ops import (_binary_ops_dict,
2425
_special_case_arith_ops_syms,
2526
_arith_ops_syms, _bool_ops_syms,
@@ -38,6 +39,23 @@
3839
_scalar_skip = 'in', 'not in'
3940

4041

42+
@pytest.fixture(params=[
43+
pytest.mark.skipif(engine == 'numexpr' and not _USE_NUMEXPR,
44+
reason='numexpr enabled->{enabled}, '
45+
'installed->{installed}'.format(
46+
enabled=_USE_NUMEXPR,
47+
installed=_NUMEXPR_INSTALLED))(engine)
48+
for engine in _engines
49+
])
50+
def engine(request):
51+
return request.param
52+
53+
54+
@pytest.fixture(params=expr._parsers)
55+
def parser(request):
56+
return request.param
57+
58+
4159
def engine_has_neg_frac(engine):
4260
return _engines[engine].has_neg_frac
4361

@@ -780,14 +798,11 @@ def check_chained_cmp_op(self, lhs, cmp1, mid, cmp2, rhs):
780798

781799

782800
class TestTypeCasting(object):
783-
@pytest.mark.parametrize('engine', _engines)
784-
@pytest.mark.parametrize('parser', expr._parsers)
785801
@pytest.mark.parametrize('op', ['+', '-', '*', '**', '/'])
786802
# maybe someday... numexpr has too many upcasting rules now
787803
# chain(*(np.sctypes[x] for x in ['uint', 'int', 'float']))
788804
@pytest.mark.parametrize('dt', [np.float32, np.float64])
789805
def test_binop_typecasting(self, engine, parser, op, dt):
790-
tm.skip_if_no_ne(engine)
791806
df = mkdf(5, 3, data_gen_f=f, dtype=dt)
792807
s = 'df {} 3'.format(op)
793808
res = pd.eval(s, engine=engine, parser=parser)
@@ -820,19 +835,13 @@ class TestAlignment(object):
820835
index_types = 'i', 'u', 'dt'
821836
lhs_index_types = index_types + ('s',) # 'p'
822837

823-
@pytest.mark.parametrize('engine', _engines)
824-
@pytest.mark.parametrize('parser', expr._parsers)
825838
def test_align_nested_unary_op(self, engine, parser):
826-
tm.skip_if_no_ne(engine)
827839
s = 'df * ~2'
828840
df = mkdf(5, 3, data_gen_f=f)
829841
res = pd.eval(s, engine=engine, parser=parser)
830842
assert_frame_equal(res, df * ~2)
831843

832-
@pytest.mark.parametrize('engine', _engines)
833-
@pytest.mark.parametrize('parser', expr._parsers)
834844
def test_basic_frame_alignment(self, engine, parser):
835-
tm.skip_if_no_ne(engine)
836845
args = product(self.lhs_index_types, self.index_types,
837846
self.index_types)
838847
with warnings.catch_warnings(record=True):
@@ -850,10 +859,7 @@ def test_basic_frame_alignment(self, engine, parser):
850859
res = pd.eval('df + df2', engine=engine, parser=parser)
851860
assert_frame_equal(res, df + df2)
852861

853-
@pytest.mark.parametrize('engine', _engines)
854-
@pytest.mark.parametrize('parser', expr._parsers)
855862
def test_frame_comparison(self, engine, parser):
856-
tm.skip_if_no_ne(engine)
857863
args = product(self.lhs_index_types, repeat=2)
858864
for r_idx_type, c_idx_type in args:
859865
df = mkdf(10, 10, data_gen_f=f, r_idx_type=r_idx_type,
@@ -867,10 +873,7 @@ def test_frame_comparison(self, engine, parser):
867873
assert_frame_equal(res, df < df3)
868874

869875
@slow
870-
@pytest.mark.parametrize('engine', _engines)
871-
@pytest.mark.parametrize('parser', expr._parsers)
872876
def test_medium_complex_frame_alignment(self, engine, parser):
873-
tm.skip_if_no_ne(engine)
874877
args = product(self.lhs_index_types, self.index_types,
875878
self.index_types, self.index_types)
876879

@@ -890,11 +893,7 @@ def test_medium_complex_frame_alignment(self, engine, parser):
890893
engine=engine, parser=parser)
891894
assert_frame_equal(res, df + df2 + df3)
892895

893-
@pytest.mark.parametrize('engine', _engines)
894-
@pytest.mark.parametrize('parser', expr._parsers)
895896
def test_basic_frame_series_alignment(self, engine, parser):
896-
tm.skip_if_no_ne(engine)
897-
898897
def testit(r_idx_type, c_idx_type, index_name):
899898
df = mkdf(10, 10, data_gen_f=f, r_idx_type=r_idx_type,
900899
c_idx_type=c_idx_type)
@@ -920,11 +919,7 @@ def testit(r_idx_type, c_idx_type, index_name):
920919
for r_idx_type, c_idx_type, index_name in args:
921920
testit(r_idx_type, c_idx_type, index_name)
922921

923-
@pytest.mark.parametrize('engine', _engines)
924-
@pytest.mark.parametrize('parser', expr._parsers)
925922
def test_basic_series_frame_alignment(self, engine, parser):
926-
tm.skip_if_no_ne(engine)
927-
928923
def testit(r_idx_type, c_idx_type, index_name):
929924
df = mkdf(10, 7, data_gen_f=f, r_idx_type=r_idx_type,
930925
c_idx_type=c_idx_type)
@@ -954,10 +949,7 @@ def testit(r_idx_type, c_idx_type, index_name):
954949
for r_idx_type, c_idx_type, index_name in args:
955950
testit(r_idx_type, c_idx_type, index_name)
956951

957-
@pytest.mark.parametrize('engine', _engines)
958-
@pytest.mark.parametrize('parser', expr._parsers)
959952
def test_series_frame_commutativity(self, engine, parser):
960-
tm.skip_if_no_ne(engine)
961953
args = product(self.lhs_index_types, self.index_types, ('+', '*'),
962954
('index', 'columns'))
963955

@@ -985,11 +977,7 @@ def test_series_frame_commutativity(self, engine, parser):
985977
assert_frame_equal(a, b)
986978

987979
@slow
988-
@pytest.mark.parametrize('engine', _engines)
989-
@pytest.mark.parametrize('parser', expr._parsers)
990980
def test_complex_series_frame_alignment(self, engine, parser):
991-
tm.skip_if_no_ne(engine)
992-
993981
import random
994982
args = product(self.lhs_index_types, self.index_types,
995983
self.index_types, self.index_types)
@@ -1033,10 +1021,7 @@ def test_complex_series_frame_alignment(self, engine, parser):
10331021
tm.assert_equal(res.shape, expected.shape)
10341022
assert_frame_equal(res, expected)
10351023

1036-
@pytest.mark.parametrize('engine', _engines)
1037-
@pytest.mark.parametrize('parser', expr._parsers)
10381024
def test_performance_warning_for_poor_alignment(self, engine, parser):
1039-
tm.skip_if_no_ne(engine)
10401025
df = DataFrame(randn(1000, 10))
10411026
s = Series(randn(10000))
10421027
if engine == 'numexpr':
@@ -1737,29 +1722,20 @@ def setUpClass(cls):
17371722

17381723
class TestScope(object):
17391724

1740-
@pytest.mark.parametrize('engine', _engines)
1741-
@pytest.mark.parametrize('parser', expr._parsers)
17421725
def test_global_scope(self, engine, parser):
1743-
tm.skip_if_no_ne(engine)
17441726
e = '_var_s * 2'
17451727
tm.assert_numpy_array_equal(_var_s * 2, pd.eval(e, engine=engine,
17461728
parser=parser))
17471729

1748-
@pytest.mark.parametrize('engine', _engines)
1749-
@pytest.mark.parametrize('parser', expr._parsers)
17501730
def test_no_new_locals(self, engine, parser):
1751-
tm.skip_if_no_ne(engine)
17521731
x = 1
17531732
lcls = locals().copy()
17541733
pd.eval('x + 1', local_dict=lcls, engine=engine, parser=parser)
17551734
lcls2 = locals().copy()
17561735
lcls2.pop('lcls')
17571736
tm.assert_equal(lcls, lcls2)
17581737

1759-
@pytest.mark.parametrize('engine', _engines)
1760-
@pytest.mark.parametrize('parser', expr._parsers)
17611738
def test_no_new_globals(self, engine, parser):
1762-
tm.skip_if_no_ne(engine)
17631739
x = 1
17641740
gbls = globals().copy()
17651741
pd.eval('x + 1', engine=engine, parser=parser)
@@ -1798,29 +1774,19 @@ def test_disallowed_nodes(engine, parser):
17981774
getattr(inst, ops)()
17991775

18001776

1801-
@pytest.mark.parametrize('engine', _engines)
1802-
@pytest.mark.parametrize('parser', expr._parsers)
18031777
def test_syntax_error_exprs(engine, parser):
1804-
tm.skip_if_no_ne(engine)
18051778
e = 's +'
18061779
with pytest.raises(SyntaxError):
18071780
pd.eval(e, engine=engine, parser=parser)
18081781

18091782

1810-
@pytest.mark.parametrize('engine', _engines)
1811-
@pytest.mark.parametrize('parser', expr._parsers)
18121783
def test_name_error_exprs(engine, parser):
1813-
tm.skip_if_no_ne(engine)
18141784
e = 's + t'
18151785
with tm.assertRaises(NameError):
18161786
pd.eval(e, engine=engine, parser=parser)
18171787

18181788

1819-
@pytest.mark.parametrize('engine', _engines)
1820-
@pytest.mark.parametrize('parser', expr._parsers)
18211789
def test_invalid_local_variable_reference(engine, parser):
1822-
tm.skip_if_no_ne(engine)
1823-
18241790
a, b = 1, 2
18251791
exprs = 'a + @b', '@a + b', '@a + @b'
18261792
for expr in exprs:
@@ -1832,10 +1798,7 @@ def test_invalid_local_variable_reference(engine, parser):
18321798
pd.eval(exprs, engine=engine, parser=parser)
18331799

18341800

1835-
@pytest.mark.parametrize('engine', _engines)
1836-
@pytest.mark.parametrize('parser', expr._parsers)
18371801
def test_numexpr_builtin_raises(engine, parser):
1838-
tm.skip_if_no_ne(engine)
18391802
sin, dotted_line = 1, 2
18401803
if engine == 'numexpr':
18411804
with tm.assertRaisesRegexp(NumExprClobberingError,
@@ -1846,41 +1809,29 @@ def test_numexpr_builtin_raises(engine, parser):
18461809
tm.assert_equal(res, sin + dotted_line)
18471810

18481811

1849-
@pytest.mark.parametrize('engine', _engines)
1850-
@pytest.mark.parametrize('parser', expr._parsers)
18511812
def test_bad_resolver_raises(engine, parser):
1852-
tm.skip_if_no_ne(engine)
18531813
cannot_resolve = 42, 3.0
18541814
with tm.assertRaisesRegexp(TypeError, 'Resolver of type .+'):
18551815
pd.eval('1 + 2', resolvers=cannot_resolve, engine=engine,
18561816
parser=parser)
18571817

18581818

1859-
@pytest.mark.parametrize('engine', _engines)
1860-
@pytest.mark.parametrize('parser', expr._parsers)
18611819
def test_empty_string_raises(engine, parser):
18621820
# GH 13139
1863-
tm.skip_if_no_ne(engine)
18641821
with tm.assertRaisesRegexp(ValueError, 'expr cannot be an empty string'):
18651822
pd.eval('', engine=engine, parser=parser)
18661823

18671824

1868-
@pytest.mark.parametrize('engine', _engines)
1869-
@pytest.mark.parametrize('parser', expr._parsers)
18701825
def test_more_than_one_expression_raises(engine, parser):
1871-
tm.skip_if_no_ne(engine)
18721826
with tm.assertRaisesRegexp(SyntaxError,
18731827
'only a single expression is allowed'):
18741828
pd.eval('1 + 1; 2 + 2', engine=engine, parser=parser)
18751829

18761830

1877-
@pytest.mark.parametrize('engine', _engines)
1878-
@pytest.mark.parametrize('parser', expr._parsers)
18791831
@pytest.mark.parametrize('cmp', ('and', 'or'))
18801832
@pytest.mark.parametrize('lhs', (int, float))
18811833
@pytest.mark.parametrize('rhs', (int, float))
18821834
def test_bool_ops_fails_on_scalars(lhs, cmp, rhs, engine, parser):
1883-
tm.skip_if_no_ne(engine)
18841835
gen = {int: lambda: np.random.randint(10), float: np.random.randn}
18851836

18861837
mid = gen[lhs]()
@@ -1895,20 +1846,14 @@ def test_bool_ops_fails_on_scalars(lhs, cmp, rhs, engine, parser):
18951846
pd.eval(ex, engine=engine, parser=parser)
18961847

18971848

1898-
@pytest.mark.parametrize('engine', _engines)
1899-
@pytest.mark.parametrize('parser', expr._parsers)
19001849
def test_inf(engine, parser):
1901-
tm.skip_if_no_ne(engine)
19021850
s = 'inf + 1'
19031851
expected = np.inf
19041852
result = pd.eval(s, engine=engine, parser=parser)
19051853
tm.assert_equal(result, expected)
19061854

19071855

1908-
@pytest.mark.parametrize('engine', _engines)
1909-
@pytest.mark.parametrize('parser', expr._parsers)
19101856
def test_negate_lt_eq_le(engine, parser):
1911-
tm.skip_if_no_ne(engine)
19121857
df = pd.DataFrame([[0, 10], [1, 20]], columns=['cat', 'count'])
19131858
expected = df[~(df.cat > 0)]
19141859

0 commit comments

Comments
 (0)