使用Pandas对比文件差异
文件名 | 大小 | 执行时间 | 总条数 | 总列数 | 增量 | 更新量 |
---|---|---|---|---|---|---|
agent_x_detail | 191 MB (200,523,461 字节) | 17.065346717834473s | 638566 | 25 | 0 | 50 |
agent_x_info | 6.10 MB (6,404,732 字节) | 1.0352301597595215s | 26643 | 24 | 0 | 35 |
agent_check_x | 52.4 KB (53,742 字节) | 0.040859222412109375s | 436 | 13 | 0 | 436 |
agent_info | 1.36 MB (1,429,771 字节) | 0.16558384895324707s | 8695 | 16 | 1 | 8694 |
finance_summary | 856 MB (898,559,945 字节) | 91.57207107543945s | 2285571 | 44 | 1313 | 2143753 |
merchant_info | 3.81 KB (3,904 字节) | 2.3846187591552734s | 20 | 27 | 0 | 0 |
order_info | 532 MB (558,871,126 字节) | 57.72691226005554s | 2236209 | 25 | 1300 | 2234909 |
order_x_info | 31.8 MB (33,349,320 字节) | 7.624603509902954s | 1823 | 15 | 0 | 1823 |
payable_info | 227 KB (233,105 字节) | 0.18849635124206543s | 59 | 21 | 0 | 0 |
payment_x_info | 11.1 KB (11,455 字节) | 0.03593587875366211s | 591 | 20 | 0 | 0 |
payment_xx_info | 143 KB (147,100 字节) | 0.07283735275268555s | 591 | 20 | 0 | 0 |
product_info | 67.2 MB (70,508,008 字节) | 无 | 无 | 无 | 无 | 无 |
receivabl_info | 248 KB (254,493 字节) | 0.18846964836120605s | 1736 | 18 | 4 | 1732 |
supplier_x_infos | 657 MB (688,990,119 字节) | 80.93834805488586s | 2518705 | 28 | 1618 | 26662 |
supply_x_detail | 207 MB (217,510,818 字节) | 25.67716956138611s | 628092 | 27 | 0 | 0 |
supply_x_infos | 4.90 MB (5,147,909 字节) | 1.1818594932556152s | 21483 | 24 | 0 | 321 |
supply_chk_info | 196 KB (201,491 字节) | 0.11568450927734375s | 1544 | 13 | 0 | 1544 |
supply_info | 2.07 MB (2,178,032 字节) | 0.4218719005584717s | 9915 | 19 | 3 | 9889 |
报错记录
- 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’
描述
- 核心逻辑是,对比连续两天的数据包文件的差异,找出新增的和更新的。上面表格中总条数其实是上一天的。根据增量和更新量可以推断出下一天的数据量。
- 在运行过程中内存高峰占用到14G多,我电脑是4c,i5,win10,20G内存。因为Python跟Java一样也有垃圾收集器,内存的释放还是很及时的,没有撑爆内存。但是,电脑还是非常卡,卡到跟本点不开其他任何应用,这样的代码真的可以在生产环境上跑吗?这样有意义吗?//TODO Python和Java他们在内存占用方面是怎么处理的?
如何理解Python的DataFrame?
- 其实不是Python的,而是pandas这个组件的。是 Powerful data manipulation tools for Python
它可以连接数据库,操作大量的数据。
它可以操作csv文件
它可以操作Json
它可以操作excel
它可以操作html
它仅仅是可以读取,写这些东西。当内容被读取到这个DataFrame中后,你要对数据作怎样的操作,那都是根据我们需要的结果,然后进行逻辑操作。
注意事项
-
代码:df_merge= df1.merge(df2, on=0, copy=False)
-
对代码的中copy=False的理解。
-
如何理解copy=False的这个特殊情况?有信息说,在某些特殊情况下,不要复制,默认是复制的。
Python也是面向对象的一门语言,它也有垃圾收集器。也有对象的创建。有了对象一定有对象的序列化和反序列化的情况。也有对象的浅拷贝和深拷贝。就可以理解操作符 = copy() copy(deep==False)
在pandas中不支持深拷贝的。 -
代码证明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) -
结果
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的关系?
- DataFrame来自Pandas。Series描述的是一行数据,它可以构建成DataFrame的模式。而任何一个DataFrame都可以进行转置。转置的意思就是顺时针旋转90度。
numpy的使用。
- Numerical Python,提供了Python对多维数组对象的支持:ndarray。具有矢量运算能力,快速,节省空间。Numpy支持高级大量的维度数组于矩阵运算,此外也针对数组运算提供大量的数据函数库。构建一些数组,比如一维数组,二维数组。然后对数组本身进行一些操作,和了解它的一些属性,重写它的属性操作。也可以进行这些数组间运算操作。
小结
- 结论就是:DataFrame, Series, numpy,都可以构建一种矩阵。然后对矩阵中的属性进行一些操作。和对里面的值进行一些操作。究竟可以在哪些场景下使用,需要具体的问题分析,然后可能联想到Python的这三个库进行操作。去对比文件里面的内容也好,去统计里面内容的信息也好,都是场景的应用,因为它是作数据分析的。