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