@@ -333,13 +333,9 @@ def test_pickle(self, mgr):
333333 assert not mgr2 ._is_consolidated
334334 assert not mgr2 ._known_consolidated
335335
336- def test_non_unique_pickle (self ):
337-
338- mgr = create_mgr ("a,a,a:f8" )
339- mgr2 = tm .round_trip_pickle (mgr )
340- tm .assert_frame_equal (DataFrame (mgr ), DataFrame (mgr2 ))
341-
342- mgr = create_mgr ("a: f8; a: i8" )
336+ @pytest .mark .parametrize ("mgr_string" , ["a,a,a:f8" , "a: f8; a: i8" ])
337+ def test_non_unique_pickle (self , mgr_string ):
338+ mgr = create_mgr (mgr_string )
343339 mgr2 = tm .round_trip_pickle (mgr )
344340 tm .assert_frame_equal (DataFrame (mgr ), DataFrame (mgr2 ))
345341
@@ -427,22 +423,25 @@ def test_sparse_mixed(self):
427423
428424 # TODO: what to test here?
429425
430- def test_as_array_float (self ):
431- mgr = create_mgr ("c: f4; d: f2; e: f8" )
432- assert mgr .as_array ().dtype == np .float64
433-
434- mgr = create_mgr ("c: f4; d: f2" )
435- assert mgr .as_array ().dtype == np .float32
436-
437- def test_as_array_int_bool (self ):
438- mgr = create_mgr ("a: bool-1; b: bool-2" )
439- assert mgr .as_array ().dtype == np .bool_
440-
441- mgr = create_mgr ("a: i8-1; b: i8-2; c: i4; d: i2; e: u1" )
442- assert mgr .as_array ().dtype == np .int64
426+ @pytest .mark .parametrize (
427+ "mgr_string, dtype" ,
428+ [("c: f4; d: f2" , np .float32 ), ("c: f4; d: f2; e: f8" , np .float64 )],
429+ )
430+ def test_as_array_float (self , mgr_string , dtype ):
431+ mgr = create_mgr (mgr_string )
432+ assert mgr .as_array ().dtype == dtype
443433
444- mgr = create_mgr ("c: i4; d: i2; e: u1" )
445- assert mgr .as_array ().dtype == np .int32
434+ @pytest .mark .parametrize (
435+ "mgr_string, dtype" ,
436+ [
437+ ("a: bool-1; b: bool-2" , np .bool_ ),
438+ ("a: i8-1; b: i8-2; c: i4; d: i2; e: u1" , np .int64 ),
439+ ("c: i4; d: i2; e: u1" , np .int32 ),
440+ ],
441+ )
442+ def test_as_array_int_bool (self , mgr_string , dtype ):
443+ mgr = create_mgr (mgr_string )
444+ assert mgr .as_array ().dtype == dtype
446445
447446 def test_as_array_datetime (self ):
448447 mgr = create_mgr ("h: datetime-1; g: datetime-2" )
@@ -548,14 +547,37 @@ def test_invalid_ea_block(self):
548547 create_mgr ("a: category2; b: category2" )
549548
550549 def test_interleave (self ):
551-
552550 # self
553551 for dtype in ["f8" , "i8" , "object" , "bool" , "complex" , "M8[ns]" , "m8[ns]" ]:
554552 mgr = create_mgr (f"a: { dtype } " )
555553 assert mgr .as_array ().dtype == dtype
556554 mgr = create_mgr (f"a: { dtype } ; b: { dtype } " )
557555 assert mgr .as_array ().dtype == dtype
558556
557+ @pytest .mark .parametrize (
558+ "mgr_string, dtype" ,
559+ [
560+ ("a: category" , "i8" ),
561+ ("a: category; b: category" , "i8" ),
562+ ("a: category; b: category2" , "object" ),
563+ ("a: category2" , "object" ),
564+ ("a: category2; b: category2" , "object" ),
565+ ("a: f8" , "f8" ),
566+ ("a: f8; b: i8" , "f8" ),
567+ ("a: f4; b: i8" , "f8" ),
568+ ("a: f4; b: i8; d: object" , "object" ),
569+ ("a: bool; b: i8" , "object" ),
570+ ("a: complex" , "complex" ),
571+ ("a: f8; b: category" , "object" ),
572+ ("a: M8[ns]; b: category" , "object" ),
573+ ("a: M8[ns]; b: bool" , "object" ),
574+ ("a: M8[ns]; b: i8" , "object" ),
575+ ("a: m8[ns]; b: bool" , "object" ),
576+ ("a: m8[ns]; b: i8" , "object" ),
577+ ("a: M8[ns]; b: m8[ns]" , "object" ),
578+ ],
579+ )
580+ def test_interleave_dtype (self , mgr_string , dtype ):
559581 # will be converted according the actual dtype of the underlying
560582 mgr = create_mgr ("a: category" )
561583 assert mgr .as_array ().dtype == "i8"
@@ -689,13 +711,12 @@ def test_get_bool_data(self):
689711 def test_unicode_repr_doesnt_raise (self ):
690712 repr (create_mgr ("b,\u05d0 : object" ))
691713
692- def test_equals (self ):
714+ @pytest .mark .parametrize (
715+ "mgr_string" , ["a,b,c: i8-1; d,e,f: i8-2" , "a,a,a: i8-1; b,b,b: i8-2" ]
716+ )
717+ def test_equals (self , mgr_string ):
693718 # unique items
694- bm1 = create_mgr ("a,b,c: i8-1; d,e,f: i8-2" )
695- bm2 = BlockManager (bm1 .blocks [::- 1 ], bm1 .axes )
696- assert bm1 .equals (bm2 )
697-
698- bm1 = create_mgr ("a,a,a: i8-1; b,b,b: i8-2" )
719+ bm1 = create_mgr (mgr_string )
699720 bm2 = BlockManager (bm1 .blocks [::- 1 ], bm1 .axes )
700721 assert bm1 .equals (bm2 )
701722
@@ -905,128 +926,142 @@ def assert_reindex_indexer_is_ok(mgr, axis, new_labels, indexer, fill_value):
905926
906927
907928class TestBlockPlacement :
908- def test_slice_len (self ):
909- assert len (BlockPlacement (slice (0 , 4 ))) == 4
910- assert len (BlockPlacement (slice (0 , 4 , 2 ))) == 2
911- assert len (BlockPlacement (slice (0 , 3 , 2 ))) == 2
912-
913- assert len (BlockPlacement (slice (0 , 1 , 2 ))) == 1
914- assert len (BlockPlacement (slice (1 , 0 , - 1 ))) == 1
929+ @pytest .mark .parametrize (
930+ "slc, expected" ,
931+ [
932+ (slice (0 , 4 ), 4 ),
933+ (slice (0 , 4 , 2 ), 2 ),
934+ (slice (0 , 3 , 2 ), 2 ),
935+ (slice (0 , 1 , 2 ), 1 ),
936+ (slice (1 , 0 , - 1 ), 1 ),
937+ ],
938+ )
939+ def test_slice_len (self , slc , expected ):
940+ assert len (BlockPlacement (slc )) == expected
915941
916- def test_zero_step_raises (self ):
942+ @pytest .mark .parametrize ("slc" , [slice (1 , 1 , 0 ), slice (1 , 2 , 0 )])
943+ def test_zero_step_raises (self , slc ):
917944 msg = "slice step cannot be zero"
918-
919945 with pytest .raises (ValueError , match = msg ):
920- BlockPlacement (slice (1 , 1 , 0 ))
946+ BlockPlacement (slc )
947+
948+ @pytest .mark .parametrize (
949+ "slc" ,
950+ [
951+ slice (None , None ),
952+ slice (10 , None ),
953+ slice (None , None , - 1 ),
954+ slice (None , 10 , - 1 ),
955+ # These are "unbounded" because negative index will
956+ # change depending on container shape.
957+ slice (- 1 , None ),
958+ slice (None , - 1 ),
959+ slice (- 1 , - 1 ),
960+ slice (- 1 , None , - 1 ),
961+ slice (None , - 1 , - 1 ),
962+ slice (- 1 , - 1 , - 1 ),
963+ ],
964+ )
965+ def test_unbounded_slice_raises (self , slc ):
966+ msg = "unbounded slice"
921967 with pytest .raises (ValueError , match = msg ):
922- BlockPlacement (slice (1 , 2 , 0 ))
923-
924- def test_unbounded_slice_raises (self ):
925- def assert_unbounded_slice_error (slc ):
926- with pytest .raises (ValueError , match = "unbounded slice" ):
927- BlockPlacement (slc )
928-
929- assert_unbounded_slice_error (slice (None , None ))
930- assert_unbounded_slice_error (slice (10 , None ))
931- assert_unbounded_slice_error (slice (None , None , - 1 ))
932- assert_unbounded_slice_error (slice (None , 10 , - 1 ))
933-
934- # These are "unbounded" because negative index will change depending on
935- # container shape.
936- assert_unbounded_slice_error (slice (- 1 , None ))
937- assert_unbounded_slice_error (slice (None , - 1 ))
938- assert_unbounded_slice_error (slice (- 1 , - 1 ))
939- assert_unbounded_slice_error (slice (- 1 , None , - 1 ))
940- assert_unbounded_slice_error (slice (None , - 1 , - 1 ))
941- assert_unbounded_slice_error (slice (- 1 , - 1 , - 1 ))
942-
943- def test_not_slice_like_slices (self ):
944- def assert_not_slice_like (slc ):
945- assert not BlockPlacement (slc ).is_slice_like
946-
947- assert_not_slice_like (slice (0 , 0 ))
948- assert_not_slice_like (slice (100 , 0 ))
949-
950- assert_not_slice_like (slice (100 , 100 , - 1 ))
951- assert_not_slice_like (slice (0 , 100 , - 1 ))
952-
953- assert not BlockPlacement (slice (0 , 0 )).is_slice_like
954- assert not BlockPlacement (slice (100 , 100 )).is_slice_like
955-
956- def test_array_to_slice_conversion (self ):
957- def assert_as_slice_equals (arr , slc ):
958- assert BlockPlacement (arr ).as_slice == slc
959-
960- assert_as_slice_equals ([0 ], slice (0 , 1 , 1 ))
961- assert_as_slice_equals ([100 ], slice (100 , 101 , 1 ))
962-
963- assert_as_slice_equals ([0 , 1 , 2 ], slice (0 , 3 , 1 ))
964- assert_as_slice_equals ([0 , 5 , 10 ], slice (0 , 15 , 5 ))
965- assert_as_slice_equals ([0 , 100 ], slice (0 , 200 , 100 ))
966-
967- assert_as_slice_equals ([2 , 1 ], slice (2 , 0 , - 1 ))
968-
969- def test_not_slice_like_arrays (self ):
970- def assert_not_slice_like (arr ):
971- assert not BlockPlacement (arr ).is_slice_like
972-
973- assert_not_slice_like ([])
974- assert_not_slice_like ([- 1 ])
975- assert_not_slice_like ([- 1 , - 2 , - 3 ])
976- assert_not_slice_like ([- 10 ])
977- assert_not_slice_like ([- 1 ])
978- assert_not_slice_like ([- 1 , 0 , 1 , 2 ])
979- assert_not_slice_like ([- 2 , 0 , 2 , 4 ])
980- assert_not_slice_like ([1 , 0 , - 1 ])
981- assert_not_slice_like ([1 , 1 , 1 ])
982-
983- def test_slice_iter (self ):
984- assert list (BlockPlacement (slice (0 , 3 ))) == [0 , 1 , 2 ]
985- assert list (BlockPlacement (slice (0 , 0 ))) == []
986- assert list (BlockPlacement (slice (3 , 0 ))) == []
987-
988- def test_slice_to_array_conversion (self ):
989- def assert_as_array_equals (slc , asarray ):
990- tm .assert_numpy_array_equal (
991- BlockPlacement (slc ).as_array , np .asarray (asarray , dtype = np .int64 )
992- )
968+ BlockPlacement (slc )
993969
994- assert_as_array_equals (slice (0 , 3 ), [0 , 1 , 2 ])
995- assert_as_array_equals (slice (0 , 0 ), [])
996- assert_as_array_equals (slice (3 , 0 ), [])
970+ @pytest .mark .parametrize (
971+ "slc" ,
972+ [
973+ slice (0 , 0 ),
974+ slice (100 , 0 ),
975+ slice (100 , 100 ),
976+ slice (100 , 100 , - 1 ),
977+ slice (0 , 100 , - 1 ),
978+ ],
979+ )
980+ def test_not_slice_like_slices (self , slc ):
981+ assert not BlockPlacement (slc ).is_slice_like
982+
983+ @pytest .mark .parametrize (
984+ "arr, slc" ,
985+ [
986+ ([0 ], slice (0 , 1 , 1 )),
987+ ([100 ], slice (100 , 101 , 1 )),
988+ ([0 , 1 , 2 ], slice (0 , 3 , 1 )),
989+ ([0 , 5 , 10 ], slice (0 , 15 , 5 )),
990+ ([0 , 100 ], slice (0 , 200 , 100 )),
991+ ([2 , 1 ], slice (2 , 0 , - 1 )),
992+ ],
993+ )
994+ def test_array_to_slice_conversion (self , arr , slc ):
995+ assert BlockPlacement (arr ).as_slice == slc
997996
998- assert_as_array_equals (slice (3 , 0 , - 1 ), [3 , 2 , 1 ])
997+ @pytest .mark .parametrize (
998+ "arr" ,
999+ [
1000+ [],
1001+ [- 1 ],
1002+ [- 1 , - 2 , - 3 ],
1003+ [- 10 ],
1004+ [- 1 ],
1005+ [- 1 , 0 , 1 , 2 ],
1006+ [- 2 , 0 , 2 , 4 ],
1007+ [1 , 0 , - 1 ],
1008+ [1 , 1 , 1 ],
1009+ ],
1010+ )
1011+ def test_not_slice_like_arrays (self , arr ):
1012+ assert not BlockPlacement (arr ).is_slice_like
1013+
1014+ @pytest .mark .parametrize (
1015+ "slc, expected" ,
1016+ [(slice (0 , 3 ), [0 , 1 , 2 ]), (slice (0 , 0 ), []), (slice (3 , 0 ), [])],
1017+ )
1018+ def test_slice_iter (self , slc , expected ):
1019+ assert list (BlockPlacement (slc )) == expected
1020+
1021+ @pytest .mark .parametrize (
1022+ "slc, arr" ,
1023+ [
1024+ (slice (0 , 3 ), [0 , 1 , 2 ]),
1025+ (slice (0 , 0 ), []),
1026+ (slice (3 , 0 ), []),
1027+ (slice (3 , 0 , - 1 ), [3 , 2 , 1 ]),
1028+ ],
1029+ )
1030+ def test_slice_to_array_conversion (self , slc , arr ):
1031+ tm .assert_numpy_array_equal (
1032+ BlockPlacement (slc ).as_array , np .asarray (arr , dtype = np .int64 )
1033+ )
9991034
10001035 def test_blockplacement_add (self ):
10011036 bpl = BlockPlacement (slice (0 , 5 ))
10021037 assert bpl .add (1 ).as_slice == slice (1 , 6 , 1 )
10031038 assert bpl .add (np .arange (5 )).as_slice == slice (0 , 10 , 2 )
10041039 assert list (bpl .add (np .arange (5 , 0 , - 1 ))) == [5 , 5 , 5 , 5 , 5 ]
10051040
1006- def test_blockplacement_add_int (self ):
1007- def assert_add_equals (val , inc , result ):
1008- assert list (BlockPlacement (val ).add (inc )) == result
1009-
1010- assert_add_equals (slice (0 , 0 ), 0 , [])
1011- assert_add_equals (slice (1 , 4 ), 0 , [1 , 2 , 3 ])
1012- assert_add_equals (slice (3 , 0 , - 1 ), 0 , [3 , 2 , 1 ])
1013- assert_add_equals ([1 , 2 , 4 ], 0 , [1 , 2 , 4 ])
1014-
1015- assert_add_equals (slice (0 , 0 ), 10 , [])
1016- assert_add_equals (slice (1 , 4 ), 10 , [11 , 12 , 13 ])
1017- assert_add_equals (slice (3 , 0 , - 1 ), 10 , [13 , 12 , 11 ])
1018- assert_add_equals ([1 , 2 , 4 ], 10 , [11 , 12 , 14 ])
1019-
1020- assert_add_equals (slice (0 , 0 ), - 1 , [])
1021- assert_add_equals (slice (1 , 4 ), - 1 , [0 , 1 , 2 ])
1022- assert_add_equals ([1 , 2 , 4 ], - 1 , [0 , 1 , 3 ])
1041+ @pytest .mark .parametrize (
1042+ "val, inc, expected" ,
1043+ [
1044+ (slice (0 , 0 ), 0 , []),
1045+ (slice (1 , 4 ), 0 , [1 , 2 , 3 ]),
1046+ (slice (3 , 0 , - 1 ), 0 , [3 , 2 , 1 ]),
1047+ ([1 , 2 , 4 ], 0 , [1 , 2 , 4 ]),
1048+ (slice (0 , 0 ), 10 , []),
1049+ (slice (1 , 4 ), 10 , [11 , 12 , 13 ]),
1050+ (slice (3 , 0 , - 1 ), 10 , [13 , 12 , 11 ]),
1051+ ([1 , 2 , 4 ], 10 , [11 , 12 , 14 ]),
1052+ (slice (0 , 0 ), - 1 , []),
1053+ (slice (1 , 4 ), - 1 , [0 , 1 , 2 ]),
1054+ ([1 , 2 , 4 ], - 1 , [0 , 1 , 3 ]),
1055+ ],
1056+ )
1057+ def test_blockplacement_add_int (self , val , inc , expected ):
1058+ assert list (BlockPlacement (val ).add (inc )) == expected
10231059
1060+ @pytest .mark .parametrize ("val" , [slice (1 , 4 ), [1 , 2 , 4 ]])
1061+ def test_blockplacement_add_int_raises (self , val ):
10241062 msg = "iadd causes length change"
1025-
1026- with pytest .raises (ValueError , match = msg ):
1027- BlockPlacement (slice (1 , 4 )).add (- 10 )
10281063 with pytest .raises (ValueError , match = msg ):
1029- BlockPlacement ([ 1 , 2 , 4 ] ).add (- 10 )
1064+ BlockPlacement (val ).add (- 10 )
10301065
10311066
10321067class DummyElement :
0 commit comments