百万级大样本中的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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章