合併重疊時間窗口

任務描述

最近在做上市公司的事件研究,得到了每個事件發生及之後 15 個交易日的時間窗口,已經按照stkcd evendate的順序排好序,下面截取小段 sample 存儲到 test.txt 中。顯然存在很多重疊的時間窗口,所以想去除掉Overlapping的部分,減少下一步工作的工作量。

stkcd stkname eventdate edate
1 平安銀行 2017-06-27 2017-07-17
1 平安銀行 2017-11-20 2017-12-08
1 平安銀行 2018-01-12 2018-02-01
1 平安銀行 2018-01-19 2018-02-08
2 萬科A 2016-12-19 2017-01-09
2 萬科A 2016-12-21 2017-01-11
2 萬科A 2018-04-17 2018-05-09
2 萬科A 2018-04-24 2018-05-16
2 萬科A 2018-04-27 2018-05-21
2 萬科A 2018-05-08 2018-05-28
2 萬科A 2018-05-09 2018-05-29
2 萬科A 2018-05-10 2018-05-30
2 萬科A 2018-05-11 2018-05-31
2 萬科A 2018-05-14 2018-06-01
2 萬科A 2018-05-15 2018-06-04
2 萬科A 2018-05-16 2018-06-05
2 萬科A 2018-05-17 2018-06-06
2 萬科A 2018-05-18 2018-06-07
2 萬科A 2018-05-21 2018-06-08
2 萬科A 2018-05-22 2018-06-11
2 萬科A 2018-05-31 2018-06-21
2 萬科A 2018-06-05 2018-06-26
2 萬科A 2018-06-12 2018-07-03
2 萬科A 2018-06-29 2018-07-19
2 萬科A 2018-07-12 2018-08-01
2 萬科A 2018-07-17 2018-08-06
2 萬科A 2018-07-24 2018-08-13
2 萬科A 2018-07-27 2018-08-16
2 萬科A 2018-07-31 2018-08-20
2 萬科A 2018-08-08 2018-08-28
2 萬科A 2018-08-31 2018-09-20
2 萬科A 2018-09-11 2018-10-09
2 萬科A 2018-10-16 2018-11-05
5 世紀星源 2008-03-31 2016-01-22
5 世紀星源 2015-06-30 2016-01-22
5 世紀星源 2017-06-07 2017-06-27
5 世紀星源 2017-09-11 2017-09-29

解決思路

大概就是逐行遍歷,用 start 和 end 分別存儲上步更新的時間戳。假如每行時間窗口的起點爲 evendate ,終點爲 edate 。則一共只有以下四種情況:

  1. edate > end > evendate:
  2. edate > evendate > end
  3. start < evendate < edate < end
  4. evendate < start (一隻股票的序列結束,另一隻股票的序列開始)

根據不同情況分別更新時間戳 start end 即可

實現代碼

import pandas as pd

data = pd.read_table('test.txt',header=0,encoding='utf-8',delim_whitespace=True)
data.columns=['stkcd','stkname','evendate','edate']

start = data.loc[0, 'evendate']
end = data.loc[0, 'edate']
f=[[start,end]]

for i in range(len(data.loc[:,'stkcd'])):
    evendate = data.loc[i, 'evendate']
    edate = data.loc[i,'edate']
    print([start, end])
    if edate > end > evendate:
        end = edate
        f.append([evendate, edate])
    elif edate > evendate > end:
        start = evendate
        end = edate
        f.append([evendate, edate])
    elif start < evendate < edate < end:
        f.append([evendate, edate])
    elif evendate < start:
        start = evendate
        end = edate
        f.append([evendate, edate])

運行結果

逐行迭代後的時間戳爲:

迭代時間戳
[‘2017-06-27’, ‘2017-07-17’]
[‘2017-06-27’, ‘2017-07-17’]
[‘2017-11-20’, ‘2017-12-08’]
[‘2018-01-12’, ‘2018-02-01’]
[‘2018-01-12’, ‘2018-02-08’]
[‘2016-12-19’, ‘2017-01-09’]
[‘2016-12-19’, ‘2017-01-11’]
[‘2018-04-17’, ‘2018-05-09’]
[‘2018-04-17’, ‘2018-05-16’]
[‘2018-04-17’, ‘2018-05-21’]
[‘2018-04-17’, ‘2018-05-28’]
[‘2018-04-17’, ‘2018-05-29’]
[‘2018-04-17’, ‘2018-05-30’]
[‘2018-04-17’, ‘2018-05-31’]
[‘2018-04-17’, ‘2018-06-01’]
[‘2018-04-17’, ‘2018-06-04’]
[‘2018-04-17’, ‘2018-06-05’]
[‘2018-04-17’, ‘2018-06-06’]
[‘2018-04-17’, ‘2018-06-07’]
[‘2018-04-17’, ‘2018-06-08’]
[‘2018-04-17’, ‘2018-06-11’]
[‘2018-04-17’, ‘2018-06-21’]
[‘2018-04-17’, ‘2018-06-26’]
[‘2018-04-17’, ‘2018-07-03’]
[‘2018-04-17’, ‘2018-07-19’]
[‘2018-04-17’, ‘2018-08-01’]
[‘2018-04-17’, ‘2018-08-06’]
[‘2018-04-17’, ‘2018-08-13’]
[‘2018-04-17’, ‘2018-08-16’]
[‘2018-04-17’, ‘2018-08-20’]
[‘2018-04-17’, ‘2018-08-28’]
[‘2018-08-31’, ‘2018-09-20’]
[‘2018-08-31’, ‘2018-10-09’]
[‘2018-10-16’, ‘2018-11-05’]
[‘2008-03-31’, ‘2016-01-22’]
[‘2008-03-31’, ‘2016-01-22’]
[‘2017-06-07’, ‘2017-06-27’]

最終的時間範圍則爲每個 start 時間戳對應的最後一行:

最終時間戳
[‘2017-06-27’, ‘2017-07-17’]
[‘2017-11-20’, ‘2017-12-08’]
[‘2018-01-12’, ‘2018-02-08’]
[‘2016-12-19’, ‘2017-01-11’]
[‘2018-04-17’, ‘2018-08-28’]
[‘2018-08-31’, ‘2018-10-09’]
[‘2018-10-16’, ‘2018-11-05’]
[‘2008-03-31’, ‘2016-01-22’]
[‘2017-06-07’, ‘2017-06-27’]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章