Pandas源碼分析(一): 核心類型DataFrame的實現(xiàn)
最近在玩數(shù)據(jù)分析需要用到Pandas處理數(shù)據(jù), 在網(wǎng)上看到了各種騷操作,為了提升開發(fā)效率(避免造輪子)必須得read?the?fucking?source?code?只有讀懂了源代碼?,才算是懂了原理。順便來模仿(學習)一下大神寫代碼的風格。。。
DataFrame?類的定義
我們先來看一下DataFrame結構是怎么定義的:
我們寫一個簡單的Pandas案例并使用pbd進行調試, 看看新建一個DataFrame對象后會發(fā)生什么:
我們輸入"s"進入構造函數(shù)調用:
然后一直輸入"n&l"進行逐行調試并打印, 我們看到首先它會判斷數(shù)據(jù)和數(shù)據(jù)類型是否為空:
之后又會根據(jù)所給的數(shù)據(jù)類型進行相應的操作,中間的代碼有點多,我們先來看看data是dict時的情況:
?它會調用"dict_to_mgr"方法賦值給一個臨時變量mgr, 然后用mgr初始化父類NDFrame。
那么我們來看看"dict_to_mgr"方法做了些什么, 代碼的注釋大概是說將序列轉化為矩陣:
然后它會判斷列是否為None, 我們沒有聲明columns, 所以進入else:
else部分會計算出keys, columns, 然后來看看keys和colums的值是多少:
此時columns是一個Index類型了, 列的索引已經(jīng)計算好了,接下來到計算行的操作了!!!
調試一波后arrays的值為一個list, 它把dict的所有的value放入一個list里了:
最后返回為一個mgr類型:
這樣就求出mgr了, 我們發(fā)現(xiàn)mgr是BlockManager的:
一個DataFrame就新建完了, 然后我們打印時又df時調用了__repr__:
我們來總結一下吧, 創(chuàng)建一個DataFrame時首先會檢查data和columns是否為None, 然后判斷所給data的類型, 然后獲取data的key作為columns的索引, 然后運用key新建一個索引Index類,?最后轉化為BlockFrame類型, 使用這個類可以更方便管理表格的每一個塊。
Pandas的源代碼是真得復雜, 不過用pdb逐行調試慢慢地揭開了這堆抽象的代碼結構。。。