首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用python解析XBRL

使用python解析XBRL
EN

Stack Overflow用户
提问于 2015-11-27 19:16:53
回答 2查看 8.6K关注 0票数 1

我正在从xbrl解析值。我的代码基于python包,但做了一些修改以适应我的需要。该包使用beautifulsoup4

我正在使用下面的代码来找到我感兴趣的一个值。我之所以使用if语句,是因为不同的公司对同一件事使用不同的标签名。

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

此代码按预期工作,给出正确的值29924000000。

代码语言:javascript
复制
    #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

代码语言:javascript
复制
<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。

代码语言:javascript
复制
    #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

代码语言:javascript
复制
<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>

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

我不明白为什么相同的代码块不能工作。在两种情况下,我似乎都在做同样的事情。找到一个值并存储它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-30 12:56:34

一个不同之处是,if语句在第一种情况下检查gaap_obj.COST_GOOD_SOLD,而在第二种情况下只检查NET_CURR_DEBT。

很难在不了解self.data_processing实际操作的情况下对其进行进一步的评论,但是您的代码是否能够处理相同元素可能多次出现在XBRL文档中的事实(根据不同的上下文进行区分)?

正如我对前面的问题(Reading xbrl with python)所评论的,我不建议解析XBRL,因为它的命名空间支持是不完整的。使用一个合适的XBRL库会更好,该库还将处理上下文等问题。

票数 3
EN

Stack Overflow用户

发布于 2016-02-07 01:39:19

在python中有许多遗漏和误导的存根方法和参数。如果不仔细阅读代码,我是不会相信的。

下面是一个示例--一个名为parse_unique()的方法,它确实在XML上运行某种类型的过滤器,但随后忽略它:

代码语言:javascript
复制
@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

然后是独特的定义:

代码语言:javascript
复制
class Unique(object):
    def __init__(self):
        return None

我并不是直接用这些评论来解决您的问题,但是建议您仔细查看代码,以确保代码符合您的期望。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33963598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档