1+ from math import isclose
2+
13from whylogs .core .stubs import pd
24from whylogs .experimental .api .logger import log_batch_ranking_metrics
35
@@ -15,37 +17,42 @@ def test_log_batch_ranking_metrics_single_simple():
1517 }
1618 )
1719 result = log_batch_ranking_metrics (
18- k = 1 , data = single_df , prediction_column = "raw_predictions" , target_column = "raw_targets"
20+ data = single_df , prediction_column = "raw_predictions" , target_column = "raw_targets" , convert_non_numeric = True
1921 )
2022 pandas_summary = result .view ().to_pandas ()
2123
22- k = 1
2324 column_names = [
24- "mean_average_precision_k_" + str ( k ) ,
25- "accuracy_k_" + str ( k ) ,
25+ "mean_average_precision" ,
26+ "accuracy" ,
2627 "mean_reciprocal_rank" ,
27- "precision_k_" + str ( k ) ,
28- "recall_k_" + str ( k ) ,
28+ "precision" ,
29+ "recall" ,
2930 "top_rank" ,
30- "average_precision_k_" + str (k ),
31+ "average_precision" ,
32+ "norm_dis_cumul_gain" ,
3133 ]
3234 for col in column_names :
3335 assert col in pandas_summary .index
34- assert pandas_summary .loc ["mean_average_precision_k_" + str ( k ) , "counts/n" ] == 1
35- assert pandas_summary .loc ["accuracy_k_" + str ( k ) , "counts/n" ] == 1
36+ assert pandas_summary .loc ["mean_average_precision" , "counts/n" ] == 1
37+ assert pandas_summary .loc ["accuracy" , "counts/n" ] == 1
3638 assert pandas_summary .loc ["mean_reciprocal_rank" , "counts/n" ] == 1
37- assert pandas_summary .loc ["precision_k_" + str ( k ) , "counts/n" ] == 4
38- assert pandas_summary .loc ["recall_k_" + str ( k ) , "counts/n" ] == 4
39+ assert pandas_summary .loc ["precision" , "counts/n" ] == 4
40+ assert pandas_summary .loc ["recall" , "counts/n" ] == 4
3941 assert pandas_summary .loc ["top_rank" , "counts/n" ] == 4
40- assert pandas_summary .loc ["average_precision_k_" + str (k ), "counts/n" ] == 4
42+ assert pandas_summary .loc ["average_precision" , "counts/n" ] == 4
43+ assert pandas_summary .loc ["norm_dis_cumul_gain" , "counts/n" ] == 1
44+ assert pandas_summary .loc ["average_precision" , "counts/n" ] == 4
45+ assert pandas_summary .loc ["norm_dis_cumul_gain" , "counts/n" ] == 1
4146
4247
4348def test_log_batch_ranking_metrics_binary_simple ():
4449 binary_df = pd .DataFrame (
4550 {"raw_predictions" : [[True , False , True ], [False , False , False ], [True , True , False ], [False , True , False ]]}
4651 )
4752
48- result = log_batch_ranking_metrics (k = 2 , data = binary_df , prediction_column = "raw_predictions" )
53+ result = log_batch_ranking_metrics (
54+ data = binary_df , prediction_column = "raw_predictions" , k = 2 , convert_non_numeric = True
55+ )
4956 pandas_summary = result .view ().to_pandas ()
5057
5158 k = 2
@@ -57,6 +64,7 @@ def test_log_batch_ranking_metrics_binary_simple():
5764 "recall_k_" + str (k ),
5865 "top_rank" ,
5966 "average_precision_k_" + str (k ),
67+ "norm_dis_cumul_gain_k_" + str (k ),
6068 ]
6169 for col in column_names :
6270 assert col in pandas_summary .index
@@ -67,6 +75,7 @@ def test_log_batch_ranking_metrics_binary_simple():
6775 assert pandas_summary .loc ["recall_k_" + str (k ), "counts/n" ] == 4
6876 assert pandas_summary .loc ["top_rank" , "counts/n" ] == 4
6977 assert pandas_summary .loc ["average_precision_k_" + str (k ), "counts/n" ] == 4
78+ assert pandas_summary .loc ["norm_dis_cumul_gain_k_" + str (k ), "counts/n" ] == 1
7079
7180
7281def test_log_batch_ranking_metrics_multiple_simple ():
@@ -81,13 +90,17 @@ def test_log_batch_ranking_metrics_multiple_simple():
8190 ],
8291 }
8392 )
93+ k = 4
8494
8595 result = log_batch_ranking_metrics (
86- k = 3 , data = multiple_df , prediction_column = "raw_predictions" , target_column = "raw_targets"
96+ data = multiple_df ,
97+ prediction_column = "raw_predictions" ,
98+ target_column = "raw_targets" ,
99+ k = k ,
100+ convert_non_numeric = True ,
87101 )
88102 pandas_summary = result .view ().to_pandas ()
89103
90- k = 3
91104 column_names = [
92105 "mean_average_precision_k_" + str (k ),
93106 "accuracy_k_" + str (k ),
@@ -96,6 +109,7 @@ def test_log_batch_ranking_metrics_multiple_simple():
96109 "recall_k_" + str (k ),
97110 "top_rank" ,
98111 "average_precision_k_" + str (k ),
112+ "norm_dis_cumul_gain_k_" + str (k ),
99113 ]
100114 for col in column_names :
101115 assert col in pandas_summary .index
@@ -106,3 +120,67 @@ def test_log_batch_ranking_metrics_multiple_simple():
106120 assert pandas_summary .loc ["recall_k_" + str (k ), "counts/n" ] == 4
107121 assert pandas_summary .loc ["top_rank" , "counts/n" ] == 4
108122 assert pandas_summary .loc ["average_precision_k_" + str (k ), "counts/n" ] == 4
123+ assert pandas_summary .loc ["norm_dis_cumul_gain_k_" + str (k ), "counts/n" ] == 1
124+
125+ assert isclose (pandas_summary .loc [f"norm_dis_cumul_gain_k_{ k } " , "distribution/median" ], 0.76244 , abs_tol = 0.00001 )
126+
127+
128+ def test_log_batch_ranking_metrics_default_target ():
129+ multiple_df = pd .DataFrame ({"raw_predictions" : [[3 , 2 , 3 , 0 , 1 , 2 , 3 , 2 ]]})
130+
131+ result = log_batch_ranking_metrics (
132+ data = multiple_df , prediction_column = "raw_predictions" , k = 3 , convert_non_numeric = True
133+ )
134+ pandas_summary = result .view ().to_pandas ()
135+
136+ k = 3
137+ column_names = [
138+ "mean_average_precision_k_" + str (k ),
139+ "accuracy_k_" + str (k ),
140+ "mean_reciprocal_rank" ,
141+ "precision_k_" + str (k ),
142+ "recall_k_" + str (k ),
143+ "top_rank" ,
144+ "average_precision_k_" + str (k ),
145+ "norm_dis_cumul_gain_k_" + str (k ),
146+ ]
147+ for col in column_names :
148+ assert col in pandas_summary .index
149+ assert pandas_summary .loc ["mean_average_precision_k_" + str (k ), "counts/n" ] == 1
150+ assert pandas_summary .loc ["accuracy_k_" + str (k ), "counts/n" ] == 1
151+ assert pandas_summary .loc ["mean_reciprocal_rank" , "counts/n" ] == 1
152+ assert pandas_summary .loc ["precision_k_" + str (k ), "counts/n" ] == 1
153+ assert pandas_summary .loc ["recall_k_" + str (k ), "counts/n" ] == 1
154+ assert pandas_summary .loc ["top_rank" , "counts/n" ] == 1
155+ assert pandas_summary .loc ["average_precision_k_" + str (k ), "counts/n" ] == 1
156+ assert pandas_summary .loc ["norm_dis_cumul_gain_k_" + str (k ), "counts/n" ] == 1
157+
158+
159+ def test_log_batch_ranking_metrics_ranking_ndcg_wikipedia ():
160+ # From https://en.wikipedia.org/wiki/Discounted_cumulative_gain#Example
161+ ranking_df = pd .DataFrame ({"targets" : [[3 , 2 , 3 , 0 , 1 , 2 , 3 , 2 ]], "predictions" : [[7 , 6 , 5 , 4 , 3 , 2 , 1 , 0 ]]})
162+
163+ result = log_batch_ranking_metrics (data = ranking_df , prediction_column = "predictions" , target_column = "targets" , k = 6 )
164+ pandas_summary = result .view ().to_pandas ()
165+
166+ assert isclose (pandas_summary .loc ["norm_dis_cumul_gain_k_6" , "distribution/median" ], 0.785 , abs_tol = 0.01 )
167+
168+
169+ def test_log_batch_ranking_metrics_ranking_ndcg_sklearn ():
170+ # From https://scikit-learn.org/stable/modules/generated/sklearn.metrics.ndcg_score.html
171+ ranking_df = pd .DataFrame ({"predictions" : [[0.1 , 0.2 , 0.3 , 4 , 70 ]], "targets" : [[10 , 0 , 0 , 1 , 5 ]]})
172+
173+ result = log_batch_ranking_metrics (data = ranking_df , prediction_column = "predictions" , target_column = "targets" )
174+ pandas_summary = result .view ().to_pandas ()
175+
176+ assert isclose (pandas_summary .loc ["norm_dis_cumul_gain" , "distribution/median" ], 0.69569 , abs_tol = 0.00001 )
177+
178+
179+ def test_log_batch_ranking_metrics_ranking_ndcg_withk_sklearn ():
180+ # From https://scikit-learn.org/stable/modules/generated/sklearn.metrics.ndcg_score.html
181+ ranking_df = pd .DataFrame ({"predictions" : [[0.05 , 1.1 , 1.0 , 0.5 , 0.0 ]], "targets" : [[10 , 0 , 0 , 1 , 5 ]]})
182+
183+ result = log_batch_ranking_metrics (data = ranking_df , prediction_column = "predictions" , target_column = "targets" , k = 4 )
184+ pandas_summary = result .view ().to_pandas ()
185+
186+ assert isclose (pandas_summary .loc ["norm_dis_cumul_gain_k_4" , "distribution/median" ], 0.35202 , abs_tol = 0.00001 )
0 commit comments