郑州股票分析联盟

以小见大——Python浅谈的文本分析功能

FSSC微资讯2020-09-17 06:54:59

各位小伙伴们大家好,又到了小D跟大家见面的时间啦!许久不见不知道大家有没有想我呢?

小D对大家的思念之情可是如同滔滔江水般绵延不绝啊(此处禁止嘘声)!

今天小D给大家带来的是什么知识呢?各位看官稍安勿躁,请看下文

小D先放一张截图吧,来自于日本著名动漫《命运石之门》:

相信大家平时在生活中也会遇见许多类似的场景。我们的世界充斥着大量形形色色的数字、文字以及图片,在这个信息爆炸的时代,任何形式的数据背后,都可能藏有不为人知的秘密,需要数据分析人员敏锐捕捉并深入挖掘。传统的财务分析主要着眼于数字,通过一系列多维度的财务指标,对个体进行全面分析,但是在这一过程中却忽略了文字信息的重要性。此外,最常用也是最基础的分析工具MicrosoftExcel在数字处理方面堪称一把好手,然而在处理文字信息的时候表现并不尽如人意。因此,一款能够有效处理文字信息的分析软件就显得至关重要。

好在,这个世界上还有一个叫做Python的东西,它包含的用于字符串匹配的正则表达式模块,可以帮助我们非常完美地解决文本分析方面遇到的许多问题。

(有关Python的简单介绍请参考小D之前的作品:想要学习数据分析?不知道这些软件你可寸步难行

话不多说,下面小D用一个具体的案例向大家展示如何运用Python优雅地进行文字处理。

我们知道,股票市场的成份股构成是一个不断迭代的过程,从理论上来说,这一变动势必会对股票价格造成影响。例如当一支股票宣布加入成份股,由于必须构筑类似于股票指数的投资组合,指数基金(即以指数成份股为投资对象的基金)会大量买入这支股票,从而推动股价上升。那么实际情况是什么样的呢?成份股变动的公告通常以文字的形式公布在官方媒体上,小D希望从中获取公司名称、公告日期两类信息从而进行后续的研究。(敲黑板!!)由于市场信息在公布时就已经让股价产生相应的调整,因此小D选择公告日期而非实际变动日期,另外在本案例中我们以S&P500为例。不爱学习代码的小伙伴们可以直接跳过案例部分,在本文的最后有针对正则表示式的文字性总结,看那个就好啦~

小D设法从相关数据库下载了本案例所需的原始文本信息,如图所示:

通过观察可以发现,每篇公告都是一个独立的个体,具有相对固定的形式。在开头有我们需要的公告发布时间,之后的正文部分有我们需要的公司名称。小D要做的便是将这两项信息一一配对并提取出来,以合适的方式输出。以下的所有操作均在Python中进行:

1
导入标准库

Python本身的内置函数只占总函数的很小一部分,如果需要调用其它的函数,在使用前必须先声明调用标准库。为了完成这次任务,小D需要用到正则表达式,在最后还需要将结果合适的方式输出,因此需要调用两个标准库:re(regularexpression,即正则表达式)和csv。代码如图:

2
基础数据加工

导入Python后的原始数据尚未达到要求,并不能直接用于数据提取。小D通过一系列的替换(replace)命令,消除掉文本中所有的空行和特殊符号,并按照日期将整个文本切片,保证日期和对应的公司名称处在同一个切片中,为之后的数据提取创造条件。

3
公告时间提取

在处理好的最终数据中,公告时间位于每一行的开头,以20XX结尾。因此使用如下的正则表达式得到我们想要的结果:

其中,等号左边的anndate用来存放提取后得到的公告时间,等号右边的re表示调用re标准库中的函数,findall是re库中特有的函数,它的作用是将字符串中与正则表达式相符的部分提取出来,括号中的两部分是findall函数需要的参数,sentence代表每一则公告。黄色的部分是整个语句的核心,其中“^”代表每一行的开头,“.”代表任何一个字符,+?代表在非贪婪匹配下重复一个字符一次或者多次,意思是在正则表达式匹配成功的前提下,尽可能少的匹配,保证所得的结果是最短的结果。整个表达式的含义是,从每则公告的开头开始,截取所有的字符,一直到数字20XX为止,就得到了我们需要的时间。

4
公司名称提取

接着,我们需要获取的是公司名称,具体来说类似于从“S&PMidCap 400 constituent Health Care REIT Inc. (NYSE: HCN) will replaceSovereign Bancorp Inc. (NYSE: SOV) in the S&P 500”将“HealthCare REIT Inc. (NYSE: HCN)”取出。同样的,我们使用如下的正则表达式:

与之前一样,“.”代表任何一个字符,“+?”代表非贪婪匹配,整个语句的意思是将constituent和will之间的所有文字取出,赋值给变量add0,便得到了公司名称。

5
输出结果

最后,我们将提取出的日期和公司名称一一匹配,并且以csv的格式输出,代码如下:

首先将anndate和add0两个变量用zip函数进行一一配对,其实质是把两个变量集变成了一个,然后调用csv库中的writer函数将最终结果按行输出,放入add_company这个csv文件中,最终结果如图所示:

自此大功告成。怎么样,是不是很神奇!

当然,任何的计算机程序都还无法达到与人脑媲美的程度。小D在向大家展示Python文本分析的强大功能的同时,也必须说明它的局限性。首先,原始的分析材料需要具有一定的规律性,例如案例中的公告时间出现在每篇公告固定的位置,这就给我们提供了很大的便利,如果文本本身杂乱无章无规律可循,那么整个代码的复杂程度就会大大提高。其次,出现在语句中的文字信息提取难度相对来说较低,如果所需信息处于表格或者其它的形式当中,提取难度也会增加。最后,正则表达式进行的是严格的精确匹配,导致在提取大量信息时,可能有部分信息因为与表达式有微小的区别而被遗漏,最终的结果完整性无法达到完美。这些问题,都有待大家在实际使用过程中深入思考并解决。但无论如何,Python都是一款极佳的分析软件,为我们打开了文本分析的大门,使我们的数据分析结果更加完善可靠。

本文仅仅是对正则表达式的一个非常简单的介绍,如果小伙伴们有进一步学习的兴趣,小D推荐大家搜索正则表达式的相关文献,可以得到非常详尽的解释。至于如何将正则表达式应用于汉字,就留给大家自己去探索啦~朋友们,我们下期再见!