2015-11-18 1 views
0

Я прочитал следующую таблицу из MySQL в массив MATLAB клеток:группы по одному столбцу и вычислить медиану для групп в MATLAB

Nyse = fetch(conn,'SELECT ticker,date,utcsec,bid,ofr FROM HFE.Quotes where ex="N" order by utcsec,bid;'); 

Массив клеток Nyse содержат строки 1000000. И я хочу рассчитать медианную ставку за каждую секунду, где вторая записывается как строка в столбце utcsec. Я делаю это следующим образом:

utcsec=cell2mat(Nyse(:,3)); 
bid=cell2mat(Nyse(:,4)); 
NyseBid=grpstats(bid,utcsec,{'median'}); 

Проблема заключается в том, что функция grpstats занимает около 70 секунд, чтобы сделать задачу. Вопрос в том, как я могу оптимизировать код, чтобы он работал быстрее?

Пример строки в столбце UTCSEC равен '09: 30: 00 '.

+0

Один миллион строк - это не тривиальное количество данных. Вам нужна только медиана или вам нужна другая информация, рассчитанная 'grpstats'? – excaza

+0

Только медиана :) –

+0

Я не уверен, что полностью соблюдаю данные. Каковы размеры и типы данных 'utcsec' и' bid'? Является ли 'utcsec' только вектором времени? – excaza

ответ

0

Я предлагаю вам checkout this question and these answers, так как это очень важная проблема.

Чтобы применить результаты этой темы к этой проблеме, я бы использовал this MEX function Я написал, что принимает в массив groupID и извлекает, в какие строки входит каждая группа. Это позволяет эффективно группировать группы.

Как я понимаю, utcsec по существу является идентификатором groupID, а bid является массивом для агрегирования. Код будет идти:

utcsec = Nyse(:,3); %utcsec in this should be a cell array o fstrings 
[unique_utcsec, map] = mg_getRowsWithKey(utcsec); %call to my magic function 
     %unique_utcsec contains unique strings in utcsec 
     %map shows us which rows correspond to each unique second 

median_bid = zeros(length(unique_utcsec), size(bid,2)); 

for i = 1:length(unique_utcsec) %iterate over each utc second 
    median_bid(i,:) = median(bid(map{i},:),1); %calculate the median for that second 
end 

В моем тестировании, этот код значительно быстрее, чем реализация Matlab с функцией grpstats. В этом потоке есть альтернативные подходы, которые не полагаются на mex. MEX C++ код должен быть скомпилирован с:

mex -largeArrayDims mg_getRowsWithKey.cpp 

И тогда функция mg_getRowsWithKey можно назвать, как и любой функции Matlab. mg_getRowsWithKey написан на C++ с использованием библиотек STL, таких как карта.

+0

Если вы используете этот подход, мне бы хотелось узнать, что такое ускорение. –

Смежные вопросы