4
4
5
5
import operator
6
6
import pytest
7
- from itertools import product
8
7
9
8
from pandas .compat import (zip , range , lrange , StringIO )
10
9
from pandas import DataFrame , Series , Index , MultiIndex , date_range
@@ -165,7 +164,10 @@ def test_eval_resolvers_as_list(self):
165
164
166
165
class TestDataFrameQueryWithMultiIndex (tm .TestCase ):
167
166
168
- def check_query_with_named_multiindex (self , parser , engine ):
167
+ # parametrize single parser, for symmetry with other tests
168
+ @pytest .mark .parametrize ('parser' , ['pandas' ])
169
+ @pytest .mark .parametrize ('engine' , ENGINES )
170
+ def test_query_with_named_multiindex (self , parser , engine ):
169
171
tm .skip_if_no_ne (engine )
170
172
a = np .random .choice (['red' , 'green' ], size = 10 )
171
173
b = np .random .choice (['eggs' , 'ham' ], size = 10 )
@@ -214,11 +216,10 @@ def check_query_with_named_multiindex(self, parser, engine):
214
216
assert_frame_equal (res1 , exp )
215
217
assert_frame_equal (res2 , exp )
216
218
217
- def test_query_with_named_multiindex (self ):
218
- for parser , engine in product (['pandas' ], ENGINES ):
219
- yield self .check_query_with_named_multiindex , parser , engine
220
-
221
- def check_query_with_unnamed_multiindex (self , parser , engine ):
219
+ # parametrize single parser, for symmetry with other tests
220
+ @pytest .mark .parametrize ('parser' , ['pandas' ])
221
+ @pytest .mark .parametrize ('engine' , ENGINES )
222
+ def test_query_with_unnamed_multiindex (self , parser , engine ):
222
223
tm .skip_if_no_ne (engine )
223
224
a = np .random .choice (['red' , 'green' ], size = 10 )
224
225
b = np .random .choice (['eggs' , 'ham' ], size = 10 )
@@ -308,11 +309,10 @@ def check_query_with_unnamed_multiindex(self, parser, engine):
308
309
assert_frame_equal (res1 , exp )
309
310
assert_frame_equal (res2 , exp )
310
311
311
- def test_query_with_unnamed_multiindex (self ):
312
- for parser , engine in product (['pandas' ], ENGINES ):
313
- yield self .check_query_with_unnamed_multiindex , parser , engine
314
-
315
- def check_query_with_partially_named_multiindex (self , parser , engine ):
312
+ # parametrize single parser, for symmetry with other tests
313
+ @pytest .mark .parametrize ('parser' , ['pandas' ])
314
+ @pytest .mark .parametrize ('engine' , ENGINES )
315
+ def test_query_with_partially_named_multiindex (self , parser , engine ):
316
316
tm .skip_if_no_ne (engine )
317
317
a = np .random .choice (['red' , 'green' ], size = 10 )
318
318
b = np .arange (10 )
@@ -341,17 +341,10 @@ def check_query_with_partially_named_multiindex(self, parser, engine):
341
341
exp = df [ind != "red" ]
342
342
assert_frame_equal (res , exp )
343
343
344
- def test_query_with_partially_named_multiindex (self ):
345
- for parser , engine in product (['pandas' ], ENGINES ):
346
- yield (self .check_query_with_partially_named_multiindex ,
347
- parser , engine )
348
-
349
- def test_query_multiindex_get_index_resolvers (self ):
350
- for parser , engine in product (['pandas' ], ENGINES ):
351
- yield (self .check_query_multiindex_get_index_resolvers , parser ,
352
- engine )
353
-
354
- def check_query_multiindex_get_index_resolvers (self , parser , engine ):
344
+ # parametrize single parser, for symmetry with other tests
345
+ @pytest .mark .parametrize ('parser' , ['pandas' ])
346
+ @pytest .mark .parametrize ('engine' , ENGINES )
347
+ def test_query_multiindex_get_index_resolvers (self , parser , engine ):
355
348
df = mkdf (10 , 3 , r_idx_nlevels = 2 , r_idx_names = ['spam' , 'eggs' ])
356
349
resolvers = df ._get_index_resolvers ()
357
350
@@ -375,22 +368,18 @@ def to_series(mi, level):
375
368
else :
376
369
raise AssertionError ("object must be a Series or Index" )
377
370
378
- def test_raise_on_panel_with_multiindex (self ):
379
- for parser , engine in product (PARSERS , ENGINES ):
380
- yield self .check_raise_on_panel_with_multiindex , parser , engine
381
-
382
- def check_raise_on_panel_with_multiindex (self , parser , engine ):
371
+ @pytest .mark .parametrize ('parser' , PARSERS )
372
+ @pytest .mark .parametrize ('engine' , ENGINES )
373
+ def test_raise_on_panel_with_multiindex (self , parser , engine ):
383
374
tm .skip_if_no_ne ()
384
375
p = tm .makePanel (7 )
385
376
p .items = tm .makeCustomIndex (len (p .items ), nlevels = 2 )
386
377
with pytest .raises (NotImplementedError ):
387
378
pd .eval ('p + 1' , parser = parser , engine = engine )
388
379
389
- def test_raise_on_panel4d_with_multiindex (self ):
390
- for parser , engine in product (PARSERS , ENGINES ):
391
- yield self .check_raise_on_panel4d_with_multiindex , parser , engine
392
-
393
- def check_raise_on_panel4d_with_multiindex (self , parser , engine ):
380
+ @pytest .mark .parametrize ('parser' , PARSERS )
381
+ @pytest .mark .parametrize ('engine' , ENGINES )
382
+ def test_raise_on_panel4d_with_multiindex (self , parser , engine ):
394
383
tm .skip_if_no_ne ()
395
384
p4d = tm .makePanel4D (7 )
396
385
p4d .items = tm .makeCustomIndex (len (p4d .items ), nlevels = 2 )
@@ -874,7 +863,9 @@ def test_query_builtin(self):
874
863
875
864
class TestDataFrameQueryStrings (tm .TestCase ):
876
865
877
- def check_str_query_method (self , parser , engine ):
866
+ @pytest .mark .parametrize ('parser' , PARSERS )
867
+ @pytest .mark .parametrize ('engine' , ENGINES )
868
+ def test_str_query_method (self , parser , engine ):
878
869
tm .skip_if_no_ne (engine )
879
870
df = DataFrame (randn (10 , 1 ), columns = ['b' ])
880
871
df ['strings' ] = Series (list ('aabbccddee' ))
@@ -911,15 +902,9 @@ def check_str_query_method(self, parser, engine):
911
902
assert_frame_equal (res , expect )
912
903
assert_frame_equal (res , df [~ df .strings .isin (['a' ])])
913
904
914
- def test_str_query_method (self ):
915
- for parser , engine in product (PARSERS , ENGINES ):
916
- yield self .check_str_query_method , parser , engine
917
-
918
- def test_str_list_query_method (self ):
919
- for parser , engine in product (PARSERS , ENGINES ):
920
- yield self .check_str_list_query_method , parser , engine
921
-
922
- def check_str_list_query_method (self , parser , engine ):
905
+ @pytest .mark .parametrize ('parser' , PARSERS )
906
+ @pytest .mark .parametrize ('engine' , ENGINES )
907
+ def test_str_list_query_method (self , parser , engine ):
923
908
tm .skip_if_no_ne (engine )
924
909
df = DataFrame (randn (10 , 1 ), columns = ['b' ])
925
910
df ['strings' ] = Series (list ('aabbccddee' ))
@@ -958,7 +943,9 @@ def check_str_list_query_method(self, parser, engine):
958
943
parser = parser )
959
944
assert_frame_equal (res , expect )
960
945
961
- def check_query_with_string_columns (self , parser , engine ):
946
+ @pytest .mark .parametrize ('parser' , PARSERS )
947
+ @pytest .mark .parametrize ('engine' , ENGINES )
948
+ def test_query_with_string_columns (self , parser , engine ):
962
949
tm .skip_if_no_ne (engine )
963
950
df = DataFrame ({'a' : list ('aaaabbbbcccc' ),
964
951
'b' : list ('aabbccddeeff' ),
@@ -979,11 +966,9 @@ def check_query_with_string_columns(self, parser, engine):
979
966
with pytest .raises (NotImplementedError ):
980
967
df .query ('a in b and c < d' , parser = parser , engine = engine )
981
968
982
- def test_query_with_string_columns (self ):
983
- for parser , engine in product (PARSERS , ENGINES ):
984
- yield self .check_query_with_string_columns , parser , engine
985
-
986
- def check_object_array_eq_ne (self , parser , engine ):
969
+ @pytest .mark .parametrize ('parser' , PARSERS )
970
+ @pytest .mark .parametrize ('engine' , ENGINES )
971
+ def test_object_array_eq_ne (self , parser , engine ):
987
972
tm .skip_if_no_ne (engine )
988
973
df = DataFrame ({'a' : list ('aaaabbbbcccc' ),
989
974
'b' : list ('aabbccddeeff' ),
@@ -997,11 +982,9 @@ def check_object_array_eq_ne(self, parser, engine):
997
982
exp = df [df .a != df .b ]
998
983
assert_frame_equal (res , exp )
999
984
1000
- def test_object_array_eq_ne (self ):
1001
- for parser , engine in product (PARSERS , ENGINES ):
1002
- yield self .check_object_array_eq_ne , parser , engine
1003
-
1004
- def check_query_with_nested_strings (self , parser , engine ):
985
+ @pytest .mark .parametrize ('parser' , PARSERS )
986
+ @pytest .mark .parametrize ('engine' , ENGINES )
987
+ def test_query_with_nested_strings (self , parser , engine ):
1005
988
tm .skip_if_no_ne (engine )
1006
989
skip_if_no_pandas_parser (parser )
1007
990
raw = """id event timestamp
@@ -1025,11 +1008,9 @@ def check_query_with_nested_strings(self, parser, engine):
1025
1008
engine = engine )
1026
1009
assert_frame_equal (expected , res )
1027
1010
1028
- def test_query_with_nested_string (self ):
1029
- for parser , engine in product (PARSERS , ENGINES ):
1030
- yield self .check_query_with_nested_strings , parser , engine
1031
-
1032
- def check_query_with_nested_special_character (self , parser , engine ):
1011
+ @pytest .mark .parametrize ('parser' , PARSERS )
1012
+ @pytest .mark .parametrize ('engine' , ENGINES )
1013
+ def test_query_with_nested_special_character (self , parser , engine ):
1033
1014
skip_if_no_pandas_parser (parser )
1034
1015
tm .skip_if_no_ne (engine )
1035
1016
df = DataFrame ({'a' : ['a' , 'b' , 'test & test' ],
@@ -1038,12 +1019,9 @@ def check_query_with_nested_special_character(self, parser, engine):
1038
1019
expec = df [df .a == 'test & test' ]
1039
1020
assert_frame_equal (res , expec )
1040
1021
1041
- def test_query_with_nested_special_character (self ):
1042
- for parser , engine in product (PARSERS , ENGINES ):
1043
- yield (self .check_query_with_nested_special_character ,
1044
- parser , engine )
1045
-
1046
- def check_query_lex_compare_strings (self , parser , engine ):
1022
+ @pytest .mark .parametrize ('parser' , PARSERS )
1023
+ @pytest .mark .parametrize ('engine' , ENGINES )
1024
+ def test_query_lex_compare_strings (self , parser , engine ):
1047
1025
tm .skip_if_no_ne (engine = engine )
1048
1026
import operator as opr
1049
1027
@@ -1058,11 +1036,9 @@ def check_query_lex_compare_strings(self, parser, engine):
1058
1036
expected = df [func (df .X , 'd' )]
1059
1037
assert_frame_equal (res , expected )
1060
1038
1061
- def test_query_lex_compare_strings (self ):
1062
- for parser , engine in product (PARSERS , ENGINES ):
1063
- yield self .check_query_lex_compare_strings , parser , engine
1064
-
1065
- def check_query_single_element_booleans (self , parser , engine ):
1039
+ @pytest .mark .parametrize ('parser' , PARSERS )
1040
+ @pytest .mark .parametrize ('engine' , ENGINES )
1041
+ def test_query_single_element_booleans (self , parser , engine ):
1066
1042
tm .skip_if_no_ne (engine )
1067
1043
columns = 'bid' , 'bidsize' , 'ask' , 'asksize'
1068
1044
data = np .random .randint (2 , size = (1 , len (columns ))).astype (bool )
@@ -1071,11 +1047,10 @@ def check_query_single_element_booleans(self, parser, engine):
1071
1047
expected = df [df .bid & df .ask ]
1072
1048
assert_frame_equal (res , expected )
1073
1049
1074
- def test_query_single_element_booleans (self ):
1075
- for parser , engine in product (PARSERS , ENGINES ):
1076
- yield self .check_query_single_element_booleans , parser , engine
1077
-
1078
- def check_query_string_scalar_variable (self , parser , engine ):
1050
+ # parametrize single parser, for symmetry with other tests
1051
+ @pytest .mark .parametrize ('parser' , ['pandas' ])
1052
+ @pytest .mark .parametrize ('engine' , ENGINES )
1053
+ def test_query_string_scalar_variable (self , parser , engine ):
1079
1054
tm .skip_if_no_ne (engine )
1080
1055
df = pd .DataFrame ({'Symbol' : ['BUD US' , 'BUD US' , 'IBM US' , 'IBM US' ],
1081
1056
'Price' : [109.70 , 109.72 , 183.30 , 183.35 ]})
@@ -1084,10 +1059,6 @@ def check_query_string_scalar_variable(self, parser, engine):
1084
1059
r = df .query ('Symbol == @symb' , parser = parser , engine = engine )
1085
1060
assert_frame_equal (e , r )
1086
1061
1087
- def test_query_string_scalar_variable (self ):
1088
- for parser , engine in product (['pandas' ], ENGINES ):
1089
- yield self .check_query_string_scalar_variable , parser , engine
1090
-
1091
1062
1092
1063
class TestDataFrameEvalNumExprPandas (tm .TestCase ):
1093
1064
0 commit comments