def RankListVoteMerge(self, matrix_type="rankdifference", epsilon=0.75): """ matrix_type: 'rankdifference' or 'listdifference' epsilon: PR specific value """ if self.cnt==0: return pd.DataFrame(columns=['title', 'rate', 'rank']) ranktable = self.ranktable ranktable = ranktable.dropna() methods = ranktable.columns.drop('title') D = np.zeros((ranktable.shape[0], ranktable.shape[0]), dtype=np.float32) if matrix_type=="rankdifference": fast_generate_rank_difference_matrix(ranktable[methods].values, D) elif matrix_type=="listdifference": fast_generate_list_difference_matrix(ranktable[methods].values, D) else: raise ValueError("Invalid matrix type.") tmpitemlst = pd.DataFrame({'itemid': ranktable.loc[:,'title'], 'index': range(ranktable.shape[0])}, columns=['itemid', 'index']) ranker = MarkovRank(itemlist=tmpitemlst, epsilon=epsilon) rate = ranker.rate(D) rtn = ranker.rank(rate) return rtn
def LeastViolatedMerge(self, verbose=0): if self.cnt==0: return pd.DataFrame(columns=['title', 'rate', 'rank']) ranktable = self.ranktable ranktable = ranktable.dropna() methods = ranktable.columns.drop('title') C = np.zeros((ranktable.shape[0], ranktable.shape[0]), dtype=np.float32) fast_generate_list_difference_matrix(ranktable[methods].values, C) # originally in this funciton, C[i, j] is the list count that ranked i lower than j # but here, C[i, j] should be the number of lists that i is ranked higher than j minus # the number of lists that i is ranked lower than j. C = C.T-C tmpitemlst = pd.DataFrame({'itemid': ranktable.loc[:,'title'], 'index': range(ranktable.shape[0])}, columns=['itemid', 'index']) ranker = LeastViolatedRank(itemlist=tmpitemlst, minimize=False, verbose=verbose, ascending=True) rate = ranker.rate(C) rtn = ranker.rank(rate) return rtn