如何用PowerBI自定义函数批量爬取财务报表

近期,学习了马老师的商业智能财务分析(PowerBI)课程后,不免手痒,教学中的案例数据不过瘾,于是在PowerBI学友的启发下,自己找现实数据玩了起来。那么今天的文章主要内容是怎样从PBI批量爬取在线的财务报表数据。直接进入正题。

1 了解数据源

各大财经网站找了一圈,数据最容易爬取的当选网易财经

资产负债表地址

http://quotes.money.163.com/f10/zcfzb_000333.html

上市公司代码表下载地址(PDF 文件):

http://www.csrc.gov.cn/pub/newsite/scb/ssgshyfljg/201902/t20190212_350821.html

证监会官网找到的所有上市公司明细,可在PowerBI中选择PDF为数据源获取

2 数据导入

1)科目表

2)资产负债表数据

3)上市公司股票代码表

3 数据标准化

由于网易数据源的缘故,财务报表的科目明细和整体数值是分开的,那就分别作为维度表和事实表,都增加索引列,在模型建模建立连接即可。

由于资产负债表数据为二维表,我们需要用逆透视把它变成一维表(提升标题后 - 选中索引列 - 逆透视其他列),再删除掉值中的空值

对于从PDF文件获取的上市公司股票代码表,可删除默认出现的“更改的类型”步骤,因为股票代码有很多以0开头,需要以ABC文本格式才能显示出来。

前三列利用向下填充补充数据

到此单张表的数据清洗工作完成。

4 批量爬取其他公司报表

观察下网址结构,一串文字+股票代码,逻辑简单。那通过“上市公司行业分类表”中的股票代码便可批量导入

第一步,建立参数:取名“Web”

当前值可设置为当前股票代码 000333

第二步,在资产负债表的“查询设置”的源中,将代码中 000333替换为

"&Text.From(Web)&"

即首行公式为

=Web.BrowserContents("http://quotes.money.163.com/f10/zcfzb_"&Text.From(Web)&".html")

第三步,创建自定义函数,取名zcfcb

第四步,在从PDF文件获取的上市公司股票代码表中做筛选,考虑股票代码很多,获取全部数据非常耗时,我们先只筛选前3只股票

选择“添加列”调用自定义函数,增加一列。

字段“zcfcb”的每一个单元格中的Table都是一张完整的资产负债表数据,这种方案是先解决局部,再向上逐一击破,打开表格就是完整的数据。

加载数据后,几张表建立关系。

现金流量表、利润表也照此方法搞定。

5 进一步思考

刚刚Demo的测试,我们只选取了3家公司,一切都很完美,那如果将3500+家上市公司都加载进来,批量爬取将会发生什么?

很慢!在增加了两个数量级之后,PBI爬取数据的软肋就凸显出来,读取网页表格变得非常缓慢,仅资产负债就有将近500万+行数据,全部加载到PBI耗时两个小时,一度让我非常抓狂。

缺失!由于一些不知的原因,在爬取过程中存在一些上市公司的数据缺失,返回的是空表。而且测试中发现有不稳定的情况,同一只股票单独可以抓取到数据,但放在参数里出现了错误。

6 总结

PBI的PowerQuery虽然可以批量读取数据,但它更适合对接数据库,CSV这些确定的数据源。对于获取网页数据,它对数据的结构要求非常高。我们通过案例体验式地学会PowerQuery的特性和功能,但实际工作中对于大范围爬取网页数据的需求,建议尝试其他更专业的爬虫工具。

本文分享自微信公众号 - PowerBI大师(PowerBIMaster)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券