Нулевые значения в матрице корреляции Pandas, сгруппированные по размеру [дубликат]

Eval был создан для таких условий.

Если вам нужен другой метод, вам нужно будет использовать чистую реализацию Javascript точной вещи, которую будет делать eval.

  • Трудная часть не является разбор чисел и операторов
  • Жесткая часть - , применяющая порядок работы и рекурсивного управления

Вот быстрый базовый пример: я придумал ( обновленный (2011-06-26): чистые w / поля ввода). http://jsfiddle.net/vol7ron/6cdfA/

Примечание:

  • это только обрабатывает основные операторы
  • , он не проверяет правильность чисел (пример: деление на ноль)
  • имеет
  • по всем этим причинам и более, eval будет лучшим выбором

Edit (2017-05-26) для использования SO Snippet:

function calculate (input) {var f = {add: '+', sub: '-' , div: '/', mlt: '*', mod: '%', exp: '^'}; // Создаем массив для порядка работы и приоритета f.ooo = [[[f.mlt], [f.div], [f.mod], [f.exp]], [[f.add], [f .]]]; input = input.replace (/ [^ 0-9% ^ * \ / () \ - +.] / g, ''); // очистка ненужных символов var output; for (var i = 0, n = f.ooo.length; i & lt; n; i ++) {// Регулярное выражение для поиска операторов между плавающими числами или целыми числами var re = new RegExp ('(\\ d + \\. ? \\ d *) ([\\ '+ f.ooo [i] .join (' \\ ') +']) (\\ d + \\.? \\ d *) '); re.lastIndex = 0; // принимаем меры предосторожности и перезагружаем re start pos // Loop, пока еще есть расчет для уровня приоритета while (re.test (input)) {output = _calculate (RegExp. $ 1, RegExp. $ 2, RegExp. $ 3); if (isNaN (output) ||! isFinite (output)) return output; // выходим раньше, если не вводим число = input.replace (re, output); }} return output; function _calculate (a, op, b) {a = a * 1; b = b * 1; switch (op) {case f.add: return a + b; ломать; case f.sub: return a - b; ломать; case f.div: return a / b; ломать; case f.mlt: вернуть a * b; ломать; case f.mod: return a% b; ломать; case f.exp: return Math.pow (a, b); ломать; default: null; }}} label {display: inline-block; ширина: 4em; } & lt; div & gt; & lt; label for = "input" & gt; Уравнение: & lt; / label & gt; & lt; input type = "text" id = "input" value = "12/5 * 9 + 9.4 * 2-1" / & gt; & lt; input type = "button" value = "calculate" onclick = "getElementById ('result'). value = calculate (getElementById ('input'). value)" / & gt; & Lt; / дел & GT; & Lt; & DIV GT; & lt; label for = "result" & gt; Результат: & lt; / label & gt; & lt; input type = "text" id = "result" / & gt; & lt; / div & gt;

1
задан user2366975 26 March 2014 в 11:33
поделиться

1 ответ

Эти столбцы теперь не меняются по значению, да

Как указывает Джорис, вы ожидали NaN, если значения не меняются. Чтобы понять, почему взглянуть на формулу корреляции:

cor(i,j) = cov(i,j)/[stdev(i)*stdev(j)]

Если значения i-й или j-й переменной не меняются, то соответствующее стандартное отклонение будет равно нулю, а также будет знаменатель дроби. Таким образом, корреляция будет NaN.

4
ответ дан gibbone 17 August 2018 в 09:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: