百萬級大樣本中的countif實現

任務描述

對每個減持事件分別統計該股票在減持前30天和減持後30天發佈的公告數。由於數據集過於龐大,用stataexcel都不好操作,所以選用輕便靈活的python語言。

數據集描述

主要有兩個數據集:

  1. 公告列表
    爬取的巨潮資訊網所有公告記錄,共2787026條。sample 如下:
announcementid stkcd stkname announcementdate announcementtitle
18427242 1 S 深發展A 2006/10/10 S深發展A自2006年10月10日開市起臨時停牌
23152692 1 S 深發展A 2007/4/27 S深發展A 自2007年4月27日開市起臨時停牌
23384397 1 S 深發展A 2007/5/11 S深發展A自2007年5月11日下午開市起臨時停牌公告
29189716 1 深發展A 2007/6/20 關於“深發展A”交易的風險提示
49443130 1 深發展A 2009/2/23 深發展A自2009年2月23日13:00起臨時停牌
57139544 1 深發展A 2009/10/14 深發展A:限售股份解除限售提示性公告
57221662 1 深發展A 2009/10/29 深發展A:獨立董事對公司衍生品交易業務及風險控制情況的專項意見
57221661 1 深發展A 2009/10/29 深發展A:2009年第三季度報告
57221659 1 深發展A 2009/10/29 深發展A:董事會決議公告
57435411 1 深發展A 2009/12/25 深發展A:監事會公告
57438019 1 深發展A 2009/12/25 深發展A自2009年12月25日開市起臨時停牌
  1. 股東減持事件
    來自 CSMAR 的所有股東減持記錄,共15287條。sample 如下:
證券代碼 股份減持方 變動方式 成功與否 第一次公告日期 過戶登記日期 本次變動數量 本次變動數量佔總股本的比例(%)
55 深圳市邦林科技發展有限公司 10 1 2007/5/17 2007/5/17 4755800 1.23
55 深圳市時利和投資有限公司 10 1 2007/5/19 2007/5/19 5728800 1.48
55 深圳市邦林科技發展有限公司 10 1 2007/5/26 2007/5/26 5350000 1.38
55 深圳市時利和投資有限公司 10 1 2007/5/29 2007/5/29 5690000 1.47
55 深圳市邦林科技發展有限公司 10 1 2008/5/6 2008/5/6 19360180 5.05
55 深圳市時利和投資有限公司 10 1 2008/5/17 2008/5/17 19308180 5.05
55 深圳市邦林科技發展有限公司 10 1 2008/9/20 2008/9/20 4876180 1.14
55 深圳市時利和投資有限公司 10 1 2008/12/6 2008/12/6 5490000 1.29
56 深圳經濟特區發展(集團)公司 6 2 1999/12/2 23834756 10.79
56 泰天實業發展有限公司 10 1 2007/2/28 2007/2/28 1713000 0.78
56 深圳市特發集團有限公司 10 1 2007/4/12 2007/4/12 3923164 1.776

核心思路

python中實現excelcountif 功能:

clist = data.loc[(data['stkcd'] == 股票代碼) & (data['日期序列'] <= 結束日期) & (data['日期序列'] >= 開始日期), '日期序列']

核心代碼受Little_Rokie博客的啓發。

完整代碼

import pandas as pd
from datetime import *

data = pd.read_table('公告列表.txt',header=0,encoding='utf-8',delim_whitespace=True)
data.columns=['stkcd','日期序列']


def 區間計數(股票代碼,減持日期,前置窗口長度,後置窗口長度):
    減持時間戳 = datetime.strptime(減持日期,"%Y-%m-%d")
    開始日期 = (減持時間戳-timespan*前置窗口長度).strftime("%Y-%m-%d")
    print(開始日期)
    結束日期 = (減持時間戳+timespan*後置窗口長度).strftime("%Y-%m-%d")
    print(結束日期)
    clist = data.loc[(data['stkcd'] == 股票代碼) & (data['日期序列'] <= 結束日期) & (data['日期序列'] >= 開始日期), '日期序列']
    區間公告數 = len(clist)
    return(區間公告數)


if __name__ == "__main__":
    timespan = timedelta(days=1)
    f = open("股東減持事件.txt")
    g = open("區間公告統計結果.txt",'a')
    g.write('股票代碼,減持日期,事件前30天區間公告數,事件後30天區間公告數\n')
    lines = f.readlines()
    for line in lines:
        stkcd = int(line.split(',')[0].split("\n")[0])
        print(stkcd)
        eventdate = line.split(',')[1].split("\n")[0]
        事件前區間公告數 = 區間計數(stkcd, eventdate, 30, 0)
        事件後區間公告數 = 區間計數(stkcd, eventdate, 0, 30)
        print([stkcd, eventdate, 事件前區間公告數, 事件後區間公告數])
        g.write(','.join([repr(stkcd), eventdate, repr(事件前區間公告數), repr(事件後區間公告數)])+'\n')
    f.close()
    g.close()

主要參考鏈接:

  1. https://www.cnblogs.com/nxld/p/6756492.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章