百万级大样本中的countif实现

一、任务描述

对每个减持事件分别统计该股票在减持前30天和减持后30天发布的公告数。由于数据集过于庞大,用stataexcel都不好操作,所以选用轻便灵活的python语言。

二、数据集描述

主要有两个数据集:

  1. 公告列表
    爬取的巨潮资讯网所有公告记录,共2787026条。sample 如下:
announcementidstkcdstknameannouncementdateannouncementtitle
184272421S 深发展A2006/10/10S深发展A自2006年10月10日开市起临时停牌
231526921S 深发展A2007/4/27S深发展A 自2007年4月27日开市起临时停牌
233843971S 深发展A2007/5/11S深发展A自2007年5月11日下午开市起临时停牌公告
291897161深发展A2007/6/20关于“深发展A”交易的风险提示
494431301深发展A2009/2/23深发展A自2009年2月23日13:00起临时停牌
571395441深发展A2009/10/14深发展A:限售股份解除限售提示性公告
572216621深发展A2009/10/29深发展A:独立董事对公司衍生品交易业务及风险控制情况的专项意见
572216611深发展A2009/10/29深发展A:2009年第三季度报告
572216591深发展A2009/10/29深发展A:董事会决议公告
574354111深发展A2009/12/25深发展A:监事会公告
574380191深发展A2009/12/25深发展A自2009年12月25日开市起临时停牌
  1. 股东减持事件
    来自 CSMAR 的所有股东减持记录,共15287条。sample 如下:
证券代码股份减持方变动方式成功与否第一次公告日期过户登记日期本次变动数量本次变动数量占总股本的比例(%)
55深圳市邦林科技发展有限公司1012007/5/172007/5/1747558001.23
55深圳市时利和投资有限公司1012007/5/192007/5/1957288001.48
55深圳市邦林科技发展有限公司1012007/5/262007/5/2653500001.38
55深圳市时利和投资有限公司1012007/5/292007/5/2956900001.47
55深圳市邦林科技发展有限公司1012008/5/62008/5/6193601805.05
55深圳市时利和投资有限公司1012008/5/172008/5/17193081805.05
55深圳市邦林科技发展有限公司1012008/9/202008/9/2048761801.14
55深圳市时利和投资有限公司1012008/12/62008/12/654900001.29
56深圳经济特区发展(集团)公司621999/12/22383475610.79
56泰天实业发展有限公司1012007/2/282007/2/2817130000.78
56深圳市特发集团有限公司1012007/4/122007/4/1239231641.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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值