如何使用 pd.read_xml 正确解析 SEC cal.xml 文件?
Posted
技术标签:
【中文标题】如何使用 pd.read_xml 正确解析 SEC cal.xml 文件?【英文标题】:How to parse SEC cal.xml files correctly with pd.read_xml? 【发布时间】:2021-12-15 03:46:20 【问题描述】:几个月以来,我一直在尝试标准化 SEC 文件。但是,我意识到每个公司每年的 us-gaap 标签具有不同的含义。
因此,我现在的目标是从 cal.xml 文件中为每个 us-gaap 子项提取父项。
AAPL 文件 2011-09-24 的 cal.xml file 示例: 子项“AccountsPayableCurrent”的父项似乎是“LiabilitiesCurrent”。
我想使用 pandas.read_xml 函数。 df = pd.read_xml('https://www.sec.gov/Archives/edgar/data/320193/000119312511282113/aapl-20110924_cal.xml')
但是,生成的 df 没有我可以提取此类信息的表单。 有人知道如何为我希望的每个 ca.xml 自动执行此操作吗?
我已阅读 pd.read_xml 的文档,它可以将样式表 (XSLT) 作为参数。是否有可能从 .xml 或相关的 .xsd 创建这样的 XSLT?
提前谢谢你们。请告诉我如何改进我的问题。
【问题讨论】:
你想要的结果是什么?该 XML 包含大量信息。你需要解析什么信息?您没有在read_xml
中指定 xpath。此外,您需要考虑命名空间。是的,XSLT 1.0 可用于扁平化原始 XML 以进行二维数据框迁移。
上传 xml 的 sn-p(确保它是 VALD 文档)。解释 df 应该是什么样子。
【参考方案1】:
只需为要解析的节点部分指定所需的xpath
。根据docs,默认为一级./*
:
import pandas as pd
import requests
url = (
"https://www.sec.gov/Archives/edgar/data/320193/"
"000119312511282113/aapl-20110924_cal.xml"
)
hdr =
"user-agent":
(
"Mozilla/5.0 (Linux; android 6.0; Nexus 5 Build/MRA58N) "
"AppleWebKit/537.36 (Khtml, like Gecko) Chrome/92.0.4515.107 "
"Mobile Safari/537.36"
)
r = requests.get(url, headers=hdr)
# roleRef NODES
roleRef_df = pd.read_xml(
r.text,
xpath = "//doc:roleRef",
namespaces = "doc": "http://www.xbrl.org/2003/linkbase"
)
# calculationLink NODES
calculationLink_df = pd.read_xml(
r.text,
xpath = "//doc:calculationLink",
namespaces = "doc": "http://www.xbrl.org/2003/linkbase"
)
# loc NODES
loc_df = pd.read_xml(
r.text,
xpath = "//doc:calculationLink/doc:loc",
namespaces = "doc": "http://www.xbrl.org/2003/linkbase"
)
# calculationArc NODES
calculationArc_df = pd.read_xml(
r.text,
xpath = "//doc:calculationLink/doc:calculationArc",
namespaces = "doc": "http://www.xbrl.org/2003/linkbase"
)
如果您需要更广泛的解析,例如检索父级 calculationLink
及其子级 loc
或 calculationArc
的属性,那么请考虑 XSLT。
xsl = '''<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:doc="http://www.xbrl.org/2003/linkbase">
<xsl:output method="xml" omit-xml-declaration="no" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<xsl:copy>
<xsl:apply-templates select="descendant::doc:loc"/>
<xsl:apply-templates select="descendant::doc:calculationArc"/>
</xsl:copy>
</xsl:template>
<xsl:template match="doc:loc|doc:calculationArc">
<xsl:copy>
<xsl:copy-of select="ancestor::doc:calculationLink/@*"/>
<xsl:copy-of select="@*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>'''
calculationLink_loc_df = pd.read_xml(
r.text,
xpath = "//doc:loc",
namespaces = "doc": "http://www.xbrl.org/2003/linkbase",
stylesheet = xsl
)
calculationLink_arc_df = pd.read_xml(
r.text,
xpath = "//doc:calculationArc",
namespaces = "doc": "http://www.xbrl.org/2003/linkbase",
stylesheet = xsl
)
输出
calculationLink_loc_df.head()
# type role href label
# 0 locator http://www.apple.com/taxonomy/role/StatementOf... http://xbrl.fasb.org/us-gaap/2011/elts/us-gaap... us-gaap_CostOfGoodsAndServicesSold
# 1 locator http://www.apple.com/taxonomy/role/StatementOf... http://xbrl.fasb.org/us-gaap/2011/elts/us-gaap... us-gaap_GrossProfit
# 2 locator http://www.apple.com/taxonomy/role/StatementOf... http://xbrl.fasb.org/us-gaap/2011/elts/us-gaap... us-gaap_IncomeLossFromContinuingOperationsBefo...
# 3 locator http://www.apple.com/taxonomy/role/StatementOf... http://xbrl.fasb.org/us-gaap/2011/elts/us-gaap... us-gaap_IncomeTaxExpenseBenefit
# 4 locator http://www.apple.com/taxonomy/role/StatementOf... http://xbrl.fasb.org/us-gaap/2011/elts/us-gaap... us-gaap_NetIncomeLoss
calculationLink_arc_df.head()
# type role arcrole from to order weight priority use
# 0 arc http://www.apple.com/taxonomy/role/StatementOf... http://www.xbrl.org/2003/arcrole/summation-item us-gaap_GrossProfit us-gaap_SalesRevenueNet 1.01 1.0 2 optional
# 1 arc http://www.apple.com/taxonomy/role/StatementOf... http://www.xbrl.org/2003/arcrole/summation-item us-gaap_GrossProfit us-gaap_CostOfGoodsAndServicesSold 1.02 -1.0 2 optional
# 2 arc http://www.apple.com/taxonomy/role/StatementOf... http://www.xbrl.org/2003/arcrole/summation-item us-gaap_IncomeLossFromContinuingOperationsBefo... us-gaap_OperatingIncomeLoss 1.07 1.0 2 optional
# 3 arc http://www.apple.com/taxonomy/role/StatementOf... http://www.xbrl.org/2003/arcrole/summation-item us-gaap_IncomeLossFromContinuingOperationsBefo... us-gaap_NonoperatingIncomeExpense 1.08 1.0 2 optional
# 4 arc http://www.apple.com/taxonomy/role/StatementOf... http://www.xbrl.org/2003/arcrole/summation-item us-gaap_NetIncomeLoss us-gaap_IncomeLossFromContinuingOperationsBefo... 1.09 1.0 2 optional
【讨论】:
谢谢!您是如何知道如何构建 XSLT 的?有没有共同的方案? XSLT 是一种特殊用途的编码语言。 (Python 是一种通用语言)。因此,您可以编写 XSLT 脚本,但您需要遵守其语法来呈现所需的输出。没有像 Python 那样的通用方案。它是开放式的,可以适应输入 XML 和您想要的输出(XML、HTML,甚至 CSV)。编码愉快!以上是关于如何使用 pd.read_xml 正确解析 SEC cal.xml 文件?的主要内容,如果未能解决你的问题,请参考以下文章
失败:WebSocket 握手期间出错:“Sec-WebSocket-Accept”标头值不正确