@@ -386,33 +386,53 @@ def test_merge_series(scalars_dfs, merge_how):
386386
387387 assert_pandas_df_equal (bf_result , pd_result , ignore_order = True )
388388
389-
390- def test_cut (scalars_dfs ):
389+ @pytest .mark .parametrize (
390+ ("right" ),
391+ [
392+ pytest .param (True ),
393+ pytest .param (False ),
394+ ],
395+ )
396+ def test_cut (scalars_dfs , right ):
391397 scalars_df , scalars_pandas_df = scalars_dfs
392398
393- pd_result = pd .cut (scalars_pandas_df ["float64_col" ], 5 , labels = False )
394- bf_result = bpd .cut (scalars_df ["float64_col" ], 5 , labels = False )
399+ pd_result = pd .cut (scalars_pandas_df ["float64_col" ], 5 , labels = False , right = right )
400+ bf_result = bpd .cut (scalars_df ["float64_col" ], 5 , labels = False , right = right )
395401
396402 # make sure the result is a supported dtype
397403 assert bf_result .dtype == bpd .Int64Dtype ()
398404 pd_result = pd_result .astype ("Int64" )
399405 pd .testing .assert_series_equal (bf_result .to_pandas (), pd_result )
400406
401407
402- def test_cut_default_labels (scalars_dfs ):
408+ @pytest .mark .parametrize (
409+ ("right" ),
410+ [
411+ pytest .param (True ),
412+ pytest .param (False ),
413+ ],
414+ )
415+ def test_cut_default_labels (scalars_dfs , right ):
403416 scalars_df , scalars_pandas_df = scalars_dfs
404417
405- pd_result = pd .cut (scalars_pandas_df ["float64_col" ], 5 )
406- bf_result = bpd .cut (scalars_df ["float64_col" ], 5 ).to_pandas ()
418+ pd_result = pd .cut (scalars_pandas_df ["float64_col" ], 5 , right = right )
419+ bf_result = bpd .cut (scalars_df ["float64_col" ], 5 , right = right ).to_pandas ()
407420
408421 # Convert to match data format
422+ pd_interval = pd_result .cat .categories [pd_result .cat .codes ]
423+ if pd_interval .closed == "left" :
424+ left_key = "left_inclusive"
425+ right_key = "right_exclusive"
426+ else :
427+ left_key = "left_exclusive"
428+ right_key = "right_inclusive"
409429 pd_result_converted = pd .Series (
410430 [
411- {"left_exclusive" : interval .left , "right_inclusive" : interval .right }
431+ {left_key : interval .left , right_key : interval .right }
412432 if pd .notna (val )
413433 else pd .NA
414434 for val , interval in zip (
415- pd_result , pd_result . cat . categories [ pd_result . cat . codes ]
435+ pd_result , pd_interval
416436 )
417437 ],
418438 name = pd_result .name ,
@@ -424,27 +444,36 @@ def test_cut_default_labels(scalars_dfs):
424444
425445
426446@pytest .mark .parametrize (
427- ("breaks" ,),
447+ ("breaks" , "right" ),
428448 [
429- ([0 , 5 , 10 , 15 , 20 , 100 , 1000 ],), # ints
430- ([0.5 , 10.5 , 15.5 , 20.5 , 100.5 , 1000.5 ],), # floats
431- ([0 , 5 , 10.5 , 15.5 , 20 , 100 , 1000.5 ],), # mixed
449+ pytest .param ([0 , 5 , 10 , 15 , 20 , 100 , 1000 ], True , id = "int_right" ),
450+ pytest .param ([0 , 5 , 10 , 15 , 20 , 100 , 1000 ], False , id = "int_left" ),
451+ pytest .param ([0.5 , 10.5 , 15.5 , 20.5 , 100.5 , 1000.5 ], False , id = "float_left" ),
452+ pytest .param ([0 , 5 , 10.5 , 15.5 , 20 , 100 , 1000.5 ], True , id = "mixed_right" ),
432453 ],
433454)
434- def test_cut_numeric_breaks (scalars_dfs , breaks ):
455+ def test_cut_numeric_breaks (scalars_dfs , breaks , right ):
435456 scalars_df , scalars_pandas_df = scalars_dfs
436457
437- pd_result = pd .cut (scalars_pandas_df ["float64_col" ], breaks )
438- bf_result = bpd .cut (scalars_df ["float64_col" ], breaks ).to_pandas ()
458+ pd_result = pd .cut (scalars_pandas_df ["float64_col" ], breaks , right = right )
459+ bf_result = bpd .cut (scalars_df ["float64_col" ], breaks , right = right ).to_pandas ()
439460
440461 # Convert to match data format
462+ pd_interval = pd_result .cat .categories [pd_result .cat .codes ]
463+ if pd_interval .closed == "left" :
464+ left_key = "left_inclusive"
465+ right_key = "right_exclusive"
466+ else :
467+ left_key = "left_exclusive"
468+ right_key = "right_inclusive"
469+
441470 pd_result_converted = pd .Series (
442471 [
443- {"left_exclusive" : interval .left , "right_inclusive" : interval .right }
472+ {left_key : interval .left , right_key : interval .right }
444473 if pd .notna (val )
445474 else pd .NA
446475 for val , interval in zip (
447- pd_result , pd_result . cat . categories [ pd_result . cat . codes ]
476+ pd_result , pd_interval
448477 )
449478 ],
450479 name = pd_result .name ,
@@ -476,28 +505,38 @@ def test_cut_errors(scalars_dfs, bins):
476505
477506
478507@pytest .mark .parametrize (
479- ("bins" ,),
508+ ("bins" , "right" ),
480509 [
481- ([(- 5 , 2 ), (2 , 3 ), (- 3000 , - 10 )],),
482- (pd .IntervalIndex .from_tuples ([(1 , 2 ), (2 , 3 ), (4 , 5 )]),),
510+ pytest .param ([(- 5 , 2 ), (2 , 3 ), (- 3000 , - 10 )], True , id = "tuple_right" ),
511+ pytest .param ([(- 5 , 2 ), (2 , 3 ), (- 3000 , - 10 )], False , id = "tuple_left" ),
512+ pytest .param (pd .IntervalIndex .from_tuples ([(1 , 2 ), (2 , 3 ), (4 , 5 )]), True , id = "interval_right" ),
513+ pytest .param (pd .IntervalIndex .from_tuples ([(1 , 2 ), (2 , 3 ), (4 , 5 )]), False , id = "interval_left" ),
483514 ],
484515)
485- def test_cut_with_interval (scalars_dfs , bins ):
516+ def test_cut_with_interval (scalars_dfs , bins , right ):
486517 scalars_df , scalars_pandas_df = scalars_dfs
487- bf_result = bpd .cut (scalars_df ["int64_too" ], bins , labels = False ).to_pandas ()
518+ bf_result = bpd .cut (scalars_df ["int64_too" ], bins , labels = False , right = right ).to_pandas ()
488519
489520 if isinstance (bins , list ):
490521 bins = pd .IntervalIndex .from_tuples (bins )
491- pd_result = pd .cut (scalars_pandas_df ["int64_too" ], bins , labels = False )
522+ pd_result = pd .cut (scalars_pandas_df ["int64_too" ], bins , labels = False , right = right )
492523
493524 # Convert to match data format
525+ pd_interval = pd_result .cat .categories [pd_result .cat .codes ]
526+ if pd_interval .closed == "left" :
527+ left_key = "left_inclusive"
528+ right_key = "right_exclusive"
529+ else :
530+ left_key = "left_exclusive"
531+ right_key = "right_inclusive"
532+
494533 pd_result_converted = pd .Series (
495534 [
496- {"left_exclusive" : interval .left , "right_inclusive" : interval .right }
535+ {left_key : interval .left , right_key : interval .right }
497536 if pd .notna (val )
498537 else pd .NA
499538 for val , interval in zip (
500- pd_result , pd_result . cat . categories [ pd_result . cat . codes ]
539+ pd_result , pd_interval
501540 )
502541 ],
503542 name = pd_result .name ,
0 commit comments