PyTables 批处理获取和更新

6

我有一份使用PyTables创建的HDF5文件,其中包含每日股票数据。我想获取一组行,将其作为数组进行处理,然后使用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”条件,然后根据我的计算更新每一行,但这似乎是在重新扫描表格,浪费时间。欢迎您提出建议...
谢谢, -e
1个回答

10

如果我理解正确,那么下面的代码应该能满足你的需求:

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
当然可以。我已经根据你的建议编辑了我的先前回答。 - FrancescAlted
而不是循环遍历行数组,我想直接获取一列并尝试了以下代码:price = table.cols.price[indices]。但是却收到了以下错误提示: File "/Library/Python/2.6/site-packages/tables/table.py", line 3063, in getitem "'%s' key type is not valid in this context" % key) TypeError: '[ 0 1 2 3 4 5 6 7 8 9 10]' 关键字类型在此上下文中无效。 有什么建议可以从索引中提取整个列吗? - Ecognium
2
不好意思,目前在列级别上还不支持花式索引。但是你可以使用price = table[indices]['price']这个方法,它也非常高效。 - FrancescAlted

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接