code: def load(self, key_filter=None, header_preproc=None):
          
          # 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
docs: 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