Что эквивалентно «выбрать максимум (столбец) из таблицы» в таблицах - PullRequest
2 голосов
/ 31 марта 2012

У меня есть таблица с целым рядом числовых значений, я знаю, что могу извлечь столбец и выполнить для него max (), но, вероятно, есть способ сделать это с помощью метода в ядре. Кажется, просто не могу его найти.

Ответы [ 3 ]

6 голосов
/ 03 апреля 2012

В тесте, который я сделал, вы можете добиться более чем вдвое более быстрого результата, используя метод iterrows вместо:

In [117]: timeit max(row['timestamp'] for row in table.iterrows(stop=1000000))
1 loops, best of 3: 1 s per loop

In [118]: timeit max(row['timestamp'] for row in table.where('(timestamp<=Tf)'))
1 loops, best of 3: 2.21 s per loop

In [120]: timeit max(frames.cols.timestamp[:1000000])
1 loops, best of 3: 974 ms per loop

In [121]: timeit np.max(frames.cols.timestamp[:1000000])
1 loops, best of 3: 876 ms per loop

Обратите внимание, что выше Tf находится запись 1000000 этого столбца (которая является Float64).

Так как вопрос не требует проверки сравнения, можно сэкономить тест where ... Обратите внимание, что метод, предложенный в вопросе (загрузка данных в виде массива), все еще несколько быстрее (хотя разница составляет менее 3% и становится еще меньше для больших наборов данных, я не тестировал более 10 ^ 7 строк). Лучшие результаты, которые я нашел, когда использовали функцию max numpy (см. Выше).

Я также был бы рад узнать о более эффективном методе!

3 голосов
/ 15 января 2013

Самый быстрый способ, который я нашел, это индексировать вашу таблицу по интересующим вас столбцам:

table.cols.timestamp.createCSIndex()

После индексации получение максимума происходит практически мгновенно:

max_timestamp = table.cols.timestamp[table.colindexes['timestamp'][-1]]

Сначала он получит последний (соответствующий наибольшему метку времени) индекс строки из объекта Index вашей таблицы для столбца метки времени (table.colindexes['timestamp'][-1]), а затем просто извлечет строку, на которую указывает, путем индексации в ссылка на соответствующий столбец (table.cols.timestamp).

1 голос
/ 31 марта 2012

С Высокопроизводительное управление данными с PyTables & Family (pdf):

e = sum(row['col1'] for row in table.where(3<table.cols.col2<=20))

Изменение этого параметра для использования max():

e = max(row['col1'] for row in table.where(3<table.cols.col2<=20))
...