1

我正在使用 python 库pandaSDMX从 OECD 数据库中提取整个数据集,并将它们转换为 CSV 格式(任何可读格式都可以,因为我想将最终输出放入 SQL 数据库中)。

要访问 SDMX-Json 格式的 OECD 数据集(还有一种 SDMXML 格式),您可以在浏览器上粘贴如下链接:

http://stats.oecd.org/sdmx-json/data/PART2/all/all

注意:“PART2”是数据集的名称

问题是,有些经合组织数据集的 SDMX-Json没有名为Time_Period的维度,而我发现的所有 sdmx-json 解析 python 库仅解析具有此维度的 SDMX-Json

我还尝试找到一些可以解析 SDMXML (SDMX-ML) 文件的 python 库(这也可以),但是在 python 中构建该过程对我不起作用......

这是我用来解析 SDMX-Json 数据集并将输出 CSV 文件写入 Azure blob 存储的一段代码:

# itera sob cada ficheiro json e converte o conteudo para csv
    for dataset in datasetList:
        cursor = cnxn.cursor()

        Values = [dataset, datasetFiltersList[counter]]
        cursor.execute(SQLLogCommand, Values)
        cnxn.commit()

        #logging.info('Analysing dataset: ' + dataset)
        try:
            data_response = oecd.data(resource_id=dataset, key=datasetFiltersList[counter])
        except UnicodeDecodeError:
            Values = [datetime.today().strftime('%Y-%m-%d-%H:%M:%S'), 'Unicode Decode Error - Error', 0]
            cursor.execute(SQLUpdateCommand, Values)
            cnxn.commit()
        except KeyError:
            Values = [datetime.today().strftime('%Y-%m-%d-%H:%M:%S'), 'Key Error - Error', 0]
            cursor.execute(SQLUpdateCommand, Values)
            cnxn.commit()
        else:
            data = data_response.data
            if data.dim_at_obs == 'TIME_PERIOD':
                df = createDF(data, useIDs=False)
                blobService.create_blob_from_text(CONTAINERNAME, csvBlobPath + dataset + '.csv' , df.to_csv(index=False, sep='|', encoding='utf-8'))

                Values = [datetime.today().strftime('%Y-%m-%d-%H:%M:%S'), 'Success', 1]
                cursor.execute(SQLUpdateCommand, Values)
            cnxn.commit()  
            #logging.info('Dataset ' + dataset + ' analysed!')
        else:
            print('no time period error on dataset: ' + dataset)
            Values = [datetime.today().strftime('%Y-%m-%d-%H:%M:%S'), 'No Time Period - Error', 0]
            cursor.execute(SQLUpdateCommand, Values)
            cnxn.commit()  

cnxn.close()

所以,我的最后一个问题是

有谁知道解析没有Time_Period 维度的 SDMX-Json 文件的方法?或以其他方式从经合组织自动提取整个数据集并对其进行解析......

例如:

  1. 有时间段的数据集(这个对我来说很好): http: //stats.oecd.org/sdmx-json/data/TALIS_EDUGPS/all/all
  2. 没有时间段的数据集:http: //stats.oecd.org/sdmx-json/data/PART2/all/all
4

1 回答 1

0

该包sdmx1(的改进分支pandaSDMX)没有您描述的限制,可用于检索和解析此数据。

版本 2.5.0 还处理了这个特定的 OECD 数据的特性:消息的结构部分描述了每个观察的 TIME_FORMAT(nb 不是 TIME_PERIOD)属性,但观察实际上不包括这个属性。

>>> import sdmx
>>> OECD = sdmx.Client("OECD")
>>> message = OECD.data("PART2")
No AttributeValues for attribute <DataAttribute TIME_FORMAT>; discard

>>> message
<sdmx.DataMessage>
  <Header>
    id: '710c36ac-0beb-4781-b6d6-01d86476a10c'
    prepared: '2021-07-11T17:54:09.547694+00:00'
    sender: <Agency OECD: Organisation for Economic Co-operation and Development>
    source: 
    test: False
  response: <Response [200]>
  DataSet (1)
  dataflow: <DataflowDefinition (missing id)>
  observation_dimension: <sdmx.model._AllDimensions object at 0x7f008efd7e80>

>>> sdmx.to_pandas(message.data[0])
LOCATION  IND    PER  GRD  FLD  MSR
AUS       10CAU  CHG  EIG  MAT  MN     11.430378
                                SE      6.079738
                           SCI  MN     -3.697873
                                SE      4.820530
                      FOG  MAT  MN      6.051900
                                         ...    
ZAF       8UTSR  END  EIG  SCI  SE      3.203199
                 INI  EIG  MAT  MN     60.268028
                                SE      3.864160
                           SCI  MN     55.894505
                                SE      3.500335
Name: value, Length: 18755, dtype: float64
于 2021-07-11T17:59:18.557 回答