sud*_*nym 9 python hdf5 categories pandas
回答:看来这个数据类型不适合在hdf5store中添加任意字符串.
背景
我使用脚本生成单行结果,并以迭代方式将它们附加到磁盘上的文件中.为了加快速度,我决定使用HDF5容器而不是.csv.然后基准测试显示字符串降低了HDF5的速度.我被告知在将字符串转换为categoricaldtype 时可以减轻这种情况.
问题
我无法将带有新类别的分类行附加到HDF5.另外,我不知道如何控制cat.codesAFAIK可以以某种方式完成的dtypes .
1 - 使用分类数据创建大型数据框
import pandas as pd
import numpy as np
from pandas import HDFStore, DataFrame
import random, string
dummy_data = [''.join(random.sample(string.ascii_uppercase, 5)) for i in range(100000)]
df_big = pd.DataFrame(dummy_data, columns = ['Dummy_Data'])
df_big['Dummy_Data'] = df_big['Dummy_Data'].astype('category')
Run Code Online (Sandbox Code Playgroud)
2 - 创建一行以追加
df_small = pd.DataFrame(['New_category'], columns = ['Dummy_Data'])
df_small['Dummy_Data'] = df_small['Dummy_Data'].astype('category')
Run Code Online (Sandbox Code Playgroud)
3 - 保存(1)到HDF并尝试追加(2)
df_big.to_hdf('h5_file.h5', \
'symbols_dict', format = "table", data_columns = True, append = False, \
complevel = 9, complib ='blosc')
df_small.to_hdf('h5_file.h5', \
'symbols_dict', format = "table", data_columns = True, append = True, \
complevel = 9, complib ='blosc')
Run Code Online (Sandbox Code Playgroud)
这会导致以下异常
ValueError:附加数据[name-> Dummy_Data,cname-> Dummy_Data,dtype-> int8,kind-> integer,shape - >(1,)] vs当前表[name-> Dummy_Data,cname]的[values_axes]组合无效 - > Dummy_Data,dtype-> INT32,kind->整数,形状 - >无]
我的修复尝试
我试图调整dtypes cat.catcodes:
df_big['Dummy_Data'] = df_big['Dummy_Data'].cat.codes.astype('int32')
df_small['Dummy_Data'] = df_small['Dummy_Data'].cat.codes.astype('int32')
Run Code Online (Sandbox Code Playgroud)
当我这样做时,错误消失,但分类dtype也是如此:
df_test = pd.read_hdf('h5_file.h5', key='symbols_dict')
print df_mydict.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 100001 entries, 0 to 0 # The appending worked now
Data columns (total 1 columns):
Dummy_Data 100001 non-null int32 # Categorical dtype gone
dtypes: int32(1) # I need to change dtype of cat.codes of categorical
memory usage: 1.1 MB # Not of categorical itself
Run Code Online (Sandbox Code Playgroud)
另外,首先df_small.info()没有显示dtype cat.codes,这使得调试变得困难.我究竟做错了什么?
问题
1.如何正确改变dtypes cat.codes?
2.如何在python中正确地将分类数据附加到HDF5?
我不是这方面的专家,但据我至少查看了 h5py 模块,http://docs.h5py.org/en/latest/high/dataset.html,HDF5支持 Numpy 数据类型,其中不包括任何分类数据类型。
Pandas 使用的PyTables也是如此。
类别数据类型在Pandas 数据类型中被引入和使用,并进行了描述:
分类变量具有有限且通常固定的可能值(类别;R 中的级别)
那么可能会发生的情况是,每次为了添加新类别,您都必须以某种方式从 hdf5store 重新读取所有现有类别,以便 Pandas 重新索引它?
然而,从一般文档来看,这种数据类型似乎不适合将任意字符串添加到 hdf5store 中,除非您确定在添加几次之后不会有新的类别。
作为补充说明,除非您的应用程序需要极高的性能,否则在 SQL 中存储数据可能是更好的选择——一方面,SQL 对字符串有更好的支持。例如,虽然在某些测试中发现 SQLite 比 HDF5 慢,但它们不包括处理字符串。从 CSV 跳到 HDF5 听起来就像从马车跳到火箭,但也许汽车或飞机也能起到同样的作用(或者更好,因为它有更多选择,可以扩展类比)?
| 归档时间: |
|
| 查看次数: |
810 次 |
| 最近记录: |