--- title: Meta Tag Maintenance marimo-version: 0.24.0 --- Tag maintentance ================ Scope ----- As shown in the basics, a dataset gets a few mandatory technical attributes on creation. Additional descriptive metadata may be provided, that is the dataset and its series may be tagged. The tagging is a one time operation that neeed should not need to be repeated. That is, unless mistakes or omissions have been made, or new series are added to the set. For calculations that derive new data. Some functions will automaticly update the metadata. Others will require that to be handled by the user. ## Setup ```python {.marimo} from datetime import timedelta from ssb_timeseries.sample_data import create_df,date_ranges from ssb_timeseries.dates import ensure_datetime, date_utc ``` ```python {.marimo} import polars as pl from datetime import datetime ``` ```python {.marimo} from ssb_timeseries.types import SeriesType, Versioning, Temporality ``` ```python {.marimo} from ssb_timeseries.dataset import Dataset ``` Manually tagging set and series ------------------------------- ```python {.marimo} ``` ```python {.marimo} def some_simple_data_from_file_or_query( start='2020-01-01', end='2025-06-01', ): """create some sample data""" return create_df( ['p','q','r'], start_date=start, end_date=end, freq='D' ) pqr_df = some_simple_data_from_file_or_query() ``` ```python {.marimo} pqr = Dataset( name = 'PQR', data_type = SeriesType('NONE', 'AT'), data = pqr_df, ) ``` The technical metadata is added at creation time. ```python {.marimo} pqr.tags ```
{'name': 'PQR',
'repository': 'tutorials',
'series': {'p': {'dataset': 'PQR',
'name': 'p',
'repository': 'tutorials',
'temporality': 'AT',
'vare': 'kaffe',
'varegruppe': 'nødvendigheter',
'variabel': 'pris',
'versioning': 'NONE'},
'q': {'dataset': 'PQR',
'name': 'q',
'repository': 'tutorials',
'temporality': 'AT',
'vare': 'knekkebrød',
'varegruppe': 'nødvendigheter',
'variabel': 'pris',
'versioning': 'NONE'},
'r': {'dataset': 'PQR',
'name': 'r',
'repository': 'tutorials',
'temporality': 'AT',
'vare': 'brunost',
'varegruppe': 'nødvendigheter',
'variabel': 'pris',
'versioning': 'NONE'}},
'temporality': 'AT',
'varegruppe': 'nødvendigheter',
'variabel': 'pris',
'versioning': 'NONE'}
```python {.marimo}
pqr.tag_dataset(tags={'variabel': 'pris','varegruppe': 'nødvendigheter'})
pqr.tag_series('p',tags={'vare': 'kaffe'})
pqr.tag_series('q',tags={'vare': 'knekkebrød'})
pqr.tag_series('r',tags={'vare': 'brunost'})
pqr.tags
```
{'name': 'PQR',
'repository': 'tutorials',
'series': {'p': {'dataset': 'PQR',
'name': 'p',
'repository': 'tutorials',
'temporality': 'AT',
'vare': 'kaffe',
'varegruppe': 'nødvendigheter',
'variabel': 'pris',
'versioning': 'NONE'},
'q': {'dataset': 'PQR',
'name': 'q',
'repository': 'tutorials',
'temporality': 'AT',
'vare': 'knekkebrød',
'varegruppe': 'nødvendigheter',
'variabel': 'pris',
'versioning': 'NONE'},
'r': {'dataset': 'PQR',
'name': 'r',
'repository': 'tutorials',
'temporality': 'AT',
'vare': 'brunost',
'varegruppe': 'nødvendigheter',
'variabel': 'pris',
'versioning': 'NONE'}},
'temporality': 'AT',
'varegruppe': 'nødvendigheter',
'variabel': 'pris',
'versioning': 'NONE'}
Tags can be used immediately.
```python {.marimo}
pqr[{'vare': 'kaffe'}].data
```
| valid_at | p |
| --- | --- |
| 2020-01-01 | 90.0 |
| 2020-01-02 | 90.0 |
| 2020-01-03 | 110.0 |
| 2020-01-04 | 110.0 |
| 2020-01-05 | 100.0 |
| ... | ... |
| 2025-05-28 | 90.0 |
| 2025-05-29 | 90.0 |
| 2025-05-30 | 100.0 |
| 2025-05-31 | 110.0 |
| 2025-06-01 | 90.0 |
```python {.marimo}
pqr.save()
```
Autotagging
-----------
```python {.marimo}
interval_data = SeriesType('NONE', 'FROM_TO')
```
```python {.marimo}
def mock_interval_data_from_file_or_query(start, end):
a_to_z = [chr(i) for i in range(ord('a'), ord('z') + 1)]
variables = ['volume', 'price']
goods = ['coffe', 'tea', 'softdrinks', 'beer', 'wine']
return create_df(
a_to_z, variables, goods,
start_date=start,
end_date=end,
freq='M',
temporality='FROM_TO',
implementation='polars'
)
```
```python {.marimo}
bigger_data = mock_interval_data_from_file_or_query(start='2025-01-01', end='2025-06-01')
```
```python {.marimo}
bigger_data
```
| valid_from | valid_to | a_volume_coffe | a_volume_tea | a_volume_softdrinks | a_volume_beer | a_volume_wine | a_price_coffe | a_price_tea | a_price_softdrinks | a_price_beer | a_price_wine | b_volume_coffe | b_volume_tea | b_volume_softdrinks | b_volume_beer | b_volume_wine | b_price_coffe | b_price_tea | b_price_softdrinks | b_price_beer | b_price_wine | c_volume_coffe | c_volume_tea | c_volume_softdrinks | c_volume_beer | c_volume_wine | c_price_coffe | c_price_tea | c_price_softdrinks | c_price_beer | c_price_wine | d_volume_coffe | d_volume_tea | d_volume_softdrinks | d_volume_beer | d_volume_wine | … | w_volume_beer | w_volume_wine | w_price_coffe | w_price_tea | w_price_softdrinks | w_price_beer | w_price_wine | x_volume_coffe | x_volume_tea | x_volume_softdrinks | x_volume_beer | x_volume_wine | x_price_coffe | x_price_tea | x_price_softdrinks | x_price_beer | x_price_wine | y_volume_coffe | y_volume_tea | y_volume_softdrinks | y_volume_beer | y_volume_wine | y_price_coffe | y_price_tea | y_price_softdrinks | y_price_beer | y_price_wine | z_volume_coffe | z_volume_tea | z_volume_softdrinks | z_volume_beer | z_volume_wine | z_price_coffe | z_price_tea | z_price_softdrinks | z_price_beer | z_price_wine |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| datetime[μs] | datetime[μs] | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | … | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 |
| 2025-01-01 00:00:00 | 2025-02-01 00:00:00 | 100.0 | 100.0 | 110.0 | 100.0 | 110.0 | 110.0 | 100.0 | 90.0 | 90.0 | 100.0 | 90.0 | 110.0 | 90.0 | 90.0 | 90.0 | 110.0 | 100.0 | 90.0 | 100.0 | 100.0 | 120.0 | 100.0 | 110.0 | 80.0 | 100.0 | 110.0 | 110.0 | 100.0 | 100.0 | 100.0 | 90.0 | 90.0 | 110.0 | 90.0 | 100.0 | … | 100.0 | 110.0 | 90.0 | 100.0 | 110.0 | 90.0 | 100.0 | 100.0 | 80.0 | 110.0 | 100.0 | 80.0 | 120.0 | 110.0 | 100.0 | 100.0 | 110.0 | 100.0 | 80.0 | 120.0 | 110.0 | 100.0 | 80.0 | 90.0 | 100.0 | 90.0 | 100.0 | 100.0 | 90.0 | 110.0 | 90.0 | 90.0 | 100.0 | 80.0 | 100.0 | 90.0 | 110.0 |
| 2025-02-01 00:00:00 | 2025-03-01 00:00:00 | 100.0 | 90.0 | 80.0 | 120.0 | 100.0 | 80.0 | 110.0 | 100.0 | 90.0 | 100.0 | 110.0 | 100.0 | 100.0 | 100.0 | 100.0 | 110.0 | 110.0 | 110.0 | 100.0 | 100.0 | 120.0 | 70.0 | 110.0 | 80.0 | 90.0 | 120.0 | 90.0 | 100.0 | 110.0 | 70.0 | 110.0 | 90.0 | 90.0 | 100.0 | 100.0 | … | 100.0 | 100.0 | 90.0 | 100.0 | 110.0 | 120.0 | 90.0 | 110.0 | 110.0 | 110.0 | 100.0 | 100.0 | 110.0 | 90.0 | 100.0 | 90.0 | 110.0 | 110.0 | 100.0 | 90.0 | 100.0 | 110.0 | 100.0 | 100.0 | 100.0 | 80.0 | 100.0 | 110.0 | 110.0 | 100.0 | 100.0 | 100.0 | 110.0 | 110.0 | 90.0 | 80.0 | 110.0 |
| 2025-03-01 00:00:00 | 2025-04-01 00:00:00 | 100.0 | 100.0 | 100.0 | 80.0 | 90.0 | 90.0 | 100.0 | 90.0 | 110.0 | 100.0 | 110.0 | 80.0 | 100.0 | 100.0 | 110.0 | 110.0 | 90.0 | 100.0 | 90.0 | 100.0 | 100.0 | 100.0 | 100.0 | 110.0 | 90.0 | 90.0 | 100.0 | 100.0 | 100.0 | 80.0 | 130.0 | 110.0 | 80.0 | 100.0 | 110.0 | … | 100.0 | 100.0 | 100.0 | 110.0 | 80.0 | 90.0 | 120.0 | 80.0 | 90.0 | 100.0 | 100.0 | 110.0 | 70.0 | 90.0 | 120.0 | 90.0 | 90.0 | 110.0 | 110.0 | 110.0 | 100.0 | 90.0 | 70.0 | 100.0 | 100.0 | 100.0 | 90.0 | 110.0 | 90.0 | 90.0 | 110.0 | 100.0 | 100.0 | 110.0 | 100.0 | 100.0 | 110.0 |
| 2025-04-01 00:00:00 | 2025-05-01 00:00:00 | 100.0 | 100.0 | 80.0 | 100.0 | 100.0 | 100.0 | 100.0 | 80.0 | 110.0 | 100.0 | 110.0 | 110.0 | 100.0 | 100.0 | 100.0 | 80.0 | 120.0 | 90.0 | 90.0 | 100.0 | 80.0 | 90.0 | 110.0 | 110.0 | 90.0 | 100.0 | 90.0 | 110.0 | 100.0 | 90.0 | 90.0 | 110.0 | 90.0 | 120.0 | 110.0 | … | 120.0 | 130.0 | 100.0 | 80.0 | 90.0 | 110.0 | 90.0 | 100.0 | 100.0 | 110.0 | 110.0 | 110.0 | 100.0 | 90.0 | 100.0 | 110.0 | 100.0 | 90.0 | 100.0 | 100.0 | 90.0 | 90.0 | 100.0 | 120.0 | 90.0 | 90.0 | 100.0 | 100.0 | 100.0 | 90.0 | 90.0 | 110.0 | 90.0 | 100.0 | 100.0 | 110.0 | 90.0 |
| 2025-05-01 00:00:00 | 2025-06-01 00:00:00 | 100.0 | 90.0 | 110.0 | 100.0 | 90.0 | 100.0 | 80.0 | 110.0 | 110.0 | 100.0 | 120.0 | 100.0 | 100.0 | 80.0 | 80.0 | 90.0 | 110.0 | 90.0 | 90.0 | 110.0 | 100.0 | 110.0 | 100.0 | 100.0 | 110.0 | 120.0 | 110.0 | 110.0 | 110.0 | 100.0 | 100.0 | 90.0 | 100.0 | 110.0 | 110.0 | … | 100.0 | 110.0 | 100.0 | 100.0 | 100.0 | 90.0 | 100.0 | 100.0 | 100.0 | 100.0 | 90.0 | 90.0 | 90.0 | 100.0 | 90.0 | 100.0 | 90.0 | 100.0 | 90.0 | 90.0 | 90.0 | 110.0 | 100.0 | 100.0 | 100.0 | 110.0 | 90.0 | 120.0 | 100.0 | 110.0 | 100.0 | 90.0 | 120.0 | 90.0 | 100.0 | 120.0 | 90.0 |
| 2025-06-01 00:00:00 | 2025-07-01 00:00:00 | 90.0 | 110.0 | 90.0 | 100.0 | 100.0 | 100.0 | 110.0 | 110.0 | 100.0 | 90.0 | 90.0 | 110.0 | 90.0 | 110.0 | 70.0 | 100.0 | 110.0 | 110.0 | 80.0 | 110.0 | 120.0 | 90.0 | 110.0 | 90.0 | 100.0 | 120.0 | 80.0 | 90.0 | 80.0 | 90.0 | 100.0 | 110.0 | 100.0 | 110.0 | 100.0 | … | 100.0 | 100.0 | 110.0 | 120.0 | 90.0 | 90.0 | 110.0 | 110.0 | 100.0 | 90.0 | 90.0 | 100.0 | 100.0 | 100.0 | 90.0 | 90.0 | 80.0 | 100.0 | 110.0 | 120.0 | 90.0 | 110.0 | 90.0 | 90.0 | 110.0 | 90.0 | 110.0 | 90.0 | 100.0 | 90.0 | 110.0 | 90.0 | 90.0 | 100.0 | 110.0 | 80.0 | 110.0 |
```python {.marimo}
az = Dataset(
name = 'AZ Drinks',
data_type = interval_data,
data = bigger_data,
attributes=['store','variable','product'], # <-- this is the clever part
)
az.save()
```
```python {.marimo}
len(az.series)
```
260```python {.marimo} az_selection = az[{'product': 'tea', 'variable': 'price'}] az_selection.data ``` | valid_from | valid_to | a_price_tea | b_price_tea | c_price_tea | d_price_tea | e_price_tea | f_price_tea | g_price_tea | h_price_tea | i_price_tea | j_price_tea | k_price_tea | l_price_tea | m_price_tea | n_price_tea | o_price_tea | p_price_tea | q_price_tea | r_price_tea | s_price_tea | t_price_tea | u_price_tea | v_price_tea | w_price_tea | x_price_tea | y_price_tea | z_price_tea | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | | datetime[μs] | datetime[μs] | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | | 2025-01-01 00:00:00 | 2025-02-01 00:00:00 | 100.0 | 100.0 | 110.0 | 110.0 | 80.0 | 100.0 | 120.0 | 100.0 | 100.0 | 100.0 | 90.0 | 100.0 | 110.0 | 110.0 | 100.0 | 100.0 | 90.0 | 100.0 | 90.0 | 100.0 | 100.0 | 90.0 | 100.0 | 110.0 | 90.0 | 80.0 | | 2025-02-01 00:00:00 | 2025-03-01 00:00:00 | 110.0 | 110.0 | 90.0 | 110.0 | 110.0 | 100.0 | 130.0 | 90.0 | 110.0 | 100.0 | 90.0 | 80.0 | 100.0 | 110.0 | 120.0 | 90.0 | 110.0 | 100.0 | 100.0 | 80.0 | 90.0 | 120.0 | 100.0 | 90.0 | 100.0 | 110.0 | | 2025-03-01 00:00:00 | 2025-04-01 00:00:00 | 100.0 | 90.0 | 100.0 | 100.0 | 110.0 | 110.0 | 100.0 | 90.0 | 100.0 | 100.0 | 90.0 | 100.0 | 110.0 | 80.0 | 100.0 | 110.0 | 90.0 | 100.0 | 100.0 | 120.0 | 110.0 | 110.0 | 110.0 | 90.0 | 100.0 | 110.0 | | 2025-04-01 00:00:00 | 2025-05-01 00:00:00 | 100.0 | 120.0 | 90.0 | 100.0 | 100.0 | 120.0 | 110.0 | 100.0 | 100.0 | 120.0 | 120.0 | 110.0 | 90.0 | 100.0 | 110.0 | 90.0 | 100.0 | 90.0 | 80.0 | 90.0 | 110.0 | 100.0 | 80.0 | 90.0 | 120.0 | 100.0 | | 2025-05-01 00:00:00 | 2025-06-01 00:00:00 | 80.0 | 110.0 | 110.0 | 90.0 | 100.0 | 100.0 | 90.0 | 90.0 | 120.0 | 100.0 | 100.0 | 110.0 | 90.0 | 100.0 | 90.0 | 90.0 | 90.0 | 100.0 | 80.0 | 80.0 | 90.0 | 110.0 | 100.0 | 100.0 | 100.0 | 90.0 | | 2025-06-01 00:00:00 | 2025-07-01 00:00:00 | 110.0 | 110.0 | 80.0 | 90.0 | 100.0 | 100.0 | 100.0 | 90.0 | 90.0 | 90.0 | 110.0 | 110.0 | 110.0 | 80.0 | 100.0 | 100.0 | 110.0 | 110.0 | 110.0 | 100.0 | 90.0 | 90.0 | 120.0 | 100.0 | 90.0 | 100.0 | ```python {.marimo} len(az_selection.series) ```
26By supplying the `attributes` parameter, we utilised the fact that names were structured as underscore separated strings. This way, we managed to tag 26 * 2 * 5 attributes across 260 series. The autotagging is quite powerful. Additional parameters may be supplied to specify other separators, substitutions, or more complex patterns with regexes. Updating tags after calculations -------------------------------- ```python {.marimo} prices = Dataset('AZ Drinks')[{'variable':'price'}] volumes = Dataset('AZ Drinks')[{'variable':'volume'}] revenues = prices * volumes ``` The new `Dataset` instance `revenues` gets an autogenerated name. The series names are also inherited from the inputs to the calculation. ```python {.marimo} print(revenues.name) print(revenues.series) ```
(COPY of(AZ Drinks SELECTED by names (), pattern: , regex: tags: [{'variable': 'price'}]).multiply.COPY of(AZ Drinks SELECTED by names (), pattern: , regex: tags: [{'variable': 'volume'}]))
['a_price_beer', 'a_price_coffe', 'a_price_softdrinks', 'a_price_tea', 'a_price_wine', 'b_price_beer', 'b_price_coffe', 'b_price_softdrinks', 'b_price_tea', 'b_price_wine', 'c_price_beer', 'c_price_coffe', 'c_price_softdrinks', 'c_price_tea', 'c_price_wine', 'd_price_beer', 'd_price_coffe', 'd_price_softdrinks', 'd_price_tea', 'd_price_wine', 'e_price_beer', 'e_price_coffe', 'e_price_softdrinks', 'e_price_tea', 'e_price_wine', 'f_price_beer', 'f_price_coffe', 'f_price_softdrinks', 'f_price_tea', 'f_price_wine', 'g_price_beer', 'g_price_coffe', 'g_price_softdrinks', 'g_price_tea', 'g_price_wine', 'h_price_beer', 'h_price_coffe', 'h_price_softdrinks', 'h_price_tea', 'h_price_wine', 'i_price_beer', 'i_price_coffe', 'i_price_softdrinks', 'i_price_tea', 'i_price_wine', 'j_price_beer', 'j_price_coffe', 'j_price_softdrinks', 'j_price_tea', 'j_price_wine', 'k_price_beer', 'k_price_coffe', 'k_price_softdrinks', 'k_price_tea', 'k_price_wine', 'l_price_beer', 'l_price_coffe', 'l_price_softdrinks', 'l_price_tea', 'l_price_wine', 'm_price_beer', 'm_price_coffe', 'm_price_softdrinks', 'm_price_tea', 'm_price_wine', 'n_price_beer', 'n_price_coffe', 'n_price_softdrinks', 'n_price_tea', 'n_price_wine', 'o_price_beer', 'o_price_coffe', 'o_price_softdrinks', 'o_price_tea', 'o_price_wine', 'p_price_beer', 'p_price_coffe', 'p_price_softdrinks', 'p_price_tea', 'p_price_wine', 'q_price_beer', 'q_price_coffe', 'q_price_softdrinks', 'q_price_tea', 'q_price_wine', 'r_price_beer', 'r_price_coffe', 'r_price_softdrinks', 'r_price_tea', 'r_price_wine', 's_price_beer', 's_price_coffe', 's_price_softdrinks', 's_price_tea', 's_price_wine', 't_price_beer', 't_price_coffe', 't_price_softdrinks', 't_price_tea', 't_price_wine', 'u_price_beer', 'u_price_coffe', 'u_price_softdrinks', 'u_price_tea', 'u_price_wine', 'v_price_beer', 'v_price_coffe', 'v_price_softdrinks', 'v_price_tea', 'v_price_wine', 'w_price_beer', 'w_price_coffe', 'w_price_softdrinks', 'w_price_tea', 'w_price_wine', 'x_price_beer', 'x_price_coffe', 'x_price_softdrinks', 'x_price_tea', 'x_price_wine', 'y_price_beer', 'y_price_coffe', 'y_price_softdrinks', 'y_price_tea', 'y_price_wine', 'z_price_beer', 'z_price_coffe', 'z_price_softdrinks', 'z_price_tea', 'z_price_wine']
```python {.marimo}
```
```python {.marimo}
revenues.rename('AZ Revenue', ('price', 'revenue'))
print(revenues.name)
print(revenues.series)
```
AZ Revenue ['a_revenue_beer', 'a_revenue_coffe', 'a_revenue_softdrinks', 'a_revenue_tea', 'a_revenue_wine', 'b_revenue_beer', 'b_revenue_coffe', 'b_revenue_softdrinks', 'b_revenue_tea', 'b_revenue_wine', 'c_revenue_beer', 'c_revenue_coffe', 'c_revenue_softdrinks', 'c_revenue_tea', 'c_revenue_wine', 'd_revenue_beer', 'd_revenue_coffe', 'd_revenue_softdrinks', 'd_revenue_tea', 'd_revenue_wine', 'e_revenue_beer', 'e_revenue_coffe', 'e_revenue_softdrinks', 'e_revenue_tea', 'e_revenue_wine', 'f_revenue_beer', 'f_revenue_coffe', 'f_revenue_softdrinks', 'f_revenue_tea', 'f_revenue_wine', 'g_revenue_beer', 'g_revenue_coffe', 'g_revenue_softdrinks', 'g_revenue_tea', 'g_revenue_wine', 'h_revenue_beer', 'h_revenue_coffe', 'h_revenue_softdrinks', 'h_revenue_tea', 'h_revenue_wine', 'i_revenue_beer', 'i_revenue_coffe', 'i_revenue_softdrinks', 'i_revenue_tea', 'i_revenue_wine', 'j_revenue_beer', 'j_revenue_coffe', 'j_revenue_softdrinks', 'j_revenue_tea', 'j_revenue_wine', 'k_revenue_beer', 'k_revenue_coffe', 'k_revenue_softdrinks', 'k_revenue_tea', 'k_revenue_wine', 'l_revenue_beer', 'l_revenue_coffe', 'l_revenue_softdrinks', 'l_revenue_tea', 'l_revenue_wine', 'm_revenue_beer', 'm_revenue_coffe', 'm_revenue_softdrinks', 'm_revenue_tea', 'm_revenue_wine', 'n_revenue_beer', 'n_revenue_coffe', 'n_revenue_softdrinks', 'n_revenue_tea', 'n_revenue_wine', 'o_revenue_beer', 'o_revenue_coffe', 'o_revenue_softdrinks', 'o_revenue_tea', 'o_revenue_wine', 'p_revenue_beer', 'p_revenue_coffe', 'p_revenue_softdrinks', 'p_revenue_tea', 'p_revenue_wine', 'q_revenue_beer', 'q_revenue_coffe', 'q_revenue_softdrinks', 'q_revenue_tea', 'q_revenue_wine', 'r_revenue_beer', 'r_revenue_coffe', 'r_revenue_softdrinks', 'r_revenue_tea', 'r_revenue_wine', 's_revenue_beer', 's_revenue_coffe', 's_revenue_softdrinks', 's_revenue_tea', 's_revenue_wine', 't_revenue_beer', 't_revenue_coffe', 't_revenue_softdrinks', 't_revenue_tea', 't_revenue_wine', 'u_revenue_beer', 'u_revenue_coffe', 'u_revenue_softdrinks', 'u_revenue_tea', 'u_revenue_wine', 'v_revenue_beer', 'v_revenue_coffe', 'v_revenue_softdrinks', 'v_revenue_tea', 'v_revenue_wine', 'w_revenue_beer', 'w_revenue_coffe', 'w_revenue_softdrinks', 'w_revenue_tea', 'w_revenue_wine', 'x_revenue_beer', 'x_revenue_coffe', 'x_revenue_softdrinks', 'x_revenue_tea', 'x_revenue_wine', 'y_revenue_beer', 'y_revenue_coffe', 'y_revenue_softdrinks', 'y_revenue_tea', 'y_revenue_wine', 'z_revenue_beer', 'z_revenue_coffe', 'z_revenue_softdrinks', 'z_revenue_tea', 'z_revenue_wine']A similar operation is required for tags: ```python {.marimo} # DEBUG: tags are lost in selects above, hence not flowing through revenues.tags["series"]["a_revenue_beer"] ```
{'dataset': 'AZ Revenue',
'name': 'a_revenue_beer',
'product': 'beer',
'repository': 'tutorials',
'store': 'a',
'temporality': 'FROM_TO',
'variable': 'price',
'versioning': 'NONE'}
```python {.marimo}
# ... tag maintenance is likely to be necessary after calculations:
revenues.replace_tags(({'variable':'price'},{'variable':'revenue'}))
revenues.tags["series"]["a_revenue_beer"]
```
{'dataset': 'AZ Revenue',
'name': 'a_revenue_beer',
'product': 'beer',
'repository': 'tutorials',
'store': 'a',
'temporality': 'FROM_TO',
'variable': 'revenue',
'versioning': 'NONE'}
Detagging
---------
If mistakes have been made, it may be necessary to remove tags.
```python {.marimo}
from copy import deepcopy
deepcopy(pqr.tags)
```
{'name': 'PQR',
'repository': 'tutorials',
'series': {'p': {'dataset': 'PQR',
'name': 'p',
'repository': 'tutorials',
'temporality': 'AT',
'vare': 'kaffe',
'varegruppe': 'nødvendigheter',
'variabel': 'pris',
'versioning': 'NONE'},
'q': {'dataset': 'PQR',
'name': 'q',
'repository': 'tutorials',
'temporality': 'AT',
'vare': 'knekkebrød',
'varegruppe': 'nødvendigheter',
'variabel': 'pris',
'versioning': 'NONE'},
'r': {'dataset': 'PQR',
'name': 'r',
'repository': 'tutorials',
'temporality': 'AT',
'vare': 'brunost',
'varegruppe': 'nødvendigheter',
'variabel': 'pris',
'versioning': 'NONE'}},
'temporality': 'AT',
'varegruppe': 'nødvendigheter',
'variabel': 'pris',
'versioning': 'NONE'}
```python {.marimo}
pqr.detag_series('varegruppe', vare='knekkebrød')
```
```python {.marimo}
pqr.detag_series( vare='knekkebrød' )
pqr.tags
```
{'name': 'PQR',
'repository': 'tutorials',
'series': {'p': {'dataset': 'PQR',
'name': 'p',
'repository': 'tutorials',
'temporality': 'AT',
'vare': 'kaffe',
'variabel': 'pris',
'versioning': 'NONE'},
'q': {'dataset': 'PQR',
'name': 'q',
'repository': 'tutorials',
'temporality': 'AT',
'variabel': 'pris',
'versioning': 'NONE'},
'r': {'dataset': 'PQR',
'name': 'r',
'repository': 'tutorials',
'temporality': 'AT',
'vare': 'brunost',
'variabel': 'pris',
'versioning': 'NONE'}},
'temporality': 'AT',
'varegruppe': 'nødvendigheter',
'variabel': 'pris',
'versioning': 'NONE'}
```python {.marimo}
```
The catalog
------------------------
Allows inspection and analysis of tags across all sets and series.
Actual maintenance via `Dataset` methods.
```python {.marimo}
from ssb_timeseries import get_catalog
```
```python {.marimo}
our_timeseries_database = get_catalog()
```
```python {.marimo}
all_sets = our_timeseries_database.datasets()
[s.object_name for s in all_sets]
```
['AZ_drikkevarer', 'Prices and Volumes', 'A Sample Dataset', 'PQR', 'Sample Data', 'AZ Drinks', 'XYZ', 'More Prices and Volumes', 'AZ_omsetning', 'AZ_drinks']```python {.marimo} series_in_xyz = our_timeseries_database.series(tags={'dataset': 'XYZ'}) [s.object_name for s in series_in_xyz] ```
['x', 'y', 'z']```python {.marimo} import pandas as pd everything = our_timeseries_database.items() pd.DataFrame(everything) ``` | repository_name | object_name | object_type | object_tags | parent | children | | --- | --- | --- | --- | --- | --- | | tutorials | AZ_drikkevarer | dataset | {'name': 'AZ_drikkevarer', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'series': {'a_antall_brus': {'dataset': 'AZ_drikkevarer', 'name': 'a_antall_brus', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'a', 'variabel': 'antall', 'vare': 'brus'}, 'a_antall_kaffe': {'dataset': 'AZ_drikkevarer', 'name': 'a_antall_kaffe', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'a', 'variabel': 'antall', 'vare': 'kaffe'}, 'a_antall_te': {'dataset': 'AZ_drikkevarer', 'name': 'a_antall_te', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'a', 'variabel': 'antall', 'vare': 'te'}, 'a_antall_vin': {'dataset': 'AZ_drikkevarer', 'name': 'a_antall_vin', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'a', 'variabel': 'antall', 'vare': 'vin'}, 'a_antall_øl': {'dataset': 'AZ_drikkevarer', 'name': 'a_antall_øl', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'a', 'variabel': 'antall', 'vare': 'øl'}, 'a_pris_brus': {'dataset': 'AZ_drikkevarer', 'name': 'a_pris_brus', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'a', 'variabel': 'pris', 'vare': 'brus'}, 'a_pris_kaffe': {'dataset': 'AZ_drikkevarer', 'name': 'a_pris_kaffe', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'a', 'variabel': 'pris', 'vare': 'kaffe'}, 'a_pris_te': {'dataset': 'AZ_drikkevarer', 'name': 'a_pris_te', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'a', 'variabel': 'pris', 'vare': 'te'}, 'a_pris_vin': {'dataset': 'AZ_drikkevarer', 'name': 'a_pris_vin', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'a', 'variabel': 'pris', 'vare': 'vin'}, 'a_pris_øl': {'dataset': 'AZ_drikkevarer', 'name': 'a_pris_øl', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'a', 'variabel': 'pris', 'vare': 'øl'}, 'b_antall_brus': {'dataset': 'AZ_drikkevarer', 'name': 'b_antall_brus', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'b', 'variabel': 'antall', 'vare': 'brus'}, 'b_antall_kaffe': {'dataset': 'AZ_drikkevarer', 'name': 'b_antall_kaffe', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'b', 'variabel': 'antall', 'vare': 'kaffe'}, 'b_antall_te': {'dataset': 'AZ_drikkevarer', 'name': 'b_antall_te', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'b', 'variabel': 'antall', 'vare': 'te'}, 'b_antall_vin': {'dataset': 'AZ_drikkevarer', 'name': 'b_antall_vin', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'b', 'variabel': 'antall', 'vare': 'vin'}, 'b_antall_øl': {'dataset': 'AZ_drikkevarer', 'name': 'b_antall_øl', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'b', 'variabel': 'antall', 'vare': 'øl'}, 'b_pris_brus': {'dataset': 'AZ_drikkevarer', 'name': 'b_pris_brus', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'b', 'variabel': 'pris', 'vare': 'brus'}, 'b_pris_kaffe': {'dataset': 'AZ_drikkevarer', 'name': 'b_pris_kaffe', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'b', 'variabel': 'pris', 'vare': 'kaffe'}, 'b_pris_te': {'dataset': 'AZ_drikkevarer', 'name': 'b_pris_te', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'b', 'variabel': 'pris', 'vare': 'te'}, 'b_pris_vin': {'dataset': 'AZ_drikkevarer', 'name': 'b_pris_vin', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'b', 'variabel': 'pris', 'vare': 'vin'}, 'b_pris_øl': {'dataset': 'AZ_drikkevarer', 'name': 'b_pris_øl', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'b', 'variabel': 'pris', 'vare': 'øl'}, 'c_antall_brus': {'dataset': 'AZ_drikkevarer', 'name': 'c_antall_brus', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'c', 'variabel': 'antall', 'vare': 'brus'}, 'c_antall_kaffe': {'dataset': 'AZ_drikkevarer', 'name': 'c_antall_kaffe', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'c', 'variabel': 'antall', 'vare': 'kaffe'}, 'c_antall_te': {'dataset': 'AZ_drikkevarer', 'name': 'c_antall_te', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'c', 'variabel': 'antall', 'vare': 'te'}, 'c_antall_vin': {'dataset': 'AZ_drikkevarer', 'name': 'c_antall_vin', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'c', 'variabel': 'antall', 'vare': 'vin'}, 'c_antall_øl': {'dataset': 'AZ_drikkevarer', 'name': 'c_antall_øl', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'c', 'variabel': 'antall', 'vare': 'øl'}, 'c_pris_brus': {'dataset': 'AZ_drikkevarer', 'name': 'c_pris_brus', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'c', 'variabel': 'pris', 'vare': 'brus'}, 'c_pris_kaffe': {'dataset': 'AZ_drikkevarer', 'name': 'c_pris_kaffe', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'c', 'variabel': 'pris', 'vare': 'kaffe'}, 'c_pris_te': {'dataset': 'AZ_drikkevarer', 'name': 'c_pris_te', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'c', 'variabel': 'pris', 'vare': 'te'}, 'c_pris_vin': {'dataset': 'AZ_drikkevarer', 'name': 'c_pris_vin', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'c', 'variabel': 'pris', 'vare': 'vin'}, 'c_pris_øl': {'dataset': 'AZ_drikkevarer', 'name': 'c_pris_øl', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'c', 'variabel': 'pris', 'vare': 'øl'}, 'd_antall_brus': {'dataset': 'AZ_drikkevarer', 'name': 'd_antall_brus', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'd', 'variabel': 'antall', 'vare': 'brus'}, 'd_antall_kaffe': {'dataset': 'AZ_drikkevarer', 'name': 'd_antall_kaffe', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'd', 'variabel': 'antall', 'vare': 'kaffe'}, 'd_antall_te': {'dataset': 'AZ_drikkevarer', 'name': 'd_antall_te', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'd', 'variabel': 'antall', 'vare': 'te'}, 'd_antall_vin': {'dataset': 'AZ_drikkevarer', 'name': 'd_antall_vin', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'd', 'variabel': 'antall', 'vare': 'vin'}, 'd_antall_øl': {'dataset': 'AZ_drikkevarer', 'name': 'd_antall_øl', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'd', 'variabel': 'antall', 'vare': 'øl'}, 'd_pris_brus': {'dataset': 'AZ_drikkevarer', 'name': 'd_pris_brus', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'd', 'variabel': 'pris', 'vare': 'brus'}, 'd_pris_kaffe': {'dataset': 'AZ_drikkevarer', 'name': 'd_pris_kaffe', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'd', 'variabel': 'pris', 'vare': 'kaffe'}, 'd_pris_te': {'dataset': 'AZ_drikkevarer', 'name': 'd_pris_te', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'd', 'variabel': 'pris', 'vare': 'te'}, 'd_pris_vin': {'dataset': 'AZ_drikkevarer', 'name': 'd_pris_vin', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'd', 'variabel': 'pris', 'vare': 'vin'}, 'd_pris_øl': {'dataset': 'AZ_drikkevarer', 'name': 'd_pris_øl', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'd', 'variabel': 'pris', 'vare': 'øl'}, 'e_antall_brus': {'dataset': 'AZ_drikkevarer', 'name': 'e_antall_brus', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'e', 'variabel': 'antall', 'vare': 'brus'}, 'e_antall_kaffe': {'dataset': 'AZ_drikkevarer', 'name': 'e_antall_kaffe', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'e', 'variabel': 'antall', 'vare': 'kaffe'}, 'e_antall_te': {'dataset': 'AZ_drikkevarer', 'name': 'e_antall_te', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'e', 'variabel': 'antall', 'vare': 'te'}, 'e_antall_vin': {'dataset': 'AZ_drikkevarer', 'name': 'e_antall_vin', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'e', 'variabel': 'antall', 'vare': 'vin'}, 'e_antall_øl': {'dataset': 'AZ_drikkevarer', 'name': 'e_antall_øl', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'e', 'variabel': 'antall', 'vare': 'øl'}, 'e_pris_brus': {'dataset': 'AZ_drikkevarer', 'name': 'e_pris_brus', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'e', 'variabel': 'pris', 'vare': 'brus'}, 'e_pris_kaffe': {'dataset': 'AZ_drikkevarer', 'name': 'e_pris_kaffe', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'e', 'variabel': 'pris', 'vare': 'kaffe'}, 'e_pris_te': {'dataset': 'AZ_drikkevarer', 'name': 'e_pris_te', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'e', 'variabel': 'pris', 'vare': 'te'}, 'e_pris_vin': {'dataset': 'AZ_drikkevarer', 'name': 'e_pris_vin', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'e', 'variabel': 'pris', 'vare': 'vin'}, 'e_pris_øl': {'dataset': 'AZ_drikkevarer', 'name': 'e_pris_øl', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'e', 'variabel': 'pris', 'vare': 'øl'}, 'f_antall_brus': {'dataset': 'AZ_drikkevarer', 'name': 'f_antall_brus', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'f', 'variabel': 'antall', 'vare': 'brus'}, 'f_antall_kaffe': {'dataset': 'AZ_drikkevarer', 'name': 'f_antall_kaffe', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'f', 'variabel': 'antall', 'vare': 'kaffe'}, 'f_antall_te': {'dataset': 'AZ_drikkevarer', 'name': 'f_antall_te', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'f', 'variabel': 'antall', 'vare': 'te'}, 'f_antall_vin': {'dataset': 'AZ_drikkevarer', 'name': 'f_antall_vin', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'f', 'variabel': 'antall', 'vare': 'vin'}, 'f_antall_øl': {'dataset': 'AZ_drikkevarer', 'name': 'f_antall_øl', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'f', 'variabel': 'antall', 'vare': 'øl'}, 'f_pris_brus': {'dataset': 'AZ_drikkevarer', 'name': 'f_pris_brus', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'f', 'variabel': 'pris', 'vare': 'brus'}, 'f_pris_kaffe': {'dataset': 'AZ_drikkevarer', 'name': 'f_pris_kaffe', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'f', 'variabel': 'pris', 'vare': 'kaffe'}, 'f_pris_te': {'dataset': 'AZ_drikkevarer', 'name': 'f_pris_te', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'f', 'variabel': 'pris', 'vare': 'te'}, 'f_pris_vin': {'dataset': 'AZ_drikkevarer', 'name': 'f_pris_vin', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'f', 'variabel': 'pris', 'vare': 'vin'}, 'f_pris_øl': {'dataset': 'AZ_drikkevarer', 'name': 'f_pris_øl', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'f', 'variabel': 'pris', 'vare': 'øl'}, 'g_antall_brus': {'dataset': 'AZ_drikkevarer', 'name': 'g_antall_brus', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'g', 'variabel': 'antall', 'vare': 'brus'}, 'g_antall_kaffe': {'dataset': 'AZ_drikkevarer', 'name': 'g_antall_kaffe', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'g', 'variabel': 'antall', 'vare': 'kaffe'}, 'g_antall_te': {'dataset': 'AZ_drikkevarer', 'name': 'g_antall_te', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'g', 'variabel': 'antall', 'vare': 'te'}, 'g_antall_vin': {'dataset': 'AZ_drikkevarer', 'name': 'g_antall_vin', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'g', 'variabel': 'antall', 'vare': 'vin'}, 'g_antall_øl': {'dataset': 'AZ_drikkevarer', 'name': 'g_antall_øl', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'g', 'variabel': 'antall', 'vare': 'øl'}, 'g_pris_brus': {'dataset': 'AZ_drikkevarer', 'name': 'g_pris_brus', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'g', 'variabel': 'pris', 'vare': 'brus'}, 'g_pris_kaffe': {'dataset': 'AZ_drikkevarer', 'name': 'g_pris_kaffe', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'g', 'variabel': 'pris', 'vare': 'kaffe'}, 'g_pris_te': {'dataset': 'AZ_drikkevarer', 'name': 'g_pris_te', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'g', 'variabel': 'pris', 'vare': 'te'}, 'g_pris_vin': {'dataset': 'AZ_drikkevarer', 'name': 'g_pris_vin', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'g', 'variabel': 'pris', 'vare': 'vin'}, 'g_pris_øl': {'dataset': 'AZ_drikkevarer', 'name': 'g_pris_øl', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'g', 'variabel': 'pris', 'vare': 'øl'}, 'h_antall_brus': {'dataset': 'AZ_drikkevarer', 'name': 'h_antall_brus', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'h', 'variabel': 'antall', 'vare': 'brus'}, 'h_antall_kaffe': {'dataset': 'AZ_drikkevarer', 'name': 'h_antall_kaffe', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'h', 'variabel': 'antall', 'vare': 'kaffe'}, 'h_antall_te': {'dataset': 'AZ_drikkevarer', 'name': 'h_antall_te', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'h', 'variabel': 'antall', 'vare': 'te'}, 'h_antall_vin': {'dataset': 'AZ_drikkevarer', 'name': 'h_antall_vin', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'h', 'variabel': 'antall', 'vare': 'vin'}, 'h_antall_øl': {'dataset': 'AZ_drikkevarer', 'name': 'h_antall_øl', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'h', 'variabel': 'antall', 'vare': 'øl'}, 'h_pris_brus': {'dataset': 'AZ_drikkevarer', 'name': 'h_pris_brus', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'h', 'variabel': 'pris', 'vare': 'brus'}, 'h_pris_kaffe': {'dataset': 'AZ_drikkevarer', 'name': 'h_pris_kaffe', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'h', 'variabel': 'pris', 'vare': 'kaffe'}, 'h_pris_te': {'dataset': 'AZ_drikkevarer', 'name': 'h_pris_te', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'h', 'variabel': 'pris', 'vare': 'te'}, 'h_pris_vin': {'dataset': 'AZ_drikkevarer', 'name': 'h_pris_vin', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'h', 'variabel': 'pris', 'vare': 'vin'}, 'h_pris_øl': {'dataset': 'AZ_drikkevarer', 'name': 'h_pris_øl', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'h', 'variabel': 'pris', 'vare': 'øl'}, 'i_antall_brus': {'dataset': 'AZ_drikkevarer', 'name': 'i_antall_brus', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'i', 'variabel': 'antall', 'vare': 'brus'}, 'i_antall_kaffe': {'dataset': 'AZ_drikkevarer', 'name': 'i_antall_kaffe', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'i', 'variabel': 'antall', 'vare': 'kaffe'}, 'i_antall_te': {'dataset': 'AZ_drikkevarer', 'name': 'i_antall_te', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'i', 'variabel': 'antall', 'vare': 'te'}, 'i_antall_vin': {'dataset': 'AZ_drikkevarer', 'name': 'i_antall_vin', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'i', 'variabel': 'antall', 'vare': 'vin'}, 'i_antall_øl': {'dataset': 'AZ_drikkevarer', 'name': 'i_antall_øl', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'i', 'variabel': 'antall', 'vare': 'øl'}, 'i_pris_brus': {'dataset': 'AZ_drikkevarer', 'name': 'i_pris_brus', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'i', 'variabel': 'pris', 'vare': 'brus'}, 'i_pris_kaffe': {'dataset': 'AZ_drikkevarer', 'name': 'i_pris_kaffe', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'i', 'variabel': 'pris', 'vare': 'kaffe'}, 'i_pris_te': {'dataset': 'AZ_drikkevarer', 'name': 'i_pris_te', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'i', 'variabel': 'pris', 'vare': 'te'}, 'i_pris_vin': {'dataset': 'AZ_drikkevarer', 'name': 'i_pris_vin', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'i', 'variabel': 'pris', 'vare': 'vin'}, 'i_pris_øl': {'dataset': 'AZ_drikkevarer', 'name': 'i_pris_øl', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'i', 'variabel': 'pris', 'vare': 'øl'}, 'j_antall_brus': {'dataset': 'AZ_drikkevarer', 'name': 'j_antall_brus', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'j', 'variabel': 'antall', 'vare': 'brus'}, 'j_antall_kaffe': {'dataset': 'AZ_drikkevarer', 'name': 'j_antall_kaffe', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'j', 'variabel': 'antall', 'vare': 'kaffe'}, 'j_antall_te': {'dataset': 'AZ_drikkevarer', 'name': 'j_antall_te', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'j', 'variabel': 'antall', 'vare': 'te'}, 'j_antall_vin': {'dataset': 'AZ_drikkevarer', 'name': 'j_antall_vin', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'j', 'variabel': 'antall', 'vare': 'vin'}, 'j_antall_øl': {'dataset': 'AZ_drikkevarer', 'name': 'j_antall_øl', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'j', 'variabel': 'antall', 'vare': 'øl'}, 'j_pris_brus': {'dataset': 'AZ_drikkevarer', 'name': 'j_pris_brus', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'j', 'variabel': 'pris', 'vare': 'brus'}, 'j_pris_kaffe': {'dataset': 'AZ_drikkevarer', 'name': 'j_pris_kaffe', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'j', 'variabel': 'pris', 'vare': 'kaffe'}, 'j_pris_te': {'dataset': 'AZ_drikkevarer', 'name': 'j_pris_te', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'j', 'variabel': 'pris', 'vare': 'te'}, 'j_pris_vin': {'dataset': 'AZ_drikkevarer', 'name': 'j_pris_vin', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'j', 'variabel': 'pris', 'vare': 'vin'}, 'j_pris_øl': {'dataset': 'AZ_drikkevarer', 'name': 'j_pris_øl', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'j', 'variabel': 'pris', 'vare': 'øl'}, ...}, 'repository': 'tutorials'} | | None | | tutorials | a_antall_brus | series | {'dataset': 'AZ_drikkevarer', 'name': 'a_antall_brus', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'a', 'variabel': 'antall', 'vare': 'brus'} | AZ_drikkevarer | None | | tutorials | a_antall_kaffe | series | {'dataset': 'AZ_drikkevarer', 'name': 'a_antall_kaffe', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'a', 'variabel': 'antall', 'vare': 'kaffe'} | AZ_drikkevarer | None | | tutorials | a_antall_te | series | {'dataset': 'AZ_drikkevarer', 'name': 'a_antall_te', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'a', 'variabel': 'antall', 'vare': 'te'} | AZ_drikkevarer | None | | tutorials | a_antall_vin | series | {'dataset': 'AZ_drikkevarer', 'name': 'a_antall_vin', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'butikk': 'a', 'variabel': 'antall', 'vare': 'vin'} | AZ_drikkevarer | None | | ... | ... | ... | ... | ... | ... | | tutorials | z_volume_wine_NW | series | {'dataset': 'AZ_drinks', 'name': 'z_volume_wine_NW', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'store': 'z', 'variable': 'volume', 'product': 'wine', 'region': 'NW'} | AZ_drinks | None | | tutorials | z_volume_wine_S | series | {'dataset': 'AZ_drinks', 'name': 'z_volume_wine_S', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'store': 'z', 'variable': 'volume', 'product': 'wine', 'region': 'S'} | AZ_drinks | None | | tutorials | z_volume_wine_SE | series | {'dataset': 'AZ_drinks', 'name': 'z_volume_wine_SE', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'store': 'z', 'variable': 'volume', 'product': 'wine', 'region': 'SE'} | AZ_drinks | None | | tutorials | z_volume_wine_SW | series | {'dataset': 'AZ_drinks', 'name': 'z_volume_wine_SW', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'store': 'z', 'variable': 'volume', 'product': 'wine', 'region': 'SW'} | AZ_drinks | None | | tutorials | z_volume_wine_W | series | {'dataset': 'AZ_drinks', 'name': 'z_volume_wine_W', 'versioning': 'NONE', 'temporality': 'FROM_TO', 'repository': 'tutorials', 'store': 'z', 'variable': 'volume', 'product': 'wine', 'region': 'W'} | AZ_drinks | None | ### Consuming KLASS The `Dataset` and `Series` attributes are *technically* just key-value pairs. It is, however, possible (even recommended) to rely on more formal taxonomies top structure these. ```python {.marimo} from klass import get_classification from klass import KlassClassification # Import the class for KlassClassifications ``` ```python {.marimo} print(get_classification(157)) ```
Classification 157: Standard for klassifisering av energibalanseposter
Owning Section: 425 - Seksjon for energi-, miljø- og transportstatistikk
Contact Person:
name: Bjelvert, Malin
email: Malin.Bjelvert@ssb.no
phone:
Statistical Units: Foretak, Aktivitet/produkt/tjeneste/vare, Person, Bedrift
Number of versions: 1
Klassifisering av energibalanseposter er en klassifisering av tilgang og anvendelse av energiprodukter. Energibalansen følger en territorial avgrensing og omfatter all
flyt av energiprodukter på norsk jord, uavhengig av nasjonalitet.
```python {.marimo}
from ssb_timeseries.meta import Taxonomy
```
```python {.marimo}
print('"Energy balance posts" - KLASS 157 is an example of a taxonomy with hierarchical structure.')
klass157 = Taxonomy(klass_id=157)
klass157.entities # <-- arrow table, with an extra row 0
```
"Energy balance posts" - KLASS 157 is an example of a taxonomy with hierarchical structure.
pyarrow.Table code: string not null parentCode: string name: string not null level: string shortName: string presentationName: string validFrom: string validTo: string notes: string ---- code: [["0","1","1.1","1.1.1","1.1.2",...,"8.6","8.7","8.8","8.9","9"]] parentCode: [[null,"0","1","1.1","1.1",...,"8","8","8","8","0"]] name: [["KLASS-157","Produksjon av primære energiprodukter","Av dette fra fornybare kilder","Av dette i vannkraftverk","Av dette i vindkraftverk",...,"Vindkraftstasjoner","Varmekraftverk","Kraftvarmeverk","Fjernvarmeverk","Svinn"]] level: [["0","1","2","3","3",...,"2","2","2","2","1"]] shortName: [["","","","","",...,"","","","",""]] presentationName: [["","","","","",...,"","","","",""]] validFrom: [["",null,null,null,null,...,null,null,null,null,null]] validTo: [["",null,null,null,null,...,null,null,null,null,null]] notes: [["","Produksjon av primære energiprodukter omfatter utvinning av brensel eller energi fra naturlige fo (... 239 chars omitted)","Produksjon av primære energiprodukter fra fornybare energikilder, for eksempel produksjon av biod (... 72 chars omitted)","Elektrisitet produsert i verk som drives av frisk, flytende eller fallende vann.","Elektrisitet produsert i verk som drives av vindkraft",...,"","I varmekraftverk omvandles termisk energi til elektrisitet ved bruk av brennbare energiprodukter, (... 107 chars omitted)","Forbruk av energi i anlegg som produserer både varme og elektrisk kraft.","I fjernvarmeverk omvandles termisk energi til varme ved bruk av brennbare energiprodukter, dvs. en (... 100 chars omitted)","Svinn er tap under overføring, fordeling og transport av brensel, varme og elektrisitet."]]```python {.marimo} # ... is inserted by the Taxonomy() bto create a tree structure with a single root node klass157.print_tree() ```
╙── 0
├─╼ 1
│ ├─╼ 1.1
│ │ ├─╼ 1.1.1
│ │ ├─╼ 1.1.2
│ │ └─╼ 1.1.3
│ └─╼ 1.2
├─╼ 11
│ ├─╼ 11.1
│ └─╼ 11.2
├─╼ 12
│ ├─╼ 12.1
│ │ ├─╼ 12.1.1
│ │ ├─╼ 12.1.10
│ │ ├─╼ 12.1.11
│ │ ├─╼ 12.1.12
│ │ ├─╼ 12.1.13
│ │ ├─╼ 12.1.2
│ │ ├─╼ 12.1.3
│ │ ├─╼ 12.1.4
│ │ ├─╼ 12.1.5
│ │ ├─╼ 12.1.6
│ │ ├─╼ 12.1.7
│ │ ├─╼ 12.1.8
│ │ └─╼ 12.1.9
│ ├─╼ 12.2
│ │ ├─╼ 12.2.1
│ │ ├─╼ 12.2.2
│ │ ├─╼ 12.2.3
│ │ ├─╼ 12.2.4
│ │ └─╼ 12.2.5
│ └─╼ 12.3
│ ├─╼ 12.3.1
│ ├─╼ 12.3.2
│ ├─╼ 12.3.3
│ └─╼ 12.3.4
├─╼ 13
├─╼ 14
├─╼ 15
├─╼ 2
├─╼ 3
├─╼ 4
│ ├─╼ 4.1
│ └─╼ 4.2
├─╼ 5
├─╼ 6
├─╼ 7
│ ├─╼ 7.1
│ ├─╼ 7.2
│ ├─╼ 7.3
│ ├─╼ 7.4
│ ├─╼ 7.5
│ └─╼ 7.6
├─╼ 8
│ ├─╼ 8.1
│ ├─╼ 8.2
│ ├─╼ 8.3
│ ├─╼ 8.4
│ ├─╼ 8.5
│ ├─╼ 8.6
│ ├─╼ 8.7
│ ├─╼ 8.8
│ └─╼ 8.9
└─╼ 9
```python {.marimo}
print(klass157.leaf_nodes)
```
['1.1.1', '1.1.2', '1.1.3', '1.2', '11.1', '11.2', '12.1.1', '12.1.10', '12.1.11', '12.1.12', '12.1.13', '12.1.2', '12.1.3', '12.1.4', '12.1.5', '12.1.6', '12.1.7', '12.1.8', '12.1.9', '12.2.1', '12.2.2', '12.2.3', '12.2.4', '12.2.5', '12.3.1', '12.3.2', '12.3.3', '12.3.4', '13', '14', '15', '2', '3', '4.1', '4.2', '5', '6', '7.1', '7.2', '7.3', '7.4', '7.5', '7.6', '8.1', '8.2', '8.3', '8.4', '8.5', '8.6', '8.7', '8.8', '8.9', '9']```python {.marimo} print(klass157.parent_nodes) ```
['1', '0', '1.1', '11', '12', '12.1', '12.2', '12.3', '4', '7', '8']```python {.marimo} # read/write to file -> taxonomies can be defined outside KLASS #klass157.save('klass157.json') #file157 = Taxonomy(path='klass157.json') ``` ```python {.marimo} #klass157 == file157 ```