«Мне нужно поменять местами присвоенные ранги, чтобы наибольшему числу был присвоен ранг 1»
Это стандартное поведение rankdata.
«Пусть работает следующее, за исключением случаев, когда он неправильно обрабатывает связи»
Поведение в отношении связей обрабатывается главным образом через аргумент метода. См. Список примеров ниже ( source ):
>>> from scipy.stats import rankdata
>>> rankdata([0, 2, 3, 2])
array([ 1. , 2.5, 4. , 2.5])
>>> rankdata([0, 2, 3, 2], method='min')
array([ 1., 2., 4., 2.])
>>> rankdata([0, 2, 3, 2], method='max')
array([ 1., 3., 4., 3.])
>>> rankdata([0, 2, 3, 2], method='dense')
array([ 1., 2., 3., 2.])
>>> rankdata([0, 2, 3, 2], method='ordinal')
array([ 1., 2., 4., 3.])
"возвращает число вместо числа с плавающей точкой"
Я не уверен, как ты это делаешь.
Единственное, о чем я могу подумать, это примечание, указанное в документации:
Примечания
Все типы с плавающей точкой преобразуются в numpy.float64 до
рейтинг. Это может привести к ложным связям, если входной массив с плавающей точкой
имеет более широкий тип данных, чем numpy.float64 (например, numpy.float128).