gpt4 book ai didi

python - 如何打开此 XML 文件以在 Python 中创建数据框?

转载 作者:太空狗 更新时间:2023-10-29 20:15:39 24 4
gpt4 key购买 nike

有没有人建议在下面的站点上打开 xml 数据以将其放入 python 数据框(我更喜欢使用 pandas)的最佳方法?该文件位于本网站的“数据 - XML (sdmx/zip)”链接中:

http://www.federalreserve.gov/pubs/feds/2006/200628/200628abs.html

我尝试通过从 http://timhomelab.blogspot.com/2014/01/how-to-read-xml-file-into-dataframe.html 复制来使用以下内容,看来我越来越接近了:

from lxml import objectify
import pandas as pd

path = 'feds200628.xml'
xml = objectify.parse(open(path))
root = xml.getroot()
root.getchildren()[0].getchildren()
df = pd.DataFrame(columns=('id', 'name'))

for i in range(0,4):
obj = root.getchildren()[i].getchildren()
row = dict(zip(['id', 'name'], [obj[0].text, obj[1].text]))
row_s = pd.Series(row)
row_s.name = i
df = df.append(row_s)

不过,我对 xml 的了解还不够多,无法完成剩下的工作。

任何帮助都会很棒 - 我什至不需要它在数据框中,我只需要弄清楚如何以某种方式在 python 中解析这些内容。

最佳答案

XML 是树状结构,而 Pandas DataFrame 是二维表状结构。所以没有在两者之间自动转换的方法。您必须了解 XML 结构并知道如何将其数据映射到 2D 表。因此,每个 XML 到 DataFrame 的问题都是不同的。

您的 XML 有 2 个数据集,每个数据集包含多个系列。每个 Series 包含多个 Obs 元素。

每个Series都有一个NAME属性,每个Obs都有OBS_STATUS、TIME_PERIOD和OBS_VALUE属性。因此,创建一个包含 NAME、OBS_STATUS、TIME_PERIOD 和 OBS_VALUE 列的表也许是合理的。

我发现从 XML 中提取所需的数据有点复杂,这让我怀疑我是否找到了最好的方法。但这是一种方法(PS。Thomas Maloney 从类似 2D 表格的 XLS 数据开始的想法应该更简单):

import lxml.etree as ET
import pandas as pd

path = 'feds200628.xml'

def fast_iter(context, func, *args, **kwargs):
"""
http://lxml.de/parsing.html#modifying-the-tree
Based on Liza Daly's fast_iter
http://www.ibm.com/developerworks/xml/library/x-hiperfparse/
See also http://effbot.org/zone/element-iterparse.htm
http://stackoverflow.com/a/7171543/190597 (unutbu)
"""
for event, elem in context:
func(elem, *args, **kwargs)
# It's safe to call clear() here because no descendants will be
# accessed
elem.clear()
# Also eliminate now-empty references from the root node to elem
for ancestor in elem.xpath('ancestor-or-self::*'):
while ancestor.getprevious() is not None:
del ancestor.getparent()[0]
del context

data = list()
obs_keys = ['OBS_STATUS', 'TIME_PERIOD', 'OBS_VALUE']
columns = ['NAME'] + obs_keys

def process_obs(elem, name):
dct = elem.attrib
# print(dct)
data.append([name] + [dct[key] for key in obs_keys])

def process_series(elem):
dct = elem.attrib
# print(dct)
context = ET.iterwalk(
elem, events=('end', ),
tag='{http://www.federalreserve.gov/structure/compact/common}Obs'
)
fast_iter(context, process_obs, dct['SERIES_NAME'])

def process_dataset(elem):
nsmap = elem.nsmap
# print(nsmap)
context = ET.iterwalk(
elem, events=('end', ),
tag='{{{prefix}}}Series'.format(prefix=elem.nsmap['kf'])
)
fast_iter(context, process_series)

with open(path, 'rb') as f:
context = ET.iterparse(
f, events=('end', ),
tag='{http://www.federalreserve.gov/structure/compact/common}DataSet'
)
fast_iter(context, process_dataset)
df = pd.DataFrame(data, columns=columns)

产量

            NAME OBS_STATUS TIME_PERIOD   OBS_VALUE
0 SVENY01 A 1961-06-14 2.9825
1 SVENY01 A 1961-06-15 2.9941
2 SVENY01 A 1961-06-16 3.0012
3 SVENY01 A 1961-06-19 2.9949
4 SVENY01 A 1961-06-20 2.9833
5 SVENY01 A 1961-06-21 2.9993
6 SVENY01 A 1961-06-22 2.9837
...
1029410 TAU2 A 2014-09-19 3.72896779
1029411 TAU2 A 2014-09-22 3.12836171
1029412 TAU2 A 2014-09-23 3.20146575
1029413 TAU2 A 2014-09-24 3.29972110

关于python - 如何打开此 XML 文件以在 Python 中创建数据框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26077231/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com