Source code for alpenglow.offline.evaluation.NdcgScore

import math
import pandas as pd
import numpy as np

[docs]def NdcgScore(test, recommendations, top_k=100): to_join=test\ .copy()\ .sort_values('score',ascending=False)\ .drop_duplicates(subset=['user','item'])[['user','item','score']]\ .rename(columns={'score':'score_test'})\ .set_index(['user','item']) recs = recommendations.join(to_join, on=['user','item'], how='inner').copy() users = set(recommendations['user']) & set(test['user']) idcgs = pd.DataFrame({'user':list(users)}).set_index('user').sort_index() ranked_test=test.sort_values('score',ascending=False).copy() ranked_test['rank']=1 ranked_test['rank']=ranked_test.groupby('user')['rank'].transform(pd.Series.cumsum) ranked_test = ranked_test[ranked_test['rank']<=top_k].copy() ranked_test['dg']=ranked_test['score']/np.log2(ranked_test['rank']+1) idcgs['idcg'] = ranked_test.groupby('user')['dg'].sum() recs['dg']=recs['score_test']/np.log2(recs['rank']+1) dcgs = recs.groupby('user')['dg'].sum() ndcgs = (dcgs/idcgs['idcg']).fillna(0) ndcg = ndcgs.mean() return ndcg