金融数据分析之PDF年报中词频率统计

阅读本文之前可以看浏览一下上面这篇文章,对大数据分析和年报处理有一个大概的了解。

目录

一、前言

二、需求分析

三、数据特征分析

四、代码实现

五、提取结果示列


一、前言

有位研究生同学,看到上面链接的文章,找到我,让我帮忙做一个年报的数据提取,随即我们便开展了合作。之前也做过年报数据的提取,比如3张财务表、金融衍生数据、银行理财数据、年报特定词汇频率统计等等,和我合作的大都是依据年报做投资的投资客和在校硕士和博士研究生,看得出来金融大数据分析是一个当前很热门的研究课题。小编是计算机相关专业的,对金融数据感兴趣,在金融数据的统计分析与模型回归方面可能是外行,但是在自动、批量提取数据方面还是很熟练的。这要感谢计算机和编程语言发明者,为我们节省宝贵的时间和解放懒人的生产力。


二、需求分析

(1)、提取年报中的会计师事务所数据,包括地址和名称

(2)、年报范围:2000--2020年所有上市公司年报

(3)、输出为excel统计表

(隐含需求1)、获取所有上市公司列表:中国上市公司分类2020四季度.xlsx

(隐含需求2)、获取所有上市公司2000--2020年的年度报告

接到这个需求的时候,感觉问题不大,第一条需求没有接触过,也不知道会遇到什么坑,不过做过类似的数据提取,问题不大。小编爽快答应合作了,就这样入坑了。


三、数据特征分析

提取数据之前我们先来看看年报中的会计师事务所信息长什么样子,方便“程序er”和她确认一下眼神,再把她高兴地娶回家(excel)。打开PDF左看看、右翻翻、上看看、下瞧瞧,发现她是长这样的:

1、模样一:在表格table中,分两行两列显示姓名和地址。长得比较正点,符合审美。


2、模样二:在表格table中,分两行三列显示姓名和地址。长得比较内敛,勉强看得过去,但不容易发现她的美。


3、模样三:不在表格中,直接年报中分两行显示姓名和地址。这个需要一定的境界才看得顺眼,需要点实力。


4、模样四:不在表格中,分三行显示,第一行显示主要信息,后面两行分别显示姓名和地址。这枚不是那么好追的,得一步一步来,坚持住。


以上四种模样就包含了年报中大部分的模样,按照这样去找,把满足要求的都娶回家的可能性很大,可以开始code了。等等,穿的衣服不一样怎么办,傻傻分不清,地址显示模糊,不过没关系,经过小编一番研究,发现穿啥衣服都能一眼看出来。

四、代码实现

重点来了----代码实现流程

1、获取公司代码列表,上述已经给出链接,小编也是利用spider爬取的,一般一年爬一次即可。

2、年报下载、这个可以小编自动spider的,主要是两个网站,同花顺和巨潮资讯网。

3、读取excel.xlsx文件,一方面读取模样信息的抽象词组,一方面保存整理提取的数据信息。

'''
读取.xlsx文件,按照行读取表格数据,返回二维数组
'''
def loadStockExcel_xlsx(xlsx_name):wbb=load_workbook(xlsx_name)sheet_names=wbb.sheetnamessheet1 = wbb[sheet_names[0]]dataByLine=[]for row in sheet1.rows:list_sheet1_all=[]for cell in row:if cell.value is None:continuelist_sheet1_all.append(cell.value)dataByLine.append(list_sheet1_all)wbb.close()return dataByLine

4、主流程

