Довольно странный вопрос здесь, но кое-что у меня было с большим трудом в течение последнего дня или около того. В общем, я пытаюсь вычислить максимум массива с использованием crossfilter, а затем использовать это значение, чтобы найти максимум.Crossfilter - Double Dimensions (второе значение, связанное с ежедневным максимумом)
Например, у меня есть серия временных меток с ассоциированным значением X и значением Y. Я хочу агрегировать временные метки по дням и найти максимальное значение X, а затем сообщить значение Y, связанное с этой временной меткой. По сути, это двойное измерение, как я понимаю.
Я могу сделать первый этап просто для того, чтобы найти максимальные значения. Но мне трудно справиться со вторым значением.
Рабочий код для первого, (с использованием Crossfilter и Reductio). Предполагая, что каждая строка имеет следующие четыре значения.
[(Timestamp, Date, XValue, YValue),
(2015-05-15 16:00:00, 2015-05-15, 30, 15),
(2015-05-15 16:45:00, 2015-05-15, 25, 33)
... (many thousand of rows)]
Первое измерение
ndx = crossfilter(data);
dailyDimension = ndx.dimension(function(d) { return d.date; });
Получите максимум от значения Х с помощью Reductio
maxXValue = reductio().max(function(d) { return d.XValue;});
XValues = maxXValue(dailyDimension.group())
XValues теперь содержит все максимум X значений на ежедневной основе.
Теперь я хотел бы использовать эти значения X для определения соответствующих значений Y на основе даты.
Используя те же данные выше соответствующего значения, возвращаемого бы:
[(date, YValue),
('2015-05-15', 15)]
// Note, that it is 15 as it is the max X Value we find, not the max Y Value.
В Python/панд я бы установить индекс в DataFrame к X, а затем сделать матч индекс, чтобы найти Y значения
(Заметьте, можно смело предположить, что значения X уникальны в этом случае, но на самом деле мы должны действительно идентифицировать временную метку, связанную с этим периодом, а затем соответствовать этому, поскольку они строго гарантированы быть уникальными, а не свободно).
Я считаю, что это может быть достигнуто путем изменения Reductio максимальный код, который я не в полной мере понять, правильно Source Code is from here
var reductio_max = {
add: function (prior, path) {
return function (p, v) {
if(prior) prior(p, v);
path(p).max = path(p).valueList[path(p).valueList.length - 1];
return p;
};
},
remove: function (prior, path) {
return function (p, v) {
if(prior) prior(p, v);
// Check for undefined.
if(path(p).valueList.length === 0) {
path(p).max = undefined;
return p;
}
path(p).max = path(p).valueList[path(p).valueList.length - 1];
return p;
};
},
initial: function (prior, path) {
return function (p) {
p = prior(p);
path(p).max = undefined;
return p;
};
}
};
Возможно, это может быть модифицирован таким образом, что существует второй Valuelist из Y значений, какие карты 1 : 1 с значениями X, связанными с максимальной функцией. В этом случае он будет тем же самым индексом искать как в функциях, так и просто назначаться.
Приносим извинения, что у меня нет более рабочего кода.
Альтернативный подход состоит в том, чтобы использовать некоторую форму функции фильтрации для удаления записей, которые не удовлетворяют критериям X, а затем группируются по дням (в этом случае должно быть только одно значение, поэтому простой снимокSum будет, тем не менее, верните правильное значение).
// Pseudo non working code
dailyDimension.filter(function(p) {return p.XValue === XValues;})
dailyDimension.group().reduceSum(function(d) {return d.YValue;})
Конечные результаты будут отображаться в постоянном токе.JS
Hi Ethan, это делает 90% того, что требуется, но ваше предположение о его нарушении на фильтрах является правильным. «Uncaught TypeError: Невозможно прочитать свойство« 0 »неопределенного» в максимальной функции. Сейчас я смотрю на создание JSFiddle. –
@ dantes_419 Звучит неплохо. Дайте мне знать, если вы получите то, что разработал JSFiddle. Тем временем, я обновил этот пример, чтобы использовать конкатенированную строку с x-value zero-padded. Опять же, он, вероятно, содержит некоторые ошибки, но, надеюсь, это дает вам эту идею. Это должно работать с фильтрацией, поскольку список значений должен быть правильно упорядочен. –