...
 
Commits (6)
......@@ -140,17 +140,14 @@ def norm_unit_info(unit_info):
return (unit_code, unit_label)
def generate_series_jsonl(ds_dir, csv_data_content, zi_col, zi_type, base_time_series, attributes_map):
def generate_series_jsonl(ds_dir, csv_data_content, zi_col, zi_type, base_time_series, dim_info):
"""Generates series.jsonl file and return unit set
"""
# nb of time series == nb of prefixes * nb of base time series
bts_nb = len(base_time_series)
df = du.compute_data_frame(csv_data_content, zi_type, zi_col, base_time_series)
df = du.compute_data_frame(csv_data_content, zi_type, zi_col, len(base_time_series))
freq_code, _ = DESTATIS_FREQ_MAP[zi_type]
unit_info_set = set()
unnamed_dim_list = []
dim_list = None
series_jsonl_filepath = ds_dir / 'series.jsonl'
with series_jsonl_filepath.open("wt", encoding="utf-8") as fdout:
......@@ -158,38 +155,36 @@ def generate_series_jsonl(ds_dir, csv_data_content, zi_col, zi_type, base_time_s
for prefix, subdf in df.sort_values(['prefix', 'period']).groupby(by='prefix'):
prefix_token_list = prefix.split('.')
prefix_token_len = len(prefix_token_list)
# Add dimensions for chunk composing dataset code
if not unnamed_dim_list:
for _ in prefix_token_list:
unnamed_dim_list.append(attributes_map)
unnamed_dim_list.append({t[0]: t[1] for t in base_time_series})
if not dim_list:
dim_list = [dim_info['dimensions_values_to_dimensions'].get(key)
for key in prefix_token_list]
prefix_label = ' - '.join([dim_info['dimensions_values_labels'][dim][val]
for val, dim in zip(prefix_token_list, dim_list)])
# Generate bts_nb series at a time
ts_list.clear()
for i in range(bts_nb):
bts = base_time_series[i]
bts_code = base_time_series[i][0]
ts_unit_info = bts[2]
for i, bts in enumerate(base_time_series):
(bts_code, bts_label, ts_unit_info) = bts
unit_info_set.add(ts_unit_info)
unit_code, _ = norm_unit_info(ts_unit_info)
time_series = {
'code': '{}.{}'.format(prefix, bts_code),
'name': du.compute_timeseries_label(prefix, bts[1], attributes_map),
'name': '{} - {}'.format(prefix_label, bts_label),
'dimensions': {
'frequency': freq_code,
'unit': bts[2],
'freq': freq_code,
'unit': unit_code,
'ind': bts_code,
**dict(zip(dim_list, prefix_token_list))
},
'observations': [
("PERIOD", "VALUE"),
*zip(map(str, subdf['period'].tolist()), subdf[i].fillna('NA').tolist())
]
}
# Additional unnamed properties
for i, token, in enumerate(prefix_token_list, start=1):
time_series['dimensions']['ind{}'.format(i)] = token
time_series['dimensions']['ind{}'.format(prefix_token_len+1)] = bts_code
ts_list.append(time_series)
# Reorder times series for a given prefix
......@@ -197,10 +192,10 @@ def generate_series_jsonl(ds_dir, csv_data_content, zi_col, zi_type, base_time_s
json.dump(time_series, fdout, sort_keys=True, ensure_ascii=False)
fdout.write("\n")
return (unit_info_set, unnamed_dim_list)
return (unit_info_set, dim_list)
def generate_dataset_json(ds_code, ds_dir, zi_type, unit_set, additional_dimensions, datasets_info, timestamp_data):
def generate_dataset_json(ds_code, ds_dir, zi_type, base_time_series, unit_set, dim_list, dim_info, datasets_info, timestamp_data):
""" Generates dataset.json """
def compute_units_tuple(unit_set):
......@@ -211,15 +206,19 @@ def generate_dataset_json(ds_code, ds_dir, zi_type, unit_set, additional_dimensi
dataset_info = dict(
_code=ds_code,
_dimensions_info=[
('frequency', 'Frequency', (freq_info,)),
('freq', 'Frequency', (freq_info,)),
('unit', 'Unit', compute_units_tuple(unit_set)),
],
)
if timestamp_data is not None:
dataset_info['_updated_date'] = timestamp_data
for i, added_dim in enumerate(additional_dimensions, start=1):
dataset_info['_dimensions_info'].append(('ind{}'.format(i), 'Indicator {}'.format(i), added_dim.items()))
if base_time_series:
dataset_info['_dimensions_info'].append(
('ind', 'Indicator', [(bst[0], bst[1]) for bst in base_time_series]))
for dim in dim_list:
dim_label = dim_info['dimensions_labels'].get(dim)
dim_values_labels = dim_info['dimensions_values_labels'].get(dim)
dataset_info['_dimensions_info'].append((dim, dim_label, dim_values_labels.items()))
ds_json_filepath = ds_dir / 'dataset.json'
cu.write_dataset_json_file(ds_json_filepath, dataset_info, datasets_info)
......@@ -260,6 +259,57 @@ def build_attributes_map(csv_data):
return att_map
KEY_LINE_RE = re.compile('^D;([A-Z0-9-]+);([^;]+).*')
KEY_RE = re.compile('^[A-Z0-9-]+$')
def extract_dimensions_info(csv_data, dimensions_english_labels):
"""
Generates information about dimensions
- 'dimensions_labels': {'dim1': 'Dimension 1', ..}
- 'dimensions_values_labels: {'dim1': {'key1': 'val1'}}
- 'dimensions_values_to_dimensions: {'key1': 'dim1', ...}
As dimensions_labels found in csv_data is german only,
use dimensions_english_labels from structure info to get
english labels when possible
"""
key_label_map = {}
key_dim_map = {}
dim_list = []
for line in csv_data.split('\n'):
m = KEY_LINE_RE.match(line)
if not m:
continue
fields_nb = len(line.split(';'))
key = m.group(1)
value = m.group(2)
if not key in key_label_map:
key_label_map[key] = value
elif value in key_label_map and fields_nb == 3 and KEY_RE.match(value):
key_dim_map[key] = value
if value not in dim_list:
dim_list.append(value)
return {
'dimensions_labels': {
dim: dimensions_english_labels.get(dim) or key_label_map.get(dim, dim) for dim in dim_list
},
'dimensions_values_labels': {
dim: {dim_key: key_label_map.get(dim_key, dim_key)
for dim_key in key_dim_map
if key_dim_map[dim_key] == dim}
for dim in dim_list
},
'dimensions_values_to_dimensions': key_dim_map,
}
def compute_zi_values_from_interval(zi_list, zi_type):
"""Computes all period values (destatis style) between 2 date values
>>> compute_zi_values_from_interval(['1995', '1998'], 'JAHR')
......@@ -383,6 +433,7 @@ def generate_dataset_data(target_dir, ds_code, structure_info, datacube_filepath
base_time_series = structure_info['base_time_series']
zi_list = structure_info['zi_list']
zi_type = structure_info['zi_type']
dim_english_labels = structure_info['dimensions_english_labels']
# Handle intervals
zi_values = set(compute_zi_values_from_interval(zi_list, zi_type))
......@@ -397,17 +448,19 @@ def generate_dataset_data(target_dir, ds_code, structure_info, datacube_filepath
ds_dir.mkdir(exist_ok=True)
# Builds attribute_maps from csv_data
attributes_map = build_attributes_map(csv_data)
# attributes_map = build_attributes_map(csv_data)
# Builds dimension info map from csv_data
dim_info = extract_dimensions_info(csv_data, dim_english_labels)
# Generates series.jsonl and return unit values set
csv_data_content, zi_col = du.extract_dzi_data_content(csv_data, zi_values, len(base_time_series))
(unit_set, additional_dimensions) = generate_series_jsonl(ds_dir, csv_data_content,
zi_col, zi_type, base_time_series,
attributes_map)
(unit_set, dim_list) = generate_series_jsonl(ds_dir, csv_data_content,
zi_col, zi_type, base_time_series,
dim_info)
# Generates dataset.json
generate_dataset_json(ds_code, ds_dir, zi_type,
unit_set, additional_dimensions, datasets_info, timestamp_data)
generate_dataset_json(ds_code, ds_dir, zi_type, base_time_series,
unit_set, dim_list, dim_info, datasets_info, timestamp_data)
return True
......
......@@ -13,6 +13,8 @@ from lxml import etree
# Chosen themes
CATEGORY_LABELS = {
'42': ' Manufacturing, mining and quarrying',
'45': 'Trade, accommodation and food services, tourism',
'51': 'Foreign trade',
'61': 'Prices',
'62': 'Earnings, labour costs',
......@@ -22,6 +24,12 @@ CATEGORY_LABELS = {
}
SUB_CATEGORIES = {
'42': [
('421', 'Short-term surveys'),
],
'45': [
('452', 'Short-term stat.: trade, accomm. and food services'),
],
'51': [],
'61': [
('611', 'Consumer prices'),
......@@ -101,8 +109,10 @@ def extract_structure_info(datacube_structure_filepath: Path):
- base time series as (code, name, unit)
- zi type: 'JAHR', 'SMONAT', ...
- zi list: ['1991', '1992', ...]
- dimensions_english_labels: {'dim1': 'Label1', ...}
"""
# Parses *.structure.xml
dim_label_map = {}
base_time_series = []
mm_info = dict()
zi_type = None
......@@ -121,20 +131,26 @@ def extract_structure_info(datacube_structure_filepath: Path):
# </merkmale>
else:
# 'normal' dimension
if mm_info.get('art', '') == 'I':
if mm_info.get('art') == 'I':
if not mm_info['code'] in code_set:
base_time_series.append((mm_info['code'], mm_info['inhalt'],
mm_info['masseinheit']))
code_set.add(mm_info['code'])
# dimension label
elif mm_info.get('art') == 'A':
dim_code = mm_info.get('code')
dim_label = mm_info.get('inhalt')
dim_label_map[dim_code] = dim_label
# Time dimension
elif mm_info.get('typ', '') == 'ZI':
if mm_info.get('typ') == 'ZI':
zi_type = mm_info['code']
# When QUARTG dimension is present, it contains quarter information
# Even if zi information is JAHR (annually),
# frequency has to be considered as quarterly
elif mm_info.get('typ', '') == 'ZK' and mm_info.get('code', '') == 'QUARTG':
if mm_info.get('typ') == 'ZK' and mm_info.get('code') == 'QUARTG':
has_quartg = True
# populates mm_info with <merkmale> sub tags content
......@@ -155,7 +171,8 @@ def extract_structure_info(datacube_structure_filepath: Path):
return dict(
base_time_series=base_time_series,
zi_type=zi_type,
zi_list=sorted(zi_list)
zi_list=sorted(zi_list),
dimensions_english_labels=dim_label_map,
)
......@@ -176,9 +193,6 @@ def extract_dzi_data_content(csv_data, zi_values, base_time_series_nb):
zi_col = None
offset, sio = 0, io.StringIO(csv_data)
# import ipdb
# ipdb.set_trace()
for line in sio:
cols = line.strip().split(';')
......@@ -257,16 +271,14 @@ def norm_zz_period_value(sdmx_val, zi_code):
return None # never called
def compute_data_frame(csv_data_content, zi_type, zi_col, base_time_series):
def compute_data_frame(csv_data_content, zi_type, zi_col, bts_nb):
"""Computes a simple pandas datafrom from given info"""
# base_time_series_nb = len(base_time_series)
def gen_apply_func(df, zi_type, zi_col, base_time_series):
def gen_apply_func(df, zi_type, zi_col, bts_nb):
"""Generate an optimized apply function"""
# Prégénérate observation column ids
obs_value_col_ids = [zi_col+1+i*4 for i in range(len(base_time_series))]
obs_value_col_ids = [zi_col+1+i*4 for i in range(bts_nb)]
# Extract first row
row = next(df.iterrows())[1].tolist()
......@@ -295,12 +307,12 @@ def compute_data_frame(csv_data_content, zi_type, zi_col, base_time_series):
return apply_func
df = pd.read_table(io.StringIO(csv_data_content), sep=';', header=None)
df = pd.read_table(io.StringIO(csv_data_content), sep=';', header=None, dtype=str)
# Computes prefix and observation values, normalize period values
apply_func = gen_apply_func(df, zi_type, zi_col, base_time_series)
apply_func = gen_apply_func(df, zi_type, zi_col, bts_nb)
df = df.apply(apply_func, axis=1, result_type='expand')
df.columns = ['prefix', 'period', *list(range(len(base_time_series)))]
df.columns = ['prefix', 'period', *list(range(bts_nb))]
return df
......@@ -346,11 +358,6 @@ def compute_timeseries_id(prefix_str, code):
return '{}.{}'.format(prefix_str, code)
def compute_timeseries_label(prefix_str, bts_label, att_label_map):
def compute_timeseries_label(prefix_labels, bts_label):
"""Computes time series label from its dimensions"""
if prefix_str == '':
return bts_label
codes = prefix_str.split('.')
label = ''.join(['{} - '.format(att_label_map.get(code, code)) for code in codes])
return label + bts_label
return ' - '.join(prefix_labels + bts_label)
dulwich==0.19.8
dulwich==0.19.13
humanize==0.5.1
lxml==4.2.5
numpy==1.15.4
pandas==0.23.4
requests==2.20.0
lxml==4.4.1
numpy==1.17.2
pandas==0.25.1
requests==2.22.0
ujson==1.35
pytest==5.2.1
\ No newline at end of file
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<DatenAufbauResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<DatenAufbauReturn>
<aufbauInformation>
<merkmale xmlns:ns1="daten.webservice_2010.genesis" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" soapenc:arrayType="ns1:AufbauElement[8]" xsi:type="soapenc:Array">
<merkmale>
<art>A</art>
<auspraegungen/>
<code>SMONAT</code>
<fachschluesselausgabe>false</fachschluesselausgabe>
<inhalt>Reference month</inhalt>
<masseinheit/>
<regelausgabe>false</regelausgabe>
<typ>ZI</typ>
</merkmale>
<merkmale>
<art>A</art>
<auspraegungen/>
<code>DINSGF</code>
<fachschluesselausgabe>false</fachschluesselausgabe>
<inhalt>Former territory of the Fed. Republic / New L&#228;nder</inhalt>
<masseinheit/>
<regelausgabe>false</regelausgabe>
<typ>RK</typ>
</merkmale>
<merkmale>
<art>A</art>
<auspraegungen/>
<code>GES</code>
<fachschluesselausgabe>false</fachschluesselausgabe>
<inhalt>Sex</inhalt>
<masseinheit/>
<regelausgabe>false</regelausgabe>
<typ>SK</typ>
</merkmale>
<merkmale>
<art>I</art>
<auspraegungen/>
<code>VST010</code>
<fachschluesselausgabe>false</fachschluesselausgabe>
<inhalt>Gross monthly earnings of wage earners</inhalt>
<masseinheit>EUR</masseinheit>
<regelausgabe>false</regelausgabe>
<typ>W</typ>
</merkmale>
<merkmale>
<art>I</art>
<auspraegungen/>
<code>VST009</code>
<fachschluesselausgabe>false</fachschluesselausgabe>
<inhalt>Gross monthly earnings of salary earners</inhalt>
<masseinheit>EUR</masseinheit>
<regelausgabe>false</regelausgabe>
<typ>W</typ>
</merkmale>
<merkmale>
<art>I</art>
<auspraegungen/>
<code>ERW016</code>
<fachschluesselausgabe>false</fachschluesselausgabe>
<inhalt>Wage earners</inhalt>
<masseinheit>Anzahl</masseinheit>
<regelausgabe>false</regelausgabe>
<typ>W</typ>
</merkmale>
<merkmale>
<art>I</art>
<auspraegungen/>
<code>ERW017</code>
<fachschluesselausgabe>false</fachschluesselausgabe>
<inhalt>Salary earners</inhalt>
<masseinheit>Anzahl</masseinheit>
<regelausgabe>false</regelausgabe>
<typ>W</typ>
</merkmale>
<merkmale>
<art>A</art>
<auspraegungen/>
<code>AUSB7</code>
<fachschluesselausgabe>false</fachschluesselausgabe>
<inhalt>Type of education or training</inhalt>
<masseinheit/>
<regelausgabe>false</regelausgabe>
<typ>SK</typ>
</merkmale>
</merkmale>
<name xsi:nil="true"/>
<zeitposition>0</zeitposition>
<zeitraum>2001-10 to 2005-10</zeitraum>
<ziZeiten xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" soapenc:arrayType="xsd:string[2]" xsi:type="soapenc:Array">
<ziZeiten>2001-10</ziZeiten>
<ziZeiten>2005-10</ziZeiten>
</ziZeiten>
</aufbauInformation>
<name>62111BJ001</name>
<returnInfo>
<code>0</code>
<inhalt>successfull</inhalt>
<typ>Information</typ>
</returnInfo>
<statistikBezeichnung>Salary and wage structure in industry and services</statistikBezeichnung>
<statistikName>62111</statistikName>
</DatenAufbauReturn>
</DatenAufbauResponse>
</soapenv:Body>
</soapenv:Envelope>
This diff is collapsed.
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<DatenAufbauResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<DatenAufbauReturn>
<aufbauInformation>
<merkmale xmlns:ns1="daten.webservice_2010.genesis" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" soapenc:arrayType="ns1:AufbauElement[14]" xsi:type="soapenc:Array">
<merkmale>
<art>A</art>
<auspraegungen/>
<code>DINSG</code>
<fachschluesselausgabe>false</fachschluesselausgabe>
<inhalt>Germany</inhalt>
<masseinheit/>
<regelausgabe>false</regelausgabe>
<typ>RKG</typ>
</merkmale>
<merkmale>
<art>A</art>
<auspraegungen/>
<code>JAHR</code>
<fachschluesselausgabe>false</fachschluesselausgabe>
<inhalt>Year</inhalt>
<masseinheit/>
<regelausgabe>false</regelausgabe>
<typ>ZI</typ>
</merkmale>
<merkmale>
<art>I</art>
<auspraegungen/>
<code>VGR014</code>
<fachschluesselausgabe>false</fachschluesselausgabe>
<inhalt>Gross domestic product</inhalt>
<masseinheit>Mrd. EUR</masseinheit>
<regelausgabe>false</regelausgabe>
<typ>W</typ>
</merkmale>
<merkmale>
<art>I</art>
<auspraegungen/>
<code>EKM004</code>
<fachschluesselausgabe>false</fachschluesselausgabe>
<inhalt>Primary income to the rest of the world</inhalt>
<masseinheit>Mrd. EUR</masseinheit>
<regelausgabe>false</regelausgabe>
<typ>W</typ>
</merkmale>
<merkmale>
<art>I</art>
<auspraegungen/>
<code>EKM005</code>
<fachschluesselausgabe>false</fachschluesselausgabe>
<inhalt>Primary income from the rest of the world</inhalt>
<masseinheit>Mrd. EUR</masseinheit>
<regelausgabe>false</regelausgabe>
<typ>W</typ>
</merkmale>
<merkmale>
<art>I</art>
<auspraegungen/>
<code>VGR030</code>
<fachschluesselausgabe>false</fachschluesselausgabe>
<inhalt>Net lending / net borrowing</inhalt>
<masseinheit>Mrd. EUR</masseinheit>
<regelausgabe>false</regelausgabe>
<typ>W</typ>
</merkmale>
<merkmale>
<art>I</art>
<auspraegungen/>
<code>VGR036</code>
<fachschluesselausgabe>false</fachschluesselausgabe>
<inhalt>Saving of the national economy</inhalt>
<masseinheit>Mrd. EUR</masseinheit>
<regelausgabe>false</regelausgabe>
<typ>W</typ>
</merkmale>
<merkmale>
<art>I</art>
<auspraegungen/>
<code>EKM007</code>
<fachschluesselausgabe>false</fachschluesselausgabe>
<inhalt>National disposable income</inhalt>
<masseinheit>Mrd. EUR</masseinheit>
<regelausgabe>false</regelausgabe>
<typ>W</typ>
</merkmale>
<merkmale>
<art>I</art>
<auspraegungen/>
<code>NNE001</code>
<fachschluesselausgabe>false</fachschluesselausgabe>
<inhalt>Net national income</inhalt>
<masseinheit>Mrd. EUR</masseinheit>
<regelausgabe>false</regelausgabe>
<typ>W</typ>
</merkmale>
<merkmale>
<art>I</art>
<auspraegungen/>
<code>ABS002</code>
<fachschluesselausgabe>false</fachschluesselausgabe>
<inhalt>Consumption of fixed capital</inhalt>
<masseinheit>Mrd. EUR</masseinheit>
<regelausgabe>false</regelausgabe>
<typ>W</typ>
</merkmale>
<merkmale>
<art>I</art>
<auspraegungen/>
<code>BNE001</code>
<fachschluesselausgabe>false</fachschluesselausgabe>
<inhalt>Gross national income</inhalt>
<masseinheit>Mrd. EUR</masseinheit>
<regelausgabe>false</regelausgabe>
<typ>W</typ>
</merkmale>
<merkmale>
<art>I</art>
<auspraegungen/>
<code>TRF003</code>
<fachschluesselausgabe>false</fachschluesselausgabe>
<inhalt>Current transfers to the rest of the world</inhalt>
<masseinheit>Mrd. EUR</masseinheit>
<regelausgabe>false</regelausgabe>
<typ>W</typ>
</merkmale>
<merkmale>
<art>I</art>
<auspraegungen/>
<code>TRF004</code>
<fachschluesselausgabe>false</fachschluesselausgabe>
<inhalt>Current transfers from the rest of the world</inhalt>
<masseinheit>Mrd. EUR</masseinheit>
<regelausgabe>false</regelausgabe>
<typ>W</typ>
</merkmale>
<merkmale>
<art>I</art>
<auspraegungen/>
<code>ABG002</code>
<fachschluesselausgabe>false</fachschluesselausgabe>
<inhalt>Taxes on production and imports less subsidies</inhalt>
<masseinheit>Mrd. EUR</masseinheit>
<regelausgabe>false</regelausgabe>
<typ>W</typ>
</merkmale>
</merkmale>
<name xsi:nil="true"/>
<zeitposition>0</zeitposition>
<zeitraum>1991 to 2018</zeitraum>
<ziZeiten xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" soapenc:arrayType="xsd:string[2]" xsi:type="soapenc:Array">
<ziZeiten>1991</ziZeiten>
<ziZeiten>2018</ziZeiten>
</ziZeiten>
</aufbauInformation>
<name>81000BJ004</name>
<returnInfo>
<code>0</code>
<inhalt>successfull</inhalt>
<typ>Information</typ>
</returnInfo>
<statistikBezeichnung>National accounts of the Federation</statistikBezeichnung>
<statistikName>81000</statistikName>
</DatenAufbauReturn>
</DatenAufbauResponse>
</soapenv:Body>
</soapenv:Envelope>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<DatenExportResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<DatenExportReturn>
<quader xmlns:ns1="daten.methods.webservice.genesis" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" soapenc:arrayType="ns1:Quader[1]" xsi:type="soapenc:Array">
<quader>
<format>csv</format>
<name>81000BJ004</name>
<quaderDaten>* Der Benutzer GPLA6VMEU8 der Benutzergruppe GP1152 hat am 14.09.2019 um 03:28:30 diesen Export angestossen.
K;ERH;FACH-SCHL;KTX
D;81000;Volkswirtschaftliche Gesamtrechnungen des Bundes
K;ERH-D;GUELT-AB;PZT
D;01.01.1950;VIERTELJAEHRLICH
K;ME;ME-NAME;KTX;TYP;GRUND-ME;UMR-ME
D;Mrd. EUR;Milliarden Euro;Geldwert;EUR;EUR
K;MM;NAME;KTX;MM-TYP;BESTAND;GLIED-TYP;STD-SORT;DST;SUMMIERBAR
D;ABG002;Produktions- und Importabgaben abzgl. Subventionen;W-MM;N;;;;J
D;ABS002;Abschreibungen;W-MM;N;;;;J
D;BNE001;Bruttonationaleinkommen;W-MM;N;;;;J
D;DINSG;Deutschland insgesamt;K-REG-MM-GES;N;DAVON;FS;;N
D;EKM004;Prim&#228;reinkommen an die &#252;brige Welt;W-MM;N;;;;J
D;EKM005;Prim&#228;reinkommen aus der &#252;brigen Welt;W-MM;N;;;;J
D;EKM007;Verf&#252;gbares Einkommen der Volkswirtschaft;W-MM;N;;;;J
D;JAHR;Jahr;ZI-MM;N;;;KJAHR;N
D;NNE001;Nettonationaleinkommen;W-MM;N;;;;J
D;TRF003;Laufende Transfers an die &#252;brige Welt;W-MM;N;;;;J
D;TRF004;Laufende Transfers aus der &#252;brigen Welt;W-MM;N;;;;J
D;VGR014;Bruttoinlandsprodukt;W-MM;N;;;;J
D;VGR030;Finanzierungssaldo;W-MM;N;;;;J
D;VGR036;Sparen der Volkswirtschaft;W-MM;N;;;;J
K;KMA;FACH-SCHL;KTX
D;DG;Deutschland
K;KMAZ;FACH-SCHL;NAME
D;DG;DINSG
K;DQ;FACH-SCHL;GHH-ART;GHM-WERTE-JN;GENESIS-VBD;REGIOSTAT;EU-VBD;"mit Werten"
D;81000BJ004;;N;J;N;N
K;DQ-ERH;FACH-SCHL
D;81000
K;DQA;NAME;RHF-BSR;RHF-ACHSE
D;DINSG;1;1
K;DQZ;NAME;ZI-RHF-BSR;ZI-RHF-ACHSE
D;JAHR;2;2
K;DQI;NAME;ME-NAME;DST;TYP;NKM-STELLEN
D;ABG002;Mrd. EUR;FEST;FALL;3
D;TRF004;Mrd. EUR;FEST;FALL;3
D;TRF003;Mrd. EUR;FEST;FALL;3
D;BNE001;Mrd. EUR;FEST;FALL;3
D;ABS002;Mrd. EUR;FEST;FALL;3
D;NNE001;Mrd. EUR;FEST;FALL;3
D;EKM007;Mrd. EUR;FEST;FALL;3
D;VGR036;Mrd. EUR;FEST;FALL;3
D;VGR030;Mrd. EUR;FEST;FALL;3
D;EKM005;Mrd. EUR;FEST;FALL;3
D;EKM004;Mrd. EUR;FEST;FALL;3
D;VGR014;Mrd. EUR;FEST;FALL;3
K;QEI;FACH-SCHL;ZI-WERT;WERT;QUALITAET;GESPERRT;WERT-VERFAELSCHT
D;DG;1991;123.581;e;;0.000;13.603;e;;0.000;44.389;e;;0.000;1601.392;e;;0.000;245.896;e;;0.000;1355.496;e;;0.000;1324.710;e;;0.000;139.876;e;;0.000;-26.638;e;;0.000;70.792;e;;0.000;55.200;e;;0.000;1585.800;e;;0.000
D;DG;1992;137.334;e;;0.000;15.699;e;;0.000;41.993;e;;0.000;1717.115;e;;0.000;267.554;e;;0.000;1449.561;e;;0.000;1423.267;e;;0.000;142.613;e;;0.000;-21.738;e;;0.000;71.925;e;;0.000;56.870;e;;0.000;1702.060;e;;0.000
D;DG;1993;148.669;e;;0.000;17.862;e;;0.000;46.150;e;;0.000;1762.243;e;;0.000;285.632;e;;0.000;1476.611;e;;0.000;1448.323;e;;0.000;117.448;e;;0.000;-17.907;e;;0.000;72.829;e;;0.000;61.476;e;;0.000;1750.890;e;;0.000
D;DG;1994;159.461;e;;0.000;18.382;e;;0.000;49.196;e;;0.000;1830.687;e;;0.000;297.763;e;;0.000;1532.924;e;;0.000;1502.110;e;;0.000;120.690;e;;0.000;-28.787;e;;0.000;66.901;e;;0.000;65.764;e;;0.000;1829.550;e;;0.000
D;DG;1995;159.028;e;;0.000;19.335;e;;0.000;47.596;e;;0.000;1892.016;e;;0.000;309.289;e;;0.000;1582.727;e;;0.000;1554.466;e;;0.000;128.461;e;;0.000;-25.990;e;;0.000;68.444;e;;0.000;71.038;e;;0.000;1894.610;e;;0.000
D;DG;1996;161.061;e;;0.000;20.724;e;;0.000;47.612;e;;0.000;1921.656;e;;0.000;317.119;e;;0.000;1604.537;e;;0.000;1577.649;e;;0.000;116.953;e;;0.000;-15.887;e;;0.000;71.868;e;;0.000;71.592;e;;0.000;1921.380;e;;0.000
D;DG;1997;166.789;e;;0.000;22.627;e;;0.000;50.127;e;;0.000;1957.405;e;;0.000;325.262;e;;0.000;1632.143;e;;0.000;1604.643;e;;0.000;123.061;e;;0.000;-11.181;e;;0.000;80.103;e;;0.000;83.848;e;;0.000;1961.150;e;;0.000
D;DG;1998;173.010;e;;0.000;23.037;e;;0.000;50.733;e;;0.000;2002.895;e;;0.000;333.131;e;;0.000;1669.764;e;;0.000;1642.068;e;;0.000;136.275;e;;0.000;-15.541;e;;0.000;82.322;e;;0.000;93.847;e;;0.000;2014.420;e;;0.000
D;DG;1999;188.215;e;;0.000;30.167;e;;0.000;56.083;e;;0.000;2045.234;e;;0.000;341.665;e;;0.000;1703.569;e;;0.000;1677.653;e;;0.000;123.900;e;;0.000;-30.324;e;;0.000;92.809;e;;0.000;107.055;e;;0.000;2059.480;e;;0.000
D;DG;2000;193.795;e;;0.000;32.299;e;;0.000;61.129;e;;0.000;2097.226;e;;0.000;356.193;e;;0.000;1741.033;e;;0.000;1712.203;e;;0.000;123.135;e;;0.000;-41.043;e;;0.000;121.900;e;;0.000;133.764;e;;0.000;2109.090;e;;0.000
D;DG;2001;199.070;e;;0.000;41.765;e;;0.000;69.096;e;;0.000;2157.280;e;;0.000;367.707;e;;0.000;1789.573;e;;0.000;1762.242;e;;0.000;123.865;e;;0.000;-11.100;e;;0.000;107.535;e;;0.000;122.795;e;;0.000;2172.540;e;;0.000
D;DG;2002;202.301;e;;0.000;41.874;e;;0.000;69.773;e;;0.000;2174.801;e;;0.000;375.690;e;;0.000;1799.111;e;;0.000;1771.212;e;;0.000;123.208;e;;0.000;37.057;e;;0.000;108.797;e;;0.000;132.116;e;;0.000;2198.120;e;;0.000
D;DG;2003;209.342;e;;0.000;51.191;e;;0.000;80.618;e;;0.000;2189.106;e;;0.000;379.680;e;;0.000;1809.426;e;;0.000;1779.999;e;;0.000;103.870;e;;0.000;36.831;e;;0.000;111.749;e;;0.000;134.213;e;;0.000;2211.570;e;;0.000
D;DG;2004;208.673;e;;0.000;39.463;e;;0.000;67.893;e;;0.000;2276.187;e;;0.000;386.692;e;;0.000;1889.495;e;;0.000;1861.065;e;;0.000;165.071;e;;0.000;101.724;e;;0.000;142.289;e;;0.000;128.622;e;;0.000;2262.520;e;;0.000
D;DG;2005;212.236;e;;0.000;42.843;e;;0.000;73.061;e;;0.000;2307.203;e;;0.000;393.134;e;;0.000;1914.069;e;;0.000;1883.851;e;;0.000;160.423;e;;0.000;105.283;e;;0.000;167.380;e;;0.000;148.487;e;;0.000;2288.310;e;;0.000
D;DG;2006;221.110;e;;0.000;40.256;e;;0.000;69.803;e;;0.000;2425.419;e;;0.000;402.998;e;;0.000;2022.421;e;;0.000;1992.874;e;;0.000;227.600;e;;0.000;138.297;e;;0.000;208.837;e;;0.000;168.498;e;;0.000;2385.080;e;;0.000
D;DG;2007;245.422;e;;0.000;42.879;e;;0.000;74.685;e;;0.000;2535.845;e;;0.000;423.272;e;;0.000;2112.573;e;;0.000;2080.767;e;;0.000;284.866;e;;0.000;171.900;e;;0.000;246.418;e;;0.000;210.123;e;;0.000;2499.550;e;;0.000
D;DG;2008;250.256;e;;0.000;44.294;e;;0.000;79.186;e;;0.000;2570.665;e;;0.000;440.932;e;;0.000;2129.733;e;;0.000;2094.841;e;;0.000;249.139;e;;0.000;140.936;e;;0.000;198.253;e;;0.000;174.078;e;;0.000;2546.490;e;;0.000
D;DG;2009;243.557;e;;0.000;42.188;e;;0.000;74.200;e;;0.000;2500.874;e;;0.000;451.997;e;;0.000;2048.877;e;;0.000;2016.865;e;;0.000;147.534;e;;0.000;142.986;e;;0.000;183.869;e;;0.000;128.725;e;;0.000;2445.730;e;;0.000
D;DG;2010;248.724;e;;0.000;44.521;e;;0.000;80.381;e;;0.000;2615.840;e;;0.000;462.023;e;;0.000;2153.817;e;;0.000;2117.957;e;;0.000;203.071;e;;0.000;149.850;e;;0.000;200.710;e;;0.000;149.270;e;;0.000;2564.400;e;;0.000
D;DG;2011;268.317;e;;0.000;51.847;e;;0.000;84.462;e;;0.000;2762.535;e;;0.000;478.139;e;;0.000;2284.396;e;;0.000;2251.781;e;;0.000;273.183;e;;0.000;162.750;e;;0.000;220.126;e;;0.000;151.151;e;;0.000;2693.560;e;;0.000
D;DG;2012;276.097;e;;0.000;54.298;e;;0.000;89.631;e;;0.000;2811.180;e;;0.000;495.324;e;;0.000;2315.856;e;;0.000;2280.523;e;;0.000;243.947;e;;0.000;194.741;e;;0.000;204.612;e;;0.000;138.742;e;;0.000;2745.310;e;;0.000
D;DG;2013;279.833;e;;0.000;60.633;e;;0.000;102.832;e;;0.000;2876.449;e;;0.000;509.842;e;;0.000;2366.607;e;;0.000;2324.408;e;;0.000;238.730;e;;0.000;181.743;e;;0.000;191.344;e;;0.000;126.245;e;;0.000;2811.350;e;;0.000
D;DG;2014;287.932;e;;0.000;63.213;e;;0.000;99.399;e;;0.000;2986.082;e;;0.000;524.850;e;;0.000;2461.232;e;;0.000;2425.046;e;;0.000;287.692;e;;0.000;214.683;e;;0.000;190.525;e;;0.000;131.873;e;;0.000;2927.430;e;;0.000
D;DG;2015;298.474;p;;0.000;71.354;p;;0.000;108.252;p;;0.000;3099.023;p;;0.000;541.174;p;;0.000;2557.849;p;;0.000;2520.951;p;;0.000;326.013;p;;0.000;258.675;p;;0.000;201.899;p;;0.000;132.946;p;;0.000;3030.070;p;;0.000
D;DG;2016;307.861;p;;0.000;66.392;p;;0.000;103.265;p;;0.000;3211.263;p;;0.000;557.284;p;;0.000;2653.979;p;;0.000;2617.106;p;;0.000;347.295;p;;0.000;268.041;p;;0.000;211.627;p;;0.000;134.464;p;;0.000;3134.100;p;;0.000
D;DG;2017;317.135;p;;0.000;67.584;p;;0.000;113.181;p;;0.000;3328.026;p;;0.000;580.360;p;;0.000;2747.666;p;;0.000;2702.069;p;;0.000;360.763;p;;0.000;260.665;p;;0.000;211.552;p;;0.000;128.516;p;;0.000;3244.990;p;;0.000
D;DG;2018;326.098;p;;0.000;68.735;p;;0.000;112.507;p;;0.000;3437.908;p;;0.000;608.731;p;;0.000;2829.177;p;;0.000;2785.405;p;;0.000;376.123;p;;0.000;252.426;p;;0.000;216.645;p;;0.000;123.107;p;;0.000;3344.370;p;;0.000
</quaderDaten>
<returnInfo>
<code>0</code>
<inhalt/>
<typ/>
</returnInfo>
<stand>2019-08-26 11:48:07</stand>
<status>Aktualisierte Daten</status>
</quader>
</quader>
<quaderAuswahl>
<bereich>Alle</bereich>
<namen>81000BJ004</namen>
</quaderAuswahl>
<quaderOptionen>
<endjahr/>
<format>csv</format>
<inhalte/>
<metadaten>false</metadaten>
<regionalMerkmal/>
<regionalSchluessel/>
<sachMerkmal/>
<sachMerkmal2/>
<sachMerkmal3/>
<sachSchluessel/>
<sachSchluessel2/>
<sachSchluessel3/>
<sprache>en</sprache>
<stand/>
<startjahr/>
<werte>true</werte>
<zeitscheiben>0</zeitscheiben>
<zusatz>true</zusatz>
</quaderOptionen>
<returnInfo>
<code>0</code>
<inhalt>successfull</inhalt>
<typ>Information</typ>
</returnInfo>
</DatenExportReturn>
</DatenExportResponse>
</soapenv:Body>
</soapenv:Envelope>
#!/usr/bin/env python3
from pathlib import Path
import pytest
import convert as conv
import destatis_util as du
FIXTURE_DIR = Path(__file__).parent / 'fixtures'
def get_csv_data(dataset_code):
csv_data, _ = du.get_csv_data_and_timestamp(FIXTURE_DIR / '{}.xml'.format(dataset_code))
return csv_data
def get_structure_filepath(dataset_code):
return FIXTURE_DIR / '{}.structure.xml'.format(dataset_code)
def test_build_dimension_info_1():
dim_info = conv.extract_dimensions_info(get_csv_data('62111BJ001'))
assert 'AUSB7' in dim_info['dimensions_labels']
assert 'GES' in dim_info['dimensions_labels']
assert 'DINSGF' in dim_info['dimensions_labels']
assert len(dim_info['dimensions_labels']) == 3
assert 'GESW' in dim_info['dimensions_values_to_dimensions']
assert dim_info['dimensions_values_to_dimensions']['GESW'] == 'GES'
def test_build_dimension_info_2():
dim_info = conv.extract_dimensions_info(get_csv_data('81000BJ004'))
assert len(dim_info['dimensions_labels']) == 1
assert 'DINSG' in dim_info['dimensions_labels']
assert 'DINSG' in dim_info['dimensions_values_labels']
assert 'DG' in dim_info['dimensions_values_labels']['DINSG']
assert dim_info['dimensions_values_labels']['DINSG']['DG'] == 'Deutschland'
def assert_same_dicts(d1, d2):
"""Simply assert that 2 dictionaries have same content"""
assert len(d1) == len(d2)
for k, v in d1.items():
assert k in d2
assert d2[k] == v
def test_extract_structure_info_1():
structure_info = du.extract_structure_info(get_structure_filepath('62111BJ001'))
assert structure_info['base_time_series'] == [
('VST010', 'Gross monthly earnings of wage earners', 'EUR'),
('VST009', 'Gross monthly earnings of salary earners', 'EUR'),
('ERW016', 'Wage earners', 'Anzahl'),
('ERW017', 'Salary earners', 'Anzahl'),
]
assert structure_info['zi_list'] == ['2001-10', '2005-10']
assert structure_info['zi_type'] == 'SMONAT'
assert_same_dicts(structure_info['dimensions_english_labels'], {
'AUSB7': 'Type of education or training',
'SMONAT': 'Reference month',
'DINSGF': 'Former territory of the Fed. Republic / New Länder',
'GES': 'Sex',
})
def test_extract_structure_info_2():
structure_info = du.extract_structure_info(get_structure_filepath('81000BJ004'))
assert structure_info['base_time_series'] == [
('VGR014', 'Gross domestic product', 'Mrd. EUR'),
('EKM004', 'Primary income to the rest of the world', 'Mrd. EUR'),
('EKM005', 'Primary income from the rest of the world', 'Mrd. EUR'),
('VGR030', 'Net lending / net borrowing', 'Mrd. EUR'),
('VGR036', 'Saving of the national economy', 'Mrd. EUR'),
('EKM007', 'National disposable income', 'Mrd. EUR'),
('NNE001', 'Net national income', 'Mrd. EUR'),
('ABS002', 'Consumption of fixed capital', 'Mrd. EUR'),
('BNE001', 'Gross national income', 'Mrd. EUR'),
('TRF003', 'Current transfers to the rest of the world', 'Mrd. EUR'),
('TRF004', 'Current transfers from the rest of the world', 'Mrd. EUR'),
('ABG002', 'Taxes on production and imports less subsidies', 'Mrd. EUR'),
]
assert structure_info['zi_list'] == ['1991', '2018']
assert structure_info['zi_type'] == 'JAHR'
assert_same_dicts(structure_info['dimensions_english_labels'], {
'DINSG': 'Germany',
'JAHR': 'Year',
})