Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python: 从新闻中快速搜索特定股票名称

Python: 从新闻中快速搜索特定股票名称

作者头像
用户7652506
发布于 2022-01-07 07:39:15
发布于 2022-01-07 07:39:15
1.1K00
代码可运行
举报
运行总次数:0
代码可运行

问题提出

上次村长介绍了如何快速在新闻中搜索特定词条的方法。这个问题在经济和金融学研究中非常常见:给定一组新闻标题和股票名称,我们想知道每个股票在这些新闻标题中分别出现多少次。村长的解决办法使用的是 R 和 JiebaR,这里大猫给出用 Python 的解法。

先来看一下数据集。首先我们有news数据集,它保存着新闻 ID 和新闻标题:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
news[:3,:]

NewsID

Title

▪▪▪▪

▪▪▪▪

0

57285603

富机达能正式挂牌

1

57463469

新能源过剩事出有因 多晶硅风电获准松绑

2

57463473

近9年元旦后首个交易日沪指走势一览 虎年怎开盘

3 rows × 2 columns

其中,NewsID是新闻 ID,而Title就是我们要搜索的新闻标题。为了方便后面处理,我们把NewsIDTitle分别新建为两个独立的 list,命名为news_idnews_title

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(f'news_id: {news_id[:3]}')
print(f'news_title: {news_title[:3]}')
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
news_id: [57285603, 57463469, 57463473]
news_title: ['富机达能正式挂牌', '新能源过剩事出有因 多晶硅风电获准松绑', '近9年元旦后首个交易日沪指走势一览 虎年怎开盘']

第二个需要用到的股票列表stock_name,它保存着所有需要检索的股票名称:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(f'stock_name: {stock_name[:3]}')
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
stock_name: ['平安银行', '万科A', '国农科技']

最终效果

最终生成的结果如下。其中stock是股票名, news是对应的股票名所在的新闻标题,news_id是对应的新闻 ID。需要注意,对于同一个股票名,我们可能会成功匹配多条新闻。

stock

news_id

news

▪▪▪▪

▪▪▪▪

▪▪▪▪

0

三力士

57464083

浙江三力士橡胶股份有限公司关于产品提价的公告

1

东方园林

57464009

北京东方园林股份有限公司关于使用超募资金偿还银行贷款及补充流动资金的公告

2

中国人寿

57464089

中国人寿保险股份有限公司关于执行《保险合同相关会计处理规定》的提示性公告

3 rows × 3 columns

解法 1:正则表达式(只找第一个匹配)

我们使用正则表达式来进行字符串匹配。在第一种解法中,我们只寻找新闻标题中出现的第一个股票。举个例子,假如我们的新闻标题是

平安银行中国人寿公布第三季度财报 ”

那么这种方法只能找到标题中出现的第一个股票,也就是平安银行。在解法 2 中,我们会给出如何标题中出现所有股票的方法。

在进行所有操作之前,我们需要对股票名称进行清洗。我们知道,有些股票名前可能会带有“*”,比如*st 康达。在正则表达式中,_是一个特殊字符,表示是“匹配0次或任意次”。因此我们需要把_从股票名中删去。最终生成清洗过的股票名列表stock_name_clean

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
stock_name_clean = [s.replace('*','') for s in stock_name]

print(f'stock_name_clean: {stock_name_clean[:3]}')
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
stock_name_clean: ['平安银行', '万科A', '国农科技']

接下来我们正式进行正则匹配。解法的核心是把候选的股票名称变成一个正则表达式能够接受的 pattern。在正则表达式中,竖杠 “|” 用来表达“或”。所以我们只需要用竖杠把所有的候选股票名连起来:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import re

pattern = re.compile('|'.join(stock_name_clean))

