【问题标题】:Parsing XBRL using python使用 python 解析 XBRL
【发布时间】:2015-11-27 19:16:53
【问题描述】:

我正在从 xbrl 解析值。我的代码基于 python-xbrl 包,但为了满足我的需要对其进行了一些更改。该包使用beautifulsoup4

我正在使用下面的代码来查找我感兴趣的一个值。我使用if 语句是因为不同的公司对同一事物使用不同的标签名称。

例如 AAPL 使用 us-gaap:CostOfGoodsAndServicesSold,而 ADBE 使用 us-gaap:CostOfRevenue

此代码按预期工作,给了我正确的值 29924000000

    #COST_GOOD_SOLD
    COST_GOOD_SOLD = xbrl.find_all(name=re.compile("(us-gaap:CostOfGoodsAndServicesSold$)",
                                                   re.IGNORECASE | re.MULTILINE))
    gaap_obj.COST_GOOD_SOLD = self.data_processing(COST_GOOD_SOLD, xbrl, ignore_errors,
                                                   logger, context_ids)
    if gaap_obj.COST_GOOD_SOLD ==0 or gaap_obj.COST_GOOD_SOLD==None:
        COST_GOOD_SOLD = xbrl.find_all(name=re.compile("(us-gaap:CostOfRevenue$)",
                                                           re.IGNORECASE | re.MULTILINE))
        gaap_obj.COST_GOOD_SOLD = self.data_processing(COST_GOOD_SOLD, xbrl, ignore_errors,
                                                       logger, context_ids)

XBRL

<us-gaap:CostOfGoodsAndServicesSold contextRef="eol_PE2035----1510-Q0008_STD_91_20150627_0" unitRef="iso4217_USD" decimals="-6" id="id_5025426_2D2AD7F5-3575-48A0-9F08-7F1EBE173C23_1_1">29924000000</us-gaap:CostOfGoodsAndServicesSold>

这段代码返回零,而我想要 -1808000000

    #NET_CURR_DEBT
    NET_CURR_DEBT = xbrl.find_all(name = re.compile("(us-gaap:ProceedsFromRepaymentsOfCommercialPaper$)",
                                                    re.IGNORECASE | re.MULTILINE))
    gaap_obj.NET_CURR_DEBT = self.data_processing(NET_CURR_DEBT, xbrl, ignore_errors,
                                                  logger, context_ids)
    if NET_CURR_DEBT==0 or NET_CURR_DEBT==None:
        NET_CURR_DEBT = xbrl.find_all(name = re.compile("(us-gaap:RepaymentsOfLongTermDebtAndCapitalSecurities$)",
                                                        re.IGNORECASE | re.MULTILINE))
        gaap_obj.NET_CURR_DEBT = self.data_processing(NET_CURR_DEBT, xbrl, ignore_errors,
                                                      logger, context_ids)

XBRL

<us-gaap:ProceedsFromRepaymentsOfCommercialPaper contextRef="eol_PE2035----1510-Q0008_STD_273_20150627_0" unitRef="iso4217_USD" decimals="-6" id="id_5025426_049B4F11-216C-4D4B-A41F-32F1F55F967F_1_32">-1808000000</us-gaap:ProceedsFromRepaymentsOfCommercialPaper>

我还有其他几个要解析的值,但它们都具有与我附加的代码相同的结构。 我的输出是一个数据框,其中第一列是值名称(COST_GOOD_SOLD, NET_CURR_DEBT, ect),第二列是来自XML 文件的值。

我无法弄清楚为什么相同的代码块不起作用。看来我在这两种情况下都在做同样的事情。找到一个值并存储它。

【问题讨论】:

    标签: python xbrl


    【解决方案1】:

    一个区别是 if 语句在第一种情况下检查 gaap_obj.COST_GOOD_SOLD,而在第二种情况下只检查 NET_CURR_DEBT。

    如果不了解 self.data_processing 的实际作用,就很难进一步评论,但是您的代码是否能够处理同一个元素可能在 XBRL 文档中多次出现(由不同的上下文区分)这一事实?

    正如我对您之前的问题 (Reading xbrl with python) 的评论,我不建议使用 beautifulsoup 来解析 XBRL,因为它的命名空间支持不完整。使用适当的 XBRL 库会更好,它还会为您处理上下文等。

    【讨论】:

    • 代码确实处理了一个元素可能出现多次的事实。我尝试使用 Arelle,但他们网站上指向文档 link 的链接只提供了一个模块列表。
    【解决方案2】:

    在 python-xbrl 中有许多遗漏和误导性的存根方法和参数。如果不通读,我不会相信代码。

    这里有一个例子——一个叫做 parse_unique() 的方法确实在 XML 上运行某种过滤器,但随后忽略它:

    @classmethod
    def parse_unique(self, xbrl):
        """
        Parse company unique entities from XBRL and return an Unique object.
        """
        unique_obj = Unique()
    
        unique_data = xbrl.find_all(re.compile('^(?!us-gaap|xbrl*):\s*'))
    
        return unique_obj
    

    然后是Unique的定义:

    class Unique(object):
        def __init__(self):
            return None
    

    我不会直接用这些 cmets 解决您的问题,但建议您仔细查看代码以确保它符合您的预期。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-28
      • 1970-01-01
      • 2021-01-01
      相关资源
      最近更新 更多