##需要自己安装的库
##excel
from openpyxl import Workbook ##.xlsx format
from openpyxl import load_workbook
from openpyxl.utils import get_column_letter  #,column_index_from_string##系统自带
import platform
import time
from random import randint
import random##需要自己安装的库
###pdf
import pdfplumberws=wb['会计师事务所统计信息']
title_name=['公司股票代码',"年份",'会计师事务所名称','会计师事务所地址']
ws.append(title_name)
wb.save(os.path.join(cur_path,'Accountingfirm_info.xlsx')) ##填写表头
# print(stock_data)
# stock_data=random.sample(stock_data,3)
for line in stock_data:try:# line=stock_data[index]code=line[0] name=line[1]# out_dir=os.path.join(os.path.join(cur_path,'year_reports'),str(code))out_dir=os.path.join(os.path.join(cur_path,'year_reports'),str("PDF"))if not os.path.exists(out_dir):os.system("mkdir -p "+out_dir)##下载年报到year_reports+code文件下downloadYeareportFromWANGYI(code,out_dir,year_list,end_year)pdf_list=[]for pdf_file in os.listdir(out_dir):##获取该文件夹下的PDF文件path_file=os.path.join(out_dir,pdf_file)pdf_list.append(path_file)pdf_list.sort()print(pdf_list)# exit()##提取数据yansheng_table=get_yansheng_dataFrom_pdfV2(wb,code,name,pdf_list,key_tables,year_list)##自动调整列宽column_widths = []for row in wb['会计师事务所统计信息'].iter_rows():for i, cell in enumerate(row):try:column_widths[i] = max(column_widths[i], len(str(cell.value)))except IndexError:column_widths.append(len(str(cell.value)))for i, column_width in enumerate(column_widths):wb['会计师事务所统计信息'].column_dimensions[get_column_letter(i + 1)].width = column_widthwb.save(os.path.join(cur_path,'Accountingfirm_info.xlsx'))except:print(code,name," run failed")passdelay=randint(0,2)time.sleep(delay)
wb.close()

5、提取数据实现细节

'''
检测当前表格是否包含‘会计师事务所’关键词
'''
def check_tableContainsKey(table,key_words):for row in table:for col in row:if key_words in str(col):return Truereturn False
'''
从一系列年报名录中提取关键词
wb 统计表
code 股票代码
name 股票名称
pdf_list 年报PDF文件列表
key_tables 关键词列表
year_list 年份列表
'''
def get_yansheng_dataFrom_pdfV2(wb,code,name,pdf_list,key_tables,year_list):if len(key_tables)<1:print("key_tables for search is empty,please fill them in excel")exit(0)ws=wb['会计师事务所统计信息']yansheng_table=[]year=''for key_list in key_tables: ##我们的关键词表只有一行for pdf_name in pdf_list: ##循环处理年报PDF文件year=get_report_year(pdf_name,year_list) ##获取年份if '--' in str(year):continueelse:try:print("...."+pdf_name+"....")with pdfplumber.open(pdf_name) as pdf: ##打开pdf年报文件yansheng_data=search_page_list_tableMode(pdf.pages,key_list) ##优先表格模式if len(yansheng_data)<1:print("samle line mode")yansheng_data=search_page_list_samelineMode(pdf.pages,key_list) ##其次同行文本模式if len(yansheng_data)<1:print("another line mode")yansheng_data=search_page_list_anotherlineMode(pdf.pages,key_list)   ##再次分行模式                        if len(yansheng_data)<1: ##提取数据失败则执行下一份PDFcontinuefile_name=os.path.basename(pdf_name).split(".")[0]#提取后的数据提取处理yansheng_data2=[file_name,str(year)]##表格名称和年份yansheng_data[0:0]=yansheng_data2yansheng_table.append(yansheng_data)ws.append(yansheng_data)##写入表格并保存,每一分PDF都会保存一次,避免程序崩溃数据丢失wb.save(os.path.join(os.getcwd(),'Accountingfirm_info.xlsx'))except:passreturn yansheng_table

具体进一步的实现细节可以咨询小编,代码量有点大,这里不一一贴出

五、提取结果示列

欢迎读者交流!!!

