如何使用 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 及其子级 loccalculationArc 的属性,那么请考虑 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 文件?的主要内容,如果未能解决你的问题,请参考以下文章

解析iperf结果

失败:WebSocket 握手期间出错:“Sec-WebSocket-Accept”标头值不正确

使用/解析远程变量时如何正确转义单引号? [复制]

如何使用 Alamofire 和 SwiftyJSON 正确解析 JSON

如何使用 bs4 正确解析谷歌搜索结果?

Oracle11gR2--SEC_CASE_SENSITIVE_LOGON参数解析