def load(self, key_filter=None, header_preproc=None):
        """Load data table from tsv file, from default location

        Args:
            key_filter (str): additional filter for key column - regex matching
                key values to include; None for no filter

            header_preproc (func): function to apply to column headers to extract year numbers (as strings)

        Returns:
            pd.DataFrame: data
        """
        # read file, keep all values as strings
        df = pd.read_csv(self.input_file,
                         sep='\t',
                         dtype=object)

        if key_filter is not None:
            # filter on key column (first column)
            df = df[df[df.columns[0]].str.match(key_filter)]

        # first column contains metadata, with NUTS2 region key as last (comma-separated) value
        meta_col = df.columns[0]
        df[meta_col] = df[meta_col].str.split(',').str[-1]

        # convert columns to numbers, skip first column (containing metadata)
        for col_name in df.columns[1:]:
            # some values have lower-case characters indicating footnotes, strip them
            stripped = df[col_name].str.replace(r'[a-z]', '')

            # convert to numbers, convert any remaining empty values (indicated by ':' in the input table) to NaN
            df[col_name] = pd.to_numeric(stripped, errors='coerce')

        # preprocess headers
        if header_preproc is not None:
            df.columns = list(df.columns[:1]) + [header_preproc(c) for c in df.columns[1:]]

        # rename columns, convert years to integers
        # noinspection PyTypeChecker
        df.columns = ['key'] + [int(y) for y in df.columns[1:]]

        return df