bcolz

bcolz

bcolz 在使用的时候对 pandas 有要求,版本最好是 0.22.0 版本

安装

pip install -U bcolz

使用conda安装

conda install -c conda-forge bcolz

bcolz 包的存储分为 ctable 和 carray 两种存储类型,

ctable操作

ctable属性

cbytes    此对象的压缩大小(以子节为单位)
cparams   此对象的压缩参数
dtype     此对象的数据类型(numpy dtype)
names     对象的列名(列表)
nbytes    此对象的原始(未压缩)大小(以子节未单位)
ndim      此对象的维数
shape     这个物体的形状
size      这个对象的大小

ctable函数

addcol(newcol [,name,pos,move])    添加一个新的newcol对象作为列。
append(COLS)    将cols附加到此ctable。
copy(** kwargs)    返回此ctable的副本。
delcol([姓名,pos,keep])    删除名为name的列或位置pos。
eval(表达,** kwargs)    评估列上的表达式并返回结果。
fetchwhere(表达[,outcols,limit,...])    获取满足表达式条件的行。
flush()    将内部缓冲区中的数据刷新到磁盘。
free_cachemem()    摆脱内部缓存以释放内存。
fromdataframe(** kwargs)    从pandas数据帧中返回一个ctable对象。
fromhdf5([的NodePath])    从复合HDF5数据集(PyTables表)中返回ctable对象。
iter([开始,停止,步骤,outcols,限制,......])    具有启动,停止和步进边界的迭代器。
resize(NITEMS)    调整实例大小以使其具有nitems。
todataframe([列,东方])    从此对象返回一个pandas数据帧。
tohdf5(filepath [,nodepath,mode,cparams,...])    将此对象写入HDF5文件。
trim(NITEMS)    从此实例中删除尾随的nitems。
where(表达式[,outcols,limit,skip,...])    迭代表达式为true的行。
whereblocks(表达[,blen,outcols,...])    迭代在此ctable上填充表达式条件的行,以大小为blen的块。

# addcol(newcol,name = None,pos = None,move = False,** kwargs ) 添加一个新的newcol对象作为列。
参数:    
newcol:carray,ndarray,list或tuple
如果通过了carray,则不会进行转换。如果必须转换为carray,则应用kwargs。
name:string,optional
新列的名称。如果没有通过,它将收到一个自动名称。
pos:int,可选
列位置。如果没有通过,它将在最后附加。
move:布尔值,可选
如果新列是现有的,基于磁盘的carray它应该a)复制数据目录(False)或b)移动数据目录(True)
kwargs:参数列表或字典
carray构造函数支持的任何参数。

# append(cols )  将cols附加到此ctable。
参数:    
cols:标量值的列表/元组,NumPy数组或carray,它也可以是NumPy记录,NumPy重组或其他ctable。

# cbytes  此对象的压缩大小(以字节为单位)。

# copy(** kwargs )   返回此ctable的副本。
参数:    
kwargs:参数列表或字典

# carray / ctable构造函数支持的任何参数。
返回:    
out:ctable对象,这个ctable的副本。

# cparams    此对象的压缩参数。

# delcol(name = None,pos = None,keep = False )  删除名为name的列或位置pos。
参数:    
name:string,optional,要删除的列的名称。
pos:int,可选,要删除的列的位置。
keep:布尔值

# flush()
将内部缓冲区中的数据刷新到磁盘。
通常应该在持久性模式下执行修改(__settitem __(),append())之后执行此调用。如果您不这样做,您可能会失去部分修改。

# free_cachemem()
摆脱内部缓存以释放内存。
通常可以在从carray / ctable读取之后进行该调用,以释放内部使用的存储器以缓存数据块/块。

# 静态fromdataframe(** kwargs )   从pandas数据帧中返回一个ctable对象。
参数:    
df:DataFrame

如果可能,'object'dtype将被转换为'S'字符串类型。这样可以更好地节省bcolz的存储空间。

使用 bolz 写入 df 对象和读取 df 对象

读取

将 .bcolz 文件读为 DataFrame

import bcolz

f = bcolz.open('/tmp/test.bcolz')
df = f.todataframe()

写入

方法一: bcolz.fromiter
ct2 = bcolz.fromiter(
	((i,i*i) for i in range(N)), 
	dtype="i4,f8", 
	count=N, 
	rootdir="./ct2.bcolz")
方法二: ctable.append
with bcolz.zeros(0, dtype="i4,f8", mode='w', rootdir="./ct1.bcolz") as ct1:
    for i in range(20000):
        ct1.append((i, i**2))
方法三: ctable.addcol
with bcolz.zeros(0, dtype="i4,f8", mode='w', rootdir="./ct3.bcolz") as ct3:
    new_col = np.linspace(0, 1, N)
    ct3.addcol(new_col)
方法四: ctable.fromdataframe
ct4 = bcolz.ctable.fromdataframe(df, rootdir='./ct4.bcolz')

查询

方法一
ct = bcolz.open('./ct.bcolz')
df = ct.todataframe()
df = df.loc[(df.date>20160101)&(df.date<=20160201)]
方法二
ct = bcolz.open('./ct.bcolz')
ct = ct.where('(date>20160101)&(date<=20160201)')
df = pd.DataFrame(ct
附:

bcolz 中的 dtype 的写法与 numpy 一样

类型         简写                描述
bool_       'b'          布尔型数据类型(True 或者 False)
int_        'i8'         默认的整数类型(int32 或 int64)
intc        'i4/i8'      一般是 int32 或 int 64
intp        'i4/i8'      用于索引的整数类型(一般情是 int32 或 int64)
int8        'i1'         字节(-128 to 127)
int16       'i2'         整数(-32768 to 32767)
int32       'i4'         整数(-2147483648 to 2147483647)
int64       'i8'         整数(-9223372036854775808 to 9223372036854775807)
uint8       'u1'         无符号整数(0 to 255)
uint16      'u2'         无符号整数(0 to 65535)
uint32      'u4'         无符号整数(0 to 4294967295)
uint64      'u8'         无符号整数(0 to 18446744073709551615)
float_      'f8'         float64 类型的简写
float16     'f2'         半精度浮点数,包括:1 个符号位,5 个指数位,10 个尾数位
float32     'f4'         单精度浮点数,包括:1 个符号位,8 个指数位,23 个尾数位
float64     'f8'         双精度浮点数,包括:1 个符号位,11 个指数位,52 个尾数位
complex_    'c16'        complex128 类型的简写,即 128 位复数
complex64   'c8'         复数,表示双 32 位浮点数(实数部分和虚数部分)
complex128  'c16'        复数,表示双 64 位浮点数(实数部分和虚数部分)

实例

写入df对象

import time
import pandas as pd
import bcolz
import os
from concurrent.futures import ThreadPoolExecutor

p = ThreadPoolExecutor(5)

file_names = os.listdir(r'/home/mfbar/rox_script/111111')

def clean(file_name):
    start = time.time()
    df = pd.read_csv(r'/home/mfbar/rox_script/111111/%s'%file_name)
    ct = bcolz.ctable.fromdataframe(df, rootdir=r'/home/mfbar/rox_script/clean/%s.bcolz'%file_name[:-4])
    ct.flush()    # 格式化到本地,也可以直接写入到内存中
    print('结束', file_name, time.time() - start)

if __name__ == '__main__':
    l = []
    for file_name in file_names:
        t = p.submit(clean, file_name)
        l.append(t)

读取df对象

import bcolz
import os
import time

file_names = os.listdir(r'/home/mfbar/rox_script/clean')

s1 = time.time()
for file_name in file_names:
    start = time.time()
    ct = bcolz.open(rootdir=r'/home/mfbar/rox_script/clean/%s'%file_name)
    df = ct.todataframe()
    df = df.loc[(df.unixtime >= 1356969600) & (df.unixtime <= 1514736000)]
    print(df.index)
    print('结束', file_name, df.shape , time.time() - start)
print('使用bcolz处理完总共需要的时间', time.time() - s1)

博客参考地址:

https://blog.csdn.net/u013474436/article/details/79291963?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159261499219195264515309%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=159261499219195264515309&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v3~pc_rank_v3-4-79291963.first_rank_ecpm_v3_pc_rank_v3&utm_term=bcolz

https://blog.csdn.net/weixin_42902669/article/details/103089128?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159261499219195264515309%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=159261499219195264515309&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-2-103089128.first_rank_ecpm_v3_pc_rank_v3&utm_term=bcolz

http://bcolz.blosc.org/en/latest/intro.html

原文地址:https://www.cnblogs.com/whkzm/p/13167687.html