2015-06-19 3 views
2

У меня есть файл (десятки столбцов и миллионы строк), которые в основном выглядит следующим образом:смотреть вперед анализ времени в R (алгоритм интеллектуального анализа данных)

customerID VARCHAR(11) 
accountID VARCHAR(11) 
snapshotDate Date 
isOpen Boolean 
... 

Одна запись в файле может выглядеть следующим образом:

1,100,200901,1,... 
1,100,200902,1,... 
1,100,200903,1,... 
1,100,200904,1,... 
1,100,200905,1,... 
1,100,200906,1,... 
... 
1,100,201504,1,... 
1,100,201505,1,... 
1,100,201506,1,... 

Когда учетная запись закрыта, могут произойти две вещи. Как правило, никаких дальнейших снимков для этой записи не существует в данных. Иногда дополнительные записи будут добавляться, но флаг isOpen будет установлен в 0.

Я хочу добавить дополнительный булевский столбец, называемый «closedInYr», который имеет значение 0, ЕСЛИ ЗАКРЫТЬ АККАУНТ В ОДИН ГОД ПОСЛЕ ДАТА СНАБЖЕНИЯ.

Мое решение - медленное и грубое. Он берет каждую запись, отсчитывает вперед в течение 12 месяцев, и если он находит запись с тем же идентификатором клиента, идентификатором учетной записи и isOpen, установленным в 1, он заполняет запись 0 в поле «closedInYr», в противном случае она заполняет поле с 1. Это работает, но производительность неприемлема, и у нас есть несколько таких файлов для обработки.

Любые идеи о том, как реализовать это? Я использую R, но я хочу кодировать Perl, Python или практически все, кроме COBOL или VB.

Благодаря

+0

Воспроизводимый пример улучшит шансы найти решение. –

+0

Python, вероятно, будет вашим лучшим выбором, поскольку я считаю, что он более эффективен, особенно с интеллектуальным анализом данных. Плюс, воспроизводимые данные - плюс. – NealC

+1

Гораздо проще, чем предлагалось, добавить столбец с закрытым годом. Затем вы можете сделать простую последовательность действий для определения ClosedInYr –

ответ

0

Я предлагаю использовать команду Linux «дату», чтобы преобразовать дату к отметкам времени Unix. Временная метка Unix - это количество секунд, прошедших с 1 января 1970 года. Таким образом, в основном год составляет 60 с * 60 м * 24 ч * 256 д. Итак, если разница между отметками времени больше, чем это число, то это больше, чем год.

Это будет что-то вроде этого:

>date --date='201106' "+%s" 
1604642400 

Так что, если вы используете Perl, который является довольно прохладным языком обработки файлов, вы будете анализировать весь файл в нескольких строках и использовать Eval "Вам дату команда ".

0

Если все снимки для данной записи отображаются в одной строке, а записи, открытые за один и тот же период времени, имеют одинаковую длину (т. Е. Моментальные снимки были сделаны через равные промежутки времени), тогда одна возможность может быть фильтрующей основанный на длинах строк. Если самая длинная открытая строка - длина N, а записи за один год - M, то вы знаете, что строка NM была открыта, на самом длинном, на один год меньше, чем самая длинная ... Этот подход не обрабатывает случай, когда моментальные снимки продолжают добавляться , хотя с открытыми флагами, установленными в 0, но это может позволить вам сократить количество поисков вниз, по крайней мере, сократить количество поисков, которые должны быть сделаны за строку?

По крайней мере, это идея. В более общем плане, поиск с конца, чтобы найти последний год, где isOpen == 1, может немного сократить поиск ...

Конечно, это все предполагает, что каждая запись находится в одной строке. Если нет, возможно, расплав в порядке?

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