@@ -333,13 +333,9 @@ def test_pickle(self, mgr):
333
333
assert not mgr2 ._is_consolidated
334
334
assert not mgr2 ._known_consolidated
335
335
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 )
343
339
mgr2 = tm .round_trip_pickle (mgr )
344
340
tm .assert_frame_equal (DataFrame (mgr ), DataFrame (mgr2 ))
345
341
@@ -427,22 +423,25 @@ def test_sparse_mixed(self):
427
423
428
424
# TODO: what to test here?
429
425
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
443
433
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
446
445
447
446
def test_as_array_datetime (self ):
448
447
mgr = create_mgr ("h: datetime-1; g: datetime-2" )
@@ -548,14 +547,37 @@ def test_invalid_ea_block(self):
548
547
create_mgr ("a: category2; b: category2" )
549
548
550
549
def test_interleave (self ):
551
-
552
550
# self
553
551
for dtype in ["f8" , "i8" , "object" , "bool" , "complex" , "M8[ns]" , "m8[ns]" ]:
554
552
mgr = create_mgr (f"a: { dtype } " )
555
553
assert mgr .as_array ().dtype == dtype
556
554
mgr = create_mgr (f"a: { dtype } ; b: { dtype } " )
557
555
assert mgr .as_array ().dtype == dtype
558
556
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 ):
559
581
# will be converted according the actual dtype of the underlying
560
582
mgr = create_mgr ("a: category" )
561
583
assert mgr .as_array ().dtype == "i8"
@@ -689,13 +711,12 @@ def test_get_bool_data(self):
689
711
def test_unicode_repr_doesnt_raise (self ):
690
712
repr (create_mgr ("b,\u05d0 : object" ))
691
713
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 ):
693
718
# 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 )
699
720
bm2 = BlockManager (bm1 .blocks [::- 1 ], bm1 .axes )
700
721
assert bm1 .equals (bm2 )
701
722
@@ -905,128 +926,142 @@ def assert_reindex_indexer_is_ok(mgr, axis, new_labels, indexer, fill_value):
905
926
906
927
907
928
class 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
915
941
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 ):
917
944
msg = "slice step cannot be zero"
918
-
919
945
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"
921
967
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 )
993
969
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
997
996
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
+ )
999
1034
1000
1035
def test_blockplacement_add (self ):
1001
1036
bpl = BlockPlacement (slice (0 , 5 ))
1002
1037
assert bpl .add (1 ).as_slice == slice (1 , 6 , 1 )
1003
1038
assert bpl .add (np .arange (5 )).as_slice == slice (0 , 10 , 2 )
1004
1039
assert list (bpl .add (np .arange (5 , 0 , - 1 ))) == [5 , 5 , 5 , 5 , 5 ]
1005
1040
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
1023
1059
1060
+ @pytest .mark .parametrize ("val" , [slice (1 , 4 ), [1 , 2 , 4 ]])
1061
+ def test_blockplacement_add_int_raises (self , val ):
1024
1062
msg = "iadd causes length change"
1025
-
1026
- with pytest .raises (ValueError , match = msg ):
1027
- BlockPlacement (slice (1 , 4 )).add (- 10 )
1028
1063
with pytest .raises (ValueError , match = msg ):
1029
- BlockPlacement ([ 1 , 2 , 4 ] ).add (- 10 )
1064
+ BlockPlacement (val ).add (- 10 )
1030
1065
1031
1066
1032
1067
class DummyElement :
0 commit comments