我正在做一个涉及处理大量XBRL文档(> 1m个独立文件)的项目。我对XBRL完全是个新手,现在我觉得很迷茫。
我在一个单独的MySQL数据库中有与这些XBRL文档相关的数据,我想将XBRL数据添加到MySQL中,以便将所有内容存储在一个数据库中。
将数据从XBRL文档传输到MySQL的最佳方法是什么?
有没有适合它的批量处理库?
我一直在寻找关于这些问题的教程,但找不到任何提供基本介绍的东西,只有大量的高级信息。
发布于 2016-07-01 20:44:16
理论上,在数据库中存储XBRL的自然范例是OLAP,因为XBRL是关于数据立方体的。在关系数据库之上的OLAP将被称为ROLAP。
这不是一个微不足道的问题,因为从大量分类中提取的事实可以形成一个非常大且稀疏的多维数据集(对于美国证券交易委员会的文件,它是SQL维),还因为创建10k+模式需要在任何导入之前了解分类。如果出现新的分类法,则需要重新提取所有内容。这并不能使关系数据库适合作为一般的解决方案。
如果文件共享相同的分类法,并且分类法非常简单(如:不是太多的维度),则可以提出一个特别映射,在ROLAP意义上将所有事实存储在包含多行的单个表中(事实到行,方面到列)。一些供应商专门存储非维度的XBRL事实,在这种情况下,传统的SQL (或随行扩展的"post-SQL“)产品可以很好地工作。
一些供应商为分类法中的每个XBRL超立方体创建一个表,该表具有从定义网络派生的模式,但每个超立方体的模式不同。这可能会导致数据库中有很多表,并且需要对涉及多个超立方体的查询进行大量连接。
其他一些供应商对底层XBRL结构或其用户需要运行的查询类型进行了假设。通过限制问题的范围,可以找到也可以满足这些特定需求的特定体系结构或SQL模式。
最后,要导入大量文件,可以在NoSQL数据存储而不是关系数据库的基础上构建通用映射。具有不同维度的大量事实适合于半结构化文档的大型集合,而网络则适合分层格式。
发布于 2016-07-15 19:57:04
首先,您需要认识到XBRL文档(实例)包含许多不同类型的信息。例如:它可以包含投资基金的每日定价信息,也可以包含季度增值税报告或信用信息。XBRL是一种标准的通信方式,但是内容有自己的(XBRL标准化的)分类。例如:有一个荷兰分类法,荷兰税务机构就是在这个分类法的基础上建立起来的(有它自己的分类法),在这个分类法的基础上有一个特定的分类法来提交增值税报告。这些分类是使用XSD、Xlink和linkbase定义的。可以把它想象成字典的概念:字典的构建方式在任何地方都是一样的(使用字母表中的每个字母组成“章节”,按字母顺序对单词进行排序等),但希腊字典使用自己的字母表、自己的单词和自己的语言来解释内容。
因此,如果只使用一种或几种不同类型的XBRL文档(共享相同的分类法),则可以创建从这些分类法到您自己的(数据库)对象的映射。如果你有更广泛的分类法,你必须创建一个更通用的解决方案来“导入”分类法。这将是一个相当大的挑战(这就是市场上没有太多工具可用的原因)。
如果你(r公司)负担得起,我建议你看看现有的tools,比如Altova's MapForce。这样就不需要学习XBRL、XSD、Xlink和linkbase,只需开始开发自己的工具来解析这些文件,就可以利用现有产品将XBRL分类映射到数据库/应用程序。
发布于 2016-07-16 23:31:15
我希望您知道,MySQL是一种结构化数据存储,而XBRL只是将业务文档映射为数字格式的表示形式。XBRL是基于XML的文档,这意味着它是非结构化的,您从文档中需要的数据可以出现在该特定文档中,也可以不出现在该特定文档中。它还可以包含任何其他附加信息。XSD定义了如何构造以及任何标记可以出现的次数。现在回答您的问题,您可以使用eXistDB,我以前也使用过它来存储XBRL文档。然而,它有时可能会很慢。如果您只需要从XBRL获取一些数据,并且需要将其存储在MySQL数据库中,那么您可以使用XPATH。在下面的简单python代码中,您可以从this document获取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的eXistDB文档存储,并编写Xpath来获取特定数据。如果您需要使用所有类型的文档中的所有数据,则会出现复杂性。因此,您必须限制您将从这些文档中消费的内容。
https://stackoverflow.com/questions/38122262
复制相似问题