2015-04-01 1 views
1

Я хочу создать алгоритм, но не знаю, как начать.Своевременный точный алгоритм непрерывных данных

Этот алгоритм фактически будет методом, который принимает массив из N объектов с некоторыми атрибутами, createdAt, value. Я буду сортировать массив от более старого к новому (createdAt), а затем я должен выяснить, насколько совместимыми являются доступные данные, то есть на каждый час у меня есть как минимум 5 записей и каждые полчаса 2 записи.

Пример-testcode:

- (void) normalizeData:(NSArray*)records 
{ 
// sort the records 
NSArray* sortedRecords = [records sortWithCreatedAt]; 

// split all dates in the records, distinct them, and create a dictionary with a key for every date, for value create another dictionary with the hour as key and the records as the value. 

NSArray* distinctDates = [sortedRecords valueForKeyPath:@"@distinctUnionOfObjects.createdAt"]; // should only consider month-day-year-hour 
NSMutableDictionary* dictionary = [NSMutableDictionary dictionary]; 
for (NSDate* date in distinctDates) 
    { 
    NSString* stringDate = [date string]; 
    NSArray* recordsForDate = [sortedRecords valueForKeyPath:[NSString stringWithFormat:@"[collect].{createdAt=%@}.self", stringDate]]; // let's say you got them with this line 
    [dictionary setObject:recordsForDate forKey:date]; 
    } 

for (NSDate* keyDate in dictionary) 
    { 
    NSArray* records = [dictionary objectForKey:keyDate]; 
    Record* previousRecord = nil; 
    for (Records* record in records) 
     { 
     // I'll have to keep the previous record and compare the time difference with the new 
     NSInteger secondsAfterDate = 0; 
     if (previousRecord) 
     { 
     secondsAfterDate = [record.createdAt timeIntervalSinceDate:previousRecord.createdAt]; 
     // add logic to create trend difference in a model that has for every hour of the records count, the records and suffice description 
     // logic if the records count and timespan is suffice. 

     } 
     previousRecord = record; 
     } 
    } 
} 

Я оценил бы никакого вклада в процесс в методе.

Также конечной целью является создание возврата (вызов обработчика блока) для каждого результата обработанных записей. Логика должна заканчиваться на 5 записей по крайней мере в час и промежуток между ними менее 15 минут.

+0

Когда вы имеете в виду, что вам нужно 5 записей в час, вы имеете в виду между 11:00 и 12:00 или 5 разделенных (в терминах «индекс» в отсортированном массиве) значения разницы во времени должны быть меньше часа? – Larme

+0

Для каждого часа (с 11:00 до 12:00) мне нужно как минимум 5 записей со временем ~ 15 минут. Таким образом, я могу сказать, что у меня достаточно данных для обработки изменений в тренде. –

ответ

0

Учитывайте общую продолжительность сбора записей (разницу между созданной первой записью и созданной в последней записи) и дискретизируйте ее в ящики. Поместите каждый объект в соответствующий лоток. Затем использовалось скользящее окно с двумя размерами окна (30 минут и 60 минут). Когда вы идете по массиву, постоянно оценивайте, выполняются ли условия, которые вы описываете.

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

+0

Спасибо за вклад. Я проверю ваше предложение как можно скорее. –