我正在从事一个涉及处理大量 XBRL 文档(> 1m 个单独文件)的项目。我对 XBRL 完全陌生,现在感觉很迷茫。
我在单独的 MySQL 数据库中有与这些 XBRL 文档相关的数据,我想将 XBRL 数据添加到 MySQL 中以将所有内容存储在一个数据库中。
将数据从 XBRL 文档传输到 MySQL 的最佳方法是什么?
是否有可用的批量处理库?
我一直在寻找有关这些问题的教程,但找不到任何提供基本介绍的东西,只有很多高级信息。
理论上,将 XBRL 存储在数据库中的自然范例是 OLAP,因为 XBRL 是关于数据立方体的。关系数据库之上的 OLAP 称为 ROLAP。
这不是一个微不足道的问题,因为从大量分类法中提取的事实可以形成一个非常大且稀疏的立方体(对于 SEC 文件,它是 10k+ 维度),而且还因为创建 SQL 模式需要在任何导入之前了解分类法。如果出现新的分类法,则需要重新 ETL 一切。这并不能使关系数据库适合作为通用解决方案。
如果文件共享相同的分类法并且分类法非常简单(例如:没有太多维度),则可以提出一个临时映射来将所有事实存储在 ROLAP 中包含许多行的单个表中意义(事实到行,方面到列)。一些供应商专门存储无维 XBRL 事实,在这种情况下,传统 SQL(或随行扩展的“后 SQL”)产品运行良好。
一些供应商为分类法中的每个 XBRL 超立方体创建一个表,其模式源自定义网络,但每个超立方体都不同。这会导致数据库中有很多表,并且需要大量连接来处理涉及多个超立方体的查询。
其他一些供应商对底层 XBRL 结构或其用户需要运行的查询类型做出假设。限制问题的范围允许找到也可以满足这些特定需求的特定体系结构或 SQL 模式。
最后,要导入大量文件,可以在 NoSQL 数据存储而不是关系数据库之上构建通用映射。具有不同维度的大量事实适合大量半结构化文档,并且网络非常适合分层格式。
首先,您需要了解 XBRL 文档(实例) 包含许多不同类型的信息。例如:它可以包含投资基金的每日定价信息,也可以包含季度增值税报告或信用信息。XBRL 是一种标准的通信方式,但其内容有自己的(XBRL 标准化)分类法。例如:有一个荷兰分类法,荷兰税收机构建立在它之上(有自己的分类法),有一个用于提交增值税报告的特定分类法。这些分类法是使用 XSD、Xlink 和 linkbase 定义的。将其视为字典的概念:字典的构建方式在任何地方都是相同的(使用字母表中的每个字母来制作“章节”,按字母顺序对单词进行排序等),但希腊字典使用自己的字母表,它的用自己的语言和自己的语言来解释内容。
因此,如果您只使用一种或几种不同类型的 XBRL 文档(共享相同的分类法),您可以创建从这些分类法到您自己的(数据库)对象的映射。如果您有更广泛的分类法,则必须创建一个更通用的解决方案来“导入”分类法。这将是一个相当大的挑战(这就是市场上没有很多可用工具的原因)。
如果您(公司)负担得起,我建议您研究现有的工具 ,例如Altova 的 MapForce。这样就不需要学习 XBRL、XSD、Xlink 和 linkbase 来开始开发自己的工具来解析这些文件,您可以利用现有产品将 XBRL 分类映射到您的数据库/应用程序。
我希望您知道 MySQL 是一种结构化数据存储,而XBRL
只是将业务文档映射为数字格式的一种表示形式。XBRL
是XML
基于文档的,这意味着它是非结构化的,并且您从文档中需要的数据可以或不能出现在该特定文档中。它也可以包含任何其他附加信息。XSD
定义如何构建 XML 以及任何标记可以出现多少次。现在回答您的问题,您可以使用eXistDB
,我过去也使用它来存储 XBRL 文档。但是,有时它可能很慢。如果您只需要一些数据XBRL
并将其存储在 MySQL 数据库中,您可以使用XPATH
. 在以下简单的 python 代码中,您可以获取 和EquityTotalEndingBalance
的ReservesTotalEndingBalance
值这份文件。
from lxml import etree
root = etree.fromstring(open("file.xml").read())
nsmap = root.nsmap
nsmap.pop(None) # There was some error without this.
data_one = root.xpath("//iascf-pfs:EquityTotalEndingBalance/text()",namespaces=nsmap)
data_two = root.xpath("//novartis:ReservesTotalEndingBalance/text()",namespaces=nsmap)
print data_one
print data_two
此代码将打印值:
['37216000000', '36862000000', '42245000000']
['35903000000', '35558000000', '40971000000']
那么你怎么能解决你的问题呢?
要么您必须选择NoSQL
基于 XML 文档的存储,例如eXistDB
并编写 Xpath 来获取特定数据。
您可以像上面一样手动解析 XBRL 文档并直接触发 XPath 并存储数据。
如果您需要使用来自所有类型文档的所有数据,则会出现复杂性。因此,您将不得不限制您将从这些文档中使用的内容。