Version 1.2 of the South African Reserve Bank’s Quarterly Bulletin (QB) datasets is now live on EconData. It gives you every bulletin since December 2004 as a separate vintage, on consistent series keys, with base periods separated by patch versions. If you use QB_BUSCYCL, see Always pass a version below.
Datasets
| Dataset ID | Chapter | Versions |
|---|---|---|
QB_MONBANK | Money and Banking | 1.2.0 |
QB_CAPMARK | Capital Market | 1.2.0 |
QB_PUBLFIN | Public Finance | 1.2.0 |
QB_BALNPAY | External Economic Accounts | 1.2.0 – 1.2.4 |
QB_NATLACC | National Accounts | 1.2.0 – 1.2.3 |
QB_BUSCYCL | General Economic Indicators | 1.2.0 – 1.2.24 |
QB_INTECON | Integrated Economic Accounts | 1.2.0 |
Each bulletin is a release (vintage). Six datasets run from the December 2004 QB to September 2026, and QB_INTECON from June 2022. Version 1.1.4 remains available, while we removed access to the older minor versions for simplicity.
One version per base period
A minor version (x.2.x) represents a change to the dataset as a whole, like this one, and a patch version (x.x.3) a change in a metadata value. Each patch version holds the bulletins published on one base period, and its dataset description says which. In QB_NATLACC:
| Version | Real series on | Vintages |
|---|---|---|
| 1.2.0 | constant 2000 prices | 2004Q3 – 2009Q2 |
| 1.2.1 | constant 2005 prices | 2009Q3 – 2014Q2 |
| 1.2.2 | constant 2010 prices | 2014Q3 – 2021Q1 |
| 1.2.3 | constant 2015 prices | 2021Q2 – present |
QB_BUSCYCL has 25 versions because its indicator families (CPI, PPI, employment, production, sales, the composite indicators and others) are rebased at different times, and a rebase in any one of them starts a new patch version. We placed every boundary by checking the values themselves, for example that an index averages 100 in its base year, not only the SARB’s original metadata, which don’t always change at a rebase. Within a patch version every release is on the same base.
What’s better in 1.2
Base periods
BASE_PER and LABEL now give the base each version’s values are actually on. Many real series previously had no base period at all, and where the SARB’s own description is out of date (its CPI series kept “Index 2016/12 = 100” after moving to December 2021 = 100) we show the correct base. For example, total non-agricultural employment (KBP7009L.Q.N.S.I) reads “Index 2000 = 100” up to QB_BUSCYCL 1.2.11, “Index 2010 = 100” from 1.2.12 and “Index 2015 = 100” from 1.2.20.
No more mixed bases
The apparent jump in real GDP in an archived 2021 vintage, where older 2010-price values sat next to the new 2015-price ones, can’t happen in 1.2: each base period has its own version.
One key per series
A series has the same canonical key in every release and version. Earlier versions sometimes created a second key when the SARB reworded the metadata across time. A few series are also classified more accurately: for example, the effective exchange rate changes in QB_BALNPAY are now percentage changes rather than levels.
A more complete history
The September 2020 QB, the December 2020 QB’s data, and the September 2025 Money and Banking chapter are now included. The files we had for September 2005 turned out to be a copy of September 2006’s, so that bulletin is left out rather than shown with the wrong data.
Cleaning
A break in total employment that the SARB itself corrected in 2016 is corrected in every earlier release, and a one-off jump in a producer price index in the March 2021 vintage is fixed. Weekly Money and Banking series in the 2012–2019 vintages now carry the right dates.
Series metadata comments
Known features of individual series are explained in their COMMENT attribute, for example permanent steps in some capital-stock series, discontinued series, and KBP2150K, a mnemonic the SARB reused: local government’s marketable debt until 2011Q1, and green bond issuance from September 2026 (two separate series, KBP2150K.Q.N.N.LVL and KBP2150K.Q.R.N.LVL in QB_CAPMARK).
Always pass a version for QB_BUSCYCL
If you leave out version, econdatar asks for the “latest” version. At the moment that comparison treats version numbers as text, so “1.2.9” counts as later than “1.2.24”, and you get QB_BUSCYCL 1.2.9, which holds only the June 2013 QB. The other QB datasets aren’t affected, because their version numbers are still single digits. Until this is fixed, pass the version:
read_dataset("QB_BUSCYCL", version = "1.2.24")
We may fix the API, in which case you won’t need to worry about this in future. If we fix it in the econdatar package (Issue 46), you’ll need to reinstall it:
remotes::install_github("coderaanalytics/econdatar")
Working with 1.2 in R
List a dataset’s 1.2 versions and their releases
library(econdatar)
library(dplyr)
accounts <- read_registry("dataflow", id = "QB_NATLACC", version = "all")
Filter(function(f) startsWith(f$version, "1.2."), accounts) |>
sapply(function(f) paste(f$version, f$description))
rel <- read_release("QB_NATLACC", version = "all")
rel12 <- rel[startsWith(names(rel), "v1.2.")]
# Order the list items by version number
rel12 <- rel12[order(numeric_version(sub("^v", "", names(rel12))))]
Get all revisions of a series value
with hist_obs = TRUE (it needs tidy = FALSE). With version = "all" you get every version, including 1.1, so keep the 1.2 ones:
key <- "KBP6006D.Q.R.S.LA"
x <- read_dataset("QB_NATLACC", version = "all", series_key = key,
tidy = FALSE, hist_obs = TRUE)
v12 <- Filter(function(d) startsWith(attr(d, "metadata")$version, "1.2."), x)
revisions <- bind_rows(lapply(v12, function(d)
mutate(d[[key]], version = attr(d, "metadata")$version)))
filter(revisions, TIME_PERIOD == "2021-01-01") %>% arrange(created)
| Time Period | Vintage | Real GDP Value | Version (Base Period) |
|---|---|---|---|
| 2021Q1 | Jun 2021 | 3 044 465 | 1.2.2 |
| 2021Q1 | Sep 2021 | 4 471 258 | 1.2.3 |
| 2021Q1 | Dec 2021 | 4 466 826 | 1.2.3 |
| 2021Q1 | Mar 2022 | 4 471 955 | 1.2.3 |
| 2021Q1 | Jun 2022 | 4 483 290 | 1.2.3 |
| 2021Q1 | Jun 2023 | 4 496 641 | 1.2.3 |
| 2021Q1 | Jun 2024 | 4 486 493 | 1.2.3 |
| 2021Q1 | Jun 2025 | 4 484 831 | 1.2.3 |
read_dataset(hist_obs = TRUE, tidy = FALSE) optionEach row is one published value with the time it was published (created, in UTC): real GDP for 2021Q1 has one value in 1.2.2, from the June 2021 QB at 2010 prices, and one for each revision since in 1.2.3, at 2015 prices.
Check a series’ metadata (base period and notes)
ppi <- read_dataset("QB_BUSCYCL", version = "1.2.17", # PPI on December 2020 = 100
series_key = "KBP7180N.M.N.S.I", wide = FALSE)
ppi$metadata[c("label", "base_period", "comment")]
Tl;dr
- Pass
versionexplicitly forQB_BUSCYCL. - Check
COMMENTandBASE_PERbefore combining releases or versions.