统计软件Stata允许将短文本片段保存在数据集中.这可以使用notes
和/或characteristics
完成.
这对我来说是一个很有价值的功能,因为它允许我保存各种信息,从提醒和待办事项列表到有关我如何生成数据的信息,甚至是特定变量的估算方法.
我现在正试图在Python 3.6中提出类似的功能.到目前为止,我已经在线查看了一些帖子,但这些帖子并没有完全解决我想做的事情.
一些参考文章包括:
> best way to preserve numpy arrays on disk
> What is the difference between save a pandas dataframe to pickle and to csv?
> What is the fastest way to upload a big csv file in notebook to work with python pandas?
> How do I view data object contents within an npz file?
对于一个小的NumPy数组,我得出结论,函数numpy.savez()
和字典的组合可以在一个文件中充分存储所有相关信息.
例如:
a = np.array([[2,4],[6,8],[10,12]])
d = {"first": 1, "second": "two", "third": 3}
np.savez(whatever_name.npz, a=a, d=d)
data = np.load(whatever_name.npz)
arr = data['a']
dic = data['d'].tolist()
但问题仍然存在:
有没有更好的方法可以将其他信息包含在包含NumPy数组或(大)Pandas DataFrame的文件中?
我特别感兴趣的是,您可以通过示例了解您可能提出的任何建议的特殊利弊.依赖性越少越好.
解决方法:
有很多选择.我将只讨论HDF5,因为我有使用这种格式的经验.
优点:可移植(可在Python之外读取),本机压缩,内存不足功能,元数据支持.
缺点:依赖于单个低级C API,数据损坏作为单个文件的可能性,删除数据不会自动减小大小.
根据我的经验,为了性能和可移植性,请避免使用pyTables / HDFStore来存储数字数据.您可以使用h5py
提供的直观界面.
存储一个数组
import h5py, numpy as np
arr = np.random.randint(0, 10, (1000, 1000))
f = h5py.File('file.h5', 'w', libver='latest') # use 'latest' for performance
dset = f.create_dataset('array', shape=(1000, 1000), data=arr, chunks=(100, 100)
compression='gzip', compression_opts=9)
压缩&分块
有许多压缩选择,例如blosc和lzf分别是压缩和解压缩性能的不错选择.注意gzip是原生的;默认情况下,您的HDF5安装可能无法提供其他压缩过滤器.
分块是另一种选择,当与读取数据内存时的方式一致时,可以显着提高性能.
添加一些属性
dset.attrs['Description'] = 'Some text snippet'
dset.attrs['RowIndexArray'] = np.arange(1000)
存储字典
for k, v in d.items():
f.create_dataset('dictgroup/'+str(k), data=v)
内存不足
dictionary = f['dictgroup']
res = dictionary['my_key']
没有什么可以替代读取暴露大部分C API的h5py documentation,但是你应该从上面看到它具有很大的灵活性.