Load the climate data as a map

        Returns:
            dict: {data: masked 3D numpy array containing climate data per month (first axis),
                   lat_idx: function converting a latitude to the (fractional) row index in the map,
                   lon_idx: function converting a longitude to the (fractional) column index in the map}

def load(self):
        """Load the climate data as a map

        Returns:
            dict: {data: masked 3D numpy array containing climate data per month (first axis),
                   lat_idx: function converting a latitude to the (fractional) row index in the map,
                   lon_idx: function converting a longitude to the (fractional) column index in the map}
        """
        from scipy.io import netcdf_file
        from scipy import interpolate
        import numpy as np

        # load file
        f = netcdf_file(self.input_file)

        # extract data, make explicity copies of data
        out = dict()
        lats = f.variables['lat'][:].copy()
        lons = f.variables['lon'][:].copy()

        # lons start at 0, this is bad for working with data in Europe because the map border runs right through;
        # roll array by half its width to get Europe into the map center
        out['data'] = np.roll(f.variables[self.variable_name][:, :, :].copy(), shift=len(lons) // 2, axis=2)
        lons = np.roll(lons, shift=len(lons) // 2)

        # avoid wraparound problems around zero by setting lon range to -180...180, this is
        # also the format used in the GeoJSON NUTS2 polygons
        lons[lons > 180] -= 360

        # data contains some very negative value (~ -9e36) as 'invalid data' flag, convert this to a masked array
        out['data'] = np.ma.array(out['data'])
        out['data'][out['data'] < -1.e6] = np.ma.masked

        # -- start documentation include: climate-input-interp
        # build interpolators to convert lats/lons to row/column indices
        out['lat_idx'] = interpolate.interp1d(x=lats, y=np.arange(len(lats)))
        out['lon_idx'] = interpolate.interp1d(x=lons, y=np.arange(len(lons)))
        # -- end documentation include: climate-input-interp

        # clean up
        f.close()

        return out