【问题标题】:efficient way to find last time stamp for each unique value in a column in HDF5 table查找 HDF5 表中列中每个唯一值的最后一个时间戳的有效方法
【发布时间】:2015-01-20 11:21:58
【问题描述】:

如何有效地找到 SecurityID 列中每个唯一值的最后一个时间戳(来自 Datetime 列)? SecurityID 列中大约有 1000 个唯一值。

目前我在整个表中查询 SecurityID 中的每个唯一值,然后查找最后一个时间戳。正如您可能想象的那样,它非常缓慢。该表超过 40GB,并且还在不断增长。

我会这样做:

os.chdir('E:\HDFStores')
store = pd.HDFStore('mysuperawesomehdfstore.h5')
assets = skBase.bbg_helper_assets('minutely')
df_timestamp = pd.Dataframe()
tags = ['T', 'B', 'A']
for asset in assets:
    for tag in tags:
        print asset, " ", tag
        timestamp = (store.select('table', where = "SecurityID = ['" + asset + "'] & Tag = ['" + tag + "'] & columns = ['Datetime']")).tail(1)
        if len(timestamp_.index) == 0:
            print "value DNE"
        else:
            dt = (str(timestamp_iloc[0][0])).split(' ', 1)[0]
            tm = (str(timestamp_iloc[0][0])).split(' ', 1)[1]

我曾考虑在我的 4 核机器上运行单独的 python 进程。但我宁愿有一种更清洁的做事方式,也不愿诉诸黑客。

任何想法都将不胜感激。

【问题讨论】:

    标签: python pandas hdf5


    【解决方案1】:

    因为你的数据库很大,你必须从硬盘中查询它,你会遇到 IO 瓶颈。

    这实际上是这里的主要问题。智能代码无法真正弥补必须查询 40gb 文件的问题——尤其是考虑到您的查询非常简单。多处理也无济于事(这不是 CPU 瓶颈)。所以我认为解决方案会更新您的工作流程。

    所有解决方案都依赖于异步操作(首先处理所有数据,将其转储到单独的文件,根据需要从该文件中读取),或者重新组织存储数据的方式。

    异步 1

    如果您更新主 HDF5 文件的频率低于每天,您可以:

    更新主 HDF5 后,查询所有 securityID 的最新时间戳(使用您现有的代码)。将结果转储到单独的 H5 文件中(仅索引:SecurityID,值:最新时间戳)。当然,这个解决方案只有在每个查询花费不到 30 秒的情况下才有效(这已经花费了将近半天的时间......)

    然后您可以将此数据保存在内存中(应该只有几 Kbs),并在您需要知道特定 SecurityID 的最新时间戳时随时访问它。

    异步 2

    一种更聪明的方法(但更多的工作)是在您收到更新的数据时读取最后一个时间戳。我不确切知道您是如何更新 HDF5 文件的,但我猜您正在下载新数据并将其附加到当前文件中。

    在这种情况下,正是获取最新时间戳数据的最佳时机。您的工作流程将变为:

    1. 下载新数据
    2. 从新数据中,为每个 SecurityID 获取最新的时间戳
    3. 转储/更新您的“latest_timestamp”h5 文件
    4. 使用新数据更新您的主 HDF5

    H5重组

    如果上述解决方案似乎都不可行,那么您可以将每个 SecurityID 作为单独的节点存储在 h5 文件中。所以你会做类似的事情:

    store.select(asset, where = Tag = ['" + tag + "'] & columns ['Datetime']")).tail(1)
    

    调整其余代码可能需要做更多工作(以及重组数据库的前期工作),但这应该会显着减少您的查询时间,并且从长远来看会有所帮助。我认为没有任何充分的理由将所有 SecurityID 集中在一个巨型节点中。而且它比其他解决方案更不老套:-)

    【讨论】:

    • 是的,将不得不进行 H5 重组。我想知道当不同表之间的行号不相同时,是否有一种方法可以查询和合并不同的表。对于单独的表,我将不得不在查询 H5 商店之后使用 pandas 进行合并。常识会说这是 H5 原生支持的一项基本功能,但我认为这是不可用的技术原因(据我所知)。
    猜你喜欢
    • 2022-08-19
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    • 2022-09-24
    • 2011-04-16
    相关资源
    最近更新 更多