def chg_diff(self, operation: str = "chg", period_op: str = "last"): """ Calculate pct change or difference. See Also -------- :func:`~econuy.transform.chg_diff` """ if isinstance(self.dataset, dict): output = {} for key, value in self.dataset.items(): table = transform.chg_diff(value, operation=operation, period_op=period_op) output.update({key: table}) else: output = transform.chg_diff(self.dataset, operation=operation, period_op=period_op) self.logger.info(f"Applied 'chg_diff' transformation with " f"'{operation}' operation and '{period_op}' period.") if self.inplace is True: self.dataset = output return self else: return Session(location=self.location, revise_rows=self.revise_rows, only_get=self.only_get, dataset=output, logger=self.logger, inplace=self.inplace)
def test_chg(): data_m = dummy_df(freq="M") session = Session(location=TEST_CON, dataset=data_m, inplace=True) trf_last = session.chg_diff(operation="chg", period_op="last").dataset trf_last.columns = data_m.columns assert trf_last.equals(data_m.pct_change(periods=1).multiply(100)) data_m = dummy_df(freq="M") session = Session(location=TEST_CON, dataset=data_m, inplace=True) trf_last = session.chg_diff(operation="chg", period_op="last").dataset trf_last.columns = data_m.columns assert trf_last.equals(data_m.pct_change(periods=1).multiply(100)) data_q1 = dummy_df(freq="Q-DEC") data_q2 = dummy_df(freq="Q-DEC") data_dict = {"data_q1": data_q1, "data_q2": data_q2} session = Session(location=TEST_CON, dataset=data_dict) trf_inter = session.chg_diff(operation="chg", period_op="inter").dataset trf_inter["data_q1"].columns = trf_inter[ "data_q2"].columns = data_q1.columns assert trf_inter["data_q1"].equals(data_q1.pct_change(periods=4). multiply(100)) assert trf_inter["data_q2"].equals(data_q2.pct_change(periods=4). multiply(100)) data_a = dummy_df(freq="A", ts_type="Flow") trf_annual = transform.chg_diff(data_a, operation="chg", period_op="last") trf_annual.columns = data_a.columns assert trf_annual.equals(data_a.pct_change(periods=1).multiply(100)) data_q_annual = dummy_df(freq="Q-DEC", ts_type="Flujo") trf_q_annual = transform.chg_diff(data_q_annual, operation="chg", period_op="annual") trf_q_annual.columns = data_q_annual.columns assert trf_q_annual.equals(data_q_annual. rolling(window=4, min_periods=4). sum(). pct_change(periods=4).multiply(100))
def test_diff(): data_m = dummy_df(freq="M") session = Session(location=TEST_CON, dataset=data_m) trf_last = session.chg_diff(operation="diff", period_op="last").dataset trf_last.columns = data_m.columns assert trf_last.equals(data_m.diff(periods=1)) data_q1 = dummy_df(freq="Q-DEC") data_q2 = dummy_df(freq="Q-DEC") data_dict = {"data_q1": data_q1, "data_q2": data_q2} session = Session(location=TEST_CON, dataset=data_dict, inplace=True) trf_inter = session.chg_diff(operation="diff", period_op="inter").dataset trf_inter["data_q1"].columns = trf_inter[ "data_q2"].columns = data_q1.columns assert trf_inter["data_q1"].equals(data_q1.diff(periods=4)) assert trf_inter["data_q2"].equals(data_q2.diff(periods=4)) data_a = dummy_df(freq="A", ts_type="Flow") trf_annual = transform.chg_diff(data_a, operation="diff", period_op="last") trf_annual.columns = data_a.columns assert trf_annual.equals(data_a.diff(periods=1)) data_q_annual = dummy_df(freq="Q-DEC", ts_type="Flujo") trf_q_annual = transform.chg_diff(data_q_annual, operation="diff", period_op="annual") trf_q_annual.columns = data_q_annual.columns assert trf_q_annual.equals(data_q_annual. rolling(window=4, min_periods=4). sum(). diff(periods=4)) data_q_annual = dummy_df(freq="Q-DEC", ts_type="Stock") trf_q_annual = transform.chg_diff(data_q_annual, operation="diff", period_op="annual") trf_q_annual.columns = data_q_annual.columns assert trf_q_annual.equals(data_q_annual.diff(periods=4)) with pytest.raises(ValueError): data_wrong = data_m.iloc[np.random.randint(0, 200, 100)] transform.chg_diff(data_wrong)
def store_transformed_data( real_start, real_end, resample_freq, resample_operation, rolling_periods, rolling_operation, chg_diff_operation, chg_diff_period, rebase_start, rebase_end, rebase_base, decompose_method, decompose_component, order, query_data, query_metadata, ): if not order: return query_data, query_metadata if not query_data: return {}, {} if ( ("resample" in order and (not resample_freq or not resample_operation)) or ("rolling" in order and (not rolling_periods or not rolling_operation)) or ("chg-diff" in order and (not chg_diff_operation or not chg_diff_period)) or ("rebase" in order and (not rebase_start or not rebase_base)) or ( "decompose" in order and (not decompose_method or not decompose_component) ) ): raise PreventUpdate data = pd.DataFrame.from_records(query_data, coerce_float=True, index="index") data.index = pd.to_datetime(data.index) metadata = pd.DataFrame.from_records(query_metadata) data.columns = pd.MultiIndex.from_frame(metadata) p = Pipeline(location=db.engine, download=False) transformations = { "usd": lambda x: convert_usd(x, pipeline=p, errors="ignore"), "real": lambda x: convert_real( x, start_date=real_start, end_date=real_end, pipeline=p, errors="ignore" ), "gdp": lambda x: convert_gdp(x, pipeline=p, errors="ignore"), "resample": lambda x: resample( x, rule=resample_freq, operation=resample_operation ), "rolling": lambda x: rolling( x, window=rolling_periods, operation=rolling_operation ), "chg-diff": lambda x: chg_diff( x, operation=chg_diff_operation, period=chg_diff_period ), "rebase": lambda x: rebase( x, start_date=rebase_start, end_date=rebase_end, base=rebase_base ), "decompose": lambda x: decompose( x, component=decompose_component, method=decompose_method, force_x13=True, errors="ignore", ), } transformed_data = data.copy() for t in order: transformed_data = transformations[t](transformed_data) transformed_metadata = transformed_data.columns.to_frame() transformed_data.columns = transformed_data.columns.get_level_values(0) transformed_data.reset_index(inplace=True) return transformed_data.to_dict("records"), transformed_metadata.to_dict( "records" )
{ "base": "balance_cg-bps", "transformations": [lambda x: transform.convert_gdp(x, pipeline=p)], }, "Public sector - Uruguay - Fiscal balance: public enterprises (% GDP) - Monthly": { "base": "balance_pe", "transformations": [lambda x: transform.convert_gdp(x, pipeline=p)], }, "Public sector - Uruguay - Tax revenue by source (real, YoY % chg) - Monthly": { "base": "tax_revenue", "transformations": [ lambda x: transform.convert_real(x, pipeline=p), lambda x: transform.chg_diff(x, period="inter"), ], }, "Public sector - Uruguay - General government debt: by contractual term, residual, currency and residence (% GDP) - Quarterly": { "base": "public_debt_gps", "transformations": [lambda x: transform.convert_gdp(x, pipeline=p)], }, "Public sector - Uruguay - Non-monetary government debt: by contractual term, residual, currency and residence (% GDP) - Quarterly": { "base": "public_debt_nfps", "transformations": [lambda x: transform.convert_gdp(x, pipeline=p)], }, "Public sector - Uruguay - Central bank debt: by contractual term, residual, currency and residence (% GDP) - Quarterly": { "base": "public_debt_cb",