From eaeb7cb936bceb42379416baebd2cde05966e189 Mon Sep 17 00:00:00 2001 From: Pablo Martin Date: Fri, 14 Jun 2024 15:48:24 +0200 Subject: [PATCH] schema and tests for new table --- models/intermediate/cross/schema.yml | 83 ++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 models/intermediate/cross/schema.yml diff --git a/models/intermediate/cross/schema.yml b/models/intermediate/cross/schema.yml new file mode 100644 index 0000000..114c984 --- /dev/null +++ b/models/intermediate/cross/schema.yml @@ -0,0 +1,83 @@ +models: + - name: int_daily_currency_exchange_rates + description: >- + This model holds a lot of data on currency exchange rates. The time + granularity is daily. Each record holds a currency pair for a specific + day, source and version. + + Actual rates are source from xe.com data. The `guessed` and `forecast` + versions are built by simply 'pushing' the first/last exchange rate on + record. Basically, wherever we dont' have data for a date, we pick the + closest actual data point that comes from xe.com. + + Note that, given the dimensionality, getting a simple time series for a + currency pair will require a bit of filtering. + + Reverse rates are explicit. This means that, for any given day and any + given currency pair, you will find two records with opposite from/to + positions. So, for 2024-01-01, you will find both a EUR->USD record and a + USD->EUR record with the opposite rate (1/rate). + columns: + - name: id_exchange_rate + data_type: text + description: A unique ID for the record, derived from concatenating the + currencies, date, source and version. Currency order is relevant + (EURUSD != USDEUR). + tests: + - not_null + - unique + - name: from_currency + data_type: character + description: The source currency, represented as an ISO 4217 code. + tests: + - not_null + - name: to_currency + data_type: character + description: The target currency, represented as an ISO 4217 code. + tests: + - not_null + - name: rate + data_type: numeric + description: >- + The exchange rate, represented as the units of the target currency + that one unit of source currency gets you. So, from_currency=USD to + to_currency=PLN with rate=4.2 should be read as '1 US Dollar buys me + 4.2 Polish Zlotys'. + + For same currency pairs (EUR to EUR, USD to USD, etc). The rate will + always be one. + + The rate can be smaller than one, but can't be negative. + tests: + - not_negative_or_zero + - not_null + - name: rate_date_utc + data_type: date + description: The date in which the rate record is relevant. + tests: + - not_null + - name: source + data_type: text + description: Where is the data coming from. Records that are composed from + making assumptions on real data will contain `_inferred`. + - name: rate_version + data_type: text + description: The version of the rate. This can be one of `actual` (the rate is a + reality fact), `forecast` (the rate sits in the future and is a guess + in nature) or `guess` (the rate sits in the past and is a guess in + nature). Note that one currency pair can have multiple rate versions + on the same date. + tests: + - not_null + - accepted_values: + values: + - guess + - actual + - forecast + - name: updated_at_utc + data_type: timestamp with time zone + description: For external sources, this will be the point in time when the + information was obtained from them. For stuff we make up here in the + DWH, this will be the point in time when we made the assumption. + tests: + - not_null