Подтвердить что ты не робот

Каковы функции reduceAdd, reduceSum, reduceRemove в crossfilter? Как их использовать?

Может кто-нибудь объяснить простыми словами, как уменьшить функцию с помощью своих аргументов reduceAdd, reduceSum, reduceRemove работает в crossfilter?

4b9b3361

Ответ 1

Помните, что сокращение карты уменьшает набор данных с помощью ключей определенного измерения. Например, можно использовать экземпляр crossfilter с записями:

[
    { name: "Gates",      age: 57,   worth: 72000000000, gender: "m" },
    { name: "Buffet",     age: 59,   worth: 58000000000, gender: "m" },
    { name: "Winfrey",    age: 83,   worth:  2900000000, gender: "f"   },
    { name: "Bloomberg",  age: 71,   worth: 31000000000, gender: "m"  },
    { name: "Walton",     age: 64,   worth: 33000000000, gender: "f"  },
]

и размерность, возраст, стоимость и пол. Мы уменьшим размерность пола с помощью метода сокращения.

Сначала мы определяем методы reduceAdd, reduceRemove и reduceInitial callback.

reduceInitial возвращает объект с формой восстановленного объекта и начальными значениями. Он не принимает никаких параметров.

function reduceInitial() {
    return {
        worth: 0,
        count: 0
    };
}

reduceAdd определяет, что происходит, когда запись "фильтруется" в восстановленный объект для определенного ключа. Первый параметр - это временный экземпляр объекта с уменьшением. Второй объект - текущая запись. Метод вернет расширенный уменьшенный переходный объект.

function reduceAdd(p, v) {
    p.worth = p.worth + v.worth;
    p.count = p.count + 1;
    return p;
}

reduceRemove делает противоположное от reduceAdd (по крайней мере, в этом примере). Он принимает те же параметры, что и reduceAdd. Это необходимо, потому что групповые сокращения обновляются, когда записи фильтруются, и иногда записи необходимо удалить из ранее вычисленной группы.

function reduceRemove(p, v) {
    p.worth = p.worth - v.worth;
    p.count = p.count - 1;
    return p;
}

Вызов метода reduce будет выглядеть так:

mycf.dimensions.gender.reduce(reduceAdd, reduceRemove, reduceInitial)

Чтобы заглянуть в уменьшенные значения, используйте метод all. Чтобы увидеть верхние значения n, используйте метод top(n).

mycf.dimensions.gender.reduce(reduceAdd, reduceRemove, reduceInitial).all()

Возвращенный массив должен выглядеть так:

[
    { key: "m", value: { worth: 161000000000, count: 3 } },
    { key: "f", value: { worth:  35000000000, count: 2 } },
]

Целями сокращения набора данных являются получение нового набора данных путем первой группировки записей с помощью общих ключей, а затем уменьшение размера этих группировок в одно значение для каждого ключа. В этом случае мы сгруппировали по полу и уменьшили ценность этой группы, добавив значения записей, которые разделяют один и тот же ключ.

Другие методы reduceX - методы convience для метода reduce.

Для этого примера reduceSum будет наиболее подходящей заменой.

mycf.dimensions.gender.reduceSum(function(d) {
    return d.worth;
});

Вызов all в возвращаемой группе будет выглядеть так:

[
    { key: "m", value: 161000000000 },
    { key: "f", value: 35000000000 },
]

reduceCount будет считать записи

mycf.dimensions.gender.reduceCount();

Вызов all в возвращаемой группе будет выглядеть так:

[
    { key: "m", value: 3 },
    { key: "f", value: 2 },
]

Надеюсь, что это поможет:)

Источник: https://github.com/square/crossfilter/wiki/API-Reference

Ответ 2

http://blog.rusty.io/2012/09/17/crossfilter-tutorial/

var livingThings = crossfilter([
  // Fact data.
  { name: "Rusty",  type: "human", legs: 2 },
  { name: "Alex",   type: "human", legs: 2 },
  { name: "Lassie", type: "dog",   legs: 4 },
  { name: "Spot",   type: "dog",   legs: 4 },
  { name: "Polly",  type: "bird",  legs: 2 },
  { name: "Fiona",  type: "plant", legs: 0 }
]);

Например, сколько живых вещей в моем доме?

Для этого хорошо назовите удобную функцию groupAll, которая выбирает все записи в одну группу, а затем функцию reduceCount, которая создает счетчик записей.

// How many living things are in my house?
var n = livingThings.groupAll().reduceCount().value();
console.log("There are " + n + " living things in my house.") // 6

Теперь давайте подсчитаем все ноги в моем доме. Опять же, используйте функцию groupAll, чтобы получить все записи в одной группе, но затем мы вызываем reduceSum. Это собирается суммировать значения вместе. Какие значения? Ну, мы хотим ноги, поэтому давайте передадим функцию, которая извлекает и возвращает количество ног из факта.

// How many total legs are in my house?
var legs = livingThings.groupAll().reduceSum(function(fact) {
  return fact.legs;
}).value()
console.log("There are " + legs + " legs in my house.")
Функция

reduceCount создает счетчик записей.
Функция reduceSum - это сумма значений этих записей.