javascript - dcjs - ¿Cuáles son las funciones reduceAdd, reduceSum, reduceRemove en el filtro cruzado? ¿Cómo deben ser utilizados?
crossfilter tutorial (2)
¿Puede alguien explicar en términos simples cómo reducir la función con sus argumentos reduceAdd, reduceSum, reduceRemove funciona en el filtro cruzado?
Recuerde que la reducción de mapa reduce un conjunto de datos por claves de una dimensión particular. Por ejemplo, vamos a usar una instancia de filtro cruzado con registros:
[
{ 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" },
]
y dimensiones nombre, edad, valor y género. Reduciremos la dimensión de género utilizando el método de reducción.
Primero definimos los métodos de reducción de llamada, reducción, eliminación y reducción de la llamada inicial.
reduceInitial
devuelve un objeto con la forma del objeto reducido y los valores iniciales. No lleva parámetros.
function reduceInitial() {
return {
worth: 0,
count: 0
};
}
reduceAdd
define lo que sucede cuando un registro se "filtra" en el objeto reducido para una clave en particular. El primer parámetro es una instancia transitoria del objeto reducido. El segundo objeto es el registro actual. El método devolverá el objeto reducido transitorio aumentado.
function reduceAdd(p, v) {
p.worth = p.worth + v.worth;
p.count = p.count + 1;
return p;
}
reduceRemove
hace lo contrario de reduceAdd
(al menos en este ejemplo). Toma los mismos parámetros que reduceAdd
. Es necesario porque las reducciones de grupo se actualizan a medida que los registros se filtran y, en ocasiones, los registros deben eliminarse de una reducción de grupo previamente calculada.
function reduceRemove(p, v) {
p.worth = p.worth - v.worth;
p.count = p.count - 1;
return p;
}
Invocar el método de reducción se vería así:
mycf.dimensions.gender.reduce(reduceAdd, reduceRemove, reduceInitial)
Para echar un vistazo a los valores reducidos, utilice el método all
. Para ver los valores n superiores, use el método top(n)
.
mycf.dimensions.gender.reduce(reduceAdd, reduceRemove, reduceInitial).all()
La matriz devuelta debería (debería) verse como:
[
{ key: "m", value: { worth: 161000000000, count: 3 } },
{ key: "f", value: { worth: 35000000000, count: 2 } },
]
El objetivo de reducir un conjunto de datos es derivar un nuevo conjunto de datos agrupando primero los registros por claves comunes, y luego reduciendo una dimensión de esas agrupaciones en un solo valor para cada clave. En este caso, agrupamos por género y reducimos la dimensión de valor de esa agrupación al agregar los valores de los registros que compartieron la misma clave.
Los otros métodos de reduceX son métodos de conveniencia para el método de reducción.
Para este ejemplo, reduceSum
sería el reemplazo más apropiado.
mycf.dimensions.gender.reduceSum(function(d) {
return d.worth;
});
Invocar all
en la agrupación devuelta debería (debería) verse como:
[
{ key: "m", value: 161000000000 },
{ key: "f", value: 35000000000 },
]
reduceCount
contará los registros
mycf.dimensions.gender.reduceCount();
Invocar all
en la agrupación devuelta debería (debería) verse como:
[
{ key: "m", value: 3 },
{ key: "f", value: 2 },
]
Espero que esto ayude :)
Fuente: https://github.com/square/crossfilter/wiki/API-Reference
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 }
]);
Por ejemplo, ¿cuántos seres vivos hay en mi casa?
Para hacer esto, llamaremos a la función de conveniencia groupAll
, que selecciona todos los registros en un solo grupo, y luego a la función reduceCount
, que crea una cuenta de los registros.
// 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
Ahora vamos a contar todas las piernas en mi casa. Nuevamente, usaremos la función groupAll
para obtener todos los registros en un solo grupo, pero luego llamamos a la función reduceSum
. Esto va a sumar valores juntos. ¿Qué valores? Bueno, queremos piernas, así que vamos a pasar una función que extrae y devuelve el número de piernas del hecho.
// 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
función reduceCount
crea un conteo de los registros.
reduceSum
función reduceSum
es la suma de los valores de estos registros.