def test_flat(): # Create a bare Message msg = DataMessage() # Recreate the content from exr-flat.json header = Header( id="62b5f19d-f1c9-495d-8446-a3661ed24753", prepared="2012-11-29T08:40:26Z", sender=model.Agency(id="ECB"), ) msg.header = header ds = DataSet() # Create a Key and attributes key = Key( FREQ="D", CURRENCY="NZD", CURRENCY_DENOM="EUR", EXR_TYPE="SP00", EXR_SUFFIX="A", TIME_PERIOD="2013-01-18", ) obs_status = DataAttribute(id="OBS_STATUS") attr = {"OBS_STATUS": AttributeValue(value_for=obs_status, value="A")} ds.obs.append( Observation(dimension=key, value=1.5931, attached_attribute=attr)) key = key.copy(TIME_PERIOD="2013-01-21") ds.obs.append( Observation(dimension=key, value=1.5925, attached_attribute=attr)) key = key.copy(CURRENCY="RUB", TIME_PERIOD="2013-01-18") ds.obs.append( Observation(dimension=key, value=40.3426, attached_attribute=attr)) key = key.copy(TIME_PERIOD="2013-01-21") ds.obs.append( Observation(dimension=key, value=40.3000, attached_attribute=attr)) msg.data.append(ds) # Write to pd.Dataframe df1 = sdmx.to_pandas(msg) with specimen("flat.json") as f: ref = sdmx.read_sdmx(f) df2 = sdmx.to_pandas(ref) assert_pd_equal(df1, df2)
def test_key(): # Construct with a dict k1 = Key({"foo": 1, "bar": 2}) # Construct with kwargs k2 = Key(foo=1, bar=2) # Results are __eq__ each other assert k1 == k2 # Doing both is an error with raises(ValueError): Key({"foo": 1}, bar=2) # __len__ assert len(k1) == 2 # __contains__: symmetrical if keys are identical assert k1 in k2 assert k2 in k1 assert Key(foo=1) in k1 assert k1 not in Key(foo=1) # Set and get using item convenience k1["baz"] = 3 # bare value is converted to a KeyValue assert k1["foo"] == 1 # __str__ assert str(k1) == "(foo=1, bar=2, baz=3)" # copying: returns a new object equal to the old one k2 = k1.copy() assert id(k1) != id(k2) and k1 == k2 # copy with changes k2 = Key(foo=1, bar=2).copy(baz=3) assert id(k1) != id(k2) and k1 == k2 # __add__: Key with something else with raises(NotImplementedError): k1 + 4 # Two Keys k2 = Key(foo=1) + Key(bar=2) assert k2 == k1 # __radd__: adding a Key to None produces a Key assert None + k1 == k1 # anything else is an error with raises(NotImplementedError): 4 + k1 # get_values(): preserve ordering assert k1.get_values() == (1, 2, 3)
def test_add_obs(DataSetType): # Create a Key and Attributes key = Key(CURRENCY="NZD", CURRENCY_DENOM="EUR", TIME_PERIOD="2018-01-01") obs_status = DataAttribute(id="OBS_STATUS") attr = {"OBS_STATUS": AttributeValue(value_for=obs_status, value="A")} obs = [] for day, value in enumerate([5, 6, 7]): key = key.copy(TIME_PERIOD="2018-01-{:02d}".format(day)) obs.append( Observation(dimension=key, value=value, attached_attribute=attr)) ds = DataSetType() ds.add_obs(obs) # PandasDataSet does not store Observation objects internally, but should # emit them when the .obs property is accessed assert all(a == b for a, b in zip(ds.obs, obs))