我正在使用python从以下链接读取SDMX XML文件:https://www.newyorkfed.org/xml/fedfunds.html或direct
理想情况下,我希望将基金利率放入dataframe中,但我正在尝试使用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我发现这个方法相当难看,对于每个“数据”,我需要检查它是否是没有。有没有更好的方法呢?
发布于 2020-04-04 09:12:40
试着这样做:
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.01https://stackoverflow.com/questions/61020154
复制相似问题