@@ -6771,6 +6771,108 @@ defmodule Explorer.SeriesTest do
67716771 end
67726772 end
67736773
6774+ describe "index_of/2" do
6775+ test "gets index of element in series" do
6776+ series = Series . from_list ( [ 1 , 2 ] )
6777+ assert series |> Series . index_of ( 1 ) == 0
6778+ assert series |> Series . index_of ( 2 ) == 1
6779+ assert series |> Series . index_of ( 3 ) == nil
6780+ end
6781+
6782+ test "works with floats" do
6783+ series = Series . from_list ( [ 1.0 , 2.0 ] )
6784+ assert series |> Series . index_of ( 1.0 ) == 0
6785+ assert series |> Series . index_of ( 2.0 ) == 1
6786+ assert series |> Series . index_of ( 3.0 ) == nil
6787+ end
6788+
6789+ test "works with booleans" do
6790+ series = Series . from_list ( [ false , true ] )
6791+ assert series |> Series . index_of ( false ) == 0
6792+ assert series |> Series . index_of ( true ) == 1
6793+
6794+ series = Series . from_list ( [ false ] )
6795+ assert series |> Series . index_of ( true ) == nil
6796+ end
6797+
6798+ test "works with strings" do
6799+ series = Series . from_list ( [ "a" , "b" ] )
6800+ assert series |> Series . index_of ( "a" ) == 0
6801+ assert series |> Series . index_of ( "b" ) == 1
6802+ assert series |> Series . index_of ( "c" ) == nil
6803+ end
6804+
6805+ test "works with dates" do
6806+ series = Series . from_list ( [ ~D[ 2021-01-01] , ~D[ 2021-01-02] ] )
6807+ assert series |> Series . index_of ( ~D[ 2021-01-01] ) == 0
6808+ assert series |> Series . index_of ( ~D[ 2021-01-02] ) == 1
6809+ assert series |> Series . index_of ( ~D[ 2021-01-03] ) == nil
6810+ end
6811+
6812+ test "works with times" do
6813+ series = Series . from_list ( [ ~T[ 00:00:00.000001] , ~T[ 00:00:01.000001] ] )
6814+ assert series |> Series . index_of ( ~T[ 00:00:00.000001] ) == 0
6815+ assert series |> Series . index_of ( ~T[ 00:00:01.000001] ) == 1
6816+ assert series |> Series . index_of ( ~T[ 00:00:02] ) == nil
6817+ end
6818+
6819+ test "works with datetimes" do
6820+ series = Series . from_list ( [ ~N[ 2021-01-01 00:00:00.000001] , ~N[ 2021-01-02 00:00:00.000001] ] )
6821+ assert series |> Series . index_of ( ~N[ 2021-01-01 00:00:00.000001] ) == 0
6822+ assert series |> Series . index_of ( ~N[ 2021-01-02 00:00:00.000001] ) == 1
6823+ assert series |> Series . index_of ( ~N[ 2021-01-03 00:00:00] ) == nil
6824+ end
6825+
6826+ test "works with durations" do
6827+ series = Series . from_list ( [ 1 , 2 ] , dtype: { :duration , :millisecond } )
6828+ one = % Explorer.Duration { value: 1000 , precision: :microsecond }
6829+ two = % Explorer.Duration { value: 2 , precision: :millisecond }
6830+ three = % Explorer.Duration { value: 3 , precision: :millisecond }
6831+
6832+ assert series |> Series . index_of ( one ) == 0
6833+ assert series |> Series . index_of ( two ) == 1
6834+ assert series |> Series . index_of ( three ) == nil
6835+ end
6836+
6837+ test "works with decimal" do
6838+ series = Series . from_list ( [ Decimal . new ( "1" ) , Decimal . new ( "2" ) ] )
6839+
6840+ assert series |> Series . index_of ( Decimal . new ( "1" ) ) == 0
6841+ assert series |> Series . index_of ( Decimal . new ( "2" ) ) == 1
6842+ assert series |> Series . index_of ( Decimal . new ( "3" ) ) == nil
6843+ end
6844+
6845+ test "duplicate values" do
6846+ series = Series . from_list ( [ 0 , 0 ] )
6847+
6848+ assert series |> Series . index_of ( 0 ) == 0
6849+ end
6850+
6851+ test "raises on type mismatch" do
6852+ assert_raise ArgumentError ,
6853+ "unable to get index of value: \" a\" in series of type: {:s, 64}" ,
6854+ fn -> Series . index_of ( Series . from_list ( [ 0 ] ) , "a" ) end
6855+
6856+ assert_raise ArgumentError ,
6857+ "unable to get index of value: Decimal.new(\" 0\" ) in series of type: {:s, 64}" ,
6858+ fn -> Series . index_of ( Series . from_list ( [ 0 ] ) , Decimal . new ( "0" ) ) end
6859+
6860+ assert_raise ArgumentError ,
6861+ "unable to get index of value: ~N[2021-01-03 00:00:00] in series of type: {:s, 64}" ,
6862+ fn -> Series . index_of ( Series . from_list ( [ 0 ] ) , ~N[ 2021-01-03 00:00:00] ) end
6863+
6864+ one = % Explorer.Duration { value: 1 , precision: :microsecond }
6865+
6866+ assert_raise ArgumentError ,
6867+ "unable to get index of value: #Explorer.Duration[1us] in series of type: {:s, 64}" ,
6868+ fn -> Series . index_of ( Series . from_list ( [ 1 ] ) , one ) end
6869+
6870+ assert_raise ArgumentError ,
6871+ "unable to get index of value: 1 in series of type: {:duration, :microsecond}" ,
6872+ fn -> Series . index_of ( Series . from_list ( [ one ] ) , 1 ) end
6873+ end
6874+ end
6875+
67746876 defp all_close? ( a , b , tol \\ 1.0e-8 ) do
67756877 Series . subtract ( a , b )
67766878 |> Series . abs ( )
0 commit comments