Разбор XBRL с использованием Python

Я работаю над разбором значений из 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 файл.

Я не могу понять, почему идентичные куски кода не работают. Кажется, я делаю одно и то же в обоих случаях. Найти значение и сохранить его.

2 ответа

Решение

Единственное отличие состоит в том, что оператор if проверяет gaap_obj.COST_GOOD_SOLD в первом случае, а во втором - просто NET_CURR_DEBT.

Трудно комментировать дальше, не видя, что на самом деле делает self.data_processing, но справляется ли ваш код с тем фактом, что один и тот же элемент может появляться несколько раз в документе XBRL (различается в разных контекстах)?

Как я прокомментировал ваш предыдущий вопрос ( Чтение xbrl с python), я бы не рекомендовал Beautifulsoup для разбора XBRL, так как его поддержка пространства имен неполная. Вам будет лучше с правильной библиотекой XBRL, которая также позаботится об обработке контекстов и т. Д. Для вас.

Существует ряд упущений и вводящих в заблуждение методов и параметров заглушки, которые ничего не делают в 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

а затем определение уникального:

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

Я не обращаюсь к вашей проблеме непосредственно с помощью этих комментариев, но предлагаю вам внимательно посмотреть код, чтобы убедиться, что он делает то, что вы ожидаете.

Другие вопросы по тегам