print(f'pattern: {pattern}')
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pattern: re.compile('平安银行|万科A|国农科技|世纪星源|深振业A|全新好|神州高铁|中国宝安|ST美丽|深物业A|南玻A|沙河股份|深康佳A|深中华A|ST神城|深粮控股|深华发A|深科技|深天地A|特力A|飞亚达A|深圳能源|国药一致|深深房A|富奥股份|大悦城|深桑达A|神州数码|中国天楹|华联控股|深南电A|深大通|中集集团|东旭蓝天|中洲控股|中航善达|深纺织A|泛海控股|ST康达|德赛电池|深天马A|)

其中,pattern就是正则表达式要匹配的模式。我们这里使用了re.compile预先编译模式,这样在接下来的循环中就不需要一次次重复编译模式了,大大增加了效率。

接下来我们使用一个循环来从每一条新闻标题中寻找股票名。我们使用search这个函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import datatable as dt
import pandas as pd

# results 用来保存最终结果
results = []

for id, title in tqdm(zip(news_id[:8], news_title[:8])):

    # stock 是匹配的结果,如果匹配失败为None,如果匹配成功则为一个"re.Match"对象
    stock = pattern.search(title)

    # 如果结果不为None,那么保存结果
    if stock:
        results.append((stock.group(), id, title))

# 尝试打印结果的前三行
# 这里大猫使用了datatable包。如果读者使用pandas,那么就注销此条语句,并执行下一条
dt.Frame(results, names=['stock', 'news_id', 'news'])[:,:,dt.sort(f.stock)][:3,:]

# 如果使用pandas,则执行下面语句:
# pd.DataFrame(results, columns=['stock', 'news_id', 'news'])[:3]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
8it [00:00, 3859.94it/s]

stock

news_id

news

▪▪▪▪

▪▪▪▪

▪▪▪▪

0

酒鬼酒

57463969

酒鬼酒股份有限公司更正公告

1 row × 3 columns

正则表达式的匹配是非常快的,尤其是在预先使用re.compile编译了表达式以后。

我们的数据集包括25 万条新闻标题,需要在每条标题中搜索 3600 个可能的股票名称。在大猫的 Intel 十代 i7 移动版 CPU 上,只花费了 17 秒。 ”

解法 2:正则表达式(找到所有匹配)

在解法二中,我们使用re.findall函数,它能够找到标题中出现的所有股票名。比如“平安银行中国人寿公布第三季度财报”这则标题,代码能够识别出“平安银行”和“中国人寿”两个股票。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 预先编译表达式
pattern = re.compile('|'.join(stock_name_clean))

# results 用来保存最终结果
results = []

for id, title in tqdm(zip(news_id, news_title)):

    # matched_stock 是一个list,它保存了所有匹配到的股票名。如果列表为空,则意味着
    # 标题中不包含任何股票
    matched_stocks = pattern.findall(title)

    # 如果结果不为空,保存结果
    if len(matched_stocks) > 0:

        # 这里使用了list comprehension, 对每个匹配的stock都新建一个tuple
        out = [(s, id, title) for s in matched_stocks]

        results.extend(out)

# 尝试打印结果的前三行
# 这里大猫使用了datatable包。如果读者使用pandas,那么就注销此条语句,并执行下一条
dt.Frame(results, names=['stock', 'news_id', 'news'])[:,:,dt.sort(f.news)][f.news_id==57467518,:]

# 如果使用pandas,则执行下面语句:
# pd.DataFrame(results, columns=['stock', 'news_id', 'news'])[:3]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
249474it [00:19, 12576.39it/s]

stock

news_id

news

▪▪▪▪

▪▪▪▪

▪▪▪▪

0

赛象科技

57467518

金色阳光新股快车—1月5日申购版(赛象科技、奥普光电、皖新传媒)

1

奥普光电

57467518

金色阳光新股快车—1月5日申购版(赛象科技、奥普光电、皖新传媒)

2

皖新传媒

57467518

金色阳光新股快车—1月5日申购版(赛象科技、奥普光电、皖新传媒)

3 rows × 3 columns

从上面的结果可以看到,对于news_id=57467518这则新闻标题,代码成功识别了它里面包含的三个股票:赛象科技、奥普光电、皖新传媒。

正则表达式的匹配是非常快的,即使我们这次匹配的是“所有”股票而不是“出现的第一个股票”,代码也只多跑了 3 秒。

我们的数据集包括25 万条新闻标题,需要在每条标题中搜索 3600 个可能的股票名称。在大猫的 Intel 十代 i7 移动版 CPU 上,只花费了 20 秒。 ”

希望大家觉得这期推送有用!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大猫的R语言课堂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
用Python搭建一个股票舆情分析系统
下面的这篇文章将手把手教大家搭建一个简单的股票舆情分析系统,其中将先通过金融界网站爬取指定股票在一段时间的新闻,然后通过百度情感分析接口,用于评估指定股票的正面和反面新闻的占比,以此确定该股票是处于利好还是利空的状态。
Python编程与实战
2021/04/29
3K0
用Python搭建一个股票舆情分析系统
R语言:通过jiebaR提升正则匹配效率
大家会不会经常遇到这样的情况,需要在一系列的目标文本中,匹配搜索一系列特征文本,且这些特征文本可能在该某一目标文本中重复出现。例如如下数据集:
用户7652506
2022/01/07
4970
python舆情系统开发_什么是舆情
下面的这篇文章将手把手教大家搭建一个简单的股票舆情分析系统,其中将先通过金融界网站爬取指定股票在一段时间的新闻,然后通过百度情感分析接口,用于评估指定股票的正面和反面新闻的占比,以此确定该股票是处于利好还是利空的状态。
全栈程序员站长
2022/11/08
1.5K0
python舆情系统开发_什么是舆情
【愚公系列】《Python网络爬虫从入门到精通》007-请求模块requests高级应用(Reguests-HTML)
在当今数据驱动的时代,网络爬虫和数据采集变得越来越重要。Python作为一门强大的编程语言,其requests库因其简单易用而广受欢迎,但在处理复杂的网页内容时,单靠requests可能并不足够。这时候,Requests-HTML模块的出现,为我们提供了更为强大的工具,使得抓取和解析网页变得更加高效和便捷。
愚公搬代码
2025/07/13
1120
Python 爬虫实战:股票数据定向爬虫
功能简介 目标: 获取上交所和深交所所有股票的名称和交易信息。 输出: 保存到文件中。 技术路线: requests—bs4–re 语言:python3.5 说明 网站选择原则: 股票信息静态存在于h
小小科
2018/05/04
1.1K0
Python 爬虫实战:股票数据定向爬虫
分析新闻评论数据并进行情绪识别
爬取新闻评论数据并进行情绪识别的目的是为了从网页中抓取用户对新闻事件或话题的评价内容,并从中识别和提取用户的情绪或态度,如积极、消极、中立等。爬取新闻评论数据并进行情绪识别有以下几个优势:
jackcode
2023/07/06
5440
分析新闻评论数据并进行情绪识别
Python: “股票数据定向爬虫”实例
文章背景:之前学习了BeautifulSoup模块和Re库(参见文末的延伸阅读),在此基础上,获取沪深两市A股所有股票的名称和交易信息,并保存到文件中。
Exploring
2022/09/20
1.2K2
Python: “股票数据定向爬虫”实例
AkShare-股票数据-个股新闻
作者寄语 获取个股最新的 20 条新闻文字稿内容 更新接口 "stock_news_em" # 个股新闻 个股新闻 接口: stock_news_em 目标地址: http://so.eastmoney.com/news/s 描述: 获取东方财富指定个股的新闻资讯数据 限量: 当日最近 20 条新闻资讯数据 输入参数 名称 类型 必选 描述 stock str Y stock="300059"; 股票代码 输出参数 名称 类型 默认显示 描述 code str Y 股票代码 title str Y 新闻
数据科学实战
2021/03/09
8880
Python网络爬虫与信息提取
​ 需要注意的是,淘宝网站本身有反爬虫机制,所以在使用requests库的get()方法爬取网页信息时,需要加入本地的cookie信息,否则淘宝返回的是一个错误页面,无法获取数据。
py3study
2020/01/15
2.6K0
Python网络爬虫与信息提取
Python量化-如何获取实时股票信息
股票信息的接口有很多,之前大家常用的是新浪的,但在年初的时候,新浪的接口突然不能使用,给大家造成了很大的困扰,为此网上也有很多教程教大家如何从新浪获取数据,跟着教程弄了半天也不行,索性换到126(也就是网易了),感觉速度都还不错。
脑洞的蜂蜜
2022/06/27
1.8K0
Python股票数据分析,制作动态柱状图
前言 雪球成立于 2010 年 ,是北京雪球信息科技有限公司旗下推出的投资者社区。雪球一直致力于为中国投资者提供跨市场(沪深、中国香港、美国),跨品种(股票、基金、债券等)的数据查询、资讯获取和互动交流以及交易服务。 模块使用 requests >>> pip install requests (数据请求 第三方模块) re # 正则表达式 去匹配提取数据 json pandas pyecharts 开发环境 Python 3.8 解释器 Pycharm 2021.2 版本 代码实现步骤 发送请求 访问网
松鼠爱吃饼干
2022/03/30
7540
Python股票数据分析,制作动态柱状图
如何快速爬取新浪新闻并保存到本地
这篇文章能够快速教你爬取新浪新闻。希望这篇文章对您有所帮助!如果您有想学习的知识或建议,可以给作者留言~
不温卜火
2020/10/28
6.1K1
如何快速爬取新浪新闻并保存到本地
【Python丨主题周】Python爬虫实战:批量采集股票数据,并保存到Excel中
实例描述:通过编写爬虫,将指定日期时段内的全部上市公司股票数据爬取下来,并按照股票代码保存到相应的Excel文件中。
博文视点Broadview
2020/06/12
1.9K0
【Python丨主题周】Python爬虫实战:批量采集股票数据,并保存到Excel中
抓取网页数据的高级技巧:结合 Popen() 与 stdout 处理异步任务
在网页数据抓取过程中,处理大量请求和数据通常面临时间和资源的挑战。本文将介绍如何使用 Popen() 和 stdout 处理异步任务,结合代理IP技术和多线程提高爬虫效率。我们将参考爬虫代理提供的服务,详细讲解如何在实际项目中集成这些技术。
jackcode
2024/09/10
3110
抓取网页数据的高级技巧:结合 Popen() 与 stdout 处理异步任务
大规模异步新闻爬虫【5】:网页正文的提取
前面我们实现的新闻爬虫,运行起来后很快就可以抓取大量新闻网页,存到数据库里面的都是网页的html代码,并不是我们想要的最终结果。最终结果应该是结构化的数据,包含的信息至少有url,标题、发布时间、正文内容、来源网站等。
一墨编程学习
2019/05/14
1.9K0
大规模异步新闻爬虫【5】:网页正文的提取
(数据科学学习手札31)基于Python的网络数据采集(初级篇)
  在实际的业务中,我们手头的数据往往难以满足需求,这时我们就需要利用互联网上的资源来获取更多的补充数据,但是很多情况下,有价值的数据往往是没有提供源文件的直接下载渠道的(即所谓的API),这时我们该如何批量获取这些嵌入网页中的信息呢?
Feffery
2018/05/05
1.9K0
(数据科学学习手札31)基于Python的网络数据采集(初级篇)
新闻汇总(2):再次实现
初次实现管用,但很不灵活,因为使用它只能从Usenet讨论组获取新闻。在再次实现中,你将对代码稍作重构以修复这种问题。你将各部分代码放在类和方法中,以提高程序的结构化程度和抽象程度,这样就可用其他类替换有些部分,这比初次实现的部分代码要容易的多。
不可言诉的深渊
2019/07/26
7300
【说站】python中pandas有哪些功能特色
2、便捷的数据读写操作,相比于numpy仅支持数字索引,pandas的两种数据结构均支持标签索引,包括bool索引也是支持的。
很酷的站长
2022/11/23
8340
【说站】python中pandas有哪些功能特色
手把手教学小型金融知识图谱构建:量化分析、图数据库neo4j、图算法、关系预测、命名实体识别、Cypher Cheetsheet详细教学等
知识图谱存储方式主要包含资源描述框架(Resource Description Framework,RDF)和图数据库(Graph Database)。
汀丶人工智能
2023/07/08
2K0
手把手教学小型金融知识图谱构建:量化分析、图数据库neo4j、图算法、关系预测、命名实体识别、Cypher Cheetsheet详细教学等
Django实战-信息资讯-路由配置
Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。
小团子
2019/07/23
4030
Django实战-信息资讯-路由配置
推荐阅读
相关推荐
用Python搭建一个股票舆情分析系统
更多 >
LV.1
这个人很懒,什么都没有留下~
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验