From f64b17a223e00bc29740482dfe4c5bd7c24c8b72 Mon Sep 17 00:00:00 2001 From: Joaquin Ossa Date: Wed, 19 Jun 2024 11:52:28 +0200 Subject: [PATCH] Created currency exchange tables --- .../general/daily_currency_exchange_rates.sql | 11 ++ models/reporting/general/schema.yaml | 134 ++++++++++++++++++ .../general/simple_exchange_rates.sql | 8 ++ 3 files changed, 153 insertions(+) create mode 100644 models/reporting/general/daily_currency_exchange_rates.sql create mode 100644 models/reporting/general/simple_exchange_rates.sql diff --git a/models/reporting/general/daily_currency_exchange_rates.sql b/models/reporting/general/daily_currency_exchange_rates.sql new file mode 100644 index 0000000..ceff7d4 --- /dev/null +++ b/models/reporting/general/daily_currency_exchange_rates.sql @@ -0,0 +1,11 @@ +with daily_currency as (select * from {{ ref("int_daily_currency_exchange_rates") }}) +select + id_exchange_rate as id_exchange_rate, + from_currency as from_currency, + to_currency as to_currency, + rate as rate, + rate_date_utc as rate_date_utc, + source as source, + rate_version as rate_version, + updated_at_utc as updated_at_utc +from daily_currency diff --git a/models/reporting/general/schema.yaml b/models/reporting/general/schema.yaml index 8d7464a..68fab5c 100644 --- a/models/reporting/general/schema.yaml +++ b/models/reporting/general/schema.yaml @@ -164,3 +164,137 @@ models: - name: year_end_date data_type: date description: The full date for the last day of the year. + + - name: 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 sourced from xe.com data. The `guessed` and `forecast` + versions are built by simply 'pushing' the first/last exchange rate on + record. Basically, wherever we don't have data for a date, we pick the + closest actual data point that comes from xe.com. Bear in mind this means + that `forecast` version records will change on a daily basis as actual + data moves forwards, meaning you shouldn't assume your money amounts + converted in the future should always stay put. + + 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: + - accepted_values: + values: + - guess + - actual + - forecast + - not_null + - 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 + + - name: simple_exchange_rates + description: >- + A simplified vision of exchange rates, derived from + `int_daily_currency_exchange_rates`. Come here if you don't want to + understand nuances and complexities and just want to convert rates. + + The time granularity is daily. Each record holds a currency pair for a + specific day. You will only find one conversion rate per currency pair and + date. + tests: + - dbt_utils.unique_combination_of_columns: + combination_of_columns: + - from_currency + - to_currency + - rate_date_utc + columns: + - 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 source currency, represented as an ISO 4217 code. + tests: + - not_null + - name: rate + data_type: numeric + description: The target currency, represented as an ISO 4217 code. + tests: + - not_null + - name: rate_date_utc + data_type: date + description: The date in which the rate record is relevant. + tests: + - not_null + - 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 \ No newline at end of file diff --git a/models/reporting/general/simple_exchange_rates.sql b/models/reporting/general/simple_exchange_rates.sql new file mode 100644 index 0000000..1a56616 --- /dev/null +++ b/models/reporting/general/simple_exchange_rates.sql @@ -0,0 +1,8 @@ +with simple_exchange_rates as (select * from {{ ref("int_simple_exchange_rates") }}) +select + from_currency as from_currency, + to_currency as to_currency, + rate as rate, + rate_date_utc as rate_date_utc, + updated_at_utc as updated_at_utc +from simple_exchange_rates