• 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

  • 相关阅读:
    shell脚本进阶
    sort与uniq命令
    sed命令
    DNS与CDN
    nginx
    Docker Private Registry
    docker存储卷
    docker容器网络配置
    docker容器网络
    docker容器虚拟化
  • 原文地址:https://www.cnblogs.com/whkzm/p/13167687.html
Copyright © 2020-2023  润新知