def run(self):
        import numpy as np
        query = self.session.query(models.NUTS2Region.key,
                                   models.NUTS2Region.id)
        region_ids = self.client.df_query(query).set_index('key')['id'].to_dict()
        data = next(self.requires()).load()
        nuts = NUTS2GeoJSONInputFile().load()
        indicator_ids = dict()
        t_data = dict()
        for season, suffix in CLIMATE_SEASON_SUFFIXES.items():
            indicator = models.ClimateIndicator(description=self.description + suffix)
            self.session.add(indicator)
            self.session.commit()
            indicator_ids[season] = indicator.id
            if season == 'summer':
                t_data[season] = np.ma.average(data['data'][3:9, :, :], axis=0)
            else:
                t_data[season] = np.ma.average(0.5 * (data['data'][0:3, :, :] + data['data'][9:12, :, :]), axis=0)
        objects = []
        current_value_id = models.ClimateValue.get_max_id(self.session)
        for feature in nuts:
            mask = geojson_polygon_to_mask(feature=feature,
                                           shape=t_data['summer'].shape,
                                           lat_idx=data['lat_idx'],
                                           lon_idx=data['lon_idx'])
            for season in list(CLIMATE_SEASON_SUFFIXES.keys()):
                value = np.ma.average(t_data[season], weights=mask)
                region_id = region_ids.get(feature.properties['NUTS_ID'], None)
                if region_id is not None:
                    region_id = int(region_id)
                current_value_id += 1
                objects.append(models.ClimateValue(id=current_value_id,
                                                   value=value,
                                                   region_id=region_id,
                                                   indicator_id=indicator_ids[season]))
        self.session.bulk_save_objects(objects)
        self.session.commit()
        self.done()