PyTables批处理获取并更新
问题描述:
我将每日库存数据作为使用PyTables创建的HDF5文件。我想获得一组行,将它作为一个数组处理,然后使用PyTable将其写回到磁盘(更新行)。我找不出干净利落的方法。请让我知道什么是最好的方法来实现这一目标?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"')]
我想rows_array传递给另一个函数,它将会计算VAR1和VAR2的价值观和更新它为每个记录。请注意,var1,var2就像移动平均值一样,所以我将无法在迭代器中计算它们,因此需要将整组行设置为数组。
当我使用rows_array计算我需要的任何东西后,我不知道如何将它写回数据,即用新的计算值更新行。当更新整个表,我用这个:
table.cols.var1[:] = calc_something(rows_array)
然而,当我想只更新表的一部分,我不能做到这一点的最好办法。我想我可以重新运行“where”条件,然后根据我的calc进行更新,但这似乎是浪费时间重新扫描表格。
您的建议将不胜感激...
感谢, -e
答
如果我没理解好了,接下来应该做你想要什么:
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
希望这有助于
谢谢,Francesc。这很好。我猜第二个WhereList会再次扫描表格?我修改了代码,以便首先获取索引,然后使用索引读取表值并使用索引再次更新它。 – Ecognium 2011-02-19 05:37:59