读取SDMX XML文件
sdmx的Python项目详细描述
读取SDMX XML文件。我只添加了所需的功能,所以 远不是一个彻底的实现。欢迎投稿。
安装
pip install sdmx
用法
sdmx.generic_data_message_reader(fileobj, dsd_fileobj=None, lazy=None)
给定一个表示通用数据消息的XML的类文件对象, 返回数据消息读取器。
sdmx.compact_data_message_reader(fileobj, dsd_fileobj=None, lazy=None)
给定一个表示压缩数据消息的XML的类文件对象, 返回数据消息读取器。
数据消息读取器的可选参数
- dsd_fileobj:表示 相关DSD。仅当数据消息不包含 相关的DSD。
- lazy:设置为True以懒洋洋地读取观察结果以允许 在不将整个数据集加载到内存中的情况下读取的数据集。 谨慎使用:懒散阅读会对 XML的结构(例如,序列键总是出现 在这个系列的任何观察之前)。这些假设似乎是 在我测试过的文件上是安全的,但这并不意味着它们 普遍正确。
数据消息阅读器
每个数据消息读取器都具有以下属性:
- datasets():返回一个DatasetReader实例的iterable。 每个实例对应一个<DataSet>元素。
DatasetReader
DatasetReader具有以下属性:
- key_family():返回数据集的KeyFamily。这个 对应于<KeyFamilyRef>元素。
- series():返回一个Series实例的iterable。每个 实例对应于<Series>元素。
KeyFamily
KeyFamily具有以下属性:
- name(lang):语言中键族的名称lang。
- describe_dimensions(lang):对于密钥系列的每个维度, 找到引用的概念并在语言中使用其名称 lang。返回字符串列表,其顺序与 源文件。
Series
Series具有以下属性:
- describe_key(lang):序列的键是 数据集到值的维度。例如,如果数据集 名为Country的维度,序列的值可能是 United Kingdom。返回将字符串映射到的有序字典 字符串列表。词典中的词条顺序相同 从describe_dimensions()返回的维度。为了 实例,如果数据集具有名为Country的单个维度, 返回的值应该是{"Country": ["United Kingdom"]}。全部 一个价值的祖先也被描述,与祖先出现 在后代之前。例如,如果值United Kingdom具有 父值Europe,它具有父值World, 返回值为 {"Country": ["World", "Europe", "United Kingdom"]}。
- observations():返回一个Observation实例的iterable。 每个实例对应一个<Obs>元素。
Observation
Observation具有以下属性:
- time
- value
示例
下面的脚本可用于打印 通用数据消息。(如果有压缩数据消息,则使用 compact_data_message_reader而不是 generic_data_message_reader也应该工作。)假设脚本 另存为read-sdmx-values.py,可以这样使用:
python read-sdmx-values.py path/to/generic-data-message.xml path/to/dsd.xml
importsysimportsdmxdefmain():dataset_path=sys.argv[1]dsd_path=sys.argv[2]withopen(dataset_path)asdataset_fileobj:withopen(dsd_path)asdsd_fileobj:dataset_reader=sdmx.generic_data_message_reader(fileobj=dataset_fileobj,dsd_fileobj=dsd_fileobj,)_print_values(dataset_reader)def_print_values(dataset_reader):fordatasetindataset_reader.datasets():key_family=dataset.key_family()name=key_family.name(lang="en")printnamedimension_names=key_family.describe_dimensions(lang="en")+["Time","Value"]forseriesindataset.series():row_template=[]key=series.describe_key(lang="en")forkey_name,key_valueinkey.iteritems():row_template.append(key_value)forobservationinseries.observations(lang="en"):row=row_template[:]row.append(observation.time)row.append(observation.value)printzip(dimension_names,row)main()