У меня есть список объектов, и я хочу масштабировать значения между известными min и max. Поэтому, если известны min и max 100, 800, я хочу, чтобы результат был следующим:
{'cat' : 1, 'dog' : 3, 'chimp' : 8} -> {'cat' : 100, 'dog' : 300, 'chimp' : 800}
Реализация Python/pandas выглядит так:
def scale_size(old_value):
if numbers_df['raw_size'].max() == 1:
return 150
old_value = float(old_value)
old_max = numbers_df['raw_size'].max()
old_min = numbers_df['raw_size'].min()
new_max = 150
new_min = 20
old_range = old_max - old_min
new_range = new_max - new_min
new_value = (((old_value - old_min) * new_range) / old_range) + new_min
return int(new_value)
Вы должны создать функцию для сопоставления значений из одного диапазона в другой. Для этого вы должны сделать следующее:
(1,8)
)(100,800)
минимальный и максимальный диапазон, в который вы хотите сопоставить значения (например, (100,800)
)Я уверен, что для этого есть более эффективные и/или более чистые способы, но это может стать хорошей отправной точкой для того, что вы хотите сделать. С другой стороны, вы могли бы теоретически рассчитать минимальный и максимальный текущий диапазон, найдя наименьшие и наибольшие значения в ваших парах ключ-значение, однако это может быть не идеальным для всех случаев.
var oldVals = {'cat' : 1, 'dog' : 3, 'chimp' : 8};
function mapValues(oldMin, oldMax, newMin, newMax, values){
var newVals = {};
for (key in values){
newVals[key] = (values[key] - oldMin) * (newMax - newMin) / (oldMax - oldMin) + newMin;
}
return newVals;
}
console.log(mapValues(1, 8, 100, 800, oldVals));
Вы можете рассчитать коэффициент, используя дельта max минус минус требуемого и заданных диапазонов и вычислить новое значение для каждого значения объекта.
var object = { cat: 1, dog: 3, chimp: 8 },
min = 100,
max = 800,
minO = Math.min(...Object.values(object)),
maxO = Math.max(...Object.values(object)),
factor = (max - min) / (maxO - minO);
Object.keys(object).forEach(k => object[k] = (object[k] - minO) * factor + min);
console.log(object);
'chimp' : 12
следует масштабировать?p[key]
в цикле.