金融数据分析之公司年报会计师事务所信息批量提取相关推荐

  1. 金融数据分析之PDF年报中词频率统计

    目录 一.前言 二.词频统计概述 三.词频率统计技术路线 四.具体实现 >>>环境搭建 >>>代码实现 五.分词测试结果 六.致谢 一.前言 近年来,大数据金融越来 ...

  2. 信息批量提取工具bulk-extractor

    信息批量提取工具bulk-extractor 在数字取证中,通常需要面对海量的数据,如几百GB甚至TB级别的数据.从这些海量数据中,提取有价值的数据是一个漫长.枯燥.繁琐的过程.Kali Linux提 ...

  3. PDF信息批量提取至Excel

    在学院做助管时,某老师布置了任务:将1000+个PDF文件的指定内容整理到一个Excel中.为了防止在逐个打开复制粘贴的过程中猝死,尝试编写代码简化此问题.实现的功能主要是将每个PDF的信息分别提取到 ...

  4. vba单元格批量赋值_Excel●VBA●如何把批注中的信息批量提取到单元格?

    在Excel中,批注(Comment)是一类特殊的数据. 利用批注,我们可以为单元格添加备注信息(如解释.说明),方便表格阅读者了解数据背后的信息. 然而,由于不当的使用习惯,我们也经常碰到一些表格, ...

  5. 发票信息批量提取到 excel 软件 4.0

    个人微信 394467238 4.0 更新 新增了自己的OCR引擎,使用了神经网络模型,但是很可能会导致导入模块失败,并且识别的结果还有很多小问题,所以还请大家使用后反馈问题 新增了用发票号码.发票代 ...

  6. 发票信息批量提取到 excel 软件 2.3

    地址更新为: 链接:https://pan.baidu.com/s/1WQQ8kaDilaagjoK5IrYZzA  提取码:1111 日了狗了,电脑还是有木马,下载链接取消了,后续我换台电脑打包软件 ...

  7. 发票信息批量提取到 excel 软件 3.1

    3.1 更新 基础图片识别完全放开了次数限制,可以完全免费使用了,并且修改了之前的一个会导致闪退的bug 新增了高级PDF批量识别,对于扫描版本的PDF文件可以支持了 3.0 更新 最大的改动为使用次 ...

  8. 发票信息批量提取到 excel 软件 3.0

    3.0 更新 最大的改动为使用次数可以自动获取了,通过微信扫描小程序即可获得 修改了高级图片识别的一些发票项目的bug 2.5更新: 改正了很多影响体验的bug....用起来应该会好多了 2.4更新: ...

  9. 发票信息批量提取到 excel 软件 2.4

    地址更新为: 链接:https://pan.baidu.com/s/1WQQ8kaDilaagjoK5IrYZzA  提取码:1111 个人公众号"代码就是生产力",发布更多有用的 ...

最新文章

  1. IAR编译器的常见问题
  2. 获取网站Alexa排名数值的方法
  3. IDEA设置谷歌浏览器和火狐浏览器打开
  4. 第七章数组答案C语言,C语言复习题及答案-第七章-数组
  5. C# 控制台 模拟时间一秒一秒走动,直到按Esc键,时间静止,退出!
  6. C# 实现酒店房态图
  7. Mybatis 原始Dao层开发
  8. 易错丨Oracle 每日一题系列合集
  9. c6011取消对null指针的引用_COM编程攻略(二十二 IDL中的枚举,指针,数组)
  10. cs文件,外部类操作窗体控件
  11. 为什么都建议学java而不是python-现在学Python还是Java好呢?
  12. Oracle分析函数之FIRST_VALUE和LAST_VALUE
  13. 如何画指数函数图像探讨其函数性质
  14. C语言自学路之验证码
  15. 城市经纬度 json
  16. SAP 常用BAPI ( 二)
  17. 字符转换 (15分)
  18. ps cs6移除html,ps cs6清除照片中不想要的杂物教程
  19. alt在html不显示信息,html – Firefox不显示来自缓存的图像只有alt文本
  20. 前端学习——HTML(一)

热门文章

  1. mysql sum带条件_mysql – SUM()基于SELECT的不同条件
  2. Python列表常用操作,浅拷贝及深拷贝
  3. java:Map借口及其子类HashMap五,identityHashMap子类
  4. 打破“信息孤岛”不能透支信息安全
  5. Dubbo使用multicast广播注册中心暴露服务地址时启动报错empty notify
  6. LaTeX tikz初探——空间矢量旋转示意图,四元数(4)
  7. JAVA里点击树与表格结合,javaswing中的表格(jtable)和树(jtree)组件使用实例.doc
  8. java完成一个学生信息调查程序_利用Java设计一个简单的学生信息管理程序
  9. 怎么设计接口测试用例更好——百度大佬“教你写用例”
  10. mysql sql dateadd_在SQL语句中DATEADD和DATEDIFF函数