Skip to content

[apply_irradiance_sensitivity_adj] Create function #622

Description

@BiancaMorandi

Is your feature request related to a problem? Please describe.
Brightwind library doesn't have a function for adjusting irradiance data when the logger sensitivity value is different than the calibration sensitivity.

Describe the solution you'd like
It would be good to add a function similar to apply_wspd_slope_offset_adj that can be used for adjusting irradiance data when the logger sensitivity value is different than the calibration sensitivity.

Example code

def adjust_sensitivity(irrad, current_sen, new_sen):
    try:
        return new_sen * (irrad/ current_sen)
    except TypeError as type_error:
        for arg_value in [current_sen, new_sen]:
            if not bw.utils.utils.is_float_or_int(arg_value):
                raise TypeError("argument '" + str(arg_value) + "' is not of data type number")
        if not bw.utils.utils.is_float_or_int(irrad):
            if type(irrad) == pd.DataFrame and (irrad.dtypes == object)[0]:
                raise TypeError('some values in the DataFrame are not of data type number')
            elif type(irrad) == pd.Series and (irrad.dtypes == object):
                raise TypeError('some values in the Series are not of data type number')
            raise TypeError('irrad argument is not of data type number')
        raise type_error
    except Exception as error:
        raise error

def apply_sol_sensitivity_adj(data,
                              meas_station_obj,
                              inplace = False):
    data = data.copy(deep=True) if inplace is False else data
    sol_in_dataset = False
    df = pd.DataFrame(data) if type(data) == pd.Series else data
    for meas_sensor_config in meas_station_obj.measurements.properties:
        if meas_sensor_config['measurement_type_id'] in ['global_horizontal_irradiance',
                                                           'global_horizontal_irradiance',
                                                           'global_tilted_irradiance',
                                                           'albedo']:
            if meas_sensor_config['name'] in df.columns:
                sol_in_dataset = True
                if 'calibration.sensitivity' not in meas_sensor_config:
                    meas_sensor_config['calibration.sensitivity'] = None
                none_variables = merlin.transform._extract_none_dict_variables_from_list(meas_sensor_config, ['logger_measurement_config.sensitivity',
                                                                                                         'calibration.sensitivity'])
                if meas_sensor_config['date_to'] is None:
                    date_to_txt = 'the end of dataset'
                else:
                    date_to_txt = meas_sensor_config['date_to']
                if none_variables:
                    print("{} has {} value set as None. Sensitivity adjustment can't be applied "
                          "from {} to {}.".format(bold(meas_sensor_config['name']), bold(', '.join(none_variables)),
                                                  bold(meas_sensor_config['date_from']),
                                                  bold(date_to_txt)))
                elif float(meas_sensor_config['logger_measurement_config.sensitivity']) != float(meas_sensor_config['calibration.sensitivity']):
                    try:
                        df[meas_sensor_config['name']][meas_sensor_config['date_from']:meas_sensor_config['date_to']] = \
                            adjust_sensitivity(df[meas_sensor_config['name']][
                                                   meas_sensor_config['date_from']:meas_sensor_config['date_to']],
                                                   current_sen=float(meas_sensor_config['logger_measurement_config.sensitivity']),
                                                   new_sen=float(meas_sensor_config['calibration.sensitivity']))
                        print('{} has sensitivity adjustment applied from {} to {}.'
                              .format(bold(meas_sensor_config['name']), bold(meas_sensor_config['date_from']),
                                      bold(date_to_txt)))
                    except TypeError:
                        print('{} has TypeError with logger or calibration sensitivity values. Skipping.'
                              .format(bold(meas_sensor_config['name'])))
                    except Exception as error_msg:
                        print(error_msg)
                else:
                    print('{} logger sensitivity is equal to calibration sensitivity from '
                          '{} to {}.'.format(bold(meas_sensor_config['name']),
                                             bold(meas_sensor_config['date_from']),
                                             bold(date_to_txt)))
            else:
                print('{} is not found in data.'.format(bold(meas_sensor_config['name'])))
    if sol_in_dataset is False:
        print('No solar measurements found in the configurations.')
    # if a Series is sent, send back a Series
    if type(data) == pd.Series:
        df = df[df.columns[0]]
    
    return df

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    Status
    Backlog

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions