python - 在 python 中读取 XML SDMX
问题描述
我正在努力从以下链接使用 python 读取 SDMX XML 文件: https ://www.newyorkfed.org/xml/fedfunds.html或 直接
理想情况下,我想将资金利率纳入数据框,但我试图使用 pandasdmx,它似乎不适用于这个
我当前的代码:f
rom urllib.request import urlopen
import xml.etree.ElementTree as ET
url = "https://websvcgatewayx2.frbny.org/autorates_fedfunds_external/services/v1_0/fedfunds/xml/retrieve?typ=RATE&f=03012016&t=04032020"
d2 = urlopen(url).read()
root ET.fromstring(d2)
for elem in root.iter():
k = elem.get('OBS_VALUE')
if k is not None:
print(k)
我想得到一些看起来像这样的东西:
FUNDRATE_OBS_POINT='1%' FUNDRATE_OBS_POINT='25%'
2020-04-02 0.03 0.05
2020-04-01 0.03 0.05
2020-04-01 0.01 0.05
我发现这种方法非常难看,对于每个“数据”,我需要检查它是否不是无。有没有更好的方法来做到这一点?
解决方案
尝试以下方式:
from lxml import etree
import requests
resp = requests.get(url)
doc = etree.fromstring(resp.content)
headers = []
dates = []
columns = []
fop = doc.xpath('//Series[@FUNDRATE_OBS_POINT]')
datpath = fop[0].xpath('//*[@*="ns13:ObsType"]')
for dat in datpath:
dates.append(dat.attrib.get('TIME_PERIOD'))
for item in fop:
headers.append(item.attrib.get('FUNDRATE_OBS_POINT'))
entries = item.xpath('//*[@*="ns13:ObsType"]')
column = []
for entry in entries:
column.append(entry.attrib.get('OBS_VALUE'))
columns.append(column)
df = pd.DataFrame(columns=headers,index=dates)
for a, b in zip(headers,columns):
df[a] = b
df.head(3)
输出:
1% 25% 50% 75% 99% TARGET_HIGH TARGET_LOW
2020-04-02 0.03 0.03 0.03 0.03 0.03 0.03 0.03
2020-04-01 0.03 0.03 0.03 0.03 0.03 0.03 0.03
2020-03-31 0.01 0.01 0.01 0.01 0.01 0.01 0.01
推荐阅读
- firefox - 语音合成 API 在 Manjaro 上的 Firefox 中不起作用
- reactjs - Apollo Client 3 - 全局事件监听器?
- stata - 用抽样权重计算观测数
- javascript - 如何通过 ctrl + enter 将 br(换行符)添加到 contenteditable div?
- python - Python模拟类属性
- javascript - nextjs 向组件传递数据
- safari - 网页如何向 Safari Web 扩展发送消息?
- android - 如何将值传递给 post 请求的改造 url
- javascript - 显示符合 Javascript 条件的 HTML 文本?
- rider - 将文件永久绑定到 Rider 中的特定更改列表