如何将XBRL数据导入到MySQL中?

13

我正在从事一个项目,涉及处理大量的XBRL文件(> 1m个独立文件)。我对XBRL毫不了解,目前感到很迷茫。

我有关于这些XBRL文档的数据存储在一个单独的MySQL数据库中,我想将XBRL数据添加到MySQL中,以便将所有内容都存储在一个数据库中。

如何最好地将XBRL文档中的数据传输到MySQL中?

是否有可用于批量处理的库?

我一直在寻找有关这些问题的教程,但找不到任何提供基本介绍的内容,只有许多高级信息。


我认为没有,我大约两年前尝试过相同的事情,只不过目标是SQL Server。你有哪些类型的文件? - Radu Gheorghiu
从性能和可扩展性的角度考虑,建议使用NoSQL数据库而非SQL数据库。 - Harshal Bhamare
4个回答

8
在理论上,将XBRL存储在数据库中的自然范式应该是OLAP,因为XBRL是关于数据立方体的。在关系型数据库之上使用OLAP被称为ROLAP。
这不是一个微不足道的问题,因为从大量分类法中提取的事实可以形成非常大且稀疏的立方体(对于SEC文件来说,它有10k+维度),并且创建SQL模式需要在任何导入之前了解分类法。如果出现新的分类法,就需要重新进行ETL。这使得关系型数据库不适合作为通用解决方案。
如果申报共享相同的分类法,并且分类法非常简单(例如:没有太多维度),则可能会想出一种特定映射,以ROLAP意义上的单个表格存储所有事实,行对应事实,列对应方面。一些供应商专门存储非维度XBRL事实,在这种情况下,传统的SQL(或随着行数扩展的“后SQL”)提供良好的效果。
一些供应商为分类法中的每个XBRL超立方体创建一个表格,其架构从定义网络派生但针对每个超立方体不同。这可能会导致数据库中有很多表格,并且需要进行许多连接以查询涉及多个超立方体的查询。
一些其他供应商对底层XBRL结构或其用户需要运行的查询类型进行假设。限制问题的范围允许找到特定的架构或SQL模式,也可以为这些特定需求完成工作。
最后,为了导入大量申报,可以在NoSQL数据存储之上构建通用映射,而不是关系型数据库。具有不同维度数量的大量事实适合大型半结构化文档集合中,而网络则适合以分层格式呈现。

5
首先,您需要意识到XBRL文档(实例)包含许多不同类型的信息。例如:它可以包含投资基金的日常定价信息,但也可以包括季度增值税报告或信用价值信息。XBRL是一种标准化的通信方式,但其内容具有自己的(XBRL标准化的)分类法。例如:有一个荷兰分类法,以此构建了荷兰税务机构(带有其自己的分类法),并有一个特定的分类法用于提交增值税报告。这些分类法使用XSD、Xlink和linkbase进行定义。将其视为词典的概念:构建词典的方式在任何地方都是相同的(使用字母表中的每个字母来制作“章节”,按字母顺序排序单词等等),但是希腊词典使用其自己的字母表、自己的单词和自己的语言来解释内容。
因此,如果您仅使用一种或少数几种不同类型的XBRL文档(共享相同的分类法),则可以从这些分类法创建映射到您自己(数据库)对象的解决方案。如果您有更广泛的分类法范围,则必须创建更通用的解决方案,可以“导入”分类法。这将是一个相当大的挑战(这也是市场上没有太多可用工具的原因)。
如果您(的公司)能负担得起,我建议研究现有的工具,例如Altova's MapForce。这样,为了开始开发自己的解析这些文件的工具,不需要学习XBRL、XSD、Xlink和linkbase,可以利用现有产品将XBRL分类法映射到您的数据库/应用程序中。

你知道MapForce是否支持iXBRL吗?iXBRL是由英国公司注册局使用的。 - Paul Tibbetts
1
iXBRL是内嵌XBRL,基本上是一个包含XBRL数据的HTML文件,创建了一个与“原始”XBRL中包含的完全相同的数据的可读性更强的文档。当我查看您的链接时,它提供了两种格式的数据。通常,通过将模板(通常是XSLT)应用于XBRL文件来创建iXBRL。至于您的问题:MapForce不适用于iXBRL...但是快速浏览他们的网站显示Altova确实有处理iXBRL的工具:StyleVision,他们的报告工具。 - DdW
感谢您的回复。我发现只有大约1%的文件以XBRL格式(.xml)提供,其余的都是iXBRL格式(.html),因此MapForce无法处理其中的大部分文件。我可能会看看StyleVision是否能够读取iXBRL并输出到原始XBRL,以便MapForce可以读取它,尽管我希望能找到一个工具来完成所有这些操作。 - Paul Tibbetts
是否有进一步的更新?有没有解析器可以用来将XML解析为对象或JSON? - user3437721
哎呀,我是说XBRL,我猜你可以用XML解析器来处理它,还是需要专有库? - user3437721
显示剩余3条评论

2

希望您知道,MySQL是一个结构化数据存储,而XBRL只是将商业文件映射到数字格式的表示。 XBRL是基于XML的文档,这意味着它是非结构化的,您需要从文档中获取的数据可能出现在特定文档中,也可能不出现。它还可以包含任何其他附加信息。XSD定义了XML如何被组织和每个标记可以出现多少次。现在回答您的问题,您可以使用eXistDB来存储XBRL文档,我过去也用过它。但是,有时会很慢。如果您仅需要从XBRL中获取一些数据并将其存储在MySQL数据库中,则可以使用XPATH。在以下简单的Python代码中,您可以从此文档中获取EquityTotalEndingBalanceReservesTotalEndingBalance的值。

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']

那么,你如何解决这个问题呢?
1. 你可以选择一个基于NoSQL的XML文档存储,例如eXistDB,并编写XPath来获取特定的数据。 2. 你可以像上面那样手动解析XBRL文档,直接使用XPath并存储数据。
如果需要从各种类型的文档中消费所有数据,则复杂性会增加。因此,你需要限制从这些文档中获取的内容。

这种方法能够支持不同的contextRef吗?(而无需手动定义)我见过一些使用contextRef="current-mud",其他人使用contextRef="cfwd_31_12_2014"contextRef="FY1",我希望获得当前/最近的值。 - Paul Tibbetts
是的,这是可能的。您需要修改xpath以支持属性。假设您想要从<iascf-pfs:EquityTotalEndingBalance numericContext="Group1999AsOf">37216000000</iascf-pfs:EquityTotalEndingBalance>中获取值。在这种情况下,xpath将是data_one = root.xpath("//iascf-pfs:EquityTotalEndingBalance[@numericContext='Group1999AsOf']/text()",namespaces=nsmap)。这将返回'37216000000'。希望这可以帮助您。如果这对您有用,请接受答案。谢谢。 - Mahadeva
谢谢您的回复。您知道如何动态处理吗?我正在尝试处理大约6,000个文件,其中上下文对我来说是未知的。 - Paul Tibbetts
XPath确实是读取XBRL的很好方法。@Paul,我想补充一下,contextRef的值是需要解析为包含实际上下文信息的xbrli:context元素的外键。XBRL要求contextRef值引用同一文件中定义的上下文元素。为了获取最新值(假设没有维度),XPath表达式需要检索候选事实的上下文,选择具有最新期间(或期末)的上下文,并返回相应的事实。 - Ghislain Fourny
你可以根据自己的需求修改XPATH,但由于XBRL是一种非结构化数据格式,试图从所有文档中消费所有数据将会很复杂。就像上面给出的例子一样,你应该首先分析你要消费哪些数据以及它们是否可能出现在XBRL文档中。一旦你列出了一些项目,开始准备XPATH并像我之前所做的那样执行它。如果有多个结果怎么办?你也应该考虑这个问题。一旦你需要所有内容,将它们插入到数据库中并不难。困难的部分是确定你想要消费的项目并为其编写XPATH。 - Mahadeva


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接