Repository: IAMconsortium/pyam

Issue:
Remove region-mappings from pyam core
The pyam directory contains a region-mapping csv from some long-ago project.

Given that this functionality is now superseded by the nomenclature package and the common-definitions repo (see [here](https://github.com/IAMconsortium/common-definitions/blob/main/definitions/region/common.yaml)), I suggest to remove the region-mapping from the pyam source code.

Any objections @gidden? Anyone else who ever used this?

Discussion:
codecov[bot]: ## [Codecov](https://app.codecov.io/gh/IAMconsortium/pyam/pull/773?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=IAMconsortium) Report
> Merging [#773](https://app.codecov.io/gh/IAMconsortium/pyam/pull/773?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=IAMconsortium) (7737848) into [main](https://app.codecov.io/gh/IAMconsortium/pyam/commit/525ede9a3310198bd497f04041d4a13149adad43?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=IAMconsortium) (525ede9) will **decrease** coverage by `0.2%`.
> The diff coverage is `0.0%`.

```diff
@@           Coverage Diff           @@
##            main    #773     +/-   ##
=======================================
- Coverage   94.6%   94.5%   -0.2%     
=======================================
  Files         62      62             
  Lines       6107    6027     -80     
=======================================
- Hits        5779    5696     -83     
- Misses       328     331      +3     
```


| [Files Changed](https://app.codecov.io/gh/IAMconsortium/pyam/pull/773?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=IAMconsortium) | Coverage Δ | |
|---|---|---|
| [pyam/core.py](https://app.codecov.io/gh/IAMconsortium/pyam/pull/773?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=IAMconsortium#diff-cHlhbS9jb3JlLnB5) | `95.0% <0.0%> (-0.2%)` | :arrow_down: |
| [pyam/run\_control.py](https://app.codecov.io/gh/IAMconsortium/pyam/pull/773?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=IAMconsortium#diff-cHlhbS9ydW5fY29udHJvbC5weQ==) | `72.0% <ø> (ø)` | |
| [tests/test\_core.py](https://app.codecov.io/gh/IAMconsortium/pyam/pull/773?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=IAMconsortium#diff-dGVzdHMvdGVzdF9jb3JlLnB5) | `100.0% <ø> (ø)` | |

... and [2 files with indirect coverage changes](https://app.codecov.io/gh/IAMconsortium/pyam/pull/773/indirect-changes?src=pr&el=tree-more&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=IAMconsortium)



Patch:
diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md
index 04ddcc1..2c1ae36 100644
--- a/RELEASE_NOTES.md
+++ b/RELEASE_NOTES.md
@@ -29,9 +29,12 @@ approach to exposing pyam-internals at the package level, requiring a more expli
 import of these methods. For example, use `pyam.utils.to_list()`
 instead of `pyam.to_list()`.
 
-## Individual updates
+PR [#773](https://github.com/IAMconsortium/pyam/pull/773) removed the `map_regions()`
+method. This feature is now implemented via the **nomenclature.RegionProcessor** class.
 
+## Individual updates
 
+- [#773](https://github.com/IAMconsortium/pyam/pull/773) Remove `map_regions()` and default mappings csv
 - [#772](https://github.com/IAMconsortium/pyam/pull/772) Show all missing rows for `require_data()`
 - [#771](https://github.com/IAMconsortium/pyam/pull/771) Refactor to start a separate validation module
 - [#766](https://github.com/IAMconsortium/pyam/pull/766) Use **ixmp4** for credentials to access a Scenario Explorer database
diff --git a/docs/api.rst b/docs/api.rst
index 32697b8..da1b3c3 100644
--- a/docs/api.rst
+++ b/docs/api.rst
@@ -23,29 +23,23 @@ and methods.
    api/timeseries
    api/variables
 
-**Notebook logging behaviour**
+Logging behaviour in Jupyter notebooks
+--------------------------------------
 
-|pyam| wants to provide sensible defaults for users unfamiliar with
-`setting up python's logging library <https://realpython.com/python-logging/#basic-configurations>`_,
-and therefore will provide a basic configuration by invoking
+The |pyam| package wants to provide sensible defaults for users unfamiliar with setting
+up python's logging library (`read more`_), and therefore will add a streamhandler if
+(and only if) it determines to be running within a notebook.
 
-.. code-block:: python
-
-   import logging
-   logging.basicConfig(level="INFO", format="%(name)s - %(levelname)s: %(message)s")
-
-if (and only if):
-
-1. it determines to be running within a notebook, and
-2. logging is still *unconfigured by the time the first logging message by |pyam| is to be emitted*.
+.. _`read more` : https://realpython.com/python-logging/#basic-configurations
 
-**Intersphinx mapping**
+Intersphinx mapping
+-------------------
 
 To use sphinx.ext.intersphinx_ for generating automatic links from your project
 to the documentation of |pyam| classes and functions, please add the following
 to your project's :code:`conf.py`:
 
-.. _sphinx.ext.intersphinx: https://www.sphinx-doc.org/en/master/usage/extensions/intersphinx.html
+.. _sphinx.ext.intersphinx : https://www.sphinx-doc.org/en/master/usage/extensions/intersphinx.html
 
 .. code-block:: python
 
diff --git a/docs/conf.py b/docs/conf.py
index 598d6d5..ce6cfd8 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -328,6 +328,7 @@ intersphinx_mapping = {
     "plotly": ("https://plotly.com/python-api-reference/", None),
     "pandas_datareader": ("https://pandas-datareader.readthedocs.io/en/stable", None),
     "unfccc_di_api": ("https://unfccc-di-api.readthedocs.io/en/stable", None),
+    "nomenclature": ("https://nomenclature-iamc.readthedocs.io/en/stable", None),
 }
 
 # Set up the plotting gallery with plotly scraper
diff --git a/pyam/__init__.py b/pyam/__init__.py
index 6abb078..f0d1208 100644
--- a/pyam/__init__.py
+++ b/pyam/__init__.py
@@ -15,7 +15,6 @@ from pyam.core import (
     validate,
 )
 from pyam.statistics import Statistics
-from pyam.logging import *
 from pyam.iiasa import read_iiasa, lazy_read_iiasa  # noqa: F401
 from pyam.datareader import read_worldbank  # noqa: F401
 from pyam.unfccc import read_unfccc  # noqa: F401
@@ -23,8 +22,6 @@ from pyam.testing import assert_iamframe_equal  # noqa: F401
 from pyam.run_control import run_control  # noqa: F401
 from pyam.utils import IAMC_IDX  # noqa: F401
 
-from pyam.logging import defer_logging_config
-
 logger = logging.getLogger(__name__)
 
 # get version number either from git (preferred) or metadata
@@ -44,15 +41,15 @@ try:
 
     shell = get_ipython()
     if isinstance(shell, ZMQInteractiveShell):
-        # set up basic logging if running in a notebook
-        log_msg = "Running in a notebook, setting up a basic logging at level INFO"
+        # harmonize formatting of ixmp4 and pyam logging
+        ixmp4_logger = logging.getLogger("ixmp4")
+        ixmp4_logger.removeHandler(ixmp4_logger.handlers[0])
 
-        defer_logging_config(
-            logger,
-            log_msg,
-            level="INFO",
-            format="%(name)s - %(levelname)s: %(message)s",
-        )
+        handler = logging.StreamHandler()
+        handler.setFormatter(logging.Formatter("%(name)s - %(levelname)s: %(message)s"))
+
+        for _logger in [logger, ixmp4_logger]:
+            _logger.addHandler(handler)
 
         # deactivate in-cell scrolling in a Jupyter notebook
         shell.run_cell_magic(
diff --git a/pyam/core.py b/pyam/core.py
index 74df64a..1ced3f1 100755
--- a/pyam/core.py
+++ b/pyam/core.py
@@ -69,7 +69,7 @@ from pyam.index import (
     append_index_col,
 )
 from pyam.time import swap_time_for_year, swap_year_for_time
-from pyam.logging import raise_data_error, deprecation_warning
+from pyam.logging import raise_data_error, deprecation_warning, format_log_message
 from pyam.validation import _exclude_on_fail
 
 logger = logging.getLogger(__name__)
@@ -160,7 +160,6 @@ class IamDataFrame(object):
 
         # read from file
         if isinstance(data, Path):
-            data = Path(data)  # casting str or LocalPath to Path
             if not data.is_file():
                 raise FileNotFoundError(f"No such file: '{data}'")
             logger.info(f"Reading file {data}")
@@ -1544,6 +1543,14 @@ class IamDataFrame(object):
         --------
         add : Add timeseries data items `a` and `b` along an `axis`
         aggregate : Aggregate timeseries data along the `variable` hierarchy.
+        nomenclature.RegionProcessor : Processing of model-specific region-mappings.
+
+        Notes
+        -----
+        The :class:`nomenclature-iamc` package supports structured processing
+        of many-to-many-region mappings. Read the `user guide`_ for more information.
+
+        .. _`user guide` : https://nomenclature-iamc.readthedocs.io/en/stable/user_guide.html
 
         """
         _df = _aggregate_region(
@@ -2488,9 +2495,7 @@ class IamDataFrame(object):
         # return the package (needs to reloaded because `tmp` was deleted)
         return Package(path)
 
-    def load_meta(
-        self, path, sheet_name="meta", ignore_conflict=False, *args, **kwargs
-    ):
+    def load_meta(self, path, sheet_name="meta", ignore_conflict=False, **kwargs):
         """Load 'meta' indicators from file
 
         Parameters
@@ -2505,59 +2510,57 @@ class IamDataFrame(object):
         kwargs
             Passed to :func:`pandas.read_excel` or :func:`pandas.read_csv`
         """
+
         # load from file
         path = path if isinstance(path, pd.ExcelFile) else Path(path)
-        df = read_pandas(path, sheet_name=sheet_name, **kwargs)
-
-        # cast model-scenario column headers to lower-case (if necessary)
-        df = df.rename(columns=dict([(i.capitalize(), i) for i in META_IDX]))
+        meta = read_pandas(path, sheet_name=sheet_name, **kwargs)
 
-        # check that required index columns exist
-        missing_cols = [c for c in self.index.names if c not in df.columns]
-        if missing_cols:
+        # cast index-column headers to lower-case, check that required index exists
+        meta = meta.rename(columns=dict([(i.capitalize(), i) for i in META_IDX]))
+        if missing_cols := [c for c in self.index.names if c not in meta.columns]:
             raise ValueError(
-                f"File {Path(path)} (sheet {sheet_name}) "
-                f"missing required index columns {missing_cols}!"
+                f"Missing index columns for meta indicators: {missing_cols}"
             )
 
-        # set index, filter to relevant scenarios from imported file
-        n = len(df)
-        df.set_index(self.index.names, inplace=True)
-        df = df.loc[self.meta.index.intersection(df.index)]
-
-        # skip import of meta indicators if np
-        if not n:
-            logger.info(f"No scenarios found in sheet {sheet_name}")
+        # skip import of meta indicators if no rows in meta
+        if not len(meta.index):
+            logger.warning(f"No scenarios found in sheet {sheet_name}")
             return
 
-        msg = "Reading meta indicators"
-        # indicate if not all scenarios are included in the meta file
-        if len(df) < len(self.meta):
-            i = len(self.meta)
-            msg += f" for {len(df)} out of {i} scenario{s(i)}"
-
-        # indicate if more scenarios exist in meta file than in self
-        invalid = n - len(df)
-        if invalid:
-            msg += f", ignoring {invalid} scenario{s(invalid)} from file"
-            logger.warning(msg)
-        else:
-            logger.info(msg)
+        # set index, check consistency between existing index and meta
+        meta.set_index(self.index.names, inplace=True)
+
+        missing = self.index.difference(meta.index)
+        invalid = meta.index.difference(self.index)
+
+        if not missing.empty:
+            logger.warning(
+                format_log_message(
+                    "No meta indicators for the following scenarios", missing
+                )
+            )
+        if not invalid.empty:
+            logger.warning(
+                format_log_message(
+                    "Ignoring meta indicators for the following scenarios", invalid
+                )
+            )
+            meta = meta.loc[self.meta.index.intersection(meta.index)]
 
         # in pyam < 2.0, an "exclude" columns was part of the `meta` attribute
         # this section ensures compatibility with xlsx files created with pyam < 2.0
-        if "exclude" in df.columns:
+        if "exclude" in meta.columns:
             logger.info(
                 f"Found column 'exclude' in sheet '{sheet_name}', "
                 "moved to attribute `IamDataFrame.exclude`."
             )
             self._exclude = merge_exclude(
-                df.exclude, self.exclude, ignore_conflict=ignore_conflict
+                meta.exclude, self.exclude, ignore_conflict=ignore_conflict
             )
-            df.drop(columns="exclude", inplace=True)
+            meta.drop(columns="exclude", inplace=True)
 
         # merge imported meta indicators
-        self.meta = merge_meta(df, self.meta, ignore_conflict=ignore_conflict)
+        self.meta = merge_meta(meta, self.meta, ignore_conflict=ignore_conflict)
 
     def map_regions(
         self,
@@ -2569,98 +2572,10 @@ class IamDataFrame(object):
         remove_duplicates=False,
         inplace=False,
     ):
-        """Plot regional data for a single model, scenario, variable, and year
-
-        see pyam.plotting.region_plot() for all available options
-
-        Parameters
-        ----------
-        map_col : str
-            The column used to map new regions to. Common examples include
-            iso and 5_region.
-        agg : str, optional
-            Perform a data aggregation. Options include: sum.
-        copy_col : str, optional
-            Copy the existing region data into a new column for later use.
-        fname : str, optional
-            Use a non-default region mapping file
-        region_col : string, optional
-            Use a non-default column name for regions to map from.
-        remove_duplicates : bool, optional
-            If there are duplicates in the mapping from one regional level to
-            another, then remove these duplicates by counting the most common
-            mapped value.
-            This option is most useful when mapping from high resolution
-            (e.g., model regions) to low resolution (e.g., 5_region).
-        inplace : bool, optional
-            if True, do operation inplace and return None
-        """
-        fname = fname or run_control()["region_mapping"]["default"]
-        mapping = read_pandas(Path(fname)).rename(str.lower, axis="columns")
-        map_col = map_col.lower()
-
-        ret = self.copy() if not inplace else self
-        _df = ret.data
-        columns_orderd = _df.columns
-
-        # merge data
-        dfs = []
-        for model in self.model:
-            df = _df[_df["model"] == model]
-            _col = region_col or "{}.REGION".format(model)
-            _map = mapping.rename(columns={_col.lower(): "region"})
-            _map = _map[["region", map_col]].dropna().drop_duplicates()
-            _map = _map[_map["region"].isin(_df["region"])]
-            if remove_duplicates and _map["region"].duplicated().any():
-                # find duplicates
-                where_dup = _map["region"].duplicated(keep=False)
-                dups = _map[where_dup]
-                logger.warning(
-                    """
-                Duplicate entries found for the following regions.
-                Mapping will occur only for the most common instance.
-                {}""".format(
-                        dups["region"].unique()
-                    )
-                )
-                # get non duplicates
-                _map = _map[~where_dup]
-                # order duplicates by the count frequency
-                dups = (
-                    dups.groupby(["region", map_col])
-                    .size()
-                    .reset_index(name="count")
-                    .sort_values(by="count", ascending=False)
-                    .drop("count", axis=1)
-                )
-                # take top occurance
-                dups = dups[~dups["region"].duplicated(keep="first")]
-                # combine them back
-                _map = pd.concat([_map, dups])
-            if copy_col is not None:
-                df[copy_col] = df["region"]
-
-            df = (
-                df.merge(_map, on="region")
-                .drop("region", axis=1)
-                .rename(columns={map_col: "region"})
-            )
-            dfs.append(df)
-        df = pd.concat(dfs)
-
-        # perform aggregations
-        if agg == "sum":
-            df = df.groupby(self.dimensions).sum().reset_index()
-
-        df = (
-            df.reindex(columns=columns_orderd)
-            .sort_values(SORT_IDX)
-            .reset_index(drop=True)
+        # TODO: deprecated, remove for release >= 2.1
+        raise DeprecationWarning(
+            "This method was removed. Please use `aggregate_region()` instead."
         )
-        ret._data = df.set_index(self.dimensions).value
-
-        if not inplace:
-            return ret
 
 
 def _meta_idx(data):
@@ -2849,7 +2764,7 @@ def filter_by_meta(data, df, join_meta=False, **kwargs):
         to nan if `(model, scenario)` not in `df.meta.index`)
     """
     if not set(META_IDX).issubset(data.index.names + list(data.columns)):
-        raise ValueError("Missing required index dimensions or columns!")
+        raise ValueError("Missing required index dimensions or data columns.")
 
     meta = pd.DataFrame(df.meta[list(set(kwargs) - set(META_IDX))].copy())
 
diff --git a/pyam/logging.py b/pyam/logging.py
index 6587eff..ee3f4be 100644
--- a/pyam/logging.py
+++ b/pyam/logging.py
@@ -1,17 +1,18 @@
 from contextlib import contextmanager
-import logging
+from logging import *
+
 import pandas as pd
 import warnings
 
 
-logger = logging.getLogger(__name__)
+logger = getLogger(__name__)
 
 
 @contextmanager
 def adjust_log_level(logger="pyam", level="ERROR"):
     """Context manager to change log level"""
     if isinstance(logger, str):
-        logger = logging.getLogger(logger)
+        logger = getLogger(logger)
     old_level = logger.getEffectiveLevel()
     logger.setLevel(level)
     yield
@@ -26,58 +27,13 @@ def deprecation_warning(msg, item="This method", stacklevel=3):
 
 
 def raise_data_error(msg, data):
-    """Utils function to format error message from data formatting"""
+    """Format error message with (head of) data table and raise"""
+    raise ValueError(format_log_message(msg, data))
+
+
+def format_log_message(msg, data):
+    """Utils function to format message with (head of) data table"""
     if isinstance(data, pd.MultiIndex):
         data = data.to_frame(index=False)
     data = data.drop_duplicates()
-    msg = f"{msg}:\n{data.head()}" + ("\n..." if len(data) > 5 else "")
-    raise ValueError(msg)
-
-
-class ConfigPseudoHandler(logging.Handler):
-    """Pseudo logging handler to defer configuring logging until the first message
-
-    Registers itself as a handler for the provided logger and temporarily
-    sets the logger as sensitive to INFO messages. Upon receival of the first
-    message (of at least INFO level), it configures logging with the provided
-    `config_kwargs` and prints `log_msg`
-
-    Parameters
-    ----------
-    logger : logging.Logger
-        Logger to listen for the first message
-    log_msg : str, optional
-        Message to print once logging is configured, by default None
-    **config_kwargs
-        Arguments to pass on to logging.basicConfig
-    """
-
-    def __init__(self, logger, log_msg=None, **config_kwargs):
-        super().__init__()
-
-        self.logger = logger
-        self.log_msg = log_msg
-        self.config_kwargs = config_kwargs
-
-        self.logger.addHandler(self)
-
-        # temporarily set the logging level to a non-standard value,
-        # slightly below logging.INFO == 20 and use that as a sentinel
-        # to switch back to logging.NOTSET later
-        self.logger.setLevel(19)
-
-    def emit(self, record):
-        self.logger.removeHandler(self)
-
-        if self.logger.level == 19:
-            self.logger.setLevel(logging.NOTSET)
-
-        if not self.logger.root.hasHandlers():
-            logging.basicConfig(**self.config_kwargs)
-
-            if self.log_msg is not None:
-                self.logger.info(self.log_msg)
-
-
-# Give the Handler a function like alias
-defer_logging_config = ConfigPseudoHandler
+    return f"{msg}:\n{data.head()}" + ("\n..." if len(data) > 5 else "")
diff --git a/pyam/region_mappings/default_mapping.csv b/pyam/region_mappings/default_mapping.csv
deleted file mode 100755
index 1c78574..0000000
--- a/pyam/region_mappings/default_mapping.csv
+++ /dev/null
@@ -1,252 +0,0 @@
-ISO,Country,R5_region,AIM/CGE.REGION,AIM/CGE.NAME,GCAM4.REGION,GCAM4.NAME,IMAGE.REGION,IMAGE.NAME,MESSAGE-GLOBIOM.REGION,MESSAGE-GLOBIOM.NAME,REMIND-MAGPIE.REGION,REMIND-MAGPIE.NAME
-ATG,Antigua and Barbuda,R5LAM,XLM,Rest of Brazil,Central America and Caribbean,Central America and Caribbean,RCAM,Rest C. America,LAM,Latin America and the Caribbean,LAM,Latin America and the Caribbean
-DZA,Algeria,R5MAF,XNF,North Africa,Africa_Northern,Africa_Northern,NAF,N. Africa,MEA,Middle East and North Africa,MEA,Middle East and North Africa
-AZE,Azerbaijan,R5REF,CIS,Former USSR,Central Asia,Central Asia,RUS,Russia,FSU,Former Soviet Union,MEA,Middle East and North Africa
-ALB,Albania,R5OECD,XER,Rest of Europe,Europe_Non_EU,Europe_Non_EU,CEU,C. Europe,EEU,Eastern Europe,ROW,rest of the World
-ARM,Armenia,R5REF,CIS,Former USSR,Central Asia,Central Asia,RUS,Russia,FSU,Former Soviet Union,MEA,Middle East and North Africa
-AGO,Angola,R5MAF,XAF,Other Africa,Africa_Southern,Africa_Southern,RSAF,Rest S. Africa,AFR,Sub-saharan Africa,AFR,Sub-saharan Africa
-ASM,American Samoa,R5ASIA,XSA,Rest of Asia,Southeast Asia,Southeast Asia,OCE,Oceania,PAS,Other Pacific Asia,OAS,other Asia
-ARG,Argentina,R5LAM,XLM,Rest of Brazil,Argentina,Argentina,RSAM,Rest S. America,LAM,Latin America and the Caribbean,LAM,Latin America and the Caribbean
-AUS,Australia,R5OECD,XOC,New Zealand and Australia,Australia_NZ,Australia_NZ,OCE,Oceania,PAO,Pacific OECD,ROW,rest of the World
-BHR,Bahrain,R5MAF,XME,Middle East,Middle East,Middle East,ME,Middle East,MEA,Middle East and North Africa,MEA,Middle East and North Africa
-BRB,Barbados,R5LAM,XLM,Rest of Brazil,Central America and Caribbean,Central America and Caribbean,RCAM,Rest C. America,LAM,Latin America and the Caribbean,LAM,Latin America and the Caribbean
-BMU,Bermuda,R5LAM,XLM,Rest of Brazil,Central America and Caribbean,Central America and Caribbean,RCAM,Rest C. America,LAM,Latin America and the Caribbean,LAM,Latin America and the Caribbean
-BHS,Bahamas,R5LAM,XLM,Rest of Brazil,Central America and Caribbean,Central America and Caribbean,RCAM,Rest C. America,LAM,Latin America and the Caribbean,LAM,Latin America and the Caribbean
-BGD,Bangladesh,R5ASIA,XSA,Rest of Asia,South Asia,South Asia,RSAS,Rest S. Asia,SAS,South Asia,OAS,other Asia
-BLZ,Belize,R5LAM,XLM,Rest of Brazil,Central America and Caribbean,Central America and Caribbean,RCAM,Rest C. America,LAM,Latin America and the Caribbean,LAM,Latin America and the Caribbean
-BIH,Bosnia and Herzegovina,R5OECD,XER,Rest of Europe,Europe_Non_EU,Europe_Non_EU,CEU,C. Europe,EEU,Eastern Europe,ROW,rest of the World
-BOL,Bolivia,R5LAM,XLM,Rest of Brazil,South America_Southern,South America_Southern,RSAM,Rest S. America,LAM,Latin America and the Caribbean,LAM,Latin America and the Caribbean
-MMR,Burma,R5ASIA,XSE,Rest of East and South East Asia,Southeast Asia,Southeast Asia,SEAS,SE. Asia,PAS,Other Pacific Asia,OAS,other Asia
-BEN,Benin,R5MAF,XAF,Other Africa,Africa_Western,Africa_Western,WAF,W. Africa,AFR,Sub-saharan Africa,AFR,Sub-saharan Africa
-SLB,Solomon Islands,R5ASIA,XSA,Rest of Asia,Southeast Asia,Southeast Asia,OCE,Oceania,PAS,Other Pacific Asia,OAS,other Asia
-BRA,Brazil,R5LAM,BRA,Brazil,Brazil,Brazil,BRA,Brazil,LAM,Latin America and the Caribbean,LAM,Latin America and the Caribbean
-BGR,Bulgaria,R5OECD,XER,Rest of Europe,EU-12,EU-12,CEU,C. Europe,EEU,Eastern Europe,EUR,EU 27
-BRN,Brunei Darussalam,R5ASIA,XSA,Rest of Asia,Southeast Asia,Southeast Asia,SEAS,SE. Asia,PAS,Other Pacific Asia,OAS,other Asia
-CAN,Canada,R5OECD,CAN,Canada,Canada,Canada,CAN,Canada,NAM,North America,ROW,rest of the World
-KHM,Cambodia,R5ASIA,XSE,Rest of East and South East Asia,Southeast Asia,Southeast Asia,SEAS,SE. Asia,CPA,Centrally Planned Asia and China,OAS,other Asia
-LKA,Sri Lanka,R5ASIA,XSA,Rest of Asia,South Asia,South Asia,RSAS,Rest S. Asia,SAS,South Asia,OAS,other Asia
-COG,Congo,R5MAF,XAF,Other Africa,Africa_Western,Africa_Western,WAF,W. Africa,AFR,Sub-saharan Africa,AFR,Sub-saharan Africa
-COD,Democratic Republic of the Congo,R5MAF,XAF,Other Africa,Africa_Western,Africa_Western,WAF,W. Africa,AFR,Sub-saharan Africa,AFR,Sub-saharan Africa
-BDI,Burundi,R5MAF,XAF,Other Africa,Africa_Eastern,Africa_Eastern,EAF,E. Africa,AFR,Sub-saharan Africa,AFR,Sub-saharan Africa
-CHN,China,R5ASIA,CHN,China,China,China,CHN,China,CPA,Centrally Planned Asia and China,CHN,China
-AFG,Afghanistan,R5ASIA,XSA,Rest of Asia,South Asia,South Asia,RSAS,Rest S. Asia,SAS,South Asia,OAS,other Asia
-BTN,Bhutan,R5ASIA,XSA,Rest of Asia,South Asia,South Asia,RSAS,Rest S. Asia,SAS,South Asia,OAS,other Asia
-CHL,Chile,R5LAM,XLM,Rest of Brazil,South America_Southern,South America_Southern,RSAM,Rest S. America,LAM,Latin America and the Caribbean,LAM,Latin America and the Caribbean
-CYM,Cayman Islands,R5LAM,XLM,Rest of Brazil,Central America and Caribbean,Central America and Caribbean,RCAM,Rest C. America,LAM,Latin America and the Caribbean,LAM,Latin America and the Caribbean
-CMR,Cameroon,R5MAF,XAF,Other Africa,Africa_Western,Africa_Western,WAF,W. Africa,AFR,Sub-saharan Africa,AFR,Sub-saharan Africa
-TCD,Chad,R5MAF,XAF,Other Africa,Africa_Western,Africa_Western,WAF,W. Africa,AFR,Sub-saharan Africa,AFR,Sub-saharan Africa
-COM,Comoros,R5MAF,XAF,Other Africa,Africa_Eastern,Africa_Eastern,EAF,E. Africa,AFR,Sub-saharan Africa,AFR,Sub-saharan Africa
-COL,Colombia,R5LAM,XLM,Rest of Brazil,Colombia,Colombia,RSAM,Rest S. America,LAM,Latin America and the Caribbean,LAM,Latin America and the Caribbean
-CRI,Costa Rica,R5LAM,XLM,Rest of Brazil,Central America and Caribbean,Central America and Caribbean,RCAM,Rest C. America,LAM,Latin America and the Caribbean,LAM,Latin America and the Caribbean
-CAF,Central African Republic,R5MAF,XAF,Other Africa,Africa_Western,Africa_Western,WAF,W. Africa,AFR,Sub-saharan Africa,AFR,Sub-saharan Africa
-CUB,Cuba,R5LAM,XLM,Rest of Brazil,Central America and Caribbean,Central America and Caribbean,RCAM,Rest C. America,LAM,Latin America and the Caribbean,LAM,Latin America and the Caribbean
-CPV,Cape Verde,R5MAF,XAF,Other Africa,Africa_Western,Africa_Western,WAF,W. Africa,AFR,Sub-saharan Africa,AFR,Sub-saharan Africa
-COK,Cook Islands,R5ASIA,XSA,Rest of Asia,Southeast Asia,Southeast Asia,OCE,Oceania,PAS,Other Pacific Asia,OAS,other Asia
-CYP,Cyprus,R5OECD,XE25,EU,EU-12,EU-12,CEU,C. Europe,WEU,Western Europe,EUR,EU 27
-DNK,Denmark,R5OECD,XE25,EU,EU-15,EU-15,WEU,W. Europe,WEU,Western Europe,EUR,EU 27
-DJI,Djibouti,R5MAF,XAF,Other Africa,Africa_Eastern,Africa_Eastern,EAF,E. Africa,AFR,Sub-saharan Africa,AFR,Sub-saharan Africa
-DMA,Dominica,R5LAM,XLM,Rest of Brazil,Central America and Caribbean,Central America and Caribbean,RCAM,Rest C. America,LAM,Latin America and the Caribbean,LAM,Latin America and the Caribbean
-DOM,Dominican Republic,R5LAM,XLM,Rest of Brazil,Central America and Caribbean,Central America and Caribbean,RCAM,Rest C. America,LAM,Latin America and the Caribbean,LAM,Latin America and the Caribbean
-ECU,Ecuador,R5LAM,XLM,Rest of Brazil,South America_Southern,South America_Southern,RSAM,Rest S. America,LAM,Latin America and the Caribbean,LAM,Latin America and the Caribbean
-EGY,Egypt,R5MAF,XNF,North Africa,Africa_Northern,Africa_Northern,NAF,N. Africa,MEA,Middle East and North Africa,MEA,Middle East and North Africa
-IRL,Ireland,R5OECD,XE25,EU,EU-15,EU-15,WEU,W. Europe,WEU,Western Europe,EUR,EU 27
-GNQ,Equatorial Guinea,R5MAF,XAF,Other Africa,Africa_Western,Africa_Western,WAF,W. Africa,AFR,Sub-saharan Africa,AFR,Sub-saharan Africa
-EST,Estonia,R5OECD,XE25,EU,EU-12,EU-12,CEU,C. Europe,EEU,Eastern Europe,EUR,EU 27
-ERI,Eritrea,R5MAF,XAF,Other Africa,Africa_Eastern,Africa_Eastern,EAF,E. Africa,AFR,Sub-saharan Africa,AFR,Sub-saharan Africa
-SLV,El Salvador,R5LAM,XLM,Rest of Brazil,Central America and Caribbean,Central America and Caribbean,RCAM,Rest C. America,LAM,Latin America and the Caribbean,LAM,Latin America and the Caribbean
-ETH,Ethiopia,R5MAF,XAF,Other Africa,Africa_Eastern,Africa_Eastern,EAF,E. Africa,AFR,Sub-saharan Africa,AFR,Sub-saharan Africa
-AUT,Austria,R5OECD,XE25,EU,EU-15,EU-15,WEU,W. Europe,WEU,Western Europe,EUR,EU 27
-CZE,Czech Republic,R5OECD,XE25,EU,EU-12,EU-12,CEU,C. Europe,EEU,Eastern Europe,EUR,EU 27
-GUF,French Guiana,R5LAM,XLM,Rest of Brazil,South America_Northern,South America_Northern,RSAM,Rest S. America,LAM,Latin America and the Caribbean,LAM,Latin America and the Caribbean
-FIN,Finland,R5OECD,XE25,EU,EU-15,EU-15,WEU,W. Europe,WEU,Western Europe,EUR,EU 27
-FJI,Fiji,R5ASIA,XSA,Rest of Asia,Southeast Asia,Southeast Asia,OCE,Oceania,PAS,Other Pacific Asia,OAS,other Asia
-FLK,Falkland Islands (Malvinas),R5LAM,XLM,Rest of Brazil,EU-15,EU-15,RSAM,Rest S. America,LAM,Latin America and the Caribbean,LAM,Latin America and the Caribbean
-FSM,"Micronesia,  Federated States of",R5ASIA,XSA,Rest of Asia,Southeast Asia,Southeast Asia,OCE,Oceania,PAS,Other Pacific Asia,OAS,other Asia
-PYF,French Polynesia,R5ASIA,XSA,Rest of Asia,Southeast Asia,Southeast Asia,OCE,Oceania,PAS,Other Pacific Asia,OAS,other Asia
-FRA,France,R5OECD,XE25,EU,EU-15,EU-15,WEU,W. Europe,WEU,Western Europe,EUR,EU 27
-GMB,Gambia,R5MAF,XAF,Other Africa,Africa_Western,Africa_Western,WAF,W. Africa,AFR,Sub-saharan Africa,AFR,Sub-saharan Africa
-GAB,Gabon,R5MAF,XAF,Other Africa,Africa_Western,Africa_Western,WAF,W. Africa,AFR,Sub-saharan Africa,AFR,Sub-saharan Africa
-GEO,Georgia,R5REF,CIS,Former USSR,Central Asia,Central Asia,RUS,Russia,FSU,Former Soviet Union,MEA,Middle East and North Africa
-GHA,Ghana,R5MAF,XAF,Other Africa,Africa_Western,Africa_Western,WAF,W. Africa,AFR,Sub-saharan Africa,AFR,Sub-saharan Africa
-GRD,Grenada,R5LAM,XLM,Rest of Brazil,Central America and Caribbean,Central America and Caribbean,RCAM,Rest C. America,LAM,Latin America and the Caribbean,LAM,Latin America and the Caribbean
-GRL,Greenland,R5OECD,XLM,Rest of Brazil,EU-15,EU-15,RSAF,Rest S. Africa,WEU,Western Europe,EUR,EU 27
-DEU,Germany,R5OECD,XE25,EU,EU-15,EU-15,WEU,W. Europe,WEU,Western Europe,EUR,EU 27
-GUM,Guam,R5OECD,XSA,Rest of Asia,Southeast Asia,Southeast Asia,USA,USA,NAM,North America,OAS,other Asia
-GRC,Greece,R5OECD,XE25,EU,EU-15,EU-15,WEU,W. Europe,WEU,Western Europe,EUR,EU 27
-GTM,Guatemala,R5LAM,XLM,Rest of Brazil,Central America and Caribbean,Central America and Caribbean,RCAM,Rest C. America,LAM,Latin America and the Caribbean,LAM,Latin America and the Caribbean
-GIN,Guinea,R5MAF,XAF,Other Africa,Africa_Western,Africa_Western,WAF,W. Africa,AFR,Sub-saharan Africa,AFR,Sub-saharan Africa
-GUY,Guyana,R5LAM,XLM,Rest of Brazil,South America_Northern,South America_Northern,RSAM,Rest S. America,LAM,Latin America and the Caribbean,LAM,Latin America and the Caribbean
-HTI,Haiti,R5LAM,XLM,Rest of Brazil,Central America and Caribbean,Central America and Caribbean,RCAM,Rest C. America,LAM,Latin America and the Caribbean,LAM,Latin America and the Caribbean
-HND,Honduras,R5LAM,XLM,Rest of Brazil,Central America and Caribbean,Central America and Caribbean,RCAM,Rest C. America,LAM,Latin America and the Caribbean,LAM,Latin America and the Caribbean
-HRV,Croatia,R5OECD,XER,Rest of Europe,Europe_Non_EU,Europe_Non_EU,CEU,C. Europe,EEU,Eastern Europe,ROW,rest of the World
-HUN,Hungary,R5OECD,XE25,EU,EU-12,EU-12,CEU,C. Europe,EEU,Eastern Europe,EUR,EU 27
-ISL,Iceland,R5OECD,XER,Rest of Europe,European Free Trade Association,European Free Trade Association,WEU,W. Europe,WEU,Western Europe,ROW,rest of the World
-IND,India,R5ASIA,IND,India,India,India,INDIA,India,SAS,South Asia,IND,India
-IRN,Iran (Islamic Republic of),R5MAF,XME,Middle East,Middle East,Middle East,ME,Middle East,MEA,Middle East and North Africa,MEA,Middle East and North Africa
-ISR,Israel,R5MAF,XME,Middle East,Middle East,Middle East,ME,Middle East,MEA,Middle East and North Africa,MEA,Middle East and North Africa
-ITA,Italy,R5OECD,XE25,EU,EU-15,EU-15,WEU,W. Europe,WEU,Western Europe,EUR,EU 27
-CIV,Cote dIvoire,R5MAF,XAF,Other Africa,Africa_Western,Africa_Western,WAF,W. Africa,AFR,Sub-saharan Africa,AFR,Sub-saharan Africa
-IRQ,Iraq,R5MAF,XME,Middle East,Middle East,Middle East,ME,Middle East,MEA,Middle East and North Africa,MEA,Middle East and North Africa
-JPN,Japan,R5OECD,JPN,Japan,Japan,Japan,JAP,Japan,PAO,Pacific OECD,JPN,Japan
-JAM,Jamaica,R5LAM,XLM,Rest of Brazil,Central America and Caribbean,Central America and Caribbean,RCAM,Rest C. America,LAM,Latin America and the Caribbean,LAM,Latin America and the Caribbean
-JOR,Jordan,R5MAF,XME,Middle East,Middle East,Middle East,ME,Middle East,MEA,Middle East and North Africa,MEA,Middle East and North Africa
-KEN,Kenya,R5MAF,XAF,Other Africa,Africa_Eastern,Africa_Eastern,EAF,E. Africa,AFR,Sub-saharan Africa,AFR,Sub-saharan Africa
-KGZ,Kyrgyzstan,R5REF,CIS,Former USSR,Central Asia,Central Asia,STAN,Kazakhstan region,FSU,Former Soviet Union,MEA,Middle East and North Africa
-PRK,"Korea, Democratic Peoples Republic of",R5ASIA,XSE,Rest of East and South East Asia,Southeast Asia,Southeast Asia,KOR,Korea,CPA,Centrally Planned Asia and China,OAS,other Asia
-KIR,Kiribati,R5ASIA,XSA,Rest of Asia,Southeast Asia,Southeast Asia,OCE,Oceania,PAS,Other Pacific Asia,OAS,other Asia
-KOR,"Korea,  Republic of",R5ASIA,XSE,Rest of East and South East Asia,South Korea,South Korea,KOR,Korea,PAS,Other Pacific Asia,OAS,other Asia
-KWT,Kuwait,R5MAF,XME,Middle East,Middle East,Middle East,ME,Middle East,MEA,Middle East and North Africa,MEA,Middle East and North Africa
-KAZ,Kazakhstan,R5REF,CIS,Former USSR,Central Asia,Central Asia,STAN,Kazakhstan region,FSU,Former Soviet Union,MEA,Middle East and North Africa
-LAO,Lao Peoples Democratic Republic,R5ASIA,XSE,Rest of East and South East Asia,Southeast Asia,Southeast Asia,SEAS,SE. Asia,CPA,Centrally Planned Asia and China,OAS,other Asia
-LBN,Lebanon,R5MAF,XME,Middle East,Middle East,Middle East,ME,Middle East,MEA,Middle East and North Africa,MEA,Middle East and North Africa
-LVA,Latvia,R5OECD,XE25,EU,EU-12,EU-12,CEU,C. Europe,EEU,Eastern Europe,EUR,EU 27
-BLR,Belarus,R5REF,CIS,Former USSR,Central Asia,Central Asia,UKR,Ukraine region,FSU,Former Soviet Union,ROW,rest of the World
-LTU,Lithuania,R5OECD,XE25,EU,EU-12,EU-12,CEU,C. Europe,EEU,Eastern Europe,EUR,EU 27
-LBR,Liberia,R5MAF,XAF,Other Africa,Africa_Western,Africa_Western,WAF,W. Africa,AFR,Sub-saharan Africa,AFR,Sub-saharan Africa
-SVK,Slovakia,R5OECD,XE25,EU,EU-12,EU-12,CEU,C. Europe,EEU,Eastern Europe,EUR,EU 27
-LIE,Liechtenstein,R5OECD,XER,Rest of Europe,European Free Trade Association,European Free Trade Association,WEU,W. Europe,WEU,Western Europe,ROW,rest of the World
-LBY,Libyan Arab Jamahiriya,R5MAF,XNF,North Africa,Africa_Northern,Africa_Northern,NAF,N. Africa,MEA,Middle East and North Africa,MEA,Middle East and North Africa
-MDG,Madagascar,R5MAF,XAF,Other Africa,Africa_Eastern,Africa_Eastern,EAF,E. Africa,AFR,Sub-saharan Africa,AFR,Sub-saharan Africa
-MTQ,Martinique,R5LAM,XLM,Rest of Brazil,Central America and Caribbean,Central America and Caribbean,RCAM,Rest C. America,LAM,Latin America and the Caribbean,LAM,Latin America and the Caribbean
-MNG,Mongolia,R5ASIA,XSE,Rest of East and South East Asia,Central Asia,Central Asia,CHN,China,CPA,Centrally Planned Asia and China,OAS,other Asia
-MSR,Montserrat,R5LAM,XLM,Rest of Brazil,Central America and Caribbean,Central America and Caribbean,RCAM,Rest C. America,LAM,Latin America and the Caribbean,LAM,Latin America and the Caribbean
-MKD,The former Yugoslav Republic of Macedonia,R5OECD,XER,Rest of Europe,Europe_Non_EU,Europe_Non_EU,CEU,C. Europe,EEU,Eastern Europe,ROW,rest of the World
-MLI,Mali,R5MAF,XAF,Other Africa,Africa_Western,Africa_Western,WAF,W. Africa,AFR,Sub-saharan Africa,AFR,Sub-saharan Africa
-MAR,Morocco,R5MAF,XNF,North Africa,Africa_Northern,Africa_Northern,NAF,N. Africa,MEA,Middle East and North Africa,MEA,Middle East and North Africa
-MUS,Mauritius,R5MAF,XAF,Other Africa,Africa_Eastern,Africa_Eastern,EAF,E. Africa,AFR,Sub-saharan Africa,AFR,Sub-saharan Africa
-MRT,Mauritania,R5MAF,XAF,Other Africa,Africa_Western,Africa_Western,WAF,W. Africa,AFR,Sub-saharan Africa,AFR,Sub-saharan Africa
-MLT,Malta,R5OECD,XE25,EU,EU-12,EU-12,WEU,W. Europe,WEU,Western Europe,EUR,EU 27
-OMN,Oman,R5MAF,XME,Middle East,Middle East,Middle East,ME,Middle East,MEA,Middle East and North Africa,MEA,Middle East and North Africa
-MDV,Maldives,R5ASIA,XSA,Rest of Asia,South Asia,South Asia,RSAS,Rest S. Asia,SAS,South Asia,OAS,other Asia
-MEX,Mexico,R5LAM,XLM,Rest of Brazil,Mexico,Mexico,MEX,Mexico,LAM,Latin America and the Caribbean,LAM,Latin America and the Caribbean
-MYS,Malaysia,R5ASIA,XSE,Rest of East and South East Asia,Southeast Asia,Southeast Asia,SEAS,SE. Asia,PAS,Other Pacific Asia,OAS,other Asia
-MOZ,Mozambique,R5MAF,XAF,Other Africa,Africa_Southern,Africa_Southern,RSAF,Rest S. Africa,AFR,Sub-saharan Africa,AFR,Sub-saharan Africa
-MWI,Malawi,R5MAF,XAF,Other Africa,Africa_Southern,Africa_Southern,RSAF,Rest S. Africa,AFR,Sub-saharan Africa,AFR,Sub-saharan Africa
-NCL,New Caledonia,R5ASIA,XSA,Rest of Asia,Southeast Asia,Southeast Asia,OCE,Oceania,PAS,Other Pacific Asia,OAS,other Asia
-NIU,Niue,R5ASIA,XSA,Rest of Asia,Southeast Asia,Southeast Asia,OCE,Oceania,PAS,Other Pacific Asia,OAS,other Asia
-NER,Niger,R5MAF,XAF,Other Africa,Africa_Western,Africa_Western,WAF,W. Africa,AFR,Sub-saharan Africa,AFR,Sub-saharan Africa
-ABW,Aruba,R5LAM,XLM,Rest of Brazil,Central America and Caribbean,Central America and Caribbean,RCAM,Rest C. America,LAM,Latin America and the Caribbean,LAM,Latin America and the Caribbean
-AIA,Anguilla,R5LAM,XLM,Rest of Brazil,Central America and Caribbean,Central America and Caribbean,RCAM,Rest C. America,LAM,Latin America and the Caribbean,LAM,Latin America and the Caribbean
-BEL,Belgium,R5OECD,XE25,EU,EU-15,EU-15,WEU,W. Europe,WEU,Western Europe,EUR,EU 27
-HKG,Hong Kong,R5ASIA,CHN,China,China,China,CHN,China,CPA,Centrally Planned Asia and China,CHN,China
-MNP,Northern Mariana Islands,R5ASIA,XSA,Rest of Asia,Southeast Asia,Southeast Asia,,,PAS,Other Pacific Asia,OAS,other Asia
-FRO,Faroe Islands,R5OECD,XER,Rest of Europe,EU-15,EU-15,WEU,W. Europe,WEU,Western Europe,EUR,EU 27
-AND,Andorra,R5OECD,XER,Rest of Europe,EU-15,EU-15,WEU,W. Europe,WEU,Western Europe,ROW,rest of the World
-GIB,Gibraltar,R5OECD,XER,Rest of Europe,EU-15,EU-15,WEU,W. Europe,WEU,Western Europe,EUR,EU 27
-IMN,Isle of Man,R5OECD,XER,Rest of Europe,EU-15,EU-15,,,WEU,Western Europe,EUR,EU 27
-LUX,Luxembourg,R5OECD,XE25,EU,EU-15,EU-15,WEU,W. Europe,WEU,Western Europe,EUR,EU 27
-MAC,Macau,R5ASIA,XSE,Rest of East and South East Asia,China,China,CHN,China,CPA,Centrally Planned Asia and China,CHN,China
-MCO,Monaco,R5OECD,XER,Rest of Europe,EU-15,EU-15,WEU,W. Europe,WEU,Western Europe,ROW,rest of the World
-PSE,Palestine,R5MAF,XME,Middle East,Middle East,Middle East,ME,Middle East,MEA,Middle East and North Africa,MEA,Middle East and North Africa
-MNE,Montenegro,R5OECD,XER,Rest of Europe,Europe_Non_EU,Europe_Non_EU,CEU,C. Europe,EEU,Eastern Europe,ROW,rest of the World
-MYT,Mayotte,R5OECD,XAF,Other Africa,Southeast Asia,Southeast Asia,,,WEU,Western Europe,AFR,Sub-saharan Africa
-ALA,�land Islands,R5OECD,XER,Rest of Europe,,,,,WEU,Western Europe,EUR,EU 27
-NFK,Norfolk Island,R5OECD,XSA,Rest of Asia,Southeast Asia,Southeast Asia,OCE,Oceania,WEU,Western Europe,OAS,other Asia
-CCK,Cocos (Keeling) Islands,R5ASIA,XSA,Rest of Asia,Southeast Asia,Southeast Asia,,,PAS,Other Pacific Asia,OAS,other Asia
-ATA,Antarctica,,,,,,,,,,ROW,rest of the World
-BVT,Bouvet Island,,,,,,,,,,ROW,rest of the World
-ATF,French Southern and Antarctic Lands,,,,,,,,,,OAS,other Asia
-HMD,Heard Island and McDonald Islands,R5OECD,XSA,Rest of Asia,,,,,PAO,Pacific OECD,ROW,rest of the World
-IOT,British Indian Ocean Territory,R5OECD,XSA,Rest of Asia,,,,,WEU,Western Europe,OAS,other Asia
-CXR,Christmas Island,R5OECD,XSA,Rest of Asia,Southeast Asia,Southeast Asia,,,PAO,Pacific OECD,OAS,other Asia
-CUW,Curacao,R5LAM,,,Central America and Caribbean,Central America and Caribbean,RCAM,Rest C. America,,,LAM,Latin America and the Caribbean
-UMI,United States Minor Outlying Islands,R5OECD,XSA,Rest of Asia,,,,,NAM,North America,OAS,other Asia
-VUT,Vanuatu,R5ASIA,XSA,Rest of Asia,Southeast Asia,Southeast Asia,OCE,Oceania,PAS,Other Pacific Asia,OAS,other Asia
-NGA,Nigeria,R5MAF,XAF,Other Africa,Africa_Western,Africa_Western,WAF,W. Africa,AFR,Sub-saharan Africa,AFR,Sub-saharan Africa
-NLD,Netherlands,R5OECD,XE25,EU,EU-15,EU-15,WEU,W. Europe,WEU,Western Europe,EUR,EU 27
-NOR,Norway,R5OECD,XER,Rest of Europe,European Free Trade Association,European Free Trade Association,WEU,W. Europe,WEU,Western Europe,ROW,rest of the World
-NPL,Nepal,R5ASIA,XSA,Rest of Asia,South Asia,South Asia,RSAS,Rest S. Asia,SAS,South Asia,OAS,other Asia
-NRU,Nauru,R5ASIA,XSA,Rest of Asia,Southeast Asia,Southeast Asia,OCE,Oceania,PAS,Other Pacific Asia,ROW,rest of the World
-SUR,Suriname,R5LAM,XLM,Rest of Brazil,South America_Northern,South America_Northern,RSAM,Rest S. America,LAM,Latin America and the Caribbean,LAM,Latin America and the Caribbean
-NIC,Nicaragua,R5LAM,XLM,Rest of Brazil,Central America and Caribbean,Central America and Caribbean,RCAM,Rest C. America,LAM,Latin America and the Caribbean,LAM,Latin America and the Caribbean
-NZL,New Zealand,R5OECD,XOC,New Zealand and Australia,Australia_NZ,Australia_NZ,OCE,Oceania,PAO,Pacific OECD,ROW,rest of the World
-PRY,Paraguay,R5LAM,XLM,Rest of Brazil,South America_Southern,South America_Southern,RSAM,Rest S. America,LAM,Latin America and the Caribbean,LAM,Latin America and the Caribbean
-PER,Peru,R5LAM,XLM,Rest of Brazil,South America_Southern,South America_Southern,RSAM,Rest S. America,LAM,Latin America and the Caribbean,LAM,Latin America and the Caribbean
-PAK,Pakistan,R5ASIA,XSA,Rest of Asia,Pakistan,Pakistan,RSAS,Rest S. Asia,SAS,South Asia,OAS,other Asia
-POL,Poland,R5OECD,XE25,EU,EU-12,EU-12,CEU,C. Europe,EEU,Eastern Europe,EUR,EU 27
-PAN,Panama,R5LAM,XLM,Rest of Brazil,Central America and Caribbean,Central America and Caribbean,RCAM,Rest C. America,LAM,Latin America and the Caribbean,LAM,Latin America and the Caribbean
-PRT,Portugal,R5OECD,XE25,EU,EU-15,EU-15,WEU,W. Europe,WEU,Western Europe,EUR,EU 27
-PNG,Papua New Guinea,R5ASIA,XSA,Rest of Asia,Southeast Asia,Southeast Asia,INDO,Indonesia,PAS,Other Pacific Asia,OAS,other Asia
-GNB,Guinea-Bissau,R5MAF,XAF,Other Africa,Africa_Western,Africa_Western,WAF,W. Africa,AFR,Sub-saharan Africa,AFR,Sub-saharan Africa
-QAT,Qatar,R5MAF,XME,Middle East,Middle East,Middle East,ME,Middle East,MEA,Middle East and North Africa,MEA,Middle East and North Africa
-REU,Reunion,R5OECD,XAF,Other Africa,Africa_Eastern,Africa_Eastern,EAF,E. Africa,WEU,Western Europe,AFR,Sub-saharan Africa
-ROU,Romania,R5OECD,XER,Rest of Europe,EU-12,EU-12,CEU,C. Europe,EEU,Eastern Europe,EUR,EU 27
-MDA,Republic of Moldova,R5REF,CIS,Former USSR,Central Asia,Central Asia,UKR,Ukraine region,FSU,Former Soviet Union,ROW,rest of the World
-PHL,Philippines,R5ASIA,XSE,Rest of East and South East Asia,Southeast Asia,Southeast Asia,SEAS,SE. Asia,PAS,Other Pacific Asia,OAS,other Asia
-PRI,Puerto Rico,R5OECD,XLM,Rest of Brazil,USA,USA,RCAM,Rest C. America,NAM,North America,USA,United States of America
-RUS,Russia,R5REF,CIS,Former USSR,Russia,Russia,RUS,Russia,FSU,Former Soviet Union,RUS,Russia
-RWA,Rwanda,R5MAF,XAF,Other Africa,Africa_Eastern,Africa_Eastern,EAF,E. Africa,AFR,Sub-saharan Africa,AFR,Sub-saharan Africa
-SAU,Saudi Arabia,R5MAF,XME,Middle East,Middle East,Middle East,ME,Middle East,MEA,Middle East and North Africa,MEA,Middle East and North Africa
-KNA,Saint Kitts and Nevis,R5LAM,XLM,Rest of Brazil,Central America and Caribbean,Central America and Caribbean,RCAM,Rest C. America,LAM,Latin America and the Caribbean,LAM,Latin America and the Caribbean
-SYC,Seychelles,R5MAF,XAF,Other Africa,Southeast Asia,Southeast Asia,EAF,E. Africa,AFR,Sub-saharan Africa,AFR,Sub-saharan Africa
-ZAF,South Africa,R5MAF,XAF,Other Africa,South Africa,South Africa,SAF,South Africa,AFR,Sub-saharan Africa,ROW,rest of the World
-LSO,Lesotho,R5MAF,XAF,Other Africa,Africa_Southern,Africa_Southern,RSAF,Rest S. Africa,AFR,Sub-saharan Africa,AFR,Sub-saharan Africa
-BWA,Botswana,R5MAF,XAF,Other Africa,Africa_Southern,Africa_Southern,RSAF,Rest S. Africa,AFR,Sub-saharan Africa,AFR,Sub-saharan Africa
-SEN,Senegal,R5MAF,XAF,Other Africa,Africa_Western,Africa_Western,WAF,W. Africa,AFR,Sub-saharan Africa,AFR,Sub-saharan Africa
-SVN,Slovenia,R5OECD,XE25,EU,EU-12,EU-12,CEU,C. Europe,EEU,Eastern Europe,EUR,EU 27
-SLE,Sierra Leone,R5MAF,XAF,Other Africa,Africa_Western,Africa_Western,WAF,W. Africa,AFR,Sub-saharan Africa,AFR,Sub-saharan Africa
-SGP,Singapore,R5ASIA,XSE,Rest of East and South East Asia,Southeast Asia,Southeast Asia,SEAS,SE. Asia,PAS,Other Pacific Asia,OAS,other Asia
-SOM,Somalia,R5MAF,XAF,Other Africa,Africa_Eastern,Africa_Eastern,EAF,E. Africa,AFR,Sub-saharan Africa,AFR,Sub-saharan Africa
-ESP,Spain,R5OECD,XE25,EU,EU-15,EU-15,WEU,W. Europe,WEU,Western Europe,EUR,EU 27
-LCA,Saint Lucia,R5LAM,XLM,Rest of Brazil,Central America and Caribbean,Central America and Caribbean,RCAM,Rest C. America,LAM,Latin America and the Caribbean,LAM,Latin America and the Caribbean
-SDN,Sudan,R5MAF,XAF,Other Africa,Africa_Eastern,Africa_Eastern,EAF,E. Africa,MEA,Middle East and North Africa,AFR,Sub-saharan Africa
-SSD,South Sudan,R5MAF,XAF,Other Africa,Africa_Eastern,Africa_Eastern,EAF,E. Africa,MEA,Middle East and North Africa,AFR,Sub-saharan Africa
-SXM,Sint Marteen,R5LAM,,,Central America and Caribbean,Central America and Caribbean,RCAM,Rest C. America,,,LAM,Latin America and the Caribbean
-SWE,Sweden,R5OECD,XE25,EU,EU-15,EU-15,WEU,W. Europe,WEU,Western Europe,EUR,EU 27
-SYR,Syrian Arab Republic,R5MAF,XME,Middle East,Middle East,Middle East,ME,Middle East,MEA,Middle East and North Africa,MEA,Middle East and North Africa
-CHE,Switzerland,R5OECD,XER,Rest of Europe,European Free Trade Association,European Free Trade Association,WEU,W. Europe,WEU,Western Europe,ROW,rest of the World
-TTO,Trinidad and Tobago,R5LAM,XLM,Rest of Brazil,Central America and Caribbean,Central America and Caribbean,RCAM,Rest C. America,LAM,Latin America and the Caribbean,LAM,Latin America and the Caribbean
-THA,Thailand,R5ASIA,XSE,Rest of East and South East Asia,Southeast Asia,Southeast Asia,SEAS,SE. Asia,PAS,Other Pacific Asia,OAS,other Asia
-TJK,Tajikistan,R5REF,CIS,Former USSR,Central Asia,Central Asia,STAN,Kazakhstan region,FSU,Former Soviet Union,MEA,Middle East and North Africa
-TKL,Tokelau,R5OECD,XSA,Rest of Asia,Southeast Asia,Southeast Asia,OCE,Oceania,PAO,Pacific OECD,OAS,other Asia
-TON,Tonga,R5ASIA,XSA,Rest of Asia,Southeast Asia,Southeast Asia,OCE,Oceania,PAS,Other Pacific Asia,OAS,other Asia
-TGO,Togo,R5MAF,XAF,Other Africa,Africa_Western,Africa_Western,WAF,W. Africa,AFR,Sub-saharan Africa,AFR,Sub-saharan Africa
-STP,Sao Tome and Principe,R5MAF,XAF,Other Africa,Africa_Western,Africa_Western,WAF,W. Africa,AFR,Sub-saharan Africa,AFR,Sub-saharan Africa
-TUN,Tunisia,R5MAF,XNF,North Africa,Africa_Northern,Africa_Northern,NAF,N. Africa,MEA,Middle East and North Africa,MEA,Middle East and North Africa
-TUR,Turkey,R5OECD,TUR,Turkey,Europe_Non_EU,Europe_Non_EU,TUR,Turkey,WEU,Western Europe,ROW,rest of the World
-TUV,Tuvalu,R5ASIA,XSA,Rest of Asia,Southeast Asia,Southeast Asia,OCE,Oceania,PAS,Other Pacific Asia,OAS,other Asia
-TKM,Turkmenistan,R5REF,CIS,Former USSR,Central Asia,Central Asia,STAN,Kazakhstan region,FSU,Former Soviet Union,MEA,Middle East and North Africa
-TZA,United Republic of Tanzania,R5MAF,XAF,Other Africa,Africa_Southern,Africa_Southern,RSAF,Rest S. Africa,AFR,Sub-saharan Africa,AFR,Sub-saharan Africa
-UGA,Uganda,R5MAF,XAF,Other Africa,Africa_Eastern,Africa_Eastern,EAF,E. Africa,AFR,Sub-saharan Africa,AFR,Sub-saharan Africa
-GBR,United Kingdom,R5OECD,XE25,EU,EU-15,EU-15,WEU,W. Europe,WEU,Western Europe,EUR,EU 27
-UKR,Ukraine,R5REF,CIS,Former USSR,Central Asia,Central Asia,UKR,Ukraine region,FSU,Former Soviet Union,ROW,rest of the World
-USA,United States,R5OECD,USA,USA,USA,USA,USA,USA,NAM,North America,USA,United States of America
-BFA,Burkina Faso,R5MAF,XAF,Other Africa,Africa_Western,Africa_Western,WAF,W. Africa,AFR,Sub-saharan Africa,AFR,Sub-saharan Africa
-URY,Uruguay,R5LAM,XLM,Rest of Brazil,South America_Southern,South America_Southern,RSAM,Rest S. America,LAM,Latin America and the Caribbean,LAM,Latin America and the Caribbean
-UZB,Uzbekistan,R5REF,CIS,Former USSR,Central Asia,Central Asia,STAN,Kazakhstan region,FSU,Former Soviet Union,MEA,Middle East and North Africa
-VCT,Saint Vincent and the Grenadines,R5LAM,XLM,Rest of Brazil,Central America and Caribbean,Central America and Caribbean,RCAM,Rest C. America,LAM,Latin America and the Caribbean,LAM,Latin America and the Caribbean
-VEN,Venezuela,R5LAM,XLM,Rest of Brazil,South America_Northern,South America_Northern,RSAM,Rest S. America,LAM,Latin America and the Caribbean,LAM,Latin America and the Caribbean
-VGB,British Virgin Islands,R5OECD,XLM,Rest of Brazil,EU-15,EU-15,RCAM,Rest C. America,WEU,Western Europe,LAM,Latin America and the Caribbean
-VNM,Viet Nam,R5ASIA,XSE,Rest of East and South East Asia,Southeast Asia,Southeast Asia,SEAS,SE. Asia,CPA,Centrally Planned Asia and China,OAS,other Asia
-VIR,United States Virgin Islands,R5OECD,XLM,Rest of Brazil,USA,USA,RCAM,Rest C. America,NAM,North America,LAM,Latin America and the Caribbean
-NAM,Namibia,R5MAF,XAF,Other Africa,Africa_Southern,Africa_Southern,RSAF,Rest S. Africa,AFR,Sub-saharan Africa,AFR,Sub-saharan Africa
-WLF,Wallis and Futuna Islands,R5OECD,XSA,Rest of Asia,EU-15,EU-15,OCE,Oceania,WEU,Western Europe,OAS,other Asia
-WSM,Samoa,R5ASIA,XSA,Rest of Asia,Southeast Asia,Southeast Asia,OCE,Oceania,PAS,Other Pacific Asia,OAS,other Asia
-SWZ,Swaziland,R5MAF,XAF,Other Africa,Africa_Southern,Africa_Southern,RSAF,Rest S. Africa,AFR,Sub-saharan Africa,AFR,Sub-saharan Africa
-YEM,Yemen,R5MAF,XME,Middle East,Middle East,Middle East,ME,Middle East,MEA,Middle East and North Africa,MEA,Middle East and North Africa
-ZMB,Zambia,R5MAF,XAF,Other Africa,Africa_Southern,Africa_Southern,RSAF,Rest S. Africa,AFR,Sub-saharan Africa,AFR,Sub-saharan Africa
-ZWE,Zimbabwe,R5MAF,XAF,Other Africa,Africa_Southern,Africa_Southern,RSAF,Rest S. Africa,AFR,Sub-saharan Africa,AFR,Sub-saharan Africa
-IDN,Indonesia,R5ASIA,XSE,Rest of East and South East Asia,Indonesia,Indonesia,INDO,Indonesia,PAS,Other Pacific Asia,OAS,other Asia
-GLP,Guadeloupe,R5LAM,XLM,Rest of Brazil,Central America and Caribbean,Central America and Caribbean,RCAM,Rest C. America,LAM,Latin America and the Caribbean,LAM,Latin America and the Caribbean
-ANT,Netherlands Antilles,R5LAM,XLM,Rest of Brazil,Central America and Caribbean,Central America and Caribbean,RCAM,Rest C. America,LAM,Latin America and the Caribbean,,
-ARE,United Arab Emirates,R5MAF,XME,Middle East,Middle East,Middle East,ME,Middle East,MEA,Middle East and North Africa,MEA,Middle East and North Africa
-TLS,Timor-Leste,R5ASIA,XSE,Rest of East and South East Asia,Southeast Asia,Southeast Asia,SEAS,SE. Asia,PAS,Other Pacific Asia,OAS,other Asia
-PCN,Pitcairn Islands,R5OECD,XSA,Rest of Asia,Southeast Asia,Southeast Asia,OCE,Oceania,WEU,Western Europe,OAS,other Asia
-PLW,Palau,R5ASIA,XSA,Rest of Asia,Southeast Asia,Southeast Asia,OCE,Oceania,PAS,Other Pacific Asia,OAS,other Asia
-MHL,Marshall Islands,R5ASIA,XSA,Rest of Asia,Southeast Asia,Southeast Asia,OCE,Oceania,PAS,Other Pacific Asia,OAS,other Asia
-SPM,Saint Pierre and Miquelon,R5OECD,XLM,Rest of Brazil,EU-15,EU-15,USA,USA,WEU,Western Europe,ROW,rest of the World
-SHN,Saint Helena,R5OECD,XAF,Other Africa,EU-15,EU-15,WAF,W. Africa,WEU,Western Europe,AFR,Sub-saharan Africa
-SMR,San Marino,R5OECD,XER,Rest of Europe,EU-15,EU-15,WEU,W. Europe,WEU,Western Europe,ROW,rest of the World
-TCA,Turks and Caicos Islands,R5LAM,XLM,Rest of Brazil,EU-15,EU-15,RCAM,Rest C. America,LAM,Latin America and the Caribbean,LAM,Latin America and the Caribbean
-ESH,Western Sahara,R5MAF,XAF,Other Africa,Africa_Northern,Africa_Northern,NAF,N. Africa,AFR,Sub-saharan Africa,MEA,Middle East and North Africa
-SRB,Serbia,R5OECD,XER,Rest of Europe,Europe_Non_EU,Europe_Non_EU,CEU,C. Europe,EEU,Eastern Europe,ROW,rest of the World
-SRB (KOSOVO),Serbia (Kosovo),R5OECD,,,,,,,,,,
-VAT,Holy See (Vatican City),R5OECD,XER,Rest of Europe,EU-15,EU-15,,,WEU,Western Europe,ROW,rest of the World
-SJM,Svalbard,R5OECD,XER,Rest of Europe,European Free Trade Association,European Free Trade Association,,,WEU,Western Europe,ROW,rest of the World
-MAF,Saint Martin,R5OECD,XLM,Rest of Brazil,,,,,WEU,Western Europe,ROW,rest of the World
-BLM,Saint Barthelemy,R5OECD,XLM,Rest of Brazil,,,,,WEU,Western Europe,LAM,Latin America and the Caribbean
-GGY,Guernsey,R5OECD,XER,Rest of Europe,,,,,WEU,Western Europe,ROW,rest of the World
-JEY,Jersey,R5OECD,XER,Rest of Europe,,,,,WEU,Western Europe,EUR,EU 27
-SGS,South Georgia South Sandwich Islands,R5OECD,XLM,Rest of Brazil,,,,,WEU,Western Europe,ROW,rest of the World
-TWN,Taiwan,R5ASIA,XSE,Rest of East and South East Asia,Taiwan,Taiwan,CHN,China,PAS,Other Pacific Asia,OAS,other Asia
-BES,,,,,,,,,,,LAM,Latin America and the Caribbean
diff --git a/pyam/run_control.py b/pyam/run_control.py
index 2c04713..d31113a 100644
--- a/pyam/run_control.py
+++ b/pyam/run_control.py
@@ -19,9 +19,6 @@ _RC_DEFAULTS = {
     "marker": {},
     "linestyle": {},
     "order": {},
-    "region_mapping": {
-        "default": _REG_MAP_PATH("default_mapping.csv"),
-    },
 }
 
 
diff --git a/pyam/utils.py b/pyam/utils.py
index 2e96ac5..d63b005 100644
--- a/pyam/utils.py
+++ b/pyam/utils.py
@@ -51,28 +51,6 @@ KNOWN_FUNCS = {
 }
 
 
-def requires_package(pkg, msg, error_type=ImportError):
-    """Decorator when a function requires an optional dependency
-
-    Parameters
-    ----------
-    pkg : imported package object
-    msg : string
-        Message to show to user with error_type
-    error_type : python error class
-    """
-
-    def _requires_package(func):
-        def wrapper(*args, **kwargs):
-            if pkg is None:
-                raise error_type(msg)
-            return func(*args, **kwargs)
-
-        return wrapper
-
-    return _requires_package
-
-
 def isstr(x):
     # TODO deprecated, remove for release >= 2.1
     deprecation_warning("Please use `pyam.str.is_str()`.", "The function `isstr()`")
@@ -152,7 +130,7 @@ def read_pandas(path, sheet_name=["data*", "Data*"], *args, **kwargs):
             # apply pattern-matching for sheet names (use * as wildcard)
             sheets = sheet_names[pattern_match(sheet_names, values=sheets)]
             if sheets.empty:
-                raise ValueError(f"No sheets {sheet_name} in file {path}!")
+                raise ValueError(f"Sheet(s) '{sheet_name}' not found in file '{path}'.")
 
             df = pd.concat([xl.parse(s, *args, **kwargs) for s in sheets])
 
@@ -217,7 +195,9 @@ def _knead_data(df, **kwargs):
         dfs = []
         for v in value:
             if v not in df.columns:
-                raise ValueError("column `{}` does not exist!".format(v))
+                raise ValueError(
+                    f"Column `{v}` not in timeseries data, found: {df.columns}"
+                )
             vdf = _df[v].to_frame().rename(columns={v: "value"})
             vdf["variable"] = v
             dfs.append(vdf.reset_index())
@@ -226,7 +206,9 @@ def _knead_data(df, **kwargs):
     # otherwise, rename columns or concat to IAMC-style or do a fill-by-value
     for col, value in kwargs.items():
         if col in df:
-            raise ValueError(f"Conflict of kwarg with column `{col}` in dataframe!")
+            raise ValueError(
+                f"Conflict of kwarg with column `{col}` in timeseries data."
+            )
 
         if is_str(value) and value in df:
             df.rename(columns={value: col}, inplace=True)
@@ -236,7 +218,7 @@ def _knead_data(df, **kwargs):
         elif is_str(value):
             df[col] = value
         else:
-            raise ValueError(f"Invalid argument for casting `{col}: {value}`")
+            raise ValueError(f"Invalid argument for casting data: `{col}: {value}`")
 
     return df
 
@@ -244,7 +226,7 @@ def _knead_data(df, **kwargs):
 def _format_from_legacy_database(df):
     """Process data from legacy databases (SSP and earlier)"""
 
-    logger.info("Ignoring notes column in `data`")
+    logger.info("Ignoring notes column in `data`.")
     df.drop(columns="notes", inplace=True)
     col = df.columns[0]  # first column has database copyright notice
     df = df[~df[col].str.contains("database", case=False)]
@@ -270,7 +252,7 @@ def _intuit_column_groups(df, index, include_index=False):
 
     # check that there is no column in the timeseries data with reserved names
     if None in existing_cols:
-        raise ValueError("Unnamed column in `data`: None")
+        raise ValueError("Unnamed column in timeseries data: None")
 
     # check that there is no column in the timeseries data with reserved/illegal names
     conflict_cols = [i for i in existing_cols if i in ILLEGAL_COLS]
@@ -286,11 +268,13 @@ def _intuit_column_groups(df, index, include_index=False):
     # check that index and required columns exist
     missing_index = [c for c in index if c not in existing_cols]
     if missing_index:
-        raise ValueError(f"Missing index columns: {missing_index}")
+        raise ValueError(f"Missing index columns in timeseries data: {missing_index}")
 
     missing_required_col = [c for c in REQUIRED_COLS if c not in existing_cols]
     if missing_required_col:
-        raise ValueError(f"Missing required columns: {missing_required_col}")
+        raise ValueError(
+            f"Missing required columns in timeseries data: {missing_required_col}"
+        )
 
     # check whether data in wide format (standard IAMC) or long format (`value` column)
     if "value" in existing_cols:
@@ -300,7 +284,7 @@ def _intuit_column_groups(df, index, include_index=False):
         elif "time" in existing_cols and "year" not in existing_cols:
             time_col = "time"
         else:
-            raise ValueError("Invalid time domain, must have either `year` or `time`!")
+            raise ValueError("Invalid time domain, must have either `year` or `time`.")
         extra_cols = [
             c
             for c in existing_cols
@@ -334,7 +318,7 @@ def _intuit_column_groups(df, index, include_index=False):
             time_col = "time"
             data_cols = sorted(year_cols) + sorted(time_cols)
         if not data_cols:
-            raise ValueError("Missing time domain")
+            raise ValueError("No time domain in the data.")
 
     return time_col, extra_cols, data_cols
 
@@ -438,7 +422,7 @@ def format_data(df, index, **kwargs):
         )
     del rows
     if df.empty:
-        logger.warning("Formatted data is empty!")
+        logger.warning("Formatted data is empty.")
 
     return df.sort_index(), index, time_col, extra_cols
 
@@ -469,7 +453,7 @@ def merge_meta(left, right, ignore_conflict=False):
     diff = right.index.difference(left.index)
     sect = right.index.intersection(left.index)
 
-    # merge `right` into `left` for overlapping scenarios ( `sect`)
+    # merge `right` into `left` for overlapping scenarios (`sect`)
     if not sect.empty:
         # if not ignored, check that overlapping `meta` columns are equal
         if not ignore_conflict:
@@ -480,7 +464,7 @@ def merge_meta(left, right, ignore_conflict=False):
                     .drop_duplicates()
                     .index.drop_duplicates()
                 )
-                msg = "conflict in `meta` for scenarios {}".format(
+                msg = "Conflict in `meta` for scenarios {}".format(
                     [i for i in pd.DataFrame(index=conflict_idx).index]
                 )
                 raise ValueError(msg)


Test patch:
diff --git a/tests/test_core.py b/tests/test_core.py
index 7fafb99..bec7093 100644
--- a/tests/test_core.py
+++ b/tests/test_core.py
@@ -206,7 +206,7 @@ def test_init_df_with_custom_index(test_pd_df):
 
 def test_init_empty_message(caplog):
     IamDataFrame(data=df_empty)
-    drop_message = "Formatted data is empty!"
+    drop_message = "Formatted data is empty."
     message_idx = caplog.messages.index(drop_message)
     assert caplog.records[message_idx].levelno == logging.WARNING
 
@@ -216,7 +216,7 @@ def test_init_with_unnamed_column(test_pd_df):
     test_pd_df[None] = "foo"
 
     # check that initialising an instance with an unnamed column raises
-    with pytest.raises(ValueError, match="Unnamed column in `data`: None"):
+    with pytest.raises(ValueError, match="Unnamed column in timeseries data: None"):
         IamDataFrame(test_pd_df)
 
 
@@ -642,127 +642,6 @@ def test_filter_by_int(test_df):
     assert obs.scenario == ["scen_a"]
 
 
-def _r5_regions_exp(df):
-    df = df.filter(region="World", keep=False)
-    data = df.data
-    data["region"] = "R5MAF"
-    return sort_data(data, df.dimensions)
-
-
-def test_map_regions_r5(reg_df):
-    obs = reg_df.map_regions("r5_region").data
-    exp = _r5_regions_exp(reg_df)
-    pd.testing.assert_frame_equal(obs, exp, check_index_type=False)
-
-
-def test_map_regions_r5_region_col(reg_df):
-    df = reg_df.filter(model="MESSAGE-GLOBIOM")
-    obs = df.map_regions("r5_region", region_col="MESSAGE-GLOBIOM.REGION").data
-    exp = _r5_regions_exp(df)
-    pd.testing.assert_frame_equal(obs, exp, check_index_type=False)
-
-
-def test_map_regions_r5_inplace(reg_df):
-    exp = _r5_regions_exp(reg_df)
-    reg_df.map_regions("r5_region", inplace=True)
-    obs = reg_df.data
-    pd.testing.assert_frame_equal(obs, exp, check_index_type=False)
-
-
-def test_map_regions_r5_agg(reg_df):
-    columns = reg_df.data.columns
-    obs = reg_df.map_regions("r5_region", agg="sum").data
-
-    exp = _r5_regions_exp(reg_df)
-    grp = list(columns)
-    grp.remove("value")
-    exp = exp.groupby(grp).sum().reset_index()
-    exp = exp[columns]
-    pd.testing.assert_frame_equal(obs, exp, check_index_type=False)
-
-
-def test_48a():
-    # tests fix for #48 mapping many->few
-    df = IamDataFrame(
-        pd.DataFrame(
-            [
-                ["model", "scen", "SSD", "var", "unit", 1, 6],
-                ["model", "scen", "SDN", "var", "unit", 2, 7],
-                ["model", "scen1", "SSD", "var", "unit", 2, 7],
-                ["model", "scen1", "SDN", "var", "unit", 2, 7],
-            ],
-            columns=["model", "scenario", "region", "variable", "unit", 2005, 2010],
-        )
-    )
-
-    exp = _r5_regions_exp(df)
-    columns = df.data.columns
-    grp = list(columns)
-    grp.remove("value")
-    exp = exp.groupby(grp).sum().reset_index()
-    exp = exp[columns]
-
-    obs = df.map_regions("r5_region", region_col="iso", agg="sum").data
-
-    pd.testing.assert_frame_equal(obs, exp, check_index_type=False)
-
-
-def test_48b():
-    # tests fix for #48 mapping few->many
-
-    exp = IamDataFrame(
-        pd.DataFrame(
-            [
-                ["model", "scen", "SSD", "var", "unit", 1, 6],
-                ["model", "scen", "SDN", "var", "unit", 1, 6],
-                ["model", "scen1", "SSD", "var", "unit", 2, 7],
-                ["model", "scen1", "SDN", "var", "unit", 2, 7],
-            ],
-            columns=["model", "scenario", "region", "variable", "unit", 2005, 2010],
-        )
-    ).data
-
-    df = IamDataFrame(
-        pd.DataFrame(
-            [
-                ["model", "scen", "R5MAF", "var", "unit", 1, 6],
-                ["model", "scen1", "R5MAF", "var", "unit", 2, 7],
-            ],
-            columns=["model", "scenario", "region", "variable", "unit", 2005, 2010],
-        )
-    )
-    obs = df.map_regions("iso", region_col="r5_region").data
-    obs = sort_data(obs[obs.region.isin(["SSD", "SDN"])], df.dimensions)
-
-    pd.testing.assert_frame_equal(obs, exp, check_index_type=False)
-
-
-def test_48c():
-    # tests fix for #48 mapping few->many, dropping duplicates
-
-    exp = IamDataFrame(
-        pd.DataFrame(
-            [
-                ["model", "scen", "AGO", "var", "unit", 1, 6],
-                ["model", "scen1", "AGO", "var", "unit", 2, 7],
-            ],
-            columns=["model", "scenario", "region", "variable", "unit", 2005, 2010],
-        )
-    ).data.reset_index(drop=True)
-
-    df = IamDataFrame(
-        pd.DataFrame(
-            [
-                ["model", "scen", "R5MAF", "var", "unit", 1, 6],
-                ["model", "scen1", "R5MAF", "var", "unit", 2, 7],
-            ],
-            columns=["model", "scenario", "region", "variable", "unit", 2005, 2010],
-        )
-    )
-    obs = df.map_regions("iso", region_col="r5_region", remove_duplicates=True).data
-    pd.testing.assert_frame_equal(obs, exp, check_index_type=False)
-
-
 def test_pd_filter_by_meta(test_df):
     data = df_filter_by_meta_matching_idx.set_index(["model", "region"])
 
diff --git a/tests/test_io.py b/tests/test_io.py
index 330df8f..c358e95 100644
--- a/tests/test_io.py
+++ b/tests/test_io.py
@@ -198,7 +198,7 @@ def test_load_meta_wrong_index(test_df_year, tmpdir):
     file = tmpdir / "testing_meta_empty.xlsx"
     pd.DataFrame(columns=["model", "foo"]).to_excel(file, index=False)
 
-    match = ".* \(sheet meta\) missing required index columns \['scenario'\]\!"
+    match = "Missing index columns for meta indicators: \['scenario'\]"
     with pytest.raises(ValueError, match=match):
         test_df_year.load_meta(file)