gpt4 book ai didi

python - 将 HDF 5 文件读入 Pandas 时,如何避免字符串被读取为字节?

转载 作者:太空宇宙 更新时间:2023-11-03 14:59:10 25 4
gpt4 key购买 nike

目前,h5文件中的数据没有前缀“b”。我用以下代码读取 h5 文件。我想知道是否有更好的方法来读取 h5 并且没有前缀“b”。

import tables as tb
import pandas as pd
import numpy as np
import time

time0=time.time()
pth='d:/download/'

# read data
data_trading=pth+'Trading_v01.h5'
filem=tb.open_file(data_trading,mode='a',driver="H5FD_CORE")
tb_trading=filem.get_node(where='/', name='wind_data')
df=pd.DataFrame.from_records(tb_trading[:])
time1=time.time()
print('\ntime on reading data %6.3fs' %(time1-time0))

# in python3, remove prefix 'b'
df.loc[:,'Date']=[[dt.decode('utf-8')] for dt in df.loc[:,'Date']]
df.loc[:,'Code']=[[cd.decode('utf-8')] for cd in df.loc[:,'Code']]

time2=time.time()
print("\ntime on removing prefix 'b' %6.3fs" %(time2-time1))
print('\ntotal time %6.3fs' %(time2-time0))

时间的结果

time on reading data 1.569s

time on removing prefix 'b' 29.921s

total time 31.490s

你看,删除前缀“b”确实很耗时。

我尝试使用 pd.read_hdf,它不增加前缀“b”。

%time df2=pd.read_hdf(data_trading)
Wall time: 14.7 s

到目前为止速度更快。

<小时/>

使用this SO answer并使用矢量化 str.decode,我可以将转换时间缩短至 9.1 秒(因此总时间少于 11 秒):

 for key in ['Date', 'Code']: 
df[key] = df[key].str.decode("utf-8")
<小时/>

问题:在读取 HDF 5 数据表时,是否有更有效的方法将字节列转换为字符串?

最佳答案

提高性能的最佳解决方案是停止尝试“删除 b 前缀”。 b 前缀之所以存在,是因为您的数据由字节组成,而 Python 3 坚持在许多地方显示此前缀来指示字节。即使是没有意义的地方,例如内置 csv 模块的输出。

但是在您自己的程序中,这可能不会造成任何损害,事实上,如果您想要最高的性能,您最好将这些列保留为字节。如果您使用的是 Python 3.0 到 3.2,则尤其如此,因为它们始终使用多字节 unicode 表示形式 ( see )。

即使您使用的是 Python 3.3 或更高版本,从字节到 unicode 的转换不会花费您任何额外的空间,但如果您有大量数据,它仍然可能会浪费时间。

最后,如果您要处理的列大多是唯一的字符串,并且宽度有些一致,那么 Pandas 并不是最佳选择。例如,如果您有一列文本数据(车牌号),那么所有这些文本数据都将容纳大约 9 个字符。效率低下的原因是 Pandas 并不完全具有字符串列类型,而是使用 object column type ,其中包含指向单独存储的字符串的指针。这对 CPU 缓存、内存带宽和内存消耗都不利(同样,如果您的字符串大多是唯一的且长度相似)。如果您的字符串具有高度可变的宽度,那么这可能是值得的,因为短字符串仅需要其自身的长度加上指针,而 NumPy 和 HDF5 中典型的固定宽度存储则采用每个字符串(甚至是空字符串)的完整列宽度.

要在 Python 中获得快速、固定宽度的字符串列,您可以考虑使用 NumPy,您可以通过优秀的 h5py 阅读它。图书馆。这将为您提供一个 NumPy 数组,它与 HDF5 中存储的基础数据更加相似。它可能仍然具有 b 前缀,因为 Python 坚持非 unicode 字符串始终显示此前缀,但这不一定是您应该尝试阻止的事情。

关于python - 将 HDF 5 文件读入 Pandas 时,如何避免字符串被读取为字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45260736/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com