天天看點

easyexcel導出百萬級資料_Python: 拆分檔案讓百萬級資料運作速度提高135倍

作者:許夢潔 (中山大學)

Email: [email protected]

Stata連享會 計量專題  || 公衆号合集
4天直播-連享會-文本分析與爬蟲專題
easyexcel導出百萬級資料_Python: 拆分檔案讓百萬級資料運作速度提高135倍
語言:Python方法:拆分檔案目的:提高運作速度

一、任務描述

對 2010 年後 49083 條上市公司股權變更資料(Firm-Event 觀測)分别統計每個事件發生前後 15 天公司:

  • 釋出的臨時公告數
  • 累計超額收益 (CAR)

二、資料描述

資料集 總樣本數 2010年後的樣本數
上市公司股權變更記錄 57584 49083
上市公司公告記錄 2787026 2758934
上市公司日超額收益 9749464 5534947

三、解決思路

Python

構造一個類似于

Excel

中的 countif 函數即可。具體見我上一篇博文 [百萬級大樣本中的 countif 實作]。

特别說明: 文中包含的連結在微信中無法生效。請點選本文底部左下角的【閱讀原文】。

四、潛在問題

雖然按照上一篇文章的思路也能基本完成任務,但是程式運作非常慢,光跑一次統計視窗期公告資料的程式就要27個小時,是以必須優化程式以提高運作速度。

五、優化思路

由于全樣本非常大,上篇博文的程式相當于是對每一個公司股東股權變動事件在全部的公告池(2758934條記錄)中進行搜尋,顯然這樣做是無效率的。

是以,此次程式優化的主要思路是分别拆分 49083 條公司股東股權變動事件和 2758934 條上市公司公告記錄,并将兩類拆分的檔案對應起來。舉個例子:

  • 第一步: 将股票代碼在 000001 到 000049 的公司股權變動事件拆出來
  • 第二步: 将股票代碼在000001 到 000049 的公司公告拆出來形成一個小的公告搜尋池,然後對這部分公司的股權事件在這個小搜尋池裡統計公告記錄。

通過拆分檔案得到的精确比對大大減小了每一個事件的搜尋範圍,可以大幅提高程式運作效率。優化後跑一次同樣的統計視窗期公告資料程式僅需 12 分鐘,是原來運作速度的 135 倍。

六、核心代碼(以統計視窗期 CAR 為例)

1. 初步拆分

為了保證運作效率最高,首先平均分拆 CAR 序列,周遊股票日超額收益序列資料,設定門檻值為 50000,每 50000 條資料拆出一個檔案,以 "CAR+編号" 為檔案名 (eg:

CAR109.txt

)。最後共拆出了 110 個檔案,Python 代碼如下:

2. 根據分拆檔案記錄拆分股票節點

周遊拆出來的 110 個 CAR 檔案,分别記錄每個檔案最後一個觀測的股票代碼,并逐條寫入 “拆分節點.txt” 中。Python 代碼如下:

3. 根據拆分節點拆分事件清單并再拆分 CAR 清單

由于初步拆分是根據樣本數拆分,是以出現了同一隻股票不同日期的 CAR 會被拆到兩個不同檔案的情況,十分不利于後面股權變更檔案與 CAR 檔案拆分後實作完美比對。

是以,需要根據第二步得到拆分節點處的股票代碼對 CAR 清單再拆分,并同時拆分股權變更清單。經過這一步後拆分後的兩種檔案就可以實作精确比對。

此外,由于事先已經對股權變更檔案以及 CAR 檔案根據股票代碼以及日期進行排過序,是以接下來的拆分隻需逐行周遊,判斷周遊到的觀測股票代碼與拆分節點處的股票代碼的關系,如果周遊處股票代碼大于目前拆分節點,則儲存一個分拆檔案,清空相關變量并開啟下一個分拆檔案。Python 代碼如下:

4. 基于拆分後的事件清單和日期序列統計資料

一一對應地拆完大檔案之後就可以在縮小的搜尋範圍裡 countif 啦,這部分思路見上一篇博文百萬級大樣本中的countif實作 (點選底部【閱讀原文】檢視連結)。跑完49083 條資料的結果隻需要 12 分鐘,簡直是飛一般的感覺(`・ω・´)。

七、統計結果樣例

股票代碼 事件日期 事件前15天CAR 事件後15天CAR 事件前15天公告數 事件後15天公告數
2 2014-03-21 0.192826 0.06398 18 6
2 2014-08-29 -0.057021 -0.033097 19 6
2 2014-09-16 -0.031721 -0.031635 6 16
2 2015-01-24 -0.010155 -0.107722 3 13
2 2015-01-28 -0.069575 -0.045201 6 10
2 2015-07-11 0.356788 -0.126676 15 16
2 2015-07-25 -0.192525 0.0095 17 12
2 2015-08-04 0.019329 -0.120508 7 29
2 2015-08-27 0.142061 -0.048584 22 11
2 2015-12-07 0.242967 0.221147 11 16
2 2015-12-09 0.353391 0.276527 12 15
2 2015-12-16 0.268726 0.124451 17 26
2 2016-07-07 -0.27522 -0.133624 46 18
2 2016-08-05 0.294057 0.190569 9 8
2 2016-08-09 0.295028 0.076121 7 15

更多精彩課程

  • I. 直播-空間計量系列課程,主講:範巧。
  • H. 視訊-我的甲殼蟲-經典論文精講,主講:連玉君。
  • G. 視訊-R語言初識,主講:遊萬海,随時線上觀看。
  • F. 直播視訊-直擊面闆資料模型,主講:連玉君,公開課-Free。
  • E. 視訊-經濟學中的大資料應用,主講:李兵,随時線上觀看。
  • D. 視訊-空間計量全局模型及MATLAB實作,主講:範巧,随時線上觀看。
  • C. 視訊-動态面闆資料模型,主講:連玉君,随時線上觀看。
  • B. 視訊-實證研究設計,主講:連玉君,,随時線上觀看。
  • A. 直播-文本分析與爬蟲專題,2020.3.28-29、4.4-5,主講:司繼春、遊萬海。
easyexcel導出百萬級資料_Python: 拆分檔案讓百萬級資料運作速度提高135倍

直播:動态空間面闆 | 空間雙差分 SDID

easyexcel導出百萬級資料_Python: 拆分檔案讓百萬級資料運作速度提高135倍