2015-05-26 3 views
1

Довольно странный вопрос здесь, но кое-что у меня было с большим трудом в течение последнего дня или около того. В общем, я пытаюсь вычислить максимум массива с использованием 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

ответ

3

Не уверен, если это будет работать, но, возможно, дать ему попробовать:

maxXValue = reductio() 
    .valueList(function(d) { 
    return ("0000000000" + d.XValue).slice(-10) + ',' + d.YValue; 
    }) 
    .aliasProp({ 
    max: function(g) { 
     return +(g.valueList[g.valueList.length - 1].split(',')[0]); 
    }, 
    yValue: function(g) { 
     return +(g.valueList[g.valueList.length - 1].split(',')[1]); 
    } 
    }); 
XValues = maxXValue(dailyDimension.group()) 

Это вид менее эффективной и менее безопасной повторной реализации максимального расчета с использованием опции aliasProp, что давайте вы делаете практически все, что захотите, группе при каждом добавлении и удалении записей.

Мое непроверенное предположение заключается в том, что недокументированная функция значенияList, которая используется внутренне в макс/мин/медиана, будет правильно упорядочена. Может быть проще/лучше написать максимальную агрегацию Crossfilter, а затем изменить ее, чтобы также добавить значение y в группу.

Если вы хотите работать через Reductio, я с удовольствием сделаю это с вами здесь, но будет легче, если у нас будет рабочий пример на чем-то вроде JSFiddle.

+0

Hi Ethan, это делает 90% того, что требуется, но ваше предположение о его нарушении на фильтрах является правильным. «Uncaught TypeError: Невозможно прочитать свойство« 0 »неопределенного» в максимальной функции. Сейчас я смотрю на создание JSFiddle. –

+0

@ dantes_419 Звучит неплохо. Дайте мне знать, если вы получите то, что разработал JSFiddle. Тем временем, я обновил этот пример, чтобы использовать конкатенированную строку с x-value zero-padded. Опять же, он, вероятно, содержит некоторые ошибки, но, надеюсь, это дает вам эту идею. Это должно работать с фильтрацией, поскольку список значений должен быть правильно упорядочен. –