【问题标题】:PyTables batch get and updatePyTables 批量获取和更新
【发布时间】:2011-06-29 13:26:25
【问题描述】:

我有使用 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

【问题讨论】:

    标签: python hdf5 pytables


    【解决方案1】:

    如果我理解得很好,下一个应该做你想做的:

    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
    

    希望对你有帮助

    【讨论】:

    • 谢谢,弗朗西斯科。效果很好。我猜第二个 WhereList 会再次扫描表格吗?我修改了代码,以便我首先获取索引,然后使用索引读取表值并再次使用索引更新它。
    • 哦,当然。我已根据您的建议编辑了之前的答案。
    • 我不想循环遍历row_arrays,而是直接获取一列,我尝试了这个:price = table.cols.price[indices]。我收到此错误:文件“/Library/Python/2.6/site-packages/tables/table.py”,第 3063 行,在 getitem“'%s' 键类型在此上下文中无效" % key) TypeError: '[ 0 1 2 3 4 5 6 7 8 9 10]' key type is not valid in this context 有关如何从索引中提取整列的任何建议?
    • 不,列级尚不支持花式索引。但你总是可以这样做:price = table[indices]['price'],这也很有效。
    猜你喜欢
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多