Пакетное получение и обновление PyTables - PullRequest
6 голосов
/ 18 февраля 2011

У меня есть ежедневные данные о запасах в виде файла HDF5, созданного с помощью PyTables.Я хотел бы получить группу строк, обработать ее как массив и затем записать обратно на диск (обновить строки), используя PyTables.Я не мог найти способ сделать это чисто.Не могли бы вы дать мне знать, что будет лучшим способом сделать это?

Мои данные:

Symbol, date, price, var1, var2
abcd, 1, 2.5, 12, 12.5
abcd, 2, 2.6, 11, 10.2
abcd, 3, 2.45, 11, 10.3
defg, 1,12.34, 19.1, 18.1
defg, 2, 11.90, 19.5, 18.2
defg, 3, 11.75, 21, 20.9
defg, 4, 11.74, 22.2, 21.4

Я хотел бы прочитать строки, соответствующие каждому символу, в виде массива, выполнить некоторую обработку и обновить поля var1 и var2.Я знаю все символы заранее, чтобы я мог их просмотреть.Я пробовал что-то вроде этого:

rows_array = [row.fetch_all_fields() for row in table.where('Symbol == "abcd"')]

Я хотел бы передать row_array в другую функцию, которая будет вычислять значения для var1 и var2 и обновлять его для каждой записи.Обратите внимание, что var1, var2 подобны скользящим средним, поэтому я не смогу вычислить их внутри итератора и, следовательно, необходимо, чтобы весь набор строк был массивом.

После того, как я вычислю все, что мне нужно, используя row_array, я не уверен, как записать его обратно в данные, т. Е. Обновить строки новыми вычисленными значениями.При обновлении всей таблицы я использую это:

 table.cols.var1[:] = calc_something(rows_array)

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

Ваши предложения приветствуются ...

Спасибо, -e

1 Ответ

10 голосов
/ 18 февраля 2011

Если я хорошо понимаю, следующий должен делать то, что вы хотите:

condition = 'Symbol == "abcd"'
indices = table.getWhereList(condition)  # get indices
rows_array = table[indices]  # get values
new_rows = compute(rows_array)   # compute new values
table[indices] = new_rows  # update the indices with new values

Надеюсь, это поможет

...