ITR.target_validation

Module Contents

Classes

TargetProtocol

This class validates the targets, to make sure that only active, useful

Attributes

logger

ITR.target_validation.logger
class ITR.target_validation.TargetProtocol(config: Type[ITR.configs.PortfolioAggregationConfig] = PortfolioAggregationConfig)

This class validates the targets, to make sure that only active, useful targets are considered. It then combines the targets with company-related data into a dataframe where there’s one row for each of the nine possible target types (short, mid, long * S1+S2, S3, S1+S2+S3). This class follows the procedures outlined by the target protocol that is a part of the “Temperature Rating Methodology” (2024), which has been created by CDP Worldwide and WWF International.

Parameters

config – A Portfolio aggregation config

process(self, targets: List[ITR.interfaces.IDataProviderTarget], companies: List[ITR.interfaces.IDataProviderCompany]) pandas.DataFrame

Process the targets and companies, validate all targets and return a data frame that combines all targets and company data into a 9-box grid.

Parameters
  • targets – A list of targets

  • companies – A list of companies

Returns

A data frame that combines the processed data

_validate(self, target: ITR.interfaces.IDataProviderTarget) bool

Validate a target, meaning it should:

  • Have a valid type

  • Not be finished

  • A valid end year

Parameters

target – The target to validate

Returns

True if it’s a valid target, false if it isn’t

_validate_t_score(self, target: ITR.interfaces.IDataProviderTarget) bool

Validate targets set using the CDP_WWF temperature scoing methodology :param target: The target to validate :return: True if it’s a valid target, false if it isn’t

_split_s1s2s3(self, target: ITR.interfaces.IDataProviderTarget) Tuple[ITR.interfaces.IDataProviderTarget, Optional[ITR.interfaces.IDataProviderTarget]]

If there is a s1s2s3 scope, split it into two targets with s1s2 and s3 This S3 target becomes a headline target :param target: The input target :return The split targets or the original target and None

_split_s1s2_new(self, target: pandas.DataFrame) pandas.DataFrame

Split the target into two targets, one for the S1 data and one for the S2 data.

Parameters

target – The target to potentially split.

Returns

A list containing the S1 target and the S2 target from the split.

static _scale_reduction_ambition_by_boundary_coverage_new(target: pandas.DataFrame) float

Change in ITR method 1.5: all targets have their ambition scaled by their boundary coverage. :param target: The input target :return: The original target with a weighted reduction ambition, if so required

static _assign_time_frame(target: ITR.interfaces.IDataProviderTarget) ITR.interfaces.IDataProviderTarget
Time frame is forward looking: target year - current year.

Less than 5y = short, between 5 and 10 is mid, more than 10 is long

Parameters

target – The input target

Returns

The original target with the time_frame field filled out (if so required)

_prepare_targets(self, targets: List[ITR.interfaces.IDataProviderTarget])
logic
  • drop invalid targets

  • identifying the pure-S2 targets for later use

  • splitting s1s2s3 into s1s2 and s3

  • combining s1 and s2

  • assign target.reduction_ambition by considering target’s boundary coverage

Parameters

targets

Returns

_find_target(self, row: pandas.Series, target_columns: List[str]) pandas.DataFrame

Find the target that corresponds to a given row. If there are multiple targets available, filter them.

Parameters
  • row – The row from the data set that should be looked for

  • target_columns – The columns to return

Returns

records from the input data, which contains company and target information, that meet specific criteria. For example, record of greatest emissions_in_scope

_find_s3_targets(self, target_data: pandas.DataFrame, target_columns: List[str]) pandas.DataFrame

Find S3 target that correspond to the given row. Note that there may be more than one S3 target. We first look for a headline target and return that. If there is none we look for the targets with the latest confirmation date. Then check if there is more than one target with the same confirmation date. The method then returns all non headline targets with the latest confirmation date.

Parameters
  • target_data – The target data

  • target_columns – The columns to return

Returns

The target data that meet the criteria

group_targets(self)

Group the targets and create the target grid (short, mid, long * s1s2, s3, s1s2s3). Group valid targets by category & filter multiple targets Input: a list of valid targets for each company: For each company:

Group all valid targets based on scope (S1+S2 / S3 / S1+S2+S3) and time frame (short / mid / long-term) into 6 categories.

For each category: if more than 1 target is available, filter based on the following criteria – Latest vintage – Highest boundary coverage – Latest end year – Target type: Absolute over intensity – If all else is equal: average the ambition of targets

sort_on_vintage(self, target_data: pandas.DataFrame) pandas.DataFrame

For each combination of company id, time frame, and scope, find all targets with the same latest TARGET_CONFIRM_DATE and return as a DataFrame of targets.

Parameters

target_data – a DataFrame with target data

Returns

A DataFrame of targets sorted based on their vintage

sort_boundary_coverage(self, data: pandas.DataFrame) pandas.DataFrame

We want to select the scope 1 and scope 2 targets that have the highest combined boundary coverage for each group of self.c.COLS.COMPANY_ID, self.c.COLS.TIME_FRAME, self.c.COLS.SCOPE. We compare combinations of individual scope 1 and scope 2 targets with combined S1+S2 targets, and select the combination with the highest boundary coverage. If there is only one single scope target (e.g., S1 but no S2), we dismiss it.

Parameters

data – A dataframe with the target data

Returns

A dataframe with the target data sorted by boundary coverage