Pandas源码分析(一): 核心类型DataFrame的实现
最近在玩数据分析需要用到Pandas处理数据, 在网上看到了各种骚操作,为了提升开发效率(避免造轮子)必须得read the fucking source code 只有读懂了源代码 ,才算是懂了原理。顺便来模仿(学习)一下大神写代码的风格。。。
DataFrame 类的定义
我们先来看一下DataFrame结构是怎么定义的:
我们写一个简单的Pandas案例并使用pbd进行调试, 看看新建一个DataFrame对象后会发生什么:
我们输入"s"进入构造函数调用:
然后一直输入"n&l"进行逐行调试并打印, 我们看到首先它会判断数据和数据类型是否为空:
之后又会根据所给的数据类型进行相应的操作,中间的代码有点多,我们先来看看data是dict时的情况:
它会调用"dict_to_mgr"方法赋值给一个临时变量mgr, 然后用mgr初始化父类NDFrame。
那么我们来看看"dict_to_mgr"方法做了些什么, 代码的注释大概是说将序列转化为矩阵:
然后它会判断列是否为None, 我们没有声明columns, 所以进入else:
else部分会计算出keys, columns, 然后来看看keys和colums的值是多少:
此时columns是一个Index类型了, 列的索引已经计算好了,接下来到计算行的操作了!!!
调试一波后arrays的值为一个list, 它把dict的所有的value放入一个list里了:
最后返回为一个mgr类型:
这样就求出mgr了, 我们发现mgr是BlockManager的:
一个DataFrame就新建完了, 然后我们打印时又df时调用了__repr__:
我们来总结一下吧, 创建一个DataFrame时首先会检查data和columns是否为None, 然后判断所给data的类型, 然后获取data的key作为columns的索引, 然后运用key新建一个索引Index类, 最后转化为BlockFrame类型, 使用这个类可以更方便管理表格的每一个块。
Pandas的源代码是真得复杂, 不过用pdb逐行调试慢慢地揭开了这堆抽象的代码结构。。。