使用Python的pandas开源库测试对比文件性能和记录知识

使用Pandas对比文件差异
文件名大小执行时间总条数总列数增量更新量
agent_x_detail191 MB (200,523,461 字节)17.065346717834473s63856625050
agent_x_info6.10 MB (6,404,732 字节)1.0352301597595215s2664324035
agent_check_x52.4 KB (53,742 字节)0.040859222412109375s436130436
agent_info1.36 MB (1,429,771 字节)0.16558384895324707s86951618694
finance_summary856 MB (898,559,945 字节)91.57207107543945s22855714413132143753
merchant_info3.81 KB (3,904 字节)2.3846187591552734s202700
order_info532 MB (558,871,126 字节)57.72691226005554s22362092513002234909
order_x_info31.8 MB (33,349,320 字节)7.624603509902954s18231501823
payable_info227 KB (233,105 字节)0.18849635124206543s592100
payment_x_info11.1 KB (11,455 字节)0.03593587875366211s5912000
payment_xx_info143 KB (147,100 字节)0.07283735275268555s5912000
product_info67.2 MB (70,508,008 字节)
receivabl_info248 KB (254,493 字节)0.18846964836120605s17361841732
supplier_x_infos657 MB (688,990,119 字节)80.93834805488586s251870528161826662
supply_x_detail207 MB (217,510,818 字节)25.67716956138611s6280922700
supply_x_infos4.90 MB (5,147,909 字节)1.1818594932556152s21483240321
supply_chk_info196 KB (201,491 字节)0.11568450927734375s15441301544
supply_info2.07 MB (2,178,032 字节)0.4218719005584717s99151939889
报错记录
  1. UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xbe in position 0: invalid start byte
    csv文件默认是gbk的编码格式, 而pandas默认是utf-8编码格式。两种解决方案,把源文件修改为utf-8的编码格式,或者pandas在读的时候采用enconding=‘gbk’
描述
  1. 核心逻辑是,对比连续两天的数据包文件的差异,找出新增的和更新的。上面表格中总条数其实是上一天的。根据增量和更新量可以推断出下一天的数据量。
  2. 在运行过程中内存高峰占用到14G多,我电脑是4c,i5,win10,20G内存。因为Python跟Java一样也有垃圾收集器,内存的释放还是很及时的,没有撑爆内存。但是,电脑还是非常卡,卡到跟本点不开其他任何应用,这样的代码真的可以在生产环境上跑吗?这样有意义吗?//TODO Python和Java他们在内存占用方面是怎么处理的?
如何理解Python的DataFrame?
  1. 其实不是Python的,而是pandas这个组件的。是 Powerful data manipulation tools for Python
    它可以连接数据库,操作大量的数据。
    它可以操作csv文件
    它可以操作Json
    它可以操作excel
    它可以操作html
    它仅仅是可以读取,写这些东西。当内容被读取到这个DataFrame中后,你要对数据作怎样的操作,那都是根据我们需要的结果,然后进行逻辑操作。
注意事项
  1. 代码:df_merge= df1.merge(df2, on=0, copy=False)

  2. 对代码的中copy=False的理解。

  3. 如何理解copy=False的这个特殊情况?有信息说,在某些特殊情况下,不要复制,默认是复制的。
    Python也是面向对象的一门语言,它也有垃圾收集器。也有对象的创建。有了对象一定有对象的序列化和反序列化的情况。也有对象的浅拷贝和深拷贝。就可以理解操作符 = copy() copy(deep==False)
    在pandas中不支持深拷贝的。

  4. 代码证明pandas不支持深拷贝。
    arr1 = [1, 2, 3]
    arr2 = [1, 2, 3, 4]
    df1 = pd.DataFrame([[arr1], [arr2]], columns=[‘A’])
    print(df1.applymap(id))

    df2 = df1.copy(deep=True)
    print(df2.applymap(id))

    df2.loc[0, ‘A’].append(5)
    print(df2)
    print(df1)

  5. 结果
    A
    0 2751069368072
    1 2751069186376
    A
    0 2751069368072
    1 2751069186376
    A
    0 [1, 2, 3, 5]
    1 [1, 2, 3, 4]
    A
    0 [1, 2, 3, 5]
    1 [1, 2, 3, 4]
    A
    0 2609084320904
    1 2609084135112
    A
    0 2609084320904
    1 2609084135112
    描述:0和1是索引,A是列名。一串数字是对象Id,会发现Id没有变,也就是数字没有变化,所以证明它不支持深拷贝的。

DataFrame和Series的关系?
  1. DataFrame来自Pandas。Series描述的是一行数据,它可以构建成DataFrame的模式。而任何一个DataFrame都可以进行转置。转置的意思就是顺时针旋转90度。
numpy的使用。
  1. Numerical Python,提供了Python对多维数组对象的支持:ndarray。具有矢量运算能力,快速,节省空间。Numpy支持高级大量的维度数组于矩阵运算,此外也针对数组运算提供大量的数据函数库。构建一些数组,比如一维数组,二维数组。然后对数组本身进行一些操作,和了解它的一些属性,重写它的属性操作。也可以进行这些数组间运算操作。
小结
  1. 结论就是:DataFrame, Series, numpy,都可以构建一种矩阵。然后对矩阵中的属性进行一些操作。和对里面的值进行一些操作。究竟可以在哪些场景下使用,需要具体的问题分析,然后可能联想到Python的这三个库进行操作。去对比文件里面的内容也好,去统计里面内容的信息也好,都是场景的应用,因为它是作数据分析的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值