diff --git a/ITR/data/data_providers.py b/ITR/data/data_providers.py
index 8528904a..e532f90f 100644
--- a/ITR/data/data_providers.py
+++ b/ITR/data/data_providers.py
@@ -82,6 +82,14 @@ def get_company_projected_targets(self, company_ids: List[str]) -> pd.DataFrame:
"""
raise NotImplementedError
+ @abstractmethod
+ def get_company_fundamentals(self, company_ids: List[str]) -> pd.DataFrame:
+ """
+ :param company_ids: A list of company IDs
+ :return: A pandas DataFrame with company fundamental info per company
+ """
+ raise NotImplementedError
+
class ProductionBenchmarkDataProvider(ABC):
"""
diff --git a/ITR/data/excel.py b/ITR/data/excel.py
index 01655679..3761c474 100644
--- a/ITR/data/excel.py
+++ b/ITR/data/excel.py
@@ -277,7 +277,6 @@ def _get_historic_data(self, company_ids: List[str], historic_data: pd.DataFrame
:return: historic data with unit attributes added to yearly data on a per-element basis
"""
self.historic_years = [column for column in historic_data.columns if type(column) == int]
-
missing_ids = [company_id for company_id in company_ids if company_id not in historic_data.index]
if missing_ids:
error_message = f"Company ids missing in provided historic data: {missing_ids}"
diff --git a/ITR/data/osc_units.py b/ITR/data/osc_units.py
index 0671610e..cbd3d9a6 100644
--- a/ITR/data/osc_units.py
+++ b/ITR/data/osc_units.py
@@ -2,7 +2,7 @@
This module handles initialization of pint functionality
"""
-from pint import set_application_registry
+from pint import set_application_registry, Quantity
from pint_pandas import PintArray, PintType
from openscm_units import unit_registry
import re
diff --git a/ITR/data/vault_providers.py b/ITR/data/vault_providers.py
new file mode 100644
index 00000000..add36165
--- /dev/null
+++ b/ITR/data/vault_providers.py
@@ -0,0 +1,606 @@
+import os
+import pathlib
+from dotenv import load_dotenv
+
+# Load some standard environment variables from a dot-env file, if it exists.
+# If no such file can be found, does not fail, and so allows these environment vars to
+# be populated in some other way
+dotenv_dir = os.environ.get('CREDENTIAL_DOTENV_DIR', os.environ.get('HOME', '/opt/app-root/src'))
+dotenv_path = pathlib.Path(dotenv_dir) / 'credentials.env'
+if os.path.exists(dotenv_path):
+ load_dotenv(dotenv_path=dotenv_path,override=True)
+
+import trino
+import osc_ingest_trino as osc
+import sqlalchemy
+
+ingest_catalog = 'osc_datacommons_dev'
+
+import pandas as pd
+from typing import List, Type
+from ITR.configs import ColumnsConfig, TemperatureScoreConfig
+from ITR.data.data_providers import CompanyDataProvider, ProductionBenchmarkDataProvider, \
+ IntensityBenchmarkDataProvider
+from ITR.data.data_warehouse import DataWarehouse
+from ITR.interfaces import ICompanyData, EScope, IProductionBenchmarkScopes, IEIBenchmarkScopes, \
+ IBenchmark, ICompanyAggregates
+
+from ITR.data.osc_units import *
+
+# TODO handling of scopes in benchmarks
+
+# TODO handle ways to append information (from other providers, other benchmarks, new scope info, new corp data updates, etc)
+
+import trino
+from sqlalchemy.engine import create_engine
+from pint import Quantity
+from pint_pandas import PintArray
+
+ingest_catalog = 'osc_datacommons_dev'
+ingest_schema = 'sandbox'
+demo_schema = 'demo_dv'
+
+sqlstring = 'trino://{user}@{host}:{port}/'.format(
+ user = os.environ['TRINO_USER'],
+ host = os.environ['TRINO_HOST'],
+ port = os.environ['TRINO_PORT']
+)
+sqlargs = {
+ 'auth': trino.auth.JWTAuthentication(os.environ['TRINO_PASSWD']),
+ 'http_scheme': 'https',
+ 'catalog': ingest_catalog,
+ 'schema': ingest_schema,
+}
+engine = create_engine(sqlstring, connect_args = sqlargs)
+connection = engine.connect()
+
+# If DF_COL contains Pint quantities (because it is a PintArray or an array of Pint Quantities),
+# return a two-column dataframe of magnitudes and units.
+# If DF_COL contains no Pint quanities, return it unchanged.
+def dequantify_column(df_col: pd.Series) -> pd.DataFrame:
+ if type(df_col.values)==PintArray:
+ return pd.DataFrame({df_col.name: df_col.values.quantity.m,
+ df_col.name + "_units": str(df_col.values.dtype.units)},
+ index=df_col.index)
+ elif df_col.size==0:
+ return df_col
+ elif isinstance(df_col.iloc[0], Quantity):
+ values = df_col.map(lambda x: (x.m, x.u))
+ return pd.DataFrame({df_col.name: df_col.map(lambda x: x.m),
+ df_col.name + "_units": df_col.map(lambda x: str(x.u))},
+ index=df_col.index)
+ else:
+ return df_col
+
+# Rewrite dataframe DF so that columns containing Pint quantities are represented by a column for the Magnitude and column for the Units.
+# The magnitude column retains the original column name and the units column is renamed with a _units suffix.
+def dequantify_df(df: pd.DataFrame) -> pd.DataFrame:
+ return pd.concat([dequantify_column(df[col]) for col in df.columns], axis=1)
+
+# Because this DF comes from reading a Trino table, and because columns must be unqiue, we don't have to enumerate to ensure we properly handle columns with duplicated names
+def requantify_df(df: pd.DataFrame) -> pd.DataFrame:
+ units_col = None
+ columns_reversed = reversed(df.columns)
+ for col in columns_reversed:
+ if col.endswith("_units"):
+ if units_col:
+ # We expect _units column to follow a non-units column
+ raise ValueError
+ units_col = col
+ continue
+ if units_col:
+ if col + '_units' != units_col:
+ raise ValueError
+ if (df[units_col]==df[units_col][0]).all():
+ # Make a PintArray
+ new_col = PintArray(df[col], dtype=f"pint[{ureg(df[units_col][0]).u}]")
+ else:
+ # Make a pd.Series of Quantity in a way that does not throw UnitStrippedWarning
+ new_col = pd.Series(data=df[col], name=col) * pd.Series(data=df[units_col].map(lambda x: ureg(x).u), name=col)
+ df = df.drop(columns=units_col)
+ df[col] = new_col
+ units_col = None
+ return df
+
+def create_table_from_df (df: pd.DataFrame, schemaname: str, tablename: str, engine: sqlalchemy.engine.base.Engine, verbose=False):
+ drop_table = f"drop table if exists {schemaname}.{tablename}"
+ qres = engine.execute(drop_table)
+ rows = qres.fetchall()
+ if verbose:
+ print(f"SQL: {drop_table}")
+ for row in rows:
+ print(f"SQL RESULT: {row}")
+ print(df.dtypes)
+ print(df.columns)
+ print(df.index)
+ new_df = dequantify_df (df)
+ new_df.to_sql(tablename, con=engine, schema=schemaname, if_exists='append',
+ index=False,
+ method=osc.TrinoBatchInsert(batch_size = 5000, verbose = True))
+
+# When reading SQL tables to import into DataFrames, it is up to the user to preserve {COL}, {COL}_units pairings so they can be reconstructed.
+# If the user does a naive "select * from ..." this happens naturally.
+# We can give a warning when we see a resulting dataframe that could have, but does not have, unit information properly integrated. But
+# fixing the query on the fly becomes difficult when we consider the fully complexity of parsing and rewriting SQL queries to put the units columns in the correct locations.
+# (i.e., properly in the principal SELECT clause (which can have arbitrarily complex terms), not confused by FROM, WHERE, GROUP BY, ORDER BY, etc.)
+
+def read_quantified_sql (sql: str, tablename, schemaname, engine: sqlalchemy.engine.base.Engine, index_col=None) -> pd.DataFrame:
+ qres = engine.execute(f"describe {schemaname}.{tablename}")
+ # tabledesc will be a list of tuples (column, type, extra, comment)
+ colnames = [x[0] for x in qres.fetchall()]
+ # read columns normally...this will be missing any unit-related information
+ sql_df = pd.read_sql(sql, engine, index_col)
+ # if the query requests columns that don't otherwise bring unit information along with them, get that information too
+ extra_unit_columns = [ (i, f"{col}_units") for i, col in enumerate(sql_df.columns) if f"{col}_units" not in sql_df.columns and f"{col}_units" in colnames ]
+ if extra_unit_columns:
+ extra_unit_columns_positions = [ (i, extra_unit_columns[i][0], extra_unit_columns[i][1]) for i in range(len(extra_unit_columns)) ]
+ for col_tuple in extra_unit_columns_positions:
+ print(f"Missing units column '{col_tuple[2]}' after original column '{sql_df.columns[col_tuple[1]]}' (should be column #{col_tuple[0]+col_tuple[1]+1} in new query)")
+ raise ValueError
+ else:
+ return requantify_df(sql_df).convert_dtypes()
+
+
+# Basic Corp Data Asumptions
+# 5 year historical EI (else we presume single year is constant backward and forward)
+# 5 year historical Production (else we presume single year is constant backward and forward)
+# 5 year historical Emissions (else we presume single year is constant backward and forward)
+# We can infer one of the above from the other two (simple maths)
+# The above tables identify the scope(s) to which they apply (S1, S2, S12, S3, S123) and data source (e.g. 'rmi_20211120')
+
+# Basic Benchmark Data Assumptions
+# EI for a given scope
+# Production defined in terms of growth (or negative growth) on a rolling basis (so 0.05, -0.04) would mean 5% growth followed by 4% negative growth for a total of 0.8%
+# Benchmarks are named (e.g., 'OECM')
+
+class VaultCompanyDataProvider(CompanyDataProvider):
+ """
+ This class serves primarily for connecting to the ITR tool to the Data Vault via Trino.
+
+ :param company_table: the name of the Trino table that contains fundamental data for companies
+ :param target_table: the name of the Trino table that contains company (emissions intensity) target data (and possibly historical data)
+ :param trajectory_table: the name of the Trino table that contains company (emissions intensity) historical data (and possibly trajectory data)
+ :param company_schema: the name of the schema where the company_table is found
+ :param column_config: An optional ColumnsConfig object containing relevant variable names
+ :param tempscore_config: An optional TemperatureScoreConfig object containing temperature scoring settings
+ """
+
+ def __init__(self,
+ engine: sqlalchemy.engine.base.Engine,
+ company_table: str,
+ target_table: str = None,
+ trajectory_table: str = None,
+ company_schema: str = None,
+ column_config: Type[ColumnsConfig] = ColumnsConfig,
+ tempscore_config: Type[TemperatureScoreConfig] = TemperatureScoreConfig):
+ super().__init__()
+ self._engine = engine
+ self._schema = company_schema or engine.dialect.default_schema_name or 'demo_dv'
+ self._company_table = company_table
+ self.column_config = column_config
+ self.temp_config = tempscore_config
+ # Validate and complete the projected trajectories
+ self._target_table = target_table or company_table.replace('company_', 'target_')
+ self._trajectory_table = trajectory_table or company_table.replace('company_', 'trajectory_')
+ self._production_table = company_table.replace('company_', 'production_')
+ self._emissions_table = company_table.replace('company_', 'emissions_')
+ companies_without_projections = self._engine.execute(f"""
+select C.company_name, C.company_id from {self._schema}.{self._company_table} C left join {self._schema}.{self._target_table} EI on EI.company_name=C.company_name
+where EI.ei_s1_by_year is NULL
+""").fetchall()
+ assert len(companies_without_projections)==0, f"Provide either historic emissions data or projections for companies with IDs {companies_without_projections}"
+
+ # The factors one would want to sum over companies for weighting purposes are:
+ # * market_cap_usd
+ # * enterprise_value_usd
+ # * assets_usd
+ # * revenue_usd
+ # * emissions
+
+ # TODO: make return value a Quantity (USD or CO2)
+ def sum_over_companies(self, company_ids: List[str], year: int, factor: str, scope: EScope = EScope.S1S2) -> float:
+ if factor=='enterprise_value_usd':
+ qres = self._engine.execute(f"select sum(market_cap_usd + debt_usd - cash_usd) as {factor}_sum from {self._schema}.{self._company_table} where year={year}")
+ elif factor=='emissions':
+ # TODO: properly interpret SCOPE parameter
+ assert scope==EScope.S1S2
+ qres = self._engine.execute(f"select sum(co2_s1_by_year+if(is_nan(co2_s2_by_year),0.0,co2_s2_by_year)) as {factor}_sum from {self._schema}.{self._emissions_table} where year={year}")
+ else:
+ qres = self._engine.execute(f"select sum({factor}) as {factor}_sum from {self._schema}.{self._company_table} where year={year}")
+ sres = qres.fetchall()
+ # sres[0] is the first row of the returned data; sres[0][0] is the first (and only) column of the row returned
+ return sres[0][0]
+
+ def compute_portfolio_weights(self, pa_temp_scores: pd.Series, year: int, factor: str, scope: EScope = EScope.S1S2) -> pd.Series:
+ """
+ Portfolio values could be position size, temperature scores, anything that can be multiplied by a factor.
+
+ :param company_ids: A pd.Series of company IDs (ISINs)
+ :return: A pd.Series weighted by the factor
+ """
+ if factor=='company_evic':
+ qres = self._engine.execute(f"select company_id, sum(company_market_cap + company_cash_equivalents) as {factor} from {self._schema}.{self._company_table} group by company_id")
+ elif factor=='emissions':
+ # TODO: properly interpret SCOPE parameter
+ assert scope==EScope.S1S2
+ qres = self._engine.execute(f"select company_id, sum(co2_s1_by_year+if(is_nan(co2_s2_by_year),0.0,co2_s2_by_year)) as {factor} from {self._schema}.{self._emissions_table} where year={year} group by company_id")
+ else:
+ qres = self._engine.execute(f"select company_id, sum({factor}) as {factor} from {self._schema}.{self._company_table} group by company_id")
+ sres = qres.fetchall()
+ weights = pd.Series(data=[s[1] for s in sres], index=[s[0] for s in sres], dtype=float)
+ weights = weights.loc[pa_temp_scores.index.intersection(weights.index)]
+ weight_sum = weights.sum()
+ return pa_temp_scores * weights / weight_sum
+
+
+ def get_company_data(self, company_ids: List[str]) -> List[ICompanyData]:
+ """
+ Get all relevant data for a list of company ids. This method should return a list of ICompanyData
+ instances.
+
+ :param company_ids: A list of company IDs (ISINs)
+ :return: A list containing the company data
+ """
+ raise NotImplementedError
+
+ def get_value(self, company_ids: List[str], variable_name: str) -> pd.Series:
+ """
+ Gets the value of a variable for a list of companies ids
+ :param company_ids: list of company ids
+ :param variable_name: variable name of the projected feature
+ :return: series of values
+ """
+ raise NotImplementedError
+
+ def get_company_intensity_and_production_at_base_year(self, company_ids: List[str]) -> pd.DataFrame:
+ """
+ overrides subclass method
+ :param: company_ids: list of company ids
+ :return: DataFrame the following columns :
+ ColumnsConfig.COMPANY_ID, ColumnsConfig.GHG_S1S2, ColumnsConfig.BASE_EI, ColumnsConfig.SECTOR and
+ ColumnsConfig.REGION
+ """
+ raise NotImplementedError
+
+ def get_company_fundamentals(self, company_ids: List[str]) -> pd.DataFrame:
+ """
+ :param company_ids: A list of company IDs
+ :return: A pandas DataFrame with company fundamental info per company
+ """
+ or_clause = ' or '.join([f"company_id = '{c}'" for c in company_ids])
+ sql = f"select * from {self._schema}.{self._company_table} where {or_clause}"
+ df = read_quantified_sql(sql, self._company_table, self._schema, self._engine)
+ # df = df.drop(columns=['projected_targets', 'projected_intensities'])
+ return df
+
+ def get_company_projected_trajectories(self, company_ids: List[str]) -> pd.DataFrame:
+ """
+ :param company_ids: A list of company IDs
+ :return: A pandas DataFrame with projected intensities per company
+ """
+ raise NotImplementedError
+
+ def get_company_projected_targets(self, company_ids: List[str]) -> pd.DataFrame:
+ """
+ :param company_ids: A list of company IDs
+ :return: A pandas DataFrame with projected targets per company
+ """
+ raise NotImplementedError
+
+
+
+benchmark_scopes = ['S1S2', 'S3', 'S1S2S3']
+
+class VaultProviderProductionBenchmark(ProductionBenchmarkDataProvider):
+
+ def __init__(self,
+ engine: sqlalchemy.engine.base.Engine,
+ benchmark_name: str,
+ production_benchmarks: IProductionBenchmarkScopes,
+ ingest_schema: str = None,
+ column_config: Type[ColumnsConfig] = ColumnsConfig,
+ tempscore_config: Type[TemperatureScoreConfig] = TemperatureScoreConfig):
+ """
+ Base provider that relies on pydantic interfaces. Default for FastAPI usage
+ :param benchmark_name: the table name of the benchmark (in Trino)
+ :param production_benchmarks: List of IBenchmarkScopes
+ :param column_config: An optional ColumnsConfig object containing relevant variable names
+ :param tempscore_config: An optional TemperatureScoreConfig object containing temperature scoring settings
+ """
+ super().__init__(production_benchmarks=production_benchmarks,
+ column_config=column_config,
+ tempscore_config=tempscore_config)
+ self._engine=engine
+ self._schema = ingest_schema or engine.dialect.default_schema_name or 'demo_dv'
+ self.benchmark_name=benchmark_name
+ qres = self._engine.execute(f"drop table if exists {self._schema}.{benchmark_name}")
+ qres.fetchall()
+ df = pd.DataFrame()
+ for scope in benchmark_scopes:
+ if production_benchmarks.dict()[scope] is None:
+ continue
+ for benchmark in production_benchmarks.dict()[scope]['benchmarks']:
+ # ??? I don't understand why I cannot use benchmark.projections and must use benchmark['projections']
+ bdf = pd.DataFrame.from_dict({r['year']: [r['value'], benchmark['region'], benchmark['sector'], scope] for r in benchmark['projections']},
+ columns=['production', 'region', 'sector', 'scope'],
+ orient='index')
+ df = pd.concat([df, bdf])
+ df.reset_index(inplace=True)
+ df.rename(columns={'index':'year'}, inplace=True)
+ df = df.convert_dtypes()
+ create_table_from_df (df, self._schema, benchmark_name, engine)
+
+ def get_company_projected_production(self, ghg_scope12: pd.DataFrame) -> pd.DataFrame:
+ """
+ get the projected productions for list of companies in ghg_scope12
+ :param ghg_scope12: DataFrame with at least the following columns :
+ ColumnsConfig.COMPANY_ID,ColumnsConfig.GHG_SCOPE12, ColumnsConfig.SECTOR and ColumnsConfig.REGION
+ :return: DataFrame of projected productions for [base_year - base_year + 50]
+ """
+ benchmark_production_projections = self.get_benchmark_projections(ghg_scope12)
+ return benchmark_production_projections.add(1).cumprod(axis=1).mul(
+ ghg_scope12[self.column_config.GHG_SCOPE12].values, axis=0)
+
+ def get_benchmark_projections(self, company_sector_region_info: pd.DataFrame,
+ scope: EScope = EScope.S1S2) -> pd.DataFrame:
+ """
+ Overrides subclass method
+ returns a Dataframe with production benchmarks per company_id given a region and sector.
+ :param company_sector_region_info: DataFrame with at least the following columns :
+ ColumnsConfig.COMPANY_ID, ColumnsConfig.SECTOR and ColumnsConfig.REGION
+ :param scope: a scope
+ :return: A DataFrame with company and intensity benchmarks per calendar year per row
+ """
+ benchmark_projection = self._get_projected_production(scope) # TODO optimize performance
+ sectors = company_sector_region_info[self.column_config.SECTOR]
+ regions = company_sector_region_info[self.column_config.REGION]
+ benchmark_regions = regions.copy()
+ mask = benchmark_regions.isin(benchmark_projection.reset_index()[self.column_config.REGION])
+ benchmark_regions.loc[~mask] = "Global"
+
+ benchmark_projection = benchmark_projection.loc[list(zip(benchmark_regions, sectors)),
+ range(self.temp_config.CONTROLS_CONFIG.base_year,
+ self.temp_config.CONTROLS_CONFIG.target_end_year + 1)]
+ benchmark_projection.index = sectors.index
+
+ return benchmark_projection
+
+
+class VaultProviderIntensityBenchmark(IntensityBenchmarkDataProvider):
+ def __init__(self,
+ engine: sqlalchemy.engine.base.Engine,
+ benchmark_name: str,
+ EI_benchmarks: IEIBenchmarkScopes,
+ ingest_schema: str = None,
+ column_config: Type[ColumnsConfig] = ColumnsConfig,
+ tempscore_config: Type[TemperatureScoreConfig] = TemperatureScoreConfig):
+ super().__init__(EI_benchmarks.benchmark_temperature, EI_benchmarks.benchmark_global_budget,
+ EI_benchmarks.is_AFOLU_included)
+ self._engine=engine
+ self._schema = ingest_schema or engine.dialect.default_schema_name or 'demo_dv'
+ self.benchmark_name = benchmark_name
+ df = pd.DataFrame()
+ for scope in benchmark_scopes:
+ if EI_benchmarks.dict()[scope] is None:
+ continue
+ for benchmark in EI_benchmarks.dict()[scope]['benchmarks']:
+ bdf = pd.DataFrame.from_dict({r['year']: [r['value'], benchmark['region'], benchmark['sector'], scope, EI_benchmarks.benchmark_global_budget, EI_benchmarks.benchmark_temperature] for r in benchmark['projections']},
+ columns=['intensity', 'region', 'sector', 'scope', 'global_budget', 'benchmark_temp'],
+ orient='index')
+ # TODO: AFOLU correction
+ df = pd.concat([df, bdf])
+ df.reset_index(inplace=True)
+ df.rename(columns={'index':'year'}, inplace=True)
+ df = df.convert_dtypes()
+ create_table_from_df(df, self._schema, benchmark_name, engine)
+
+
+ def get_SDA_intensity_benchmarks(self, company_info_at_base_year: pd.DataFrame) -> pd.DataFrame:
+ """
+ Overrides subclass method
+ returns a Dataframe with intensity benchmarks per company_id given a region and sector.
+ :param benchmark_name: the table name of the benchmark (in Trino)
+ :param company_info_at_base_year: DataFrame with at least the following columns :
+ ColumnsConfig.COMPANY_ID, ColumnsConfig.BASE_EI ColumnsConfig.SECTOR and ColumnsConfig.REGION
+ :return: A DataFrame with company and SDA intensity benchmarks per calendar year per row
+ """
+ intensity_benchmarks = self._get_intensity_benchmarks(company_info_at_base_year)
+ decarbonization_paths = self._get_decarbonizations_paths(intensity_benchmarks)
+ last_ei = intensity_benchmarks[self.temp_config.CONTROLS_CONFIG.target_end_year]
+ ei_base = company_info_at_base_year[self.column_config.BASE_EI]
+
+ return decarbonization_paths.mul((ei_base - last_ei), axis=0).add(last_ei, axis=0)
+
+ def _get_decarbonizations_paths(self, intensity_benchmarks: pd.DataFrame) -> pd.DataFrame:
+ """
+ Overrides subclass method
+ Returns a DataFrame with the projected decarbonization paths for the supplied companies in intensity_benchmarks.
+ :param: A DataFrame with company and intensity benchmarks per calendar year per row
+ :return: A pd.DataFrame with company and decarbonisation path s per calendar year per row
+ """
+ return intensity_benchmarks.apply(lambda row: self._get_decarbonization(row), axis=1)
+
+ def _get_decarbonization(self, intensity_benchmark_row: pd.Series) -> pd.Series:
+ """
+ Overrides subclass method
+ returns a Series with the decarbonization path for a benchmark.
+ :param: A Series with company and intensity benchmarks per calendar year per row
+ :return: A pd.Series with company and decarbonisation path s per calendar year per row
+ """
+ first_ei = intensity_benchmark_row[self.temp_config.CONTROLS_CONFIG.base_year]
+ last_ei = intensity_benchmark_row[self.temp_config.CONTROLS_CONFIG.target_end_year]
+ return intensity_benchmark_row.apply(lambda x: (x - last_ei) / (first_ei - last_ei))
+
+ def _convert_benchmark_to_series(self, benchmark: IBenchmark) -> pd.Series:
+ """
+ extracts the company projected intensities or targets for a given scope
+ :param feature: PROJECTED_EI or PROJECTED_TARGETS
+ :param scope: a scope
+ :return: pd.Series
+ """
+ return pd.Series({r.year: r.value for r in benchmark.projections}, name=(benchmark.region, benchmark.sector))
+
+ def _get_projected_intensities(self, scope: EScope = EScope.S1S2) -> pd.Series:
+ """
+ Converts IBenchmarkScopes into dataframe for a scope
+ :param scope: a scope
+ :return: pd.Series
+ """
+ result = []
+ for bm in self._EI_benchmarks.dict()[str(scope)]['benchmarks']:
+ result.append(self._convert_benchmark_to_series(IBenchmark.parse_obj(bm)))
+ df_bm = pd.DataFrame(result)
+ df_bm.index.names = [self.column_config.REGION, self.column_config.SECTOR]
+
+ return df_bm
+
+ def _get_intensity_benchmarks(self, company_sector_region_info: pd.DataFrame,
+ scope: EScope = EScope.S1S2) -> pd.DataFrame:
+ """
+ Overrides subclass method
+ returns a Dataframe with production benchmarks per company_id given a region and sector.
+ :param company_sector_region_info: DataFrame with at least the following columns :
+ ColumnsConfig.COMPANY_ID, ColumnsConfig.SECTOR and ColumnsConfig.REGION
+ :param scope: a scope
+ :return: A DataFrame with company and intensity benchmarks per calendar year per row
+ """
+ benchmark_projection = self._get_projected_intensities(scope) # TODO optimize performance
+ sectors = company_sector_region_info[self.column_config.SECTOR]
+ regions = company_sector_region_info[self.column_config.REGION]
+ benchmark_regions = regions.copy()
+ mask = benchmark_regions.isin(benchmark_projection.reset_index()[self.column_config.REGION])
+ benchmark_regions.loc[~mask] = "Global"
+
+ benchmark_projection = benchmark_projection.loc[list(zip(benchmark_regions, sectors)),
+ range(self.temp_config.CONTROLS_CONFIG.base_year,
+ self.temp_config.CONTROLS_CONFIG.target_end_year + 1)]
+ benchmark_projection.index = sectors.index
+
+ return benchmark_projection
+
+class DataVaultWarehouse(DataWarehouse):
+ def __init__(self,
+ engine: sqlalchemy.engine.base.Engine,
+ company_data: VaultCompanyDataProvider,
+ benchmark_projected_production: ProductionBenchmarkDataProvider,
+ benchmarks_projected_ei: IntensityBenchmarkDataProvider,
+ ingest_schema: str = None,
+ column_config: Type[ColumnsConfig] = ColumnsConfig,
+ tempscore_config: Type[TemperatureScoreConfig] = TemperatureScoreConfig):
+ super().__init__(company_data=None,
+ benchmark_projected_production=benchmark_projected_production,
+ benchmarks_projected_ei=benchmarks_projected_ei,
+ column_config=column_config,
+ tempscore_config=tempscore_config)
+ self._engine=engine
+ self._schema = ingest_schema or engine.dialect.default_schema_name or 'demo_dv'
+ # intensity_projections = read_quantified_sql(f"select * from {self._schema}.{self._target_table}", self._target_table, self._schema, self._engine)
+ # intensity_projections['scope'] = 'S1+S2'
+ # intensity_projections['source'] = self._schema
+
+ # If there's no company data, we are just using the vault, not initializing it
+ if company_data==None:
+ return
+ if benchmark_projected_production is None and benchmarks_projected_ei is None:
+ return
+
+ # The DataVaultWarehouse provides three calculations per company:
+ # * Cumulative trajectory of emissions
+ # * Cumulative target of emissions
+ # * Cumulative budget of emissions (separately for each benchmark)
+
+ qres = self._engine.execute(f"drop table if exists {self._schema}.cumulative_emissions")
+ qres.fetchall()
+ qres = self._engine.execute(f"""
+create table {self._schema}.cumulative_emissions with (
+ format = 'ORC',
+ partitioning = array['scope']
+) as
+select C.company_name, C.company_id, '{company_data._schema}' as source, 'S1+S2' as scope,
+ sum((ET.ei_s1_by_year+if(is_nan(ET.ei_s2_by_year),0.0,ET.ei_s2_by_year)) * P.production_by_year) as cumulative_trajectory,
+ sum((EI.ei_s1_by_year+if(is_nan(EI.ei_s2_by_year),0.0,EI.ei_s2_by_year)) * P.production_by_year) as cumulative_target
+from {company_data._schema}.{company_data._company_table} C
+ join {company_data._schema}.{company_data._production_table} P on P.company_name=C.company_name
+ join {company_data._schema}.{company_data._target_table} EI on EI.company_name=C.company_name and EI.year=P.year
+ join {company_data._schema}.{company_data._trajectory_table} ET on ET.company_name=C.company_name and ET.year=P.year
+where P.year>=2020
+group by C.company_name, C.company_id, '{company_data._schema}', 'S1+S2'
+""")
+ # Need to fetch so table created above is established before using in query below
+ qres.fetchall()
+
+ qres = self._engine.execute(f"drop table if exists {self._schema}.cumulative_budget_1")
+ qres.fetchall()
+ qres = self._engine.execute(f"""
+create table {self._schema}.cumulative_budget_1 with (
+ format = 'ORC',
+ partitioning = array['scope']
+) as
+select C.company_name, C.company_id, '{company_data._schema}' as source, 'S1+S2' as scope, 'benchmark_1' as benchmark,
+ B.global_budget, B.benchmark_temp,
+ sum(B.intensity * P.production_by_year) as cumulative_budget
+from {company_data._schema}.{company_data._company_table} C
+ join {company_data._schema}.{company_data._production_table} P on P.company_name=C.company_name
+ join {self._schema}.benchmark_ei B on P.year=B.year and C.region=B.region and C.sector=B.sector
+where P.year>=2020
+group by C.company_name, C.company_id, '{company_data._schema}', 'S1+S2', 'benchmark_1', B.global_budget, B.benchmark_temp
+""")
+ # Need to fetch so table created above is established so later queries can use it
+ qres.fetchall()
+
+ def quant_init(self,
+ engine: sqlalchemy.engine.base.Engine,
+ company_data: VaultCompanyDataProvider,
+ ingest_schema: str = None):
+ # The Quant users of the DataVaultWarehouse produces two calculations per company:
+ # * Target and Trajectory overshoot ratios
+ # * Temperature Scores
+
+ qres = self._engine.execute(f"drop table if exists {self._schema}.overshoot_ratios")
+ qres.fetchall()
+ qres = self._engine.execute(f"""
+create table {self._schema}.overshoot_ratios with (
+ format = 'ORC',
+ partitioning = array['scope']
+) as
+select E.company_name, E.company_id, '{company_data._schema}' as source, 'S1+S2' as scope, 'benchmark_1' as benchmark,
+ B.global_budget, B.benchmark_temp,
+ E.cumulative_trajectory/B.cumulative_budget as trajectory_overshoot_ratio,
+ E.cumulative_target/B.cumulative_budget as target_overshoot_ratio
+from {self._schema}.cumulative_emissions E
+ join {self._schema}.cumulative_budget_1 B on E.company_id=B.company_id
+""")
+ # Need to fetch so table created above is established so later queries can use it
+ qres.fetchall()
+
+ qres = self._engine.execute(f"drop table if exists {self._schema}.temperature_scores")
+ qres.fetchall()
+ qres = self._engine.execute(f"""
+create table {self._schema}.temperature_scores with (
+ format = 'ORC',
+ partitioning = array['scope']
+) as
+select R.company_name, R.company_id, '{company_data._schema}' as source, 'S1+S2' as scope, 'benchmark_1' as benchmark,
+ R.benchmark_temp + R.global_budget * (R.trajectory_overshoot_ratio-1) * 2.2/3664.0 as trajectory_temperature_score,
+ 'delta_degC' as trajectory_temperature_score_units,
+ R.benchmark_temp + R.global_budget * (R.target_overshoot_ratio-1) * 2.2/3664.0 as target_temperature_score,
+ 'delta_degC' as target_temperature_score_units
+from {self._schema}.overshoot_ratios R
+""")
+ # Need to fetch so table created above is established before any might want to use later
+ qres.fetchall()
+
+
+ def get_preprocessed_company_data(self, company_ids: List[str]) -> List[ICompanyAggregates]:
+ raise NotImplementedError
+
+ def get_pa_temp_scores(self, probability: float, company_ids: List[str]) -> pd.Series:
+ if probability < 0 or probability > 1:
+ raise ValueError(f"probability value {probability} outside range [0.0, 1.0]")
+ temp_scores = read_quantified_sql(f"select company_id, target_temperature_score, target_temperature_score_units, trajectory_temperature_score, trajectory_temperature_score_units from {self._schema}.temperature_scores",
+ 'temperature_scores', self._schema, self._engine, index_col='company_id')
+ # We may have company_ids in our portfolio not in our database, and vice-versa.
+ # Return proper pa_temp_scores for what we can find, and np.nan for those we cannot
+ retval = pd.Series(data=None, index=company_ids, dtype='float64')
+ retval.loc[retval.index.intersection(temp_scores.index)] = temp_scores.target_temperature_score*probability + temp_scores.trajectory_temperature_score*(1-probability)
+ return retval
diff --git a/examples/ITR_UI.py b/examples/ITR_UI.py
index 33e755eb..fb85de9d 100644
--- a/examples/ITR_UI.py
+++ b/examples/ITR_UI.py
@@ -40,6 +40,19 @@
import sys
import argparse
+# Initial calculations
+
+
+examples_dir = '' # 'examples'
+data_dir = "data"
+data_json_units_dir = "json-units"
+root = os.path.abspath('')
+
+# Set input filename (from commandline or default)
+parser = argparse.ArgumentParser()
+parser.add_argument('-file')
+args = parser.parse_args()
+company_data_path = args.file or os.path.join(root, examples_dir, data_dir, "20220720 ITR Tool Sample Data.xlsx")
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
@@ -681,7 +694,6 @@ def agg_score(agg_method):
agg_s3 = [agg_method.value,aggregated_scores.long.S3.all.score]
else:
agg_s3 = []
-
return agg_s1s2 + agg_s3
agg_temp_scores = [agg_score(i) for i in PortfolioAggregationMethod]
@@ -747,12 +759,13 @@ def agg_score(agg_method):
fig1, fig5,
heatmap_fig, high_score_fig,
port_score_diff_methods_fig,
- "{:.2f}".format(scores), # fake for spinner
- "{:.2f}".format(scores), # portfolio score
- {'color': 'ForestGreen'} if scores < 2 else {'color': 'Red'}, # conditional color
- str(round((filt_df.company_ev_plus_cash.sum())/10**9,0)), # sum of total EVIC for companies in portfolio
- str(round((filt_df.investment_value.sum())/10**6,1)), # portfolio notional
- str(len(filt_df)), # num of companies
+ "{:.2f}".format(aggregated_scores.long.S1S2.all.score.m), # fake for spinner
+ "{:.2f}".format(aggregated_scores.long.S1S2.all.score.m), # portfolio score
+ {'color': 'ForestGreen'} if aggregated_scores.long.S1S2.all.score.m < 2 else {'color': 'Red'},
+ # conditional color
+ str(round((filt_df.company_ev_plus_cash.sum()) / 10 ** 9, 0)), # sum of total EVIC for companies in portfolio
+ str(round((filt_df.investment_value.sum()) / 10 ** 6, 1)), # portfolio notional
+ str(len(filt_df)), # num of companies
dbc.Table.from_dataframe(df_for_output_table,
striped=True,
bordered=True,
diff --git a/examples/data/mdt-20220116-portfolio.csv b/examples/data/mdt-20220116-portfolio.csv
new file mode 100644
index 00000000..a2c9a4ae
--- /dev/null
+++ b/examples/data/mdt-20220116-portfolio.csv
@@ -0,0 +1,62 @@
+company_name;company_lei;company_id;investment_value
+AES Corp.;2NUNNB7D43COUIRE5295;US00130H1059;4351252
+Algonquin Power & Utilities Corp.;549300K5VIUTJXQL7X75;US0158577090;2228185
+ALLETE, Inc.;549300NNLSIMY6Z8OT86;US0185223007;3829481
+Alliant Energy;5493009ML300G373MZ12;US0188021085;3829481
+Ameren Corp.;XRZQ5S7HYJFPHJ78L959;US0236081024;15917812
+American Electric Power Co., Inc.;1B4S6S7G0TW5EE83BO58;US0255371017;45520637
+Avangrid, Inc.;549300OX0Q38NLSKPB49;US05351W1036;10049068
+Avista Corp.;Q0IK63NITJD6RJ47SW96;US05379B1070;2804211
+Cleco Partners LP;5493002H80P81B3HXL31;US18551QAA58;3086052
+CMS Energy;549300IA9XFBAGNIBW29;US1258961002;9153135
+Consolidated Edison, Inc.;54930033SBW53OO8T749;US2091151041;20394113
+Dominion Energy;ILUL7B6Z54MRYCF6H308;US25746U1097;33528082
+DTE Energy;549300IX8SD6XXD71I78;US2333311072;14329945
+Duke Energy Corp.;I1BZKREC126H0VB1BL91;US26441C2044;73069652
+El Paso Electric Co;OZ8GM8L4AHPKSWZMW205;US283677AZ52;2646941
+Emera Inc.;NQZVQT2P5IUF2PGA1Q48;CA2908761018;6631113
+Entergy Corp.;4XM3TW50JULSLG8BNC79;US29364G1031;29844269
+Evergy, Inc.;549300PGTHDQY6PSUI61;US30034W1062;18254954
+Eversource Energy;SJ7XXD41SQU3ZNWUJ746;US30040W1080;18962480
+FirstEnergy Corp.;549300SVYJS666PQJH88;US3379321074;27277340
+Fortis, Inc;549300MQYQ9Y065XPR71;CA3495531079;12428756
+MDU Resources Group;0T6SBMK3JTBI1JR36794;US5526901096;1207049
+National Grid plc;8R95QZMKZLJX5Q2XR704;US6362744095;12281584
+NorthWestern Corp.;3BPWMBHR1R9SHUN7J795;US6680743050;2703150
+OG&E Energy;CE5OG6JPOZMDSA0LAQ19;US6708371033;7251242
+Otter Tail Corp.;549300HHVBQRQUVKKD91;US6896481032;1264277
+Pinnacle West Capital Corp.;TWSEY0NEDUDCKS27AH81;US7234841010;12058547
+PNM Resources, Inc.;5493003JOBJGLZSDDQ28;US69349H1077;3326899
+Portland General Electric Co.;GJOUP9M7C39GLSK9R870;US7365088472;5770964
+PPL;9N3UAJSNOUXFKQLF3V18;US69351T1060;18146577
+Public Service Enterprise Group;PUSS41EMO3E6XXNV3U28;US7445731067;16912134
+Sempra Energy;PBBKGKLRK5S5C0Y4T545;US8168511090;29579515
+Southern Co.;549300FC3G3YU2FBZD92;US8425871071;50294245
+WEC Energy Group;549300IGLYTZUK3PVP70;US92939U1060;11046675
+Xcel Energy, Inc.;LGJNMI9GH8XIDG5RCM61;US98389B1008;27475073
+AK STEEL HOLDING CORP;529900DT4E7ZNETMVC04;US0015471081;10000000
+ARCELORMITTAL;2EULGUTUI56JI9SAL165;LU0140205948;10000000
+CARPENTER TECHNOLOGY CORP;DX6I6ZD3X5WNNCDJKP85;US1442851036;10000000
+COMMERCIAL METALS CO;549300OQS2LO07ZJ7N73;US2017231034;10000000
+FRIEDMAN INDUSTRIES INC;LEI05;US3584351056;10000000
+GENERAL STEEL HOLDINGS INC;5493008ZKBIR02ICY091;US3708532029;10000000
+GERDAU S.A.;254900YDV6SEQQPZVG24;US3737371050;10000000
+GIBRALTAR INDUSTRIES, INC.;LEI08;US3746891072;10000000
+GROUP SIMEC SA DE CV;529900LCYCXPA0TZEU09;MXP4984U1083;10000000
+HAYNES INTERNATIONAL INC;549300I9MS5UZLRFDO40;US4208772016;10000000
+INSTEEL INDUSTRIES INC;52990026LKY4MOX3L174;US45774W1080;10000000
+LEGATO MERGER CORP.;5493006RXIB5GVHWJS53;CA0156581070;10000000
+MECHEL PAO;253400C9GSPBSKERRP65;US5838406081;10000000
+NATIONAL STEEL CO;335800Y6L4X95L2FEF64;INE088B01015;10000000
+NIPPON STEEL CORP;35380065QWQ4U2V3PA33;JP3381000003;10000000
+NUCOR CORP;549300GGJCRSI2TIEJ46;US6703461052;10000000
+OSSEN INNOVATION CO. LTD.;LEI17;US6884102087;10000000
+POSCO;988400E5HRVX81AYLM04;KR7005490008;10000000
+STEEL DYNAMICS INC;549300HGGKEL4FYTTQ83;US8581191009;10000000
+TENARIS SA;549300Y7C05BKC4HZB40;US88031M1099;10000000
+TERNIUM S.A.;529900QG4KU23TEI2E46;US8808901081;10000000
+TIMKENSTEEL CORP;549300QZTZWHDE9HJL14;US8873991033;10000000
+TITAN INTERNATIONAL INC;254900CXRGBE7C4B5A06;US88830M1027;10000000
+UNITED STATES STEEL CORP;JNLUVFYJT1OZSIQ24U47;US9129091081;10000000
+UNIVERSAL STAINLESS & ALLOY PRODUCTS INC;5493001OEIZDUGXZDE09;US9138371003;10000000
+WORTHINGTON INDUSTRIES INC;1WRCIANKYOIK6KYE5E82;US9818111026;10000000
diff --git a/examples/data/mdt-steel-demo.xlsx b/examples/data/mdt-steel-demo.xlsx
new file mode 100644
index 00000000..6a05da13
Binary files /dev/null and b/examples/data/mdt-steel-demo.xlsx differ
diff --git a/examples/data/rmi-20211120-portfolio.csv b/examples/data/rmi-20211120-portfolio.csv
new file mode 100644
index 00000000..2434a8ba
--- /dev/null
+++ b/examples/data/rmi-20211120-portfolio.csv
@@ -0,0 +1,51 @@
+company_name;company_lei;company_id;investment_value
+AES Corp.;2NUNNB7D43COUIRE5295;US00130H1059;4351252
+Algonquin Power & Utilities Corp.;549300K5VIUTJXQL7X75;US0158577090;2228185
+"ALLETE, Inc.";549300NNLSIMY6Z8OT86;US0185223007;3829481
+Alliant Energy;5493009ML300G373MZ12;US0188021085;3829481
+Ameren Corp.;XRZQ5S7HYJFPHJ78L959;US0236081024;15917812
+"American Electric Power Co., Inc.";1B4S6S7G0TW5EE83BO58;US0255371017;45520637
+"Avangrid, Inc.";549300OX0Q38NLSKPB49;US05351W1036;10049068
+Avista Corp.;Q0IK63NITJD6RJ47SW96;US05379B1070;2804211
+Cleco Partners LP;5493002H80P81B3HXL31;US18551QAA58;3086052
+CMS Energy;549300IA9XFBAGNIBW29;US1258961002;9153135
+"Consolidated Edison, Inc.";54930033SBW53OO8T749;US2091151041;20394113
+Dominion Energy;ILUL7B6Z54MRYCF6H308;US25746U1097;33528082
+DTE Energy;549300IX8SD6XXD71I78;US2333311072;14329945
+Duke Energy Corp.;I1BZKREC126H0VB1BL91;US26441C2044;73069652
+El Paso Electric Co;OZ8GM8L4AHPKSWZMW205;US283677AZ52;2646941
+Emera Inc.;NQZVQT2P5IUF2PGA1Q48;CA2908761018;6631113
+Entergy Corp.;4XM3TW50JULSLG8BNC79;US29364G1031;29844269
+"Evergy, Inc.";549300PGTHDQY6PSUI61;US30034W1062;18254954
+Eversource Energy;SJ7XXD41SQU3ZNWUJ746;US30040W1080;18962480
+FirstEnergy Corp.;549300SVYJS666PQJH88;US3379321074;27277340
+"Fortis, Inc";549300MQYQ9Y065XPR71;CA3495531079;12428756
+MDU Resources Group;0T6SBMK3JTBI1JR36794;US5526901096;1207049
+National Grid plc;8R95QZMKZLJX5Q2XR704;US6362744095;12281584
+NorthWestern Corp.;3BPWMBHR1R9SHUN7J795;US6680743050;2703150
+OG&E Energy;CE5OG6JPOZMDSA0LAQ19;US6708371033;7251242
+Otter Tail Corp.;549300HHVBQRQUVKKD91;US6896481032;1264277
+Pinnacle West Capital Corp.;TWSEY0NEDUDCKS27AH81;US7234841010;12058547
+"PNM Resources, Inc.";5493003JOBJGLZSDDQ28;US69349H1077;3326899
+Portland General Electric Co.;GJOUP9M7C39GLSK9R870;US7365088472;5770964
+PPL;9N3UAJSNOUXFKQLF3V18;US69351T1060;18146577
+Public Service Enterprise Group;PUSS41EMO3E6XXNV3U28;US7445731067;16912134
+Sempra Energy;PBBKGKLRK5S5C0Y4T545;US8168511090;29579515
+Southern Co.;549300FC3G3YU2FBZD92;US8425871071;50294245
+WEC Energy Group;549300IGLYTZUK3PVP70;US92939U1060;11046675
+"Xcel Energy, Inc.";LGJNMI9GH8XIDG5RCM61;US98389B1008;27475073
+Company AV;LEI01;US6293775085;10000000
+Company AW;LEI02;US7134481081;10000000
+Company A;LEI03;JP0000000001;10000000
+Company B;LEI04;NL0000000002;10000000
+Company C;LEI05;IT0000000003;10000000
+Company D;LEI06;SE0000000004;10000000
+Company E;LEI07;SE0000000005;10000000
+Company F;LEI08;NL0000000006;10000000
+Company G;LEI09;CN0000000007;10000000
+Company H;LEI10;CN0000000008;10000000
+Company I;LEI11;CN0000000009;10000000
+Company J;LEI12;BR0000000010;10000000
+Company K;LEI13;BR0000000011;10000000
+Company L;LEI14;BR0000000012;10000000
+Company M;LEI15;AR0000000013;10000000
diff --git a/examples/vault_demo_cleanup.ipynb b/examples/vault_demo_cleanup.ipynb
new file mode 100644
index 00000000..e6429ae1
--- /dev/null
+++ b/examples/vault_demo_cleanup.ipynb
@@ -0,0 +1,287 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "e3c5c7d5-63e0-47a5-ac4a-bb58beb98995",
+ "metadata": {},
+ "source": [
+ "# Data Vault Demo (Cleanup)\n",
+ "\n",
+ "Clean up tables created by Data Vault Demo\n",
+ "\n",
+ "Only table creators can drop tables, so we need to instantiate the engines that created the tables..."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "d1ab75f1-dc99-422d-b15b-ce043e32fff8",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import os\n",
+ "import pathlib\n",
+ "from dotenv import load_dotenv\n",
+ "\n",
+ "# Load some standard environment variables from a dot-env file, if it exists.\n",
+ "# If no such file can be found, does not fail, and so allows these environment vars to\n",
+ "# be populated in some other way\n",
+ "dotenv_dir = os.environ.get('CREDENTIAL_DOTENV_DIR', os.environ.get('PWD', '/opt/app-root/src'))\n",
+ "dotenv_path = pathlib.Path(dotenv_dir) / 'credentials.env'\n",
+ "if os.path.exists(dotenv_path):\n",
+ " load_dotenv(dotenv_path=dotenv_path,override=True)\n",
+ "\n",
+ "import trino\n",
+ "import osc_ingest_trino as osc\n",
+ "from sqlalchemy.engine import create_engine"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "b3154b10-a9d4-45e2-9329-93098ac3b1b2",
+ "metadata": {},
+ "source": [
+ "# This initializes the \"normal\" Trino developer's engine\n",
+ "\n",
+ "sqlstring = 'trino://{user}@{host}:{port}/'.format(\n",
+ " user = os.environ['TRINO_USER'],\n",
+ " host = os.environ['TRINO_HOST'],\n",
+ " port = os.environ['TRINO_PORT']\n",
+ ")\n",
+ "\n",
+ "ingest_catalog = 'osc_datacommons_dev'\n",
+ "ingest_schema = 'demo_dv'\n",
+ "\n",
+ "sqlargs = {\n",
+ " 'auth': trino.auth.JWTAuthentication(os.environ['TRINO_PASSWD']),\n",
+ " 'http_scheme': 'https',\n",
+ " 'catalog': ingest_catalog,\n",
+ " 'schema': ingest_schema,\n",
+ "}\n",
+ "engine = create_engine(sqlstring, connect_args = sqlargs)\n",
+ "connection = engine.connect()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a6b350ef-f3a0-4e59-9885-d6c830b040b3",
+ "metadata": {},
+ "source": [
+ "The ITR Data Pipeline creates these tables. We should not delete this data unless we created them as TRINO_USER1 as part of the construction of the vault."
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "b83eb9bf-9ca2-4bba-a16d-662db030a2f6",
+ "metadata": {},
+ "source": [
+ "for table in ['company_data', 'emissions_data', 'target_data', 'production_data', 'trajectory_data']:\n",
+ " print(f\"Dropping table {table}\")\n",
+ " engine.execute(f\"drop table if exists {table}\").fetchall()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "6cfbc8a9-aa36-4b40-ae6d-7f0a91785855",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Cleaning up Dev tables\n",
+ "connecting with engine Engine(trino://os-climate-user1@trino-secure-odh-trino.apps.odh-cl2.apps.os-climate.org:443/)\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/michael/opt/miniconda3/envs/jupyter/lib/python3.10/site-packages/sqlalchemy_trino/dialect.py:259: SAWarning: Dialect trino:rest will not make use of SQL compilation caching as it does not set the 'supports_statement_cache' attribute to ``True``. This can have significant performance implications including some performance degradations in comparison to prior SQLAlchemy versions. Dialect maintainers should seek to set this attribute to True after appropriate development and testing for SQLAlchemy 1.4 caching support. Alternatively, this attribute may be set to False which will disable this warning. (Background on this error at: https://sqlalche.me/e/14/cprf)\n",
+ " res = connection.execute(sql.text(query)).scalar()\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "[('benchmark_ei',),\n",
+ " ('benchmark_prod',),\n",
+ " ('company_data',),\n",
+ " ('cumulative_budget_1',),\n",
+ " ('cumulative_emissions',),\n",
+ " ('emissions_data',),\n",
+ " ('isic_to_sector',),\n",
+ " ('oecm_cumprod',),\n",
+ " ('overshoot_ratios',),\n",
+ " ('production_data',),\n",
+ " ('target_data',),\n",
+ " ('temperature_scores',),\n",
+ " ('trajectory_data',)]"
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "print(\"Cleaning up Dev tables\")\n",
+ "\n",
+ "sqlstring = 'trino://{user}@{host}:{port}/'.format(\n",
+ " user = os.environ['TRINO_USER_USER1'],\n",
+ " host = os.environ['TRINO_HOST'],\n",
+ " port = os.environ['TRINO_PORT']\n",
+ ")\n",
+ "\n",
+ "ingest_catalog = 'osc_datacommons_dev'\n",
+ "ingest_schema = 'demo_dv'\n",
+ "\n",
+ "sqlargs = {\n",
+ " 'auth': trino.auth.JWTAuthentication(os.environ['TRINO_PASSWD_USER1']),\n",
+ " 'http_scheme': 'https',\n",
+ " 'catalog': ingest_catalog,\n",
+ " 'schema': ingest_schema,\n",
+ "}\n",
+ "\n",
+ "engine_dev = create_engine(sqlstring, connect_args = sqlargs)\n",
+ "print(\"connecting with engine \" + str(engine_dev))\n",
+ "connection_dev = engine_dev.connect()\n",
+ "engine_dev.execute(f\"show tables in {ingest_schema}\").fetchall()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "a6832b10-ea33-464b-a061-043757fe16d0",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Dropping Dev table benchmark_ei\n",
+ "Dropping Dev table benchmark_prod\n",
+ "Dropping Dev table cumulative_budget_1\n",
+ "Dropping Dev table cumulative_emissions\n"
+ ]
+ }
+ ],
+ "source": [
+ "for table in ['benchmark_ei', 'benchmark_prod',\n",
+ " 'cumulative_budget_1', 'cumulative_emissions']:\n",
+ " print(f\"Dropping Dev table {table}\")\n",
+ " engine_dev.execute(f\"drop table if exists {table}\").fetchall()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "c95bcd2c-5884-4331-8233-a352bf52cec6",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Cleaning up Quant tables\n",
+ "connecting with engine Engine(trino://os-climate-user2@trino-secure-odh-trino.apps.odh-cl2.apps.os-climate.org:443/)\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "[('company_data',),\n",
+ " ('emissions_data',),\n",
+ " ('intensity_data',),\n",
+ " ('isic_to_sector',),\n",
+ " ('oecm_cumprod',),\n",
+ " ('production_data',),\n",
+ " ('target_data',),\n",
+ " ('trajectory_data',)]"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "print(\"Cleaning up Quant tables\")\n",
+ "\n",
+ "sqlstring = 'trino://{user}@{host}:{port}/'.format(\n",
+ " user = os.environ['TRINO_USER_USER2'],\n",
+ " host = os.environ['TRINO_HOST'],\n",
+ " port = os.environ['TRINO_PORT']\n",
+ ")\n",
+ "\n",
+ "ingest_catalog = 'osc_datacommons_dev'\n",
+ "ingest_schema = 'demo_dv'\n",
+ "\n",
+ "sqlargs = {\n",
+ " 'auth': trino.auth.JWTAuthentication(os.environ['TRINO_PASSWD_USER2']),\n",
+ " 'http_scheme': 'https',\n",
+ " 'catalog': ingest_catalog,\n",
+ " 'schema': ingest_schema,\n",
+ "}\n",
+ "\n",
+ "engine_quant = create_engine(sqlstring, connect_args = sqlargs)\n",
+ "print(\"connecting with engine \" + str(engine_quant))\n",
+ "connection_quant = engine_quant.connect()\n",
+ "engine_quant.execute(f\"show tables in {ingest_schema}\").fetchall()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "a4d4478e-997c-4641-9d4f-f4588318b90f",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Dropping Quant table overshoot_ratios\n",
+ "Dropping Quant table temperature_scores\n"
+ ]
+ }
+ ],
+ "source": [
+ "for table in ['overshoot_ratios',\n",
+ " 'temperature_scores']:\n",
+ " print(f\"Dropping Quant table {table}\")\n",
+ " engine_quant.execute(f\"drop table if exists {table}\").fetchall()\n",
+ "engine_quant.execute(f\"show tables in {ingest_schema}\").fetchall()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "96697928-5b47-4e5a-955c-5892f2311535",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.10.2"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/examples/vault_demo_n0.ipynb b/examples/vault_demo_n0.ipynb
new file mode 100644
index 00000000..fcd98fa9
--- /dev/null
+++ b/examples/vault_demo_n0.ipynb
@@ -0,0 +1,1205 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "e3c5c7d5-63e0-47a5-ac4a-bb58beb98995",
+ "metadata": {},
+ "source": [
+ "# Data Vault Demo (Dev -- Full Access)\n",
+ "\n",
+ "The basic concept of the Data Vault is that when a user authenticates themself, they receive an engine that gives them access to all the data (rows, columns, tables, schema, etc.) for which they are authorized. Users who can authenticate themselves for multiple roles can use those roles simultaneously. We are keeping in mind the importance of Data Lineage Management (tracked by issue https://github.com/os-climate/os_c_data_commons/issues/50) but is not treated as part of this particular prototype.\n",
+ "\n",
+ "The steps of this demo are:\n",
+ "\n",
+ "1. **Authenticate and acquire SQLAlchemy engine**\n",
+ " 1. **Dev engine sees all**\n",
+ " 2. Quant engine can do temp scoring but not see fundamental company info\n",
+ " 3. User engine can use temp scoring but not see cumulative emissions nor overshoot info\n",
+ "2. **With Dev engine, construct Vaults for:**\n",
+ " 1. **Fundamental corporate financial information**\n",
+ " 2. **Corporate emissions data (base year, historical)**\n",
+ " 3. **Corporate target data (start year, end year, target start value, target end value)**\n",
+ " 4. **Sector benchmark data (production, CO2e intensity)**\n",
+ "3. **Dev Engine: Visualize projected emissions (targets and trajectories) and calculate cumulative emissions**\n",
+ "4. Quant Engine: Using calculated cumulative emmisions, visualize per-company trajectory and target temperature scores\n",
+ "5. User Engine: Using consensus probability scoring and own portfolio data (ISIN, position value)\n",
+ " 1. Calculate publishable per-company temperature alignment score\n",
+ " 2. Based on aggregate corporate and portfolio information, produce weighting scores to yield overall portfolio alignment score"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "d1ab75f1-dc99-422d-b15b-ce043e32fff8",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import os\n",
+ "import pathlib\n",
+ "from dotenv import load_dotenv\n",
+ "\n",
+ "# Load some standard environment variables from a dot-env file, if it exists.\n",
+ "# If no such file can be found, does not fail, and so allows these environment vars to\n",
+ "# be populated in some other way\n",
+ "dotenv_dir = os.environ.get('CREDENTIAL_DOTENV_DIR', os.environ.get('PWD', '/opt/app-root/src'))\n",
+ "dotenv_path = pathlib.Path(dotenv_dir) / 'credentials.env'\n",
+ "if os.path.exists(dotenv_path):\n",
+ " load_dotenv(dotenv_path=dotenv_path,override=True)\n",
+ "\n",
+ "import trino\n",
+ "from sqlalchemy.engine import create_engine"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "04561de3-9ce1-4e08-9c28-3ac1ea298340",
+ "metadata": {},
+ "source": [
+ "# This initializes the \"normal\" Trino developer's engine\n",
+ "\n",
+ "sqlstring = 'trino://{user}@{host}:{port}/'.format(\n",
+ " user = os.environ['TRINO_USER'],\n",
+ " host = os.environ['TRINO_HOST'],\n",
+ " port = os.environ['TRINO_PORT']\n",
+ ")\n",
+ "sqlargs = {\n",
+ " 'auth': trino.auth.JWTAuthentication(os.environ['TRINO_PASSWD']),\n",
+ " 'http_scheme': 'https',\n",
+ " 'catalog': 'osc_datacommons_dev',\n",
+ " 'schema': 'itr_mdt',\n",
+ "}\n",
+ "engine = create_engine(sqlstring, connect_args = sqlargs)\n",
+ "connection = engine.connect()\n",
+ "\n",
+ "ingest_catalog = 'osc_datacommons_dev'\n",
+ "ingest_schema = 'itr_mdt'"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "24cb4e5e-fb6f-42a1-938e-2a3b430d03eb",
+ "metadata": {},
+ "source": [
+ "### Step 1: Initialize Vaut user 'Dev', which has full visibility into corporate financial, production, and target data"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "07ef60e6-a328-4657-aad3-23d78abcbfea",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "connecting with engine Engine(trino://os-climate-user1@trino-secure-odh-trino.apps.odh-cl2.apps.os-climate.org:443/)\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/michael/opt/miniconda3/envs/jupyter/lib/python3.10/site-packages/sqlalchemy_trino/dialect.py:259: SAWarning: Dialect trino:rest will not make use of SQL compilation caching as it does not set the 'supports_statement_cache' attribute to ``True``. This can have significant performance implications including some performance degradations in comparison to prior SQLAlchemy versions. Dialect maintainers should seek to set this attribute to True after appropriate development and testing for SQLAlchemy 1.4 caching support. Alternatively, this attribute may be set to False which will disable this warning. (Background on this error at: https://sqlalche.me/e/14/cprf)\n",
+ " res = connection.execute(sql.text(query)).scalar()\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "[('benchmark_ei',),\n",
+ " ('benchmark_prod',),\n",
+ " ('company_data',),\n",
+ " ('cumulative_budget_1',),\n",
+ " ('cumulative_emissions',),\n",
+ " ('emissions_data',),\n",
+ " ('isic_to_sector',),\n",
+ " ('oecm_cumprod',),\n",
+ " ('overshoot_ratios',),\n",
+ " ('production_data',),\n",
+ " ('target_data',),\n",
+ " ('temperature_scores',),\n",
+ " ('trajectory_data',)]"
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "sqlstring = 'trino://{user}@{host}:{port}/'.format(\n",
+ " user = os.environ['TRINO_USER_USER1'],\n",
+ " host = os.environ['TRINO_HOST'],\n",
+ " port = os.environ['TRINO_PORT']\n",
+ ")\n",
+ "\n",
+ "ingest_catalog = 'osc_datacommons_dev'\n",
+ "ingest_schema = 'demo_dv'\n",
+ "\n",
+ "sqlargs = {\n",
+ " 'auth': trino.auth.JWTAuthentication(os.environ['TRINO_PASSWD_USER1']),\n",
+ " 'http_scheme': 'https',\n",
+ " 'catalog': ingest_catalog,\n",
+ " 'schema': ingest_schema,\n",
+ "}\n",
+ "\n",
+ "engine_dev = create_engine(sqlstring, connect_args = sqlargs)\n",
+ "print(\"connecting with engine \" + str(engine_dev))\n",
+ "connection_dev = engine_dev.connect()\n",
+ "engine_dev.execute(f\"show tables in {ingest_schema}\").fetchall()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "837212ac-6d98-46a2-9a18-c5c026feb84c",
+ "metadata": {},
+ "source": [
+ "### The ITR module provides Vault objects that coordinate the interaction of Dev, Quant, and User roles.\n",
+ "\n",
+ "The SQLAlchemy engines mediate the actual interaction with the Data Vault."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "969b6d53-49d8-47d9-b218-6bdd790a7de4",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/michael/opt/miniconda3/envs/jupyter/lib/python3.10/site-packages/sqlalchemy_trino/dialect.py:259: SAWarning: Dialect trino:rest will not make use of SQL compilation caching as it does not set the 'supports_statement_cache' attribute to ``True``. This can have significant performance implications including some performance degradations in comparison to prior SQLAlchemy versions. Dialect maintainers should seek to set this attribute to True after appropriate development and testing for SQLAlchemy 1.4 caching support. Alternatively, this attribute may be set to False which will disable this warning. (Background on this error at: https://sqlalche.me/e/14/cprf)\n",
+ " res = connection.execute(sql.text(query)).scalar()\n"
+ ]
+ }
+ ],
+ "source": [
+ "import json\n",
+ "import pandas as pd\n",
+ "from numpy.testing import assert_array_equal\n",
+ "import ITR\n",
+ "\n",
+ "# from ITR.portfolio_aggregation import PortfolioAggregationMethod\n",
+ "# from ITR.temperature_score import TemperatureScore\n",
+ "# from ITR.configs import ColumnsConfig, TemperatureScoreConfig\n",
+ "# from ITR.data.data_warehouse import DataWarehouse\n",
+ "from ITR.data.vault_providers import VaultCompanyDataProvider, VaultProviderProductionBenchmark, \\\n",
+ " VaultProviderIntensityBenchmark, DataVaultWarehouse\n",
+ "# from ITR.interfaces import ICompanyData, EScope, ETimeFrames, PortfolioCompany, IEIBenchmarkScopes, \\\n",
+ "# IProductionBenchmarkScopes\n",
+ "from ITR.interfaces import EScope, IProductionBenchmarkScopes, IEIBenchmarkScopes"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5e1c9ad5-2cee-4052-8001-cce2c41d9f6d",
+ "metadata": {},
+ "source": [
+ "### Step 2: construct vaults for corporate financial, production, and target information.\n",
+ "\n",
+ "We also create benchmark data (which is presumed public information). There's more work to be done to modularly add new benchmarks that automatically become available options to to the ITR tool.\n",
+ "\n",
+ "In this demo we read ITR benchmark data from JSON files (REST API-friendly). Such data coming from the notebook filesystem is \"untethered\" data. The corporate data comes from an existing data pipeline (in this case, the pipeline processing RMI data). When data comes from the data commons, it is \"tethered\" to the Data Commons. The Data Vault can only control access to data that goes through the Data Commons via 'engines'."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "f0f02443-0f8f-4ee1-aa23-f59a9250615f",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "year Int64\n",
+ "production object\n",
+ "region string\n",
+ "sector string\n",
+ "scope string\n",
+ "dtype: object\n",
+ "Index(['year', 'production', 'region', 'sector', 'scope'], dtype='object')\n",
+ "RangeIndex(start=0, stop=192, step=1)\n",
+ "constructed fully qualified table name as: \"demo_dv.benchmark_prod\"\n",
+ "inserting 192 records\n",
+ " (2019, 0.0, 'dimensionless', 'Global', 'Steel', 'S1S2')\n",
+ " (2020, 0.015, 'dimensionless', 'Global', 'Steel', 'S1S2')\n",
+ " (2021, 0.015, 'dimensionless', 'Global', 'Steel', 'S1S2')\n",
+ " ...\n",
+ " (2050, 0.0032269880188280364, 'dimensionless', 'North America', 'Electricity Utilities', 'S1S2')\n",
+ "batch insert result: [(192,)]\n",
+ "year Int64\n",
+ "intensity object\n",
+ "region string\n",
+ "sector string\n",
+ "scope string\n",
+ "global_budget object\n",
+ "benchmark_temp object\n",
+ "dtype: object\n",
+ "Index(['year', 'intensity', 'region', 'sector', 'scope', 'global_budget',\n",
+ " 'benchmark_temp'],\n",
+ " dtype='object')\n",
+ "RangeIndex(start=0, stop=192, step=1)\n",
+ "constructed fully qualified table name as: \"demo_dv.benchmark_ei\"\n",
+ "inserting 192 records\n",
+ " (2019, 3.3220564752850343, 'CO2 * metric_ton / Fe_ton', 'Global', 'Steel', 'S1S2', 396, 'CO2 * gigametric_ton', 1.5, 'delta_degree_Celsius')\n",
+ " (2020, 3.1503497972403762, 'CO2 * metric_ton / Fe_ton', 'Global', 'Steel', 'S1S2', 396, 'CO2 * gigametric_ton', 1.5, 'delta_degree_Celsius')\n",
+ " (2021, 3.0527921157410978, 'CO2 * metric_ton / Fe_ton', 'Global', 'Steel', 'S1S2', 396, 'CO2 * gigametric_ton', 1.5, 'delta_degree_Celsius')\n",
+ " ...\n",
+ " (2050, 0.005126295599844942, 'CO2 * metric_ton / megawatt_hour', 'North America', 'Electricity Utilities', 'S1S2', 396, 'CO2 * gigametric_ton', 1.5, 'delta_degree_Celsius')\n",
+ "batch insert result: [(192,)]\n"
+ ]
+ }
+ ],
+ "source": [
+ "root = root = os.path.dirname(os.getcwd()+ '/../test/')\n",
+ "benchmark_prod_json = os.path.join(root, \"inputs\", \"json\", \"benchmark_production_OECM.json\")\n",
+ "benchmark_EI_json = os.path.join(root, \"inputs\", \"json\", \"benchmark_EI_OECM.json\")\n",
+ "\n",
+ "# load production benchmarks\n",
+ "with open(benchmark_prod_json) as json_file:\n",
+ " parsed_json = json.load(json_file)\n",
+ "prod_bms = IProductionBenchmarkScopes.parse_obj(parsed_json)\n",
+ "vault_production_bm = VaultProviderProductionBenchmark(engine=engine_dev, benchmark_name=\"benchmark_prod\", production_benchmarks=prod_bms)\n",
+ "\n",
+ "# load intensity benchmarks\n",
+ "with open(benchmark_EI_json) as json_file:\n",
+ " parsed_json = json.load(json_file)\n",
+ "ei_bms = IEIBenchmarkScopes.parse_obj(parsed_json)\n",
+ "vault_EI_bm = VaultProviderIntensityBenchmark(engine=engine_dev, benchmark_name=\"benchmark_ei\", EI_benchmarks=ei_bms)\n",
+ "\n",
+ "# load company data\n",
+ "# TODO: Pandas reads null data mixed with integers as float64 (np.nan). This can be fixed post hoc with astype('Int16')\n",
+ "vault_company_data = VaultCompanyDataProvider(engine=engine_dev, company_table=\"company_data\")\n",
+ "\n",
+ "vault_warehouse = DataVaultWarehouse(engine_dev, vault_company_data, vault_production_bm, vault_EI_bm)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5b02d0f2-0182-430e-9adf-48319beec507",
+ "metadata": {},
+ "source": [
+ "### Step 3: Visualize Emissions, Targets, and Trajectories\n",
+ "\n",
+ "SuperSet Dashboard here (not really, not yet, but points to TRINO_USER dashboard, not TRINO_USER1 dashboard): https://superset-secure-odh-superset.apps.odh-cl2.apps.os-climate.org/superset/dashboard/4/?edit=true&native_filters=%28%29"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "42a11af2-fc4f-42a6-9ef4-15a7b379ee66",
+ "metadata": {},
+ "source": [
+ "Plot emissions data. Others can be plotted by following same pattern.\n",
+ "\n",
+ "Note that without units, a company that emits 80 t CO2e/t Steel looks like it might emit a lot more than one that emits 10t CO2e/MWh. With units, it becomes clear that the 80 and the 10 are not comparable."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "3d18b584-de49-4344-932b-2302d3976794",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [],
+ "source": [
+ "# Because this DF comes from reading a Trino table, and because columns must be unqiue, we don't have to enumerate to ensure we properly handle columns with duplicated names\n",
+ "\n",
+ "def requantify_df(df: pd.DataFrame, typemap: dict) -> pd.DataFrame:\n",
+ " units_col = None\n",
+ " columns_not_found = [k for k in typemap.keys() if k not in df.columns]\n",
+ " if columns_not_found:\n",
+ " print(f\"columns {columns_not_found} not found in DataFrame\")\n",
+ " raise ValueError\n",
+ " columns_reversed = reversed(df.columns)\n",
+ " for col in columns_reversed:\n",
+ " if col.endswith(\"_units\"):\n",
+ " if units_col:\n",
+ " print(f\"Column {units_col} follows {col} without intervening value column\")\n",
+ " # We expect _units column to follow a non-units column\n",
+ " raise ValueError\n",
+ " units_col = col\n",
+ " continue\n",
+ " if units_col:\n",
+ " if col + '_units' != units_col:\n",
+ " print(f\"Excpecting column name {col}_units but saw {units_col} instead\")\n",
+ " raise ValueError\n",
+ " if (df[units_col]==df[units_col][0]).all():\n",
+ " # We can make a PintArray since column is of homogeneous type\n",
+ " new_col = PintArray(df[col], dtype=f\"pint[{ureg(df[units_col][0]).u}]\")\n",
+ " else:\n",
+ " # Make a pd.Series of Quantity in a way that does not throw UnitStrippedWarning\n",
+ " new_col = pd.Series(data=df[col], name=col) * pd.Series(data=df[units_col].map(lambda x: ureg(x).u), name=col)\n",
+ " if col in typemap.keys():\n",
+ " new_col = new_col.astype(typemap[col])\n",
+ " df = df.drop(columns=units_col)\n",
+ " df[col] = new_col\n",
+ " units_col = None\n",
+ " return df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "f9ec935e-3ec1-4b2a-91b5-4649720854c7",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/michael/opt/miniconda3/envs/jupyter/lib/python3.10/site-packages/pandas/io/sql.py:1773: SAWarning: index key 'partition' was not located in columns for table 'emissions_data'\n",
+ " tbl = Table(\n",
+ "/Users/michael/opt/miniconda3/envs/jupyter/lib/python3.10/site-packages/pandas/io/sql.py:1773: SAWarning: index key 'record_count' was not located in columns for table 'emissions_data'\n",
+ " tbl = Table(\n",
+ "/Users/michael/opt/miniconda3/envs/jupyter/lib/python3.10/site-packages/pandas/io/sql.py:1773: SAWarning: index key 'file_count' was not located in columns for table 'emissions_data'\n",
+ " tbl = Table(\n",
+ "/Users/michael/opt/miniconda3/envs/jupyter/lib/python3.10/site-packages/pandas/io/sql.py:1773: SAWarning: index key 'total_size' was not located in columns for table 'emissions_data'\n",
+ " tbl = Table(\n",
+ "/Users/michael/opt/miniconda3/envs/jupyter/lib/python3.10/site-packages/pandas/io/sql.py:1773: SAWarning: index key 'data' was not located in columns for table 'emissions_data'\n",
+ " tbl = Table(\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " company_name \n",
+ " company_lei \n",
+ " company_id \n",
+ " sector \n",
+ " year \n",
+ " co2_s1_by_year \n",
+ " co2_s1_by_year_units \n",
+ " co2_s2_by_year \n",
+ " co2_s2_by_year_units \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " Tri-State Generation & Transmission Associatio... \n",
+ " 549300VDHNFNPADSSV98 \n",
+ " ZZ00000000180 \n",
+ " Electricity Utilities \n",
+ " 2044 \n",
+ " 4.047107e+00 \n",
+ " CO2 * megametric_ton \n",
+ " 0.00 \n",
+ " CO2 * megametric_ton \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " Tri-State Generation & Transmission Associatio... \n",
+ " 549300VDHNFNPADSSV98 \n",
+ " ZZ00000000180 \n",
+ " Electricity Utilities \n",
+ " 2045 \n",
+ " 4.047107e+00 \n",
+ " CO2 * megametric_ton \n",
+ " 0.00 \n",
+ " CO2 * megametric_ton \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " AES Corp. \n",
+ " 2NUNNB7D43COUIRE5295 \n",
+ " US00130H1059 \n",
+ " Electricity Utilities \n",
+ " 2044 \n",
+ " 0.000000e+00 \n",
+ " CO2 * megametric_ton \n",
+ " 0.00 \n",
+ " CO2 * megametric_ton \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " UNITED STATES STEEL CORP \n",
+ " JNLUVFYJT1OZSIQ24U47 \n",
+ " US9129091081 \n",
+ " Steel \n",
+ " 2044 \n",
+ " 7.800000e+06 \n",
+ " CO2 * metric_ton \n",
+ " 792000.00 \n",
+ " CO2 * metric_ton \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " Valtec Power \n",
+ " RMI00000000000000015 \n",
+ " ZZ00000000015 \n",
+ " Electricity Utilities \n",
+ " 2044 \n",
+ " 0.000000e+00 \n",
+ " CO2 * megametric_ton \n",
+ " 0.00 \n",
+ " CO2 * megametric_ton \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " 2216 \n",
+ " UNITED STATES STEEL CORP \n",
+ " JNLUVFYJT1OZSIQ24U47 \n",
+ " US9129091081 \n",
+ " Steel \n",
+ " 2026 \n",
+ " 2.540000e+07 \n",
+ " CO2 * metric_ton \n",
+ " 2384000.00 \n",
+ " CO2 * metric_ton \n",
+ " \n",
+ " \n",
+ " 2217 \n",
+ " Valtec Power \n",
+ " RMI00000000000000015 \n",
+ " ZZ00000000015 \n",
+ " Electricity Utilities \n",
+ " 2026 \n",
+ " 0.000000e+00 \n",
+ " CO2 * megametric_ton \n",
+ " 0.00 \n",
+ " CO2 * megametric_ton \n",
+ " \n",
+ " \n",
+ " 2218 \n",
+ " WEC Energy Group \n",
+ " 549300IGLYTZUK3PVP70 \n",
+ " US92939U1060 \n",
+ " Electricity Utilities \n",
+ " 2026 \n",
+ " 1.276413e+01 \n",
+ " CO2 * megametric_ton \n",
+ " 0.00 \n",
+ " CO2 * megametric_ton \n",
+ " \n",
+ " \n",
+ " 2219 \n",
+ " WORTHINGTON INDUSTRIES INC \n",
+ " 1WRCIANKYOIK6KYE5E82 \n",
+ " US9818111026 \n",
+ " Steel \n",
+ " 2026 \n",
+ " 1.277770e+05 \n",
+ " CO2 * metric_ton \n",
+ " 129582.76 \n",
+ " CO2 * metric_ton \n",
+ " \n",
+ " \n",
+ " 2220 \n",
+ " Xcel Energy, Inc. \n",
+ " LGJNMI9GH8XIDG5RCM61 \n",
+ " US98389B1008 \n",
+ " Electricity Utilities \n",
+ " 2026 \n",
+ " 2.123984e+01 \n",
+ " CO2 * megametric_ton \n",
+ " 0.00 \n",
+ " CO2 * megametric_ton \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
2221 rows × 9 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " company_name company_lei \\\n",
+ "0 Tri-State Generation & Transmission Associatio... 549300VDHNFNPADSSV98 \n",
+ "1 Tri-State Generation & Transmission Associatio... 549300VDHNFNPADSSV98 \n",
+ "2 AES Corp. 2NUNNB7D43COUIRE5295 \n",
+ "3 UNITED STATES STEEL CORP JNLUVFYJT1OZSIQ24U47 \n",
+ "4 Valtec Power RMI00000000000000015 \n",
+ "... ... ... \n",
+ "2216 UNITED STATES STEEL CORP JNLUVFYJT1OZSIQ24U47 \n",
+ "2217 Valtec Power RMI00000000000000015 \n",
+ "2218 WEC Energy Group 549300IGLYTZUK3PVP70 \n",
+ "2219 WORTHINGTON INDUSTRIES INC 1WRCIANKYOIK6KYE5E82 \n",
+ "2220 Xcel Energy, Inc. LGJNMI9GH8XIDG5RCM61 \n",
+ "\n",
+ " company_id sector year co2_s1_by_year \\\n",
+ "0 ZZ00000000180 Electricity Utilities 2044 4.047107e+00 \n",
+ "1 ZZ00000000180 Electricity Utilities 2045 4.047107e+00 \n",
+ "2 US00130H1059 Electricity Utilities 2044 0.000000e+00 \n",
+ "3 US9129091081 Steel 2044 7.800000e+06 \n",
+ "4 ZZ00000000015 Electricity Utilities 2044 0.000000e+00 \n",
+ "... ... ... ... ... \n",
+ "2216 US9129091081 Steel 2026 2.540000e+07 \n",
+ "2217 ZZ00000000015 Electricity Utilities 2026 0.000000e+00 \n",
+ "2218 US92939U1060 Electricity Utilities 2026 1.276413e+01 \n",
+ "2219 US9818111026 Steel 2026 1.277770e+05 \n",
+ "2220 US98389B1008 Electricity Utilities 2026 2.123984e+01 \n",
+ "\n",
+ " co2_s1_by_year_units co2_s2_by_year co2_s2_by_year_units \n",
+ "0 CO2 * megametric_ton 0.00 CO2 * megametric_ton \n",
+ "1 CO2 * megametric_ton 0.00 CO2 * megametric_ton \n",
+ "2 CO2 * megametric_ton 0.00 CO2 * megametric_ton \n",
+ "3 CO2 * metric_ton 792000.00 CO2 * metric_ton \n",
+ "4 CO2 * megametric_ton 0.00 CO2 * megametric_ton \n",
+ "... ... ... ... \n",
+ "2216 CO2 * metric_ton 2384000.00 CO2 * metric_ton \n",
+ "2217 CO2 * megametric_ton 0.00 CO2 * megametric_ton \n",
+ "2218 CO2 * megametric_ton 0.00 CO2 * megametric_ton \n",
+ "2219 CO2 * metric_ton 129582.76 CO2 * metric_ton \n",
+ "2220 CO2 * megametric_ton 0.00 CO2 * megametric_ton \n",
+ "\n",
+ "[2221 rows x 9 columns]"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from ITR.data.osc_units import *\n",
+ "ureg.setup_matplotlib()\n",
+ "import numpy as np\n",
+ "sql_df = pd.read_sql_table(f\"emissions_data\", engine_dev)\n",
+ "sql_df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "463b78e4-ca3a-4af1-bc4d-f301d4e6b402",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/michael/opt/miniconda3/envs/jupyter/lib/python3.10/site-packages/pint_pandas/pint_array.py:648: UnitStrippedWarning: The unit of the quantity is stripped when downcasting to ndarray.\n",
+ " return np.array(qtys, dtype=\"object\", copy=copy)\n",
+ "/Users/michael/opt/miniconda3/envs/jupyter/lib/python3.10/site-packages/pint_pandas/pint_array.py:648: UnitStrippedWarning: The unit of the quantity is stripped when downcasting to ndarray.\n",
+ " return np.array(qtys, dtype=\"object\", copy=copy)\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " company_name \n",
+ " company_lei \n",
+ " company_id \n",
+ " sector \n",
+ " year \n",
+ " co2_s1_by_year \n",
+ " co2_s2_by_year \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " Tri-State Generation & Transmission Associatio... \n",
+ " 549300VDHNFNPADSSV98 \n",
+ " ZZ00000000180 \n",
+ " Electricity Utilities \n",
+ " 2044 \n",
+ " 4047107.450753776 \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " Tri-State Generation & Transmission Associatio... \n",
+ " 549300VDHNFNPADSSV98 \n",
+ " ZZ00000000180 \n",
+ " Electricity Utilities \n",
+ " 2045 \n",
+ " 4047107.450753776 \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " AES Corp. \n",
+ " 2NUNNB7D43COUIRE5295 \n",
+ " US00130H1059 \n",
+ " Electricity Utilities \n",
+ " 2044 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " UNITED STATES STEEL CORP \n",
+ " JNLUVFYJT1OZSIQ24U47 \n",
+ " US9129091081 \n",
+ " Steel \n",
+ " 2044 \n",
+ " 7800000.0 \n",
+ " 792000.0 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " Valtec Power \n",
+ " RMI00000000000000015 \n",
+ " ZZ00000000015 \n",
+ " Electricity Utilities \n",
+ " 2044 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " 2216 \n",
+ " UNITED STATES STEEL CORP \n",
+ " JNLUVFYJT1OZSIQ24U47 \n",
+ " US9129091081 \n",
+ " Steel \n",
+ " 2026 \n",
+ " 25400000.0 \n",
+ " 2384000.0 \n",
+ " \n",
+ " \n",
+ " 2217 \n",
+ " Valtec Power \n",
+ " RMI00000000000000015 \n",
+ " ZZ00000000015 \n",
+ " Electricity Utilities \n",
+ " 2026 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " 2218 \n",
+ " WEC Energy Group \n",
+ " 549300IGLYTZUK3PVP70 \n",
+ " US92939U1060 \n",
+ " Electricity Utilities \n",
+ " 2026 \n",
+ " 12764133.75445884 \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " 2219 \n",
+ " WORTHINGTON INDUSTRIES INC \n",
+ " 1WRCIANKYOIK6KYE5E82 \n",
+ " US9818111026 \n",
+ " Steel \n",
+ " 2026 \n",
+ " 127777.02 \n",
+ " 129582.76 \n",
+ " \n",
+ " \n",
+ " 2220 \n",
+ " Xcel Energy, Inc. \n",
+ " LGJNMI9GH8XIDG5RCM61 \n",
+ " US98389B1008 \n",
+ " Electricity Utilities \n",
+ " 2026 \n",
+ " 21239836.47235034 \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
2147 rows × 7 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " company_name company_lei \\\n",
+ "0 Tri-State Generation & Transmission Associatio... 549300VDHNFNPADSSV98 \n",
+ "1 Tri-State Generation & Transmission Associatio... 549300VDHNFNPADSSV98 \n",
+ "2 AES Corp. 2NUNNB7D43COUIRE5295 \n",
+ "3 UNITED STATES STEEL CORP JNLUVFYJT1OZSIQ24U47 \n",
+ "4 Valtec Power RMI00000000000000015 \n",
+ "... ... ... \n",
+ "2216 UNITED STATES STEEL CORP JNLUVFYJT1OZSIQ24U47 \n",
+ "2217 Valtec Power RMI00000000000000015 \n",
+ "2218 WEC Energy Group 549300IGLYTZUK3PVP70 \n",
+ "2219 WORTHINGTON INDUSTRIES INC 1WRCIANKYOIK6KYE5E82 \n",
+ "2220 Xcel Energy, Inc. LGJNMI9GH8XIDG5RCM61 \n",
+ "\n",
+ " company_id sector year co2_s1_by_year \\\n",
+ "0 ZZ00000000180 Electricity Utilities 2044 4047107.450753776 \n",
+ "1 ZZ00000000180 Electricity Utilities 2045 4047107.450753776 \n",
+ "2 US00130H1059 Electricity Utilities 2044 0.0 \n",
+ "3 US9129091081 Steel 2044 7800000.0 \n",
+ "4 ZZ00000000015 Electricity Utilities 2044 0.0 \n",
+ "... ... ... ... ... \n",
+ "2216 US9129091081 Steel 2026 25400000.0 \n",
+ "2217 ZZ00000000015 Electricity Utilities 2026 0.0 \n",
+ "2218 US92939U1060 Electricity Utilities 2026 12764133.75445884 \n",
+ "2219 US9818111026 Steel 2026 127777.02 \n",
+ "2220 US98389B1008 Electricity Utilities 2026 21239836.47235034 \n",
+ "\n",
+ " co2_s2_by_year \n",
+ "0 0.0 \n",
+ "1 0.0 \n",
+ "2 0.0 \n",
+ "3 792000.0 \n",
+ "4 0.0 \n",
+ "... ... \n",
+ "2216 2384000.0 \n",
+ "2217 0.0 \n",
+ "2218 0.0 \n",
+ "2219 129582.76 \n",
+ "2220 0.0 \n",
+ "\n",
+ "[2147 rows x 7 columns]"
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df = requantify_df(sql_df.dropna(), typemap={'co2_s1_by_year':'pint[t CO2]', 'co2_s2_by_year':'pint[t CO2]'})\n",
+ "df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "c515b6a5-bfb8-4dc5-81bd-9fe6389be42e",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "company_name object\n",
+ "company_lei object\n",
+ "company_id object\n",
+ "sector object\n",
+ "year int64\n",
+ "co2_s1_by_year pint[CO2 * metric_ton]\n",
+ "co2_s2_by_year pint[CO2 * metric_ton]\n",
+ "dtype: object"
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df.dtypes"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "f4991076-a5a9-4b1a-b19d-2c1744625f0f",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "df = df.sort_values(['company_name', 'year']).reset_index(drop=True)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "8bea8112-ecb4-4ae1-a8ea-9065d4177796",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/michael/opt/miniconda3/envs/jupyter/lib/python3.10/site-packages/pint_pandas/pint_array.py:648: UnitStrippedWarning: The unit of the quantity is stripped when downcasting to ndarray.\n",
+ " return np.array(qtys, dtype=\"object\", copy=copy)\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAABW8AAAJXCAYAAADsJKbLAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAEAAElEQVR4nOzdd3yN5//H8dedQSIhhFihxMzesUesSO292lpfbVEdWorSVls60Fbp8K1vVQehtKKlZoldBEFI7NgitiBknN8f6vykYoTECd7PxyOP5tz3dV/3+z5EHz6u87kMk8mEiIiIiIiIiIiIiOQtVpYOICIiIiIiIiIiIiK3UvFWREREREREREREJA9S8VZEREREREREREQkD1LxVkRERERERERERCQPUvFWREREREREREREJA9S8VZEREREREREREQkD3pki7eGYUwxDOOkYRix9zD2KcMwlhuGscUwjG2GYTR7GBlFRERERERERERE7tcjW7wFpgLh9zh2BPCLyWQKALoAX+dWKBEREREREREREZGc8MgWb00m00rgzM3HDMOoaBjGQsMwNhmGscowDPcbw4FC/3zvBBx7iFFFREREREREREREss3G0gFy2LdAX5PJtMcwjOpcX2HbEBgJLDYM42XAAWhsuYgiIiIiIiIiIiIid/fYFG8Nw3AEagGzDMO4cTj/P//tCkw1mUyfGoZRE/jJMAxvk8mUYYGoIiIiIiIiIiIiInf12BRvud4C4pzJZPLP4tx/+Kc/rslkWmcYhh1QDDj58OKJiIiIiIiIiIiI3LtHtuftv5lMpgvAAcMwOgIY1/n9c/oQ0Oif4x6AHZBkkaAiIiIiIiIiIiIi98AwmUyWznBfDMOIAEK5voI2EXgXWAZ8A5QCbIEZJpPpfcMwPIHJgCPXNy9702QyLbZEbhEREREREREREZF78cgWb0VEREREREREREQeZ49N2wQRERERERERERGRx8kjuWFZsWLFTOXLl7d0DBEREREREREREZEHsmnTplMmk8klq3OPZPG2fPnyREdHWzqGiIiIiIiIiIiIyAMxDOPg7c6pbYKIiIiIiIiIiIhIHqTirYiIiIiIiIiIiEgepOKtiIiIiIiIiIiISB70SPa8FRERERERERGRvCc1NZUjR46QkpJi6SgieY6dnR1lypTB1tb2nq9R8VZERERERERERHLEkSNHKFiwIOXLl8cwDEvHEckzTCYTp0+f5siRI7i5ud3zdWqbICIiIiIiIiIiOSIlJYWiRYuqcCvyL4ZhULRo0WyvSlfxVkREREREREREcowKtyJZu5+fDRVvRURERERERERERPIgFW9FRERERERERERE8iAVb0VERERERERERETyIBVvRURERERERERERPIgFW9FREREREREREQe0I8//oivry9+fn4899xzHDx4kEaNGuHr60ujRo04dOgQAD179qRfv340aNCAChUqsGLFCnr37o2Hhwc9e/Y0z+fo6Mgbb7xBYGAgjRo1IikpCYDJkycTEhKCn58f7du35/Lly+Z5X3nlFWrVqkWFChWYPXs2AM899xxz5841z/vMM8/w+++/Z/kMU6dOpV27doSHh1O5cmXefPNN87l+/foRHByMl5cX7777rvl4+fLleeutt6hZsybBwcFs3ryZpk2bUrFiRSZNmmQeN3bsWEJCQvD19c10vdyZirciIiIiIiIiIiIPYMeOHYwePZply5axdetWvvjiCwYMGED37t3Ztm0bzzzzDK+88op5/NmzZ1m2bBmff/45LVu2ZODAgezYsYPt27cTExMDwKVLlwgMDGTz5s3Ur1+f9957D4B27dqxceNGtm7dioeHB99995153uPHj7N69WrmzZvH0KFDAejTpw/ff/89AOfPn2ft2rU0a9bsts8SExPDzJkz2b59OzNnzuTw4cMAjB49mujoaLZt28aKFSvYtm2b+ZqyZcuybt066tatS8+ePZk9ezZ///0377zzDgCLFy9mz549bNiwgZiYGDZt2sTKlStz4J1//Kl4KyIiIiIiIiIi8gCWLVtGhw4dKFasGADOzs6sW7eObt26AddXv65evdo8vmXLlhiGgY+PDyVKlMDHxwcrKyu8vLxISEgAwMrKis6dOwPw7LPPmq+PjY2lbt26+Pj4MG3aNHbs2GGet02bNlhZWeHp6UliYiIA9evXZ+/evZw8eZKIiAjat2+PjY3NbZ+lUaNGODk5YWdnh6enJwcPHgTgl19+ITAwkICAAHbs2MHOnTvN17Rq1QoAHx8fqlevTsGCBXFxccHOzo5z586xePFiFi9eTEBAAIGBgcTHx7Nnz54Hes+fFLf/lRIREREREREREZG7MplMGIZxxzE3n8+fPz9wvUB74/sbr9PS0u54fc+e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/3HqF1qRXzcfYeTvO5j3Sp0ca8kgIiIiIiIiIiIPn+WrTSKPmFJO9vSoVZ4elg6SBTtba95u4cmLP23ip3UH6V3HzdKRRERERERERETkPmlZnshjJsyzBPWquPD5kt0kXbxq6TgiIiIiIiIiInKfVLwVecwYhsG7LT1JSUtnzMJ4S8cREREREREReejmzJmDYRjEx///34sTEhLw9va2YKr/16dPH3bu3HnP46dOnYqLiwv+/v54enoyefLkXEx3e3///Td+fn74+PjQo8ftP5M8depUBgwYkOlYaGgo0dHRAHz44YeZztWqVQvI/GsUHR3NK6+8AkBUVBRr1641j580aRI//vjjAz/P7t27adasGZUqVcLDw4NOnTqRmJj4wPPmJBVvRR5DFV0c6V3HjVmbjrD50FlLxxERERERERF5qCIiIqhTpw4zZsywdJQs/e9//8PT0zNb13Tu3JmYmBiioqJ46623cr3ImJaWdsux4cOHM378eLZv387IkSPve+5/F29vLszeEBwczIQJE4Bbi7d9+/ale/fu931/gJSUFJo3b06/fv3Yu3cvcXFx9OvXj6SkpHu6Pqv3JzeoeCvymHq5YWVKFMrPu3N3kJ5hsnQcERERERERkYciOTmZNWvW8N133922eHv58mU6deqEr68vnTt3pnr16uZVoREREfj4+ODt7c2QIUPM1zg6OjJ8+HD8/PyoUaOGuXh64MABatasSUhICG+//TaOjo7A9YJjixYtzNcPGDCAqVOnAplXod5u3tspXrw4FStW5ODBg/z1118EBATg4+ND7969uXr1Khs2bKBdu3YAzJ07F3t7e65du0ZKSgoVKlQAYN++fYSHhxMUFETdunXNK5R79uzJ66+/ToMGDTI9+w358uXjyJEjALi53d8+O0OHDuXKlSv4+/vzzDPPmN+Df7vx/iUkJDBp0iQ+//xz/P39WbVqFSNHjmTcuHF3fJZZs2bh7e2Nn58f9erVu2X+6dOnU7NmTVq2bGk+1qBBA7y9vUlJSaFXr174+PgQEBDA8uXLgesrijt27EjLli0JCwsjKiqKevXq0bZtWzw9Penbty8ZGRn39b7cjjYsE3lMOea34a1mHrw6I4aZGw/TrfpTlo4kIiIiIiIiT5BPNnxC/Jmcbefn7uzOkGq3FhVvFhkZSXh4OFWqVMHZ2ZnNmzcTGBiYaczXX39NkSJF2LZtG7Gxsfj7+wNw7NgxhgwZwqZNmyhSpAhhYWFERkbSpk0bLl26RI0aNRg9ejRvvvkmkydPZsSIEbz66qv069eP7t2789VXX2X7mW437+3s37+f/fv3U6ZMGapXr85ff/1FlSpV6N69O9988w0DBgxgy5YtAKxatQpvb282btxIWloa1atXB+CFF15g0qRJVK5cmfXr19O/f3+WLVsGXG8lsHTpUqytrW+5d8WKFRk2bBgeHh4EBwdn+1kBPv74Y7788ktiYmLuaXz58uXp27cvjo6ODBo0CIC//vrLfP52z/L++++zaNEiXF1dOXfu3C3zxsbGEhQUlOU9b/w6bt++nfj4eMLCwti9ezcA69atY9u2bTg7OxMVFcWGDRvYuXMn5cqVIzw8nN9++40OHTpk4x25M628FXmMtfIrTTU3Z8YsiufspWuWjiMiIiIiIiKS6yIiIujSpQsAXbp0ISIi4pYxq1evNo/x9vbG19cXgI0bNxIaGoqLiws2NjY888wzrFy5Eri+6vTGStqgoCASEhIAWLNmDV27dgXgueeey3be2837bzNnzsTf35+uXbvy3//+l6SkJNzc3KhSpQoAPXr0YOXKldjY2FCpUiXi4uLYsGEDr7/+OitXrmTVqlXUrVuX5ORk1q5dS8eOHfH39+fFF1/k+PHj5vt07Ngxy8Lt3LlzOX/+PAsWLKBbt27s2bOHpKQkQkJCbhlrGEaWz3C74/frTs9Su3ZtevbsyeTJk0lPT8/WvKtXrzb/Wrq7u1OuXDlz8bZJkyY4Ozubx1arVo0KFSpgbW1N165dWb16dQ493XVaeSvyGDMMg/daedFi4mo+XbKLUW18LB1JREREREREnhB3WyGbG06fPs2yZcuIjY3FMAzS09MxDIMxY8ZkGmcyZd1e8HbHAWxtbc3FR2tr60w9T7MqStrY2GT6CH1KSkq2571Z586d+fLLL82v77RytW7duixYsABbW1saN25Mz549SU9PZ9y4cWRkZFC4cOHbXu/g4JDl8UWLFtGoUSN8fHz47rvvaN26NR07dqRz5863jC1atChnz2beg+fMmTMUK1bstpnvx52eZdKkSaxfv5758+fj7+9PTEwMRYsWNZ/38vJixYoVWc57p98H/35//v1rn9MFaq28FXnMeZQqxHM1yjFt/SFij563dBwRERERERGRXDN79my6d+/OwYMHSUhI4PDhw7i5ud2yGrJOnTr88ssvAOzcuZPt27cDUL16dVasWMGpU6dIT08nIiKC+vXr3/GetWvXNvfWnTZtmvl4uXLl2LlzJ1evXuX8+fOZPuqfE9zd3UlISGDv3r0A/PTTT+as9erVY/z48dSsWRMXFxdOnz5NfHw8Xl5eFCpUCDc3N2bNmgVcL1Ru3br1rvcLCAhg5syZpKSkULduXdq2bcvo0aPNq45vFhISwpo1azhx4gQA0dHRXL16lbJlywLXC9apqan3/KwFCxbk4sWLtxy/07Ps27eP6tWr8/7771OsWDEOHz6c6dpu3bqxdu1a5s+fbz62cOFCtm/fTr169cy/lrt37+bQoUNUrVo1y2wbNmzgwIEDZGRkMHPmTOrUqXPPz3UvVLwVeQIMbFIF5wL5ePf3HXf81yMRERERERGRR1lERARt27bNdKx9+/ZMnz4907H+/fuTlJSEr68vn3zyCb6+vjg5OVGqVCk++ugjGjRogJ+fH4GBgbRu3fqO9/ziiy/46quvCAkJ4fz5/180VbZsWfOmaM888wwBAQE596CAnZ0d33//PR07dsTHxwcrKyv69u0LXC9CJyYmmjfq8vX1xdfX17wqdNq0aXz33Xf4+fnh5eXF3Llz73q///znP/j4+ODv709wcDDHjx9n3LhxdOjQgcuXL2caW6JECb744guaNWuGv78/r732GhEREVhZXS9FvvDCC+b35V60bNmSOXPmmDcsu9ntnmXw4MHmjefq1auHn59fpuvs7e2ZN28eEydOpHLlynh6ejJ16lSKFy9O//79SU9Px8fHh86dOzN16lTy58+fZbaaNWsydOhQvL29cXNzM//+69Onj3lTugdhPIqFnODgYFNOPLzIk+SXjYd589dtfNbJj3aBZSwdR0RERERERB5DcXFxeHh4WDrGXaWnp5OamoqdnR379u2jUaNG7N69m3z58j3w3I6OjiQnJ+dASsnroqKiGDduHPPmzbvna7L6GTEMY5PJZMpyBzj1vBV5QnQIKsO0DYf48M94mniWoKCdraUjiYiIiIiIiFjE5cuXadCgAampqZhMJr755pscKdyK5DQVb0WeEFZWBu+38qLN12v4YukeRrTwtHQkEREREREREYsoWLBgjnykPStadfvkCA0NJTQ0NFfvoZ63Ik8Qv7KF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SOfOnfH396d9+/bUrVvXfC4+Pp6iRYvex9Neb9vQqlUrgoOD8ff3Z9y4cQBMmjSJSZMm3deckrcYd1rqnVcFBweboqOjLR1D5Ik0InI709cfYv4rdfEoVcjScURERERERCQPiYuLw8PDw9IxctXVq1extrbGxsaGdevW0a9fP2JiYu57vhYtWvDbb7+RL1++nAspeVZWPyOGYWwymUzBWY1Xz1sRyZZBYVWZv+047/6+g5kv1FBvHREREREREXmiHDp0iE6dOpGRkUG+fPmYPHnyA803b968HEomjyMVb0UkWwoXyMfgpu68NWc7v289Rmt/V0tHEhEREREREXloKleuzJYtWywdQ54Q6nkrItnWOaQsPq5OfPhnHJeuplk6joiIiIiIiIjIY0nFWxHJNmur65uXJV64ysRley0dR0RERERERETksaTirYjcl8CnitAxqAzfrd7PvqRkS8cREREREREREXnsqHgrIvftzXB37GytGfn7Dkwmk6XjiIiIiIiIiIg8VlS8FZH75lIwP683qcKqPadYvDPR0nFEREREREREsLa2xt/fHz8/PwIDA1m7dm2253B0dHzgsZMmTeLHH3/M9r1vGDlyJOPGjct0rHz58pw6deqO13344Yfm7xMSEvD29r7vDLkpL2fLS1S8FZEH8lyNclQtUZB35sZyKvmqpeOIiIiIiIjIE87e3p6YmBi2bt3KRx99xLBhw+75WpPJREZGRo7k6Nu3L927d7/leFpa7m78fXPxVh59Kt6KyAOxsbbi005+nL2cyqsztpCeofYJIiIiIiIikjdcuHCBIkWKmF+PHTuWkJAQfH19effdd4HrK0A9PDzo378/gYGBHD582Dz+1KlT1KxZk/nz53P8+HHq1auHv78/3t7erFq1yjxu+PDh+Pn5UaNGDRITr38y9eaVs6Ghobz11lvUr1+fL774gk2bNlG/fn2CgoJo2rQpx48fz/aztWnThqCgILy8vPj2228BGDp0KFeuXMHf359nnnkGgPT0dJ5//nm8vLwICwvjypUrAEyePJmQkBD8/Pxo3749ly9fJj09nQoVKmAymTh37hxWVlasXLkSgLp167J37142bNhArVq1CAgIoFatWuzatct8PiYmxpyvdu3abNu27Z6eZerUqbRr147w8HAqV67Mm2++aT63cOFCAgMD8fPzo1GjRtl+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+KW7STh1ydJRRUREREREHnnFixfn22+/5csvvyQ3930KDQ1lyJAhVKtWjSpVqrBq1SrgemF28ODBhISE4Ovry3//+1/gerG4QYMGdOvWDR8fHzIyMujfvz9eXl60aNGCZs2aMXv2bP766y/atm1rvs+SJUto106tLJ8kWnkr2VagkBPtho5k+tuD+e3jkXT9YCz2BQtZOpbII8fW2opGHiVo5FGCCympLIw9QeSWo3zx1x7GL91DwFOFaRvgSgvf0jg75LN0XBERERERkWx5e88RYpOv5Oic3o72fFC5TLauqVChAhkZGZw8eZISJUrcdtyqVavw9/c3v/7111+pWLHiLeMaNGhgXinbo0cPBg4cCEBaWhobNmzgzz//5L333mPp0qV89913ODk5sXHjRq5evUrt2rUJCwsDYMOGDcTGxuLm5sbs2bNJSEhg+/btnDx5Eg8PD3r37k3Dhg156aWXSEpKwsXFhe+//55evXpl6/nl0abirdyXIqVcaTNoBLNGDWfuuNF0GDEKG1ttviRyvwrZ2dIpuCydgsty/PwVfo+5vtHZO3N38P4fOwmt6kKbAFcae5TAzlYfpxEREREREcmOe1l1+6BtE26siA0KCiIhIQGAxYsXs23bNmbPng3A+fPn2bNnD/ny5aNatWrmHrurV6+mY8eOWFlZUbJkSRo0aABc//Tmc889x88//0yvXr1Yt24dP/744z09szweVLyV++bq7kl4/4HM/2IMi74ZT7MBb2BYqROHyIMq5WTPi/Ur8mL9isQdv0DklqNExhxladxJHPPb8LR3SdoGuFK9QlGsrdQfV0RERERE8qbsrpDNLfv378fa2prixYvn6n3y588PXN8wLS0tDbheNJ44caK51+4NUVFRODg4mF/fqbjcq1cvWrZsiZ2dHR07dsTGRuW8J4kqbfJA3GvVo263nsSvWcGaX6ZZOo7IY8ejVCGGNfNg7dBGTOtTnXDvkiyIPUG3/62n9sfL+GhBHPEnLlg6poiIiIiISJ6UlJRE3759GTBggEU2h27atCnffPMNqampAOzevZtLl27d46ROnTr8+uuvZGRkkJiYSFRUlPlc6dKlKV26NKNGjaJnz54PKbnkFSrVywMLadWec4nHWT9nJk7FS+DTMMzSkUQeO9ZWBrUrFaN2pWJ80NqbpXGJRG45ynerDvDfFftxL1mQ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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plottable_df = df.pivot(index='year', columns='company_name', values='co2_s1_by_year').reset_index()\n",
+ "\n",
+ "# Must plot the first few columns, but then plot 1/3rd of the companies so as not to over-clutter the graph\n",
+ "plottable_df.iloc[:, [x for x in list(range(0,3)) + list(range(3,55,2))]].plot(x='year', kind='line', figsize=(24,10))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1848722a-342e-46bd-b8fe-aa0001d4d28c",
+ "metadata": {},
+ "source": [
+ "### Step 4: Use Quant engine to access and visualize temperature scores\n",
+ "\n",
+ "When the Data Vault is ready to be implemented, we can demonstrate that the Quant engine does not have access to primary company data (neither financial nor production)"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "8110deb5-6850-4f16-902b-c9bab9d338a3",
+ "metadata": {},
+ "source": [
+ "sqlstring = 'trino://{user}@{host}:{port}/'.format(\n",
+ " user = os.environ['TRINO_USER_USER2'],\n",
+ " host = os.environ['TRINO_HOST'],\n",
+ " port = os.environ['TRINO_PORT']\n",
+ ")\n",
+ "sqlargs = {\n",
+ " 'auth': trino.auth.JWTAuthentication(os.environ['TRINO_PASSWD_USER2']),\n",
+ " 'http_scheme': 'https',\n",
+ " 'catalog': 'osc_datacommons_dev',\n",
+ " 'schema': 'demo_dv',\n",
+ "}\n",
+ "\n",
+ "ingest_catalog = 'osc_datacommons_dev'\n",
+ "ingest_schema = 'demo_dv'\n",
+ "\n",
+ "engine_quant = create_engine(sqlstring, connect_args = sqlargs)\n",
+ "print(\"connecting with engine \" + str(engine_quant))\n",
+ "connection_quant = engine_quant.connect()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "12482310-25de-42eb-8d0c-52f56d07f627",
+ "metadata": {},
+ "source": [
+ "Show that we *cannot* access fundamental company data (cannot show until op1st team changes permissions)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "236c94f8-1709-4d7a-9beb-85419e65be5c",
+ "metadata": {},
+ "source": [
+ "Show that we *can* access both cumulative emissions (input) and temperature scores (output)"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "a7cbe50d-6b26-4f9e-a04b-ba915f19c4b0",
+ "metadata": {},
+ "source": [
+ "temp_score_df = pd.read_sql_table(f\"temperature_scores\", engine_quant)"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "ac6a2286-62b7-4d23-81bf-077ad68a34a4",
+ "metadata": {},
+ "source": [
+ "temp_score_df.head()"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "8277b6d5-3633-40ac-b69b-571eae476d99",
+ "metadata": {},
+ "source": [
+ "plottable_df = temp_score_df[['company_name', 'trajectory_temperature_score', 'target_temperature_score']].sort_values('company_name').set_index('company_name').T"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "acb3b22f-41d8-41a9-a2b0-3a3f0d2ef51a",
+ "metadata": {},
+ "source": [
+ "plottable_df"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "49a139bd-fe5d-4016-87c1-de8fa7c3413a",
+ "metadata": {},
+ "source": [
+ "# Must plot the first few columns, but then plot 1/3rd of the companies so as not to over-clutter the graph\n",
+ "plottable_df.iloc[:, [x for x in list(range(0,2)) + list(range(4,35,3))]].boxplot(figsize=(24,10))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "65795474-1de6-4f40-9086-f7d948ae6c66",
+ "metadata": {},
+ "source": [
+ "### Step 5: Show per-company temperature score and weighted portfolio alignment score\n",
+ "\n",
+ "Portfolio weighting scores (which ultimately influence portfolio alignment score) include:\n",
+ "* WATS (size of portfolio company positions used as weights)\n",
+ "* TETS (size of total emissions of portfolio companies used as weights)\n",
+ "* Financial fundamental weights:\n",
+ " * Market Cap\n",
+ " * Enterprise Value\n",
+ " * Assets\n",
+ " * Revenues\n",
+ "\n",
+ "We can pass a list of company IDs to the Data Vault to get back a sum without exposing granular data"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "1de4b009-e664-49c9-a9bb-6021ec944f04",
+ "metadata": {},
+ "source": [
+ "sqlstring = 'trino://{user}@{host}:{port}/'.format(\n",
+ " user = os.environ['TRINO_USER_USER3'],\n",
+ " host = os.environ['TRINO_HOST'],\n",
+ " port = os.environ['TRINO_PORT']\n",
+ ")\n",
+ "sqlargs = {\n",
+ " 'auth': trino.auth.JWTAuthentication(os.environ['TRINO_PASSWD_USER3']),\n",
+ " 'http_scheme': 'https',\n",
+ " 'catalog': 'osc_datacommons_dev',\n",
+ " 'schema': 'demo_dv',\n",
+ "}\n",
+ "\n",
+ "ingest_catalog = 'osc_datacommons_dev'\n",
+ "ingest_schema = 'demo_dv'\n",
+ "\n",
+ "engine_user = create_engine(sqlstring, connect_args = sqlargs)\n",
+ "print(\"connecting with engine \" + str(engine_user))\n",
+ "connection_user = engine_user.connect()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "07154a44-d648-40e3-a5cf-8364468356de",
+ "metadata": {},
+ "source": [
+ "Show that we *cannot* access fundamental company data (cannot show until op1st team changes permissions)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "df114d27-a6ab-46d9-a942-0e8200c4fcd7",
+ "metadata": {},
+ "source": [
+ "Show that we *can* access both cumulative emissions (input) and temperature scores (output)"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "66770ed9-3403-4ddf-b585-34d78654909e",
+ "metadata": {},
+ "source": [
+ "portfolio_df = pd.read_csv(\"data/mdt-20220116-portfolio.csv\", encoding=\"iso-8859-1\", sep=';', index_col='company_id')\n",
+ "portfolio_df"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e2d9942b-ec81-4eab-9cca-99e92905e24f",
+ "metadata": {},
+ "source": [
+ "### Calculate portfolio alignment temperature score based on WATS\n",
+ "\n",
+ "We can do this with information exclusive to the user space (and the probability-adjusted temperature scores)\n",
+ "\n",
+ "Note that companies with no production information (such as TITAL INTERNATIONAL INC and UNIVERSAL STAINLESS & ALLOY PRODUCTS INC will show NaN (Not a Number) as a score."
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "5882ff18-6094-438c-a307-11a11dcb131a",
+ "metadata": {},
+ "source": [
+ "# PA_SCORE means \"Probability-Adjusted\" Temperature Score\n",
+ "portfolio_df['pa_score'] = vault_warehouse.get_pa_temp_scores(probability=0.5, company_ids=portfolio_df.index.values)"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "21079b40-dd5c-4b0a-8baa-d3e37b699d25",
+ "metadata": {},
+ "source": [
+ "portfolio_df[portfolio_df.company_name=='POSCO']"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "4c072bdd-a83f-420b-a126-3d981e2b9f54",
+ "metadata": {},
+ "source": [
+ "weight_for_WATS = portfolio_df['investment_value'].sum()\n",
+ "weight_for_WATS"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "b86c6b92-7e4a-4efa-907e-5617a8adf336",
+ "metadata": {},
+ "source": [
+ "portfolio_df['WATS_weight'] = portfolio_df['pa_score'] * (portfolio_df['investment_value'] / weight_for_WATS)\n",
+ "portfolio_df.head()"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "628bb37c-84c2-4dc4-826c-c32cf47d8680",
+ "metadata": {},
+ "source": [
+ "print(f\"Portfolio temperature score based on WATS = {portfolio_df['WATS_weight'].sum()}\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "95036586-82cc-4230-8946-eb3f7a07d283",
+ "metadata": {},
+ "source": [
+ "### Calculate portfolio alignment temperature score based on TETS\n",
+ "\n",
+ "We need to carefully meld portfolio data with corp fundamental data (in this case, emissions)"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "c6add035-f666-4572-98f9-9fe71c72fea6",
+ "metadata": {},
+ "source": [
+ "portfolio_df['TETS_weight'] = vault_company_data.compute_portfolio_weights(portfolio_df['pa_score'], 2019, 'emissions', EScope.S1S2)\n",
+ "portfolio_df.head()"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "ee150189-750c-4d08-a53d-4c9540575c98",
+ "metadata": {},
+ "source": [
+ "print(f\"Portfolio temperature score based on TETS = {portfolio_df['TETS_weight'].sum()}\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "74453d3b-2288-4dfd-bb68-978c0cdf5f67",
+ "metadata": {},
+ "source": [
+ "### Calculate portfolio alignment temperature score based on MOTS, EOTS, ECOTS, AOTS, and ROTS\n",
+ "\n",
+ "* MOTS = market cap weights\n",
+ "* EOTS = enterprise value weights\n",
+ "* ECOTS = EVIC weights\n",
+ "* AOTS = asset weights\n",
+ "* ROTS = revenue weights"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "d9a0cb22-8ee4-4e3b-b08a-9647cc7f51c7",
+ "metadata": {},
+ "source": [
+ "weighting_dict = {\n",
+ " 'MOTS': 'company_market_cap',\n",
+ " 'EOTS': 'company_enterprise_value',\n",
+ " 'ECOTS': 'company_evic',\n",
+ " 'AOTS': 'company_total_assets',\n",
+ " 'ROTS': 'company_revenue',\n",
+ "}\n",
+ "\n",
+ "for k, v in weighting_dict.items():\n",
+ " weight_column = f\"{k}_weight\"\n",
+ " portfolio_df[weight_column] = vault_company_data.compute_portfolio_weights(portfolio_df['pa_score'], 2019, v, EScope.S1S2)\n",
+ " print(f\"Portfolio temperature score based on {k} = {portfolio_df[weight_column].sum()}\")\n",
+ "\n",
+ "portfolio_df"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "02416ac3-892e-4de7-b244-fc8311993ee9",
+ "metadata": {},
+ "source": [
+ "### Companies for which we lack production data (and thus cannot chart)"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "efae39b9-706a-451f-8f0e-29daa0e47fee",
+ "metadata": {},
+ "source": [
+ "portfolio_df[portfolio_df.pa_score.isnull()]"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.10.2"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/examples/vault_demo_n1.ipynb b/examples/vault_demo_n1.ipynb
new file mode 100644
index 00000000..d51679cf
--- /dev/null
+++ b/examples/vault_demo_n1.ipynb
@@ -0,0 +1,3237 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "e3c5c7d5-63e0-47a5-ac4a-bb58beb98995",
+ "metadata": {},
+ "source": [
+ "# Data Vault Demo (Quant, can also score own portfolio)\n",
+ "\n",
+ "The basic concept of the Data Vault is that when a user authenticates themself, they receive an engine that gives them access to all the data (rows, columns, tables, schema, etc.) for which they are authorized. Users who can authenticate themselves for multiple roles can use those roles simultaneously. We are keeping in mind the importance of Data Lineage Management (tracked by issue https://github.com/os-climate/os_c_data_commons/issues/50) but is not treated as part of this particular prototype.\n",
+ "\n",
+ "The steps of this demo are:\n",
+ "\n",
+ "1. **Authenticate and acquire SQLAlchemy engine**\n",
+ " 1. Dev engine sees all\n",
+ " 2. **Quant engine can do temp scoring but not see fundamental company info**\n",
+ " 3. User engine can use temp scoring but not see cumulative emissions nor overshoot info\n",
+ "2. With Dev engine, construct Vaults for:\n",
+ " 1. Fundamental corporate financial information\n",
+ " 2. Corporate emissions data (base year, historical)\n",
+ " 3. Corporate target data (start year, end year, target start value, target end value)\n",
+ " 4. Sector benchmark data (production, CO2e intensity)\n",
+ "3. Dev Engine: Visualize projected emissions (targets and trajectories) and calculate cumulative emissions\n",
+ "4. **Quant Engine: Using calculated cumulative emmisions, visualize per-company trajectory and target temperature scores**\n",
+ "5. User Engine: Using consensus probability scoring and own portfolio data (ISIN, position value)\n",
+ " 1. Calculate publishable per-company temperature alignment score\n",
+ " 2. Based on aggregate corporate and portfolio information, produce weighting scores to yield overall portfolio alignment score"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "d1ab75f1-dc99-422d-b15b-ce043e32fff8",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import os\n",
+ "import pathlib\n",
+ "from dotenv import load_dotenv\n",
+ "\n",
+ "# Load some standard environment variables from a dot-env file, if it exists.\n",
+ "# If no such file can be found, does not fail, and so allows these environment vars to\n",
+ "# be populated in some other way\n",
+ "dotenv_dir = os.environ.get('CREDENTIAL_DOTENV_DIR', os.environ.get('PWD', '/opt/app-root/src'))\n",
+ "dotenv_path = pathlib.Path(dotenv_dir) / 'credentials.env'\n",
+ "if os.path.exists(dotenv_path):\n",
+ " load_dotenv(dotenv_path=dotenv_path,override=True)\n",
+ "\n",
+ "import trino\n",
+ "from sqlalchemy.engine import create_engine"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "837212ac-6d98-46a2-9a18-c5c026feb84c",
+ "metadata": {},
+ "source": [
+ "### The ITR module provides Vault objects that coordinate the interaction of Dev, Quant, and User roles.\n",
+ "\n",
+ "The SQLAlchemy engines mediate the actual interaction with the Data Vault."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "969b6d53-49d8-47d9-b218-6bdd790a7de4",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/michael/opt/miniconda3/envs/jupyter/lib/python3.10/site-packages/sqlalchemy_trino/dialect.py:259: SAWarning: Dialect trino:rest will not make use of SQL compilation caching as it does not set the 'supports_statement_cache' attribute to ``True``. This can have significant performance implications including some performance degradations in comparison to prior SQLAlchemy versions. Dialect maintainers should seek to set this attribute to True after appropriate development and testing for SQLAlchemy 1.4 caching support. Alternatively, this attribute may be set to False which will disable this warning. (Background on this error at: https://sqlalche.me/e/14/cprf)\n",
+ " res = connection.execute(sql.text(query)).scalar()\n"
+ ]
+ }
+ ],
+ "source": [
+ "import json\n",
+ "import pandas as pd\n",
+ "from numpy.testing import assert_array_equal\n",
+ "import ITR\n",
+ "\n",
+ "# from ITR.portfolio_aggregation import PortfolioAggregationMethod\n",
+ "# from ITR.temperature_score import TemperatureScore\n",
+ "# from ITR.configs import ColumnsConfig, TemperatureScoreConfig\n",
+ "# from ITR.data.data_warehouse import DataWarehouse\n",
+ "from ITR.data.vault_providers import VaultCompanyDataProvider, VaultProviderProductionBenchmark, \\\n",
+ " VaultProviderIntensityBenchmark, DataVaultWarehouse\n",
+ "# from ITR.interfaces import ICompanyData, EScope, ETimeFrames, PortfolioCompany, IEIBenchmarkScopes, \\\n",
+ "# IProductionBenchmarkScopes\n",
+ "from ITR.interfaces import EScope, IProductionBenchmarkScopes, IEIBenchmarkScopes"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1848722a-342e-46bd-b8fe-aa0001d4d28c",
+ "metadata": {},
+ "source": [
+ "### Step 4: Use Quant engine to access and visualize temperature scores\n",
+ "\n",
+ "When the Data Vault is ready to be implemented, we can demonstrate that the Quant engine does not have access to primary company data (neither financial nor production)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "8c0af1f8-12c1-4f56-89dd-340cfdef27ea",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "connecting with engine Engine(trino://os-climate-user2@trino-secure-odh-trino.apps.odh-cl2.apps.os-climate.org:443/)\n"
+ ]
+ }
+ ],
+ "source": [
+ "sqlstring = 'trino://{user}@{host}:{port}/'.format(\n",
+ " user = os.environ['TRINO_USER_USER2'],\n",
+ " host = os.environ['TRINO_HOST'],\n",
+ " port = os.environ['TRINO_PORT']\n",
+ ")\n",
+ "sqlargs = {\n",
+ " 'auth': trino.auth.JWTAuthentication(os.environ['TRINO_PASSWD_USER2']),\n",
+ " 'http_scheme': 'https',\n",
+ " 'catalog': 'osc_datacommons_dev',\n",
+ " 'schema': 'demo_dv',\n",
+ "}\n",
+ "\n",
+ "ingest_catalog = 'osc_datacommons_dev'\n",
+ "ingest_schema = 'demo_dv'\n",
+ "\n",
+ "engine_quant = create_engine(sqlstring, connect_args = sqlargs)\n",
+ "print(\"connecting with engine \" + str(engine_quant))\n",
+ "connection_quant = engine_quant.connect()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "12482310-25de-42eb-8d0c-52f56d07f627",
+ "metadata": {},
+ "source": [
+ "Show that we *cannot* access fundamental company data (cannot show until op1st team changes permissions)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "5af9e376-10a4-4ad6-bf7a-65f925c43329",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "vault_company_data = VaultCompanyDataProvider (engine_quant,\n",
+ " company_table='company_data',\n",
+ " target_table=None,\n",
+ " trajectory_table=None,\n",
+ " company_schema='demo_dv',\n",
+ " column_config=None,\n",
+ " tempscore_config=None)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "c083622d-cde4-4f86-acde-49016a155824",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "vault_warehouse = DataVaultWarehouse(engine_quant,\n",
+ " company_data=None,\n",
+ " benchmark_projected_production=None,\n",
+ " benchmarks_projected_ei=None,\n",
+ " ingest_schema = 'demo_dv',\n",
+ " column_config=None,\n",
+ " tempscore_config=None)\n",
+ "\n",
+ "vault_warehouse.quant_init(engine_quant, company_data=vault_company_data, ingest_schema='demo_dv')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "be2d45e2-4a19-4e6a-932d-bc7ea8e0eea0",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from ITR.data.osc_units import *\n",
+ "ureg.setup_matplotlib()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "3d18b584-de49-4344-932b-2302d3976794",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [],
+ "source": [
+ "# Because this DF comes from reading a Trino table, and because columns must be unqiue, we don't have to enumerate to ensure we properly handle columns with duplicated names\n",
+ "\n",
+ "def requantify_df(df: pd.DataFrame, typemap: dict) -> pd.DataFrame:\n",
+ " units_col = None\n",
+ " columns_not_found = [k for k in typemap.keys() if k not in df.columns]\n",
+ " if columns_not_found:\n",
+ " print(f\"columns {columns_not_found} not found in DataFrame\")\n",
+ " raise ValueError\n",
+ " columns_reversed = reversed(df.columns)\n",
+ " for col in columns_reversed:\n",
+ " if col.endswith(\"_units\"):\n",
+ " if units_col:\n",
+ " print(f\"Column {units_col} follows {col} without intervening value column\")\n",
+ " # We expect _units column to follow a non-units column\n",
+ " raise ValueError\n",
+ " units_col = col\n",
+ " continue\n",
+ " if units_col:\n",
+ " if col + '_units' != units_col:\n",
+ " print(f\"Excpecting column name {col}_units but saw {units_col} instead\")\n",
+ " raise ValueError\n",
+ " if (df[units_col]==df[units_col][0]).all():\n",
+ " # We can make a PintArray since column is of homogeneous type\n",
+ " new_col = PintArray(df[col], dtype=f\"pint[{ureg(df[units_col][0]).u}]\")\n",
+ " else:\n",
+ " # Make a pd.Series of Quantity in a way that does not throw UnitStrippedWarning\n",
+ " new_col = pd.Series(data=df[col], name=col) * pd.Series(data=df[units_col].map(lambda x: ureg(x).u), name=col)\n",
+ " if col in typemap.keys():\n",
+ " new_col = new_col.astype(typemap[col])\n",
+ " df = df.drop(columns=units_col)\n",
+ " df[col] = new_col\n",
+ " units_col = None\n",
+ " return df"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "236c94f8-1709-4d7a-9beb-85419e65be5c",
+ "metadata": {},
+ "source": [
+ "Show that we *can* access both cumulative emissions (input) and temperature scores (output)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "2483f3de-ca17-4dcd-b140-deebcdb5639b",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/michael/opt/miniconda3/envs/jupyter/lib/python3.10/site-packages/pandas/io/sql.py:1773: SAWarning: index key 'partition' was not located in columns for table 'temperature_scores'\n",
+ " tbl = Table(\n",
+ "/Users/michael/opt/miniconda3/envs/jupyter/lib/python3.10/site-packages/pandas/io/sql.py:1773: SAWarning: index key 'record_count' was not located in columns for table 'temperature_scores'\n",
+ " tbl = Table(\n",
+ "/Users/michael/opt/miniconda3/envs/jupyter/lib/python3.10/site-packages/pandas/io/sql.py:1773: SAWarning: index key 'file_count' was not located in columns for table 'temperature_scores'\n",
+ " tbl = Table(\n",
+ "/Users/michael/opt/miniconda3/envs/jupyter/lib/python3.10/site-packages/pandas/io/sql.py:1773: SAWarning: index key 'total_size' was not located in columns for table 'temperature_scores'\n",
+ " tbl = Table(\n",
+ "/Users/michael/opt/miniconda3/envs/jupyter/lib/python3.10/site-packages/pandas/io/sql.py:1773: SAWarning: index key 'data' was not located in columns for table 'temperature_scores'\n",
+ " tbl = Table(\n"
+ ]
+ }
+ ],
+ "source": [
+ "sql_temp_score_df = pd.read_sql_table(f\"temperature_scores\", engine_quant)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "1ae21697-98f1-4901-bd32-b4856555b809",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/michael/opt/miniconda3/envs/jupyter/lib/python3.10/site-packages/pint_pandas/pint_array.py:648: UnitStrippedWarning: The unit of the quantity is stripped when downcasting to ndarray.\n",
+ " return np.array(qtys, dtype=\"object\", copy=copy)\n",
+ "/Users/michael/opt/miniconda3/envs/jupyter/lib/python3.10/site-packages/pint_pandas/pint_array.py:648: UnitStrippedWarning: The unit of the quantity is stripped when downcasting to ndarray.\n",
+ " return np.array(qtys, dtype=\"object\", copy=copy)\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " company_name \n",
+ " company_id \n",
+ " source \n",
+ " scope \n",
+ " benchmark \n",
+ " trajectory_temperature_score \n",
+ " target_temperature_score \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " DTE Energy \n",
+ " US2333311072 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 2.6091902259287814 \n",
+ " 2.379216491775751 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " Eversource Energy \n",
+ " US30040W1080 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 1.2628409825839846 \n",
+ " 1.2644301701927758 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " PPL Corp. \n",
+ " US69351T1060 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 2.9200602768317596 \n",
+ " 2.3491606861822802 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " CMS Energy Corp. \n",
+ " US1258961002 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 2.348452047798262 \n",
+ " 1.9155526969886063 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " Dominion Energy \n",
+ " US25746U1097 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 1.6227512601234515 \n",
+ " 1.661573221927111 \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " Old Dominion Electric Coop. \n",
+ " ZZ00000000141 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 1.6293648535896375 \n",
+ " 1.747001585843511 \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " Public Service Enterprise Group \n",
+ " US7445731067 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 1.544721397863445 \n",
+ " 1.3420928255486166 \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " ALLETE, Inc. \n",
+ " US0185223007 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 1.997417049909789 \n",
+ " 2.0901695283836217 \n",
+ " \n",
+ " \n",
+ " 8 \n",
+ " Algonquin Power & Utilities Corp. \n",
+ " US0158577090 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 1.2622489075053775 \n",
+ " 1.2624152250820424 \n",
+ " \n",
+ " \n",
+ " 9 \n",
+ " Idacorp, Inc. \n",
+ " US4511071064 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 1.8676022899726177 \n",
+ " 2.277606917005736 \n",
+ " \n",
+ " \n",
+ " 10 \n",
+ " Northwestern Corp. \n",
+ " US6680743050 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 2.3913040930528355 \n",
+ " 2.079302509181419 \n",
+ " \n",
+ " \n",
+ " 11 \n",
+ " Sempra \n",
+ " US8168511090 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 1.8111134105404487 \n",
+ " 1.925593255252446 \n",
+ " \n",
+ " \n",
+ " 12 \n",
+ " Hawaiian Electric Industries, Inc. \n",
+ " US4198701009 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 3.770581759429166 \n",
+ " 1.9661037441668163 \n",
+ " \n",
+ " \n",
+ " 13 \n",
+ " Xcel Energy, Inc. \n",
+ " US98389B1008 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 2.015157185885931 \n",
+ " 1.7179382088171773 \n",
+ " \n",
+ " \n",
+ " 14 \n",
+ " Black Hills Corp. \n",
+ " US0921131092 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 3.0418446166638597 \n",
+ " 3.1354352983921228 \n",
+ " \n",
+ " \n",
+ " 15 \n",
+ " WEC Energy Group \n",
+ " US92939U1060 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 1.9100425761684416 \n",
+ " 2.315027274921859 \n",
+ " \n",
+ " \n",
+ " 16 \n",
+ " COMMERCIAL METALS CO \n",
+ " US2017231034 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 1.3039798752099132 \n",
+ " 1.2941437041150645 \n",
+ " \n",
+ " \n",
+ " 17 \n",
+ " Edison International \n",
+ " US2810201077 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 1.312116276524954 \n",
+ " 1.4129397560495331 \n",
+ " \n",
+ " \n",
+ " 18 \n",
+ " NUCOR CORP \n",
+ " US6703461052 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 1.3380046417036604 \n",
+ " 1.2928557297900936 \n",
+ " \n",
+ " \n",
+ " 19 \n",
+ " Otter Tail Corp. \n",
+ " US6896481032 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 3.440096899151643 \n",
+ " 2.498716396935876 \n",
+ " \n",
+ " \n",
+ " 20 \n",
+ " TENARIS SA \n",
+ " US88031M1099 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 1.3801362873484335 \n",
+ " 1.3464272251011569 \n",
+ " \n",
+ " \n",
+ " 21 \n",
+ " Avangrid, Inc. \n",
+ " US05351W1036 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 1.7268528930870772 \n",
+ " 1.5214380086973212 \n",
+ " \n",
+ " \n",
+ " 22 \n",
+ " Cleco Partners LP \n",
+ " US18551QAA58 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 2.3054173371566073 \n",
+ " 2.2552022001649963 \n",
+ " \n",
+ " \n",
+ " 23 \n",
+ " GERDAU S.A. \n",
+ " US3737371050 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 1.4109172347241234 \n",
+ " 1.340264075792371 \n",
+ " \n",
+ " \n",
+ " 24 \n",
+ " Ameren Corp. \n",
+ " US0236081024 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 2.5513775118169426 \n",
+ " 2.2571450913807984 \n",
+ " \n",
+ " \n",
+ " 25 \n",
+ " Avista Corp. \n",
+ " US05379B1070 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 2.05866675939179 \n",
+ " 1.3611881118286184 \n",
+ " \n",
+ " \n",
+ " 26 \n",
+ " TIMKENSTEEL CORP \n",
+ " US8873991033 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 1.3070727237175541 \n",
+ " 1.2808123857957467 \n",
+ " \n",
+ " \n",
+ " 27 \n",
+ " CARPENTER TECHNOLOGY CORP \n",
+ " US1442851036 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 2.295769851717101 \n",
+ " 1.6844114864737225 \n",
+ " \n",
+ " \n",
+ " 28 \n",
+ " Entergy Corp. \n",
+ " US29364G1031 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 1.860668757836411 \n",
+ " 1.5937919247590187 \n",
+ " \n",
+ " \n",
+ " 29 \n",
+ " PNM Resources, Inc. \n",
+ " US69349H1077 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 2.2693945128543964 \n",
+ " 1.7579421817864156 \n",
+ " \n",
+ " \n",
+ " 30 \n",
+ " Portland General Electric Co. \n",
+ " US7365088472 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 2.1966909832814 \n",
+ " 1.5445623274403906 \n",
+ " \n",
+ " \n",
+ " 31 \n",
+ " Tri-State Generation & Transmission Associatio... \n",
+ " ZZ00000000180 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 4.074985507300026 \n",
+ " 2.8541497409559122 \n",
+ " \n",
+ " \n",
+ " 32 \n",
+ " Consolidated Edison, Inc. \n",
+ " US2091151041 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 1.7833472303288853 \n",
+ " 1.6560798047931302 \n",
+ " \n",
+ " \n",
+ " 33 \n",
+ " National Grid PLC \n",
+ " US6362744095 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 2.919305029921471 \n",
+ " 2.1411082198666396 \n",
+ " \n",
+ " \n",
+ " 34 \n",
+ " CLEVELAND-CLIFFS INC \n",
+ " US1858991011 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 1.305200079468213 \n",
+ " 1.2951308142680467 \n",
+ " \n",
+ " \n",
+ " 35 \n",
+ " Duke Energy Corp. \n",
+ " US26441C2044 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 1.89556553432109 \n",
+ " 1.756298023368055 \n",
+ " \n",
+ " \n",
+ " 36 \n",
+ " Evergy, Inc. \n",
+ " US30034W1062 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 2.479700263878156 \n",
+ " 1.89419682611465 \n",
+ " \n",
+ " \n",
+ " 37 \n",
+ " Pinnacle West Capital Corp. \n",
+ " US7234841010 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 2.4451977433867675 \n",
+ " 1.7270093178004937 \n",
+ " \n",
+ " \n",
+ " 38 \n",
+ " El Paso Electric Co \n",
+ " US283677AZ52 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 2.1594789391635216 \n",
+ " 1.5702465117614701 \n",
+ " \n",
+ " \n",
+ " 39 \n",
+ " POSCO \n",
+ " KR7005490008 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 1.673425615844414 \n",
+ " 1.4452029158287243 \n",
+ " \n",
+ " \n",
+ " 40 \n",
+ " STEEL DYNAMICS INC \n",
+ " US8581191009 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 1.3353939284100609 \n",
+ " 1.2963615316127104 \n",
+ " \n",
+ " \n",
+ " 41 \n",
+ " Nisource Inc. \n",
+ " US65473P1057 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 2.7745147045226224 \n",
+ " 2.090636528579651 \n",
+ " \n",
+ " \n",
+ " 42 \n",
+ " Southern Co. \n",
+ " US8425871071 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 1.8910323254141892 \n",
+ " 2.101726272199106 \n",
+ " \n",
+ " \n",
+ " 43 \n",
+ " Alliant Energy \n",
+ " US0188021085 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 1.7483606568416443 \n",
+ " 1.98572887625178 \n",
+ " \n",
+ " \n",
+ " 44 \n",
+ " American Electric Power Co., Inc. \n",
+ " US0255371017 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 2.4897454506803856 \n",
+ " 1.8730908991949726 \n",
+ " \n",
+ " \n",
+ " 45 \n",
+ " FirstEnergy Corp. \n",
+ " US3379321074 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 4.179107457030844 \n",
+ " 2.7026054458883104 \n",
+ " \n",
+ " \n",
+ " 46 \n",
+ " OG&E Energy Corp. \n",
+ " US6708371033 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 2.215218912057745 \n",
+ " 2.929705859615634 \n",
+ " \n",
+ " \n",
+ " 47 \n",
+ " UNITED STATES STEEL CORP \n",
+ " US9129091081 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 1.616766467401584 \n",
+ " 1.4140505736427826 \n",
+ " \n",
+ " \n",
+ " 48 \n",
+ " WORTHINGTON INDUSTRIES INC \n",
+ " US9818111026 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 1.2683057378303193 \n",
+ " 1.2673404048059607 \n",
+ " \n",
+ " \n",
+ " 49 \n",
+ " PG&E Corp. \n",
+ " US69331C1080 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 1.4119350865327291 \n",
+ " 1.3715781594384326 \n",
+ " \n",
+ " \n",
+ " 50 \n",
+ " TERNIUM S.A. \n",
+ " US8808901081 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 1.6288695211243776 \n",
+ " 1.4242417981921036 \n",
+ " \n",
+ " \n",
+ " 51 \n",
+ " AES Corp. \n",
+ " US00130H1059 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 2.355136970621065 \n",
+ " 1.858716770767351 \n",
+ " \n",
+ " \n",
+ " 52 \n",
+ " Berkshire Hathaway, Inc. \n",
+ " US0846707026 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 2.176920201680923 \n",
+ " 1.8058852318287109 \n",
+ " \n",
+ " \n",
+ " 53 \n",
+ " Fortis, Inc. \n",
+ " CA3495531079 \n",
+ " demo_dv \n",
+ " S1+S2 \n",
+ " benchmark_1 \n",
+ " 2.8141850673960107 \n",
+ " 2.8664495273593995 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " company_name company_id source \\\n",
+ "0 DTE Energy US2333311072 demo_dv \n",
+ "1 Eversource Energy US30040W1080 demo_dv \n",
+ "2 PPL Corp. US69351T1060 demo_dv \n",
+ "3 CMS Energy Corp. US1258961002 demo_dv \n",
+ "4 Dominion Energy US25746U1097 demo_dv \n",
+ "5 Old Dominion Electric Coop. ZZ00000000141 demo_dv \n",
+ "6 Public Service Enterprise Group US7445731067 demo_dv \n",
+ "7 ALLETE, Inc. US0185223007 demo_dv \n",
+ "8 Algonquin Power & Utilities Corp. US0158577090 demo_dv \n",
+ "9 Idacorp, Inc. US4511071064 demo_dv \n",
+ "10 Northwestern Corp. US6680743050 demo_dv \n",
+ "11 Sempra US8168511090 demo_dv \n",
+ "12 Hawaiian Electric Industries, Inc. US4198701009 demo_dv \n",
+ "13 Xcel Energy, Inc. US98389B1008 demo_dv \n",
+ "14 Black Hills Corp. US0921131092 demo_dv \n",
+ "15 WEC Energy Group US92939U1060 demo_dv \n",
+ "16 COMMERCIAL METALS CO US2017231034 demo_dv \n",
+ "17 Edison International US2810201077 demo_dv \n",
+ "18 NUCOR CORP US6703461052 demo_dv \n",
+ "19 Otter Tail Corp. US6896481032 demo_dv \n",
+ "20 TENARIS SA US88031M1099 demo_dv \n",
+ "21 Avangrid, Inc. US05351W1036 demo_dv \n",
+ "22 Cleco Partners LP US18551QAA58 demo_dv \n",
+ "23 GERDAU S.A. US3737371050 demo_dv \n",
+ "24 Ameren Corp. US0236081024 demo_dv \n",
+ "25 Avista Corp. US05379B1070 demo_dv \n",
+ "26 TIMKENSTEEL CORP US8873991033 demo_dv \n",
+ "27 CARPENTER TECHNOLOGY CORP US1442851036 demo_dv \n",
+ "28 Entergy Corp. US29364G1031 demo_dv \n",
+ "29 PNM Resources, Inc. US69349H1077 demo_dv \n",
+ "30 Portland General Electric Co. US7365088472 demo_dv \n",
+ "31 Tri-State Generation & Transmission Associatio... ZZ00000000180 demo_dv \n",
+ "32 Consolidated Edison, Inc. US2091151041 demo_dv \n",
+ "33 National Grid PLC US6362744095 demo_dv \n",
+ "34 CLEVELAND-CLIFFS INC US1858991011 demo_dv \n",
+ "35 Duke Energy Corp. US26441C2044 demo_dv \n",
+ "36 Evergy, Inc. US30034W1062 demo_dv \n",
+ "37 Pinnacle West Capital Corp. US7234841010 demo_dv \n",
+ "38 El Paso Electric Co US283677AZ52 demo_dv \n",
+ "39 POSCO KR7005490008 demo_dv \n",
+ "40 STEEL DYNAMICS INC US8581191009 demo_dv \n",
+ "41 Nisource Inc. US65473P1057 demo_dv \n",
+ "42 Southern Co. US8425871071 demo_dv \n",
+ "43 Alliant Energy US0188021085 demo_dv \n",
+ "44 American Electric Power Co., Inc. US0255371017 demo_dv \n",
+ "45 FirstEnergy Corp. US3379321074 demo_dv \n",
+ "46 OG&E Energy Corp. US6708371033 demo_dv \n",
+ "47 UNITED STATES STEEL CORP US9129091081 demo_dv \n",
+ "48 WORTHINGTON INDUSTRIES INC US9818111026 demo_dv \n",
+ "49 PG&E Corp. US69331C1080 demo_dv \n",
+ "50 TERNIUM S.A. US8808901081 demo_dv \n",
+ "51 AES Corp. US00130H1059 demo_dv \n",
+ "52 Berkshire Hathaway, Inc. US0846707026 demo_dv \n",
+ "53 Fortis, Inc. CA3495531079 demo_dv \n",
+ "\n",
+ " scope benchmark trajectory_temperature_score target_temperature_score \n",
+ "0 S1+S2 benchmark_1 2.6091902259287814 2.379216491775751 \n",
+ "1 S1+S2 benchmark_1 1.2628409825839846 1.2644301701927758 \n",
+ "2 S1+S2 benchmark_1 2.9200602768317596 2.3491606861822802 \n",
+ "3 S1+S2 benchmark_1 2.348452047798262 1.9155526969886063 \n",
+ "4 S1+S2 benchmark_1 1.6227512601234515 1.661573221927111 \n",
+ "5 S1+S2 benchmark_1 1.6293648535896375 1.747001585843511 \n",
+ "6 S1+S2 benchmark_1 1.544721397863445 1.3420928255486166 \n",
+ "7 S1+S2 benchmark_1 1.997417049909789 2.0901695283836217 \n",
+ "8 S1+S2 benchmark_1 1.2622489075053775 1.2624152250820424 \n",
+ "9 S1+S2 benchmark_1 1.8676022899726177 2.277606917005736 \n",
+ "10 S1+S2 benchmark_1 2.3913040930528355 2.079302509181419 \n",
+ "11 S1+S2 benchmark_1 1.8111134105404487 1.925593255252446 \n",
+ "12 S1+S2 benchmark_1 3.770581759429166 1.9661037441668163 \n",
+ "13 S1+S2 benchmark_1 2.015157185885931 1.7179382088171773 \n",
+ "14 S1+S2 benchmark_1 3.0418446166638597 3.1354352983921228 \n",
+ "15 S1+S2 benchmark_1 1.9100425761684416 2.315027274921859 \n",
+ "16 S1+S2 benchmark_1 1.3039798752099132 1.2941437041150645 \n",
+ "17 S1+S2 benchmark_1 1.312116276524954 1.4129397560495331 \n",
+ "18 S1+S2 benchmark_1 1.3380046417036604 1.2928557297900936 \n",
+ "19 S1+S2 benchmark_1 3.440096899151643 2.498716396935876 \n",
+ "20 S1+S2 benchmark_1 1.3801362873484335 1.3464272251011569 \n",
+ "21 S1+S2 benchmark_1 1.7268528930870772 1.5214380086973212 \n",
+ "22 S1+S2 benchmark_1 2.3054173371566073 2.2552022001649963 \n",
+ "23 S1+S2 benchmark_1 1.4109172347241234 1.340264075792371 \n",
+ "24 S1+S2 benchmark_1 2.5513775118169426 2.2571450913807984 \n",
+ "25 S1+S2 benchmark_1 2.05866675939179 1.3611881118286184 \n",
+ "26 S1+S2 benchmark_1 1.3070727237175541 1.2808123857957467 \n",
+ "27 S1+S2 benchmark_1 2.295769851717101 1.6844114864737225 \n",
+ "28 S1+S2 benchmark_1 1.860668757836411 1.5937919247590187 \n",
+ "29 S1+S2 benchmark_1 2.2693945128543964 1.7579421817864156 \n",
+ "30 S1+S2 benchmark_1 2.1966909832814 1.5445623274403906 \n",
+ "31 S1+S2 benchmark_1 4.074985507300026 2.8541497409559122 \n",
+ "32 S1+S2 benchmark_1 1.7833472303288853 1.6560798047931302 \n",
+ "33 S1+S2 benchmark_1 2.919305029921471 2.1411082198666396 \n",
+ "34 S1+S2 benchmark_1 1.305200079468213 1.2951308142680467 \n",
+ "35 S1+S2 benchmark_1 1.89556553432109 1.756298023368055 \n",
+ "36 S1+S2 benchmark_1 2.479700263878156 1.89419682611465 \n",
+ "37 S1+S2 benchmark_1 2.4451977433867675 1.7270093178004937 \n",
+ "38 S1+S2 benchmark_1 2.1594789391635216 1.5702465117614701 \n",
+ "39 S1+S2 benchmark_1 1.673425615844414 1.4452029158287243 \n",
+ "40 S1+S2 benchmark_1 1.3353939284100609 1.2963615316127104 \n",
+ "41 S1+S2 benchmark_1 2.7745147045226224 2.090636528579651 \n",
+ "42 S1+S2 benchmark_1 1.8910323254141892 2.101726272199106 \n",
+ "43 S1+S2 benchmark_1 1.7483606568416443 1.98572887625178 \n",
+ "44 S1+S2 benchmark_1 2.4897454506803856 1.8730908991949726 \n",
+ "45 S1+S2 benchmark_1 4.179107457030844 2.7026054458883104 \n",
+ "46 S1+S2 benchmark_1 2.215218912057745 2.929705859615634 \n",
+ "47 S1+S2 benchmark_1 1.616766467401584 1.4140505736427826 \n",
+ "48 S1+S2 benchmark_1 1.2683057378303193 1.2673404048059607 \n",
+ "49 S1+S2 benchmark_1 1.4119350865327291 1.3715781594384326 \n",
+ "50 S1+S2 benchmark_1 1.6288695211243776 1.4242417981921036 \n",
+ "51 S1+S2 benchmark_1 2.355136970621065 1.858716770767351 \n",
+ "52 S1+S2 benchmark_1 2.176920201680923 1.8058852318287109 \n",
+ "53 S1+S2 benchmark_1 2.8141850673960107 2.8664495273593995 "
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "temp_score_df = requantify_df(sql_temp_score_df, typemap={'trajectory_temperature_score':'pint[delta_degC]', 'target_temperature_score':'pint[delta_degC]'})\n",
+ "temp_score_df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "c1270d41-5a03-43dd-b90b-f305299dbe99",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/michael/opt/miniconda3/envs/jupyter/lib/python3.10/site-packages/pint_pandas/pint_array.py:648: UnitStrippedWarning: The unit of the quantity is stripped when downcasting to ndarray.\n",
+ " return np.array(qtys, dtype=\"object\", copy=copy)\n"
+ ]
+ }
+ ],
+ "source": [
+ "plottable_df = temp_score_df[['company_name', 'trajectory_temperature_score', 'target_temperature_score']].sort_values('company_name').set_index('company_name').T"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "id": "9ee65e40-cda2-4a9b-ac80-b0e96c8c152e",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 11,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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REREREREZ3keWA44z/ZwSZfZfhtA0trA1JTezkB6NseYlR7OERERERERERERHUTSuMCdwH3AJsAI25Z0FvCy7e83GmD0tCScIyIiIiIiIiIiOoSkIbaHSRoP+D3wNDAlMBR4zfb6db8MCIxGJOEcERERERERERExAEkabHv4KLaPY/vdOkBwTmA6yoDAG+rrGRAYjUnCOSIiIiIiIiIiYoBpJZslDQIOAB4E3rN9dn19lEnlVDZH0wY1HUBERERERERERER8UFuy+XLgXWBiYG9Js9TXR1nBnGRzNC0J54iIiIiIiIiIiAGiJplbFgKus70nsAbwK9tPSJqymegiPlwSzhEREREREREREQOApOlblcuSpqMMAlxW0k3A2baPrgnpTSRN3WSsEf9NEs4RERERERERERENkzQpsJmkzSTdCGxo+07gOWBs28fWXc8HZrb9QlOxRvwvGRoYERERERERERExAEhaHLgAuN32MnXbLMBPgbkoyefnbW9WX8uAwBhwknCOiIiIiIiIiIhoiKTBtofXxxMDmwLLAmcCF9h+rb72BWCQ7Yfq80H/bXBgRJPSUiMiIiIiIiIiIqIBrWSzpEGS1gamtn0IsBuwMbCqpMkkHQr8sy3ZrCSbY6BKhXNERERERERERERD6hDAq4EngMmBB4FfArNSWmkMBt61vUpjQUZ8DEk4R0REREREREREjEHtvZclHQY8bftgSX8BHgD+BuxL6U4wk+0/9X1fxECVhHNERERERERERMQYImlq2y/Ux+NRhgE+CpwPXAbcApwD/AHYx/azdd8km6MjpIdzRERERERERETEGCBpCmArSatJugXY2PY9wCSUthmH1+d/Bm5qJZsBkmyOTpEK54iIiIiIiIiIiNFM0jy276nDAU8Crra9Wtvr9wBP16dP2d62bk9lc3SUVDhHRERERERERESMRpJOAbaWNBNwH3A0ML6k5SVNUndbELgWuDHJ5uhkqXCOiIiIiIiIiIgYTSSdDEwErGV7RNv2lYAfAAcC1wPbAYfafq++Pqh9/4hOkYRzRERERERERETEaCBpeuAI26vX53MBswAzApcAswO7AmMB79heqalYI/pLEs4RERERERERERGjgaTxgRuAs4DXgJWAaYC/A18BlqYkm6e0fUd9T9poREdLwjkiIiIiIiIiIqKftRLHkhYGdgdmAA4A7rX9sKRDgWttX9r3PQ2FHNEvhjQdQERERERERERERLdpJY5t31T7NY9n+422Xb4M3Duq90R0skFNBxAREREREREREdENJK0haYL6WJIGA9geZvuNum0aSb8B/mb7jEYDjhgNknCOiIiIiIiIiIj4lCTNAWD7TUmTuBheX/u+pKWAaYHdgDdsb15fS34uukp6OEdERERERERERPQTSWtShgHuaftFSccDMwLL157OU9t+oe47yPaIJuON6G+5gxIREREREREREfEJSTpd0iKSBkvaHRgXeAXYqbbXuAxYrSabB7Ulm5Vkc3SjJJwjIiIiIiIiIiI+AUnHAMNt3wj8FHiv9mW+FBgM7ALcanuopLHaE8wZEBjdKgnniIiIiIiIiIiIj6m2ylgZOF7SZsB8wD0Atm8GLgLGBvaRNKHt9xsLNmIMGtJ0ABEREREREREREZ1E0qnAlMAJwDcpwwBfBuaV9Jjtp23fLGkcYArbbzQYbsQYlYRzRERERERERETERyRpDgDby0uaDtiKkmx+F5gNWFLSNTXp/Ie29yltNKIXKJ/ziIiIiIiIiIiIT0bS54F1gbeASYApgD8CZ9n+V4OhRTQiPZwjIiIiIiIiIiI+JkkCsP0X4CxgPOBVYBjwTpLN0atS4RwREREREREREfEp1UrnLYA/2L6s6XgimpKEc0RERERERERERD+QNI3t5+vj9GyOnpSEc0RERERERERERD9Ksjl6WRLOEREREREREREREdEvMjQwIiIiIiIiIiIiIvpFEs4RERERERERERER0S+ScI6IiIiIiIiIiIiIfpGEc0RERERERERERET0iyScIyIiIiIiIiIiIqJfJOEcEREREREREREREf0iCeeIiIiIiIiIiIiI6BdJOEdEREREREREREREv/h/OUnr+NrcqWgAAAAASUVORK5CYII=\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Must plot the first few columns, but then plot 1/3rd of the companies so as not to over-clutter the graph\n",
+ "plottable_df.applymap(lambda x: x.m).iloc[:, [x for x in list(range(0,2)) + list(range(4,52,3))]].boxplot(figsize=(24,10), rot=45)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "65795474-1de6-4f40-9086-f7d948ae6c66",
+ "metadata": {},
+ "source": [
+ "### Step 5: Show per-company temperature score and weighted portfolio alignment score\n",
+ "\n",
+ "Portfolio weighting scores (which ultimately influence portfolio alignment score) include:\n",
+ "* WATS (size of portfolio company positions used as weights)\n",
+ "* TETS (size of total emissions of portfolio companies used as weights)\n",
+ "* Financial fundamental weights:\n",
+ " * Market Cap\n",
+ " * Enterprise Value\n",
+ " * Assets\n",
+ " * Revenues\n",
+ "\n",
+ "We can pass a list of company IDs to the Data Vault to get back a sum without exposing granular data"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "df114d27-a6ab-46d9-a942-0e8200c4fcd7",
+ "metadata": {},
+ "source": [
+ "Show that we *can also* access both cumulative emissions (input) and temperature scores (output)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "id": "76d2ad90-ce27-484f-8de9-359153d32979",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " company_name \n",
+ " company_lei \n",
+ " investment_value \n",
+ " \n",
+ " \n",
+ " company_id \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " US00130H1059 \n",
+ " AES Corp. \n",
+ " 2NUNNB7D43COUIRE5295 \n",
+ " 4351252 \n",
+ " \n",
+ " \n",
+ " US0158577090 \n",
+ " Algonquin Power & Utilities Corp. \n",
+ " 549300K5VIUTJXQL7X75 \n",
+ " 2228185 \n",
+ " \n",
+ " \n",
+ " US0185223007 \n",
+ " ALLETE, Inc. \n",
+ " 549300NNLSIMY6Z8OT86 \n",
+ " 3829481 \n",
+ " \n",
+ " \n",
+ " US0188021085 \n",
+ " Alliant Energy \n",
+ " 5493009ML300G373MZ12 \n",
+ " 3829481 \n",
+ " \n",
+ " \n",
+ " US0236081024 \n",
+ " Ameren Corp. \n",
+ " XRZQ5S7HYJFPHJ78L959 \n",
+ " 15917812 \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " US8873991033 \n",
+ " TIMKENSTEEL CORP \n",
+ " 549300QZTZWHDE9HJL14 \n",
+ " 10000000 \n",
+ " \n",
+ " \n",
+ " US88830M1027 \n",
+ " TITAN INTERNATIONAL INC \n",
+ " 254900CXRGBE7C4B5A06 \n",
+ " 10000000 \n",
+ " \n",
+ " \n",
+ " US9129091081 \n",
+ " UNITED STATES STEEL CORP \n",
+ " JNLUVFYJT1OZSIQ24U47 \n",
+ " 10000000 \n",
+ " \n",
+ " \n",
+ " US9138371003 \n",
+ " UNIVERSAL STAINLESS & ALLOY PRODUCTS INC \n",
+ " 5493001OEIZDUGXZDE09 \n",
+ " 10000000 \n",
+ " \n",
+ " \n",
+ " US9818111026 \n",
+ " WORTHINGTON INDUSTRIES INC \n",
+ " 1WRCIANKYOIK6KYE5E82 \n",
+ " 10000000 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
61 rows × 3 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " company_name company_lei \\\n",
+ "company_id \n",
+ "US00130H1059 AES Corp. 2NUNNB7D43COUIRE5295 \n",
+ "US0158577090 Algonquin Power & Utilities Corp. 549300K5VIUTJXQL7X75 \n",
+ "US0185223007 ALLETE, Inc. 549300NNLSIMY6Z8OT86 \n",
+ "US0188021085 Alliant Energy 5493009ML300G373MZ12 \n",
+ "US0236081024 Ameren Corp. XRZQ5S7HYJFPHJ78L959 \n",
+ "... ... ... \n",
+ "US8873991033 TIMKENSTEEL CORP 549300QZTZWHDE9HJL14 \n",
+ "US88830M1027 TITAN INTERNATIONAL INC 254900CXRGBE7C4B5A06 \n",
+ "US9129091081 UNITED STATES STEEL CORP JNLUVFYJT1OZSIQ24U47 \n",
+ "US9138371003 UNIVERSAL STAINLESS & ALLOY PRODUCTS INC 5493001OEIZDUGXZDE09 \n",
+ "US9818111026 WORTHINGTON INDUSTRIES INC 1WRCIANKYOIK6KYE5E82 \n",
+ "\n",
+ " investment_value \n",
+ "company_id \n",
+ "US00130H1059 4351252 \n",
+ "US0158577090 2228185 \n",
+ "US0185223007 3829481 \n",
+ "US0188021085 3829481 \n",
+ "US0236081024 15917812 \n",
+ "... ... \n",
+ "US8873991033 10000000 \n",
+ "US88830M1027 10000000 \n",
+ "US9129091081 10000000 \n",
+ "US9138371003 10000000 \n",
+ "US9818111026 10000000 \n",
+ "\n",
+ "[61 rows x 3 columns]"
+ ]
+ },
+ "execution_count": 12,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "portfolio_df = pd.read_csv(\"data/mdt-20220116-portfolio.csv\", encoding=\"iso-8859-1\", sep=';', index_col='company_id')\n",
+ "portfolio_df"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e2d9942b-ec81-4eab-9cca-99e92905e24f",
+ "metadata": {},
+ "source": [
+ "### Calculate portfolio alignment temperature score based on WATS\n",
+ "\n",
+ "We can do this with information exclusive to the user space (and the probability-adjusted temperature scores)\n",
+ "\n",
+ "Note that companies with no production information (such as TITAL INTERNATIONAL INC and UNIVERSAL STAINLESS & ALLOY PRODUCTS INC will show NaN (Not a Number) as a score."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "id": "3840f2c6-a938-43b0-b24e-37f0b284d2c6",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/michael/opt/miniconda3/envs/jupyter/lib/python3.10/site-packages/pint_pandas/pint_array.py:648: UnitStrippedWarning: The unit of the quantity is stripped when downcasting to ndarray.\n",
+ " return np.array(qtys, dtype=\"object\", copy=copy)\n"
+ ]
+ }
+ ],
+ "source": [
+ "# PA_SCORE means \"Probability-Adjusted\" Temperature Score\n",
+ "portfolio_df['pa_score'] = vault_warehouse.get_pa_temp_scores(probability=0.5, company_ids=portfolio_df.index.values).astype('pint[delta_degC]')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "id": "8031e3a0-3d22-4f16-8a9a-e85f855f1b02",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/michael/opt/miniconda3/envs/jupyter/lib/python3.10/site-packages/pint_pandas/pint_array.py:648: UnitStrippedWarning: The unit of the quantity is stripped when downcasting to ndarray.\n",
+ " return np.array(qtys, dtype=\"object\", copy=copy)\n",
+ "/Users/michael/opt/miniconda3/envs/jupyter/lib/python3.10/site-packages/pint_pandas/pint_array.py:648: UnitStrippedWarning: The unit of the quantity is stripped when downcasting to ndarray.\n",
+ " return np.array(qtys, dtype=\"object\", copy=copy)\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " company_name \n",
+ " company_lei \n",
+ " investment_value \n",
+ " pa_score \n",
+ " \n",
+ " \n",
+ " company_id \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " US00130H1059 \n",
+ " AES Corp. \n",
+ " 2NUNNB7D43COUIRE5295 \n",
+ " 4351252 \n",
+ " 2.106926870694208 \n",
+ " \n",
+ " \n",
+ " US0185223007 \n",
+ " ALLETE, Inc. \n",
+ " 549300NNLSIMY6Z8OT86 \n",
+ " 3829481 \n",
+ " 2.043793289146705 \n",
+ " \n",
+ " \n",
+ " US0158577090 \n",
+ " Algonquin Power & Utilities Corp. \n",
+ " 549300K5VIUTJXQL7X75 \n",
+ " 2228185 \n",
+ " 1.2623320662937099 \n",
+ " \n",
+ " \n",
+ " US0188021085 \n",
+ " Alliant Energy \n",
+ " 5493009ML300G373MZ12 \n",
+ " 3829481 \n",
+ " 1.8670447665467123 \n",
+ " \n",
+ " \n",
+ " US0236081024 \n",
+ " Ameren Corp. \n",
+ " XRZQ5S7HYJFPHJ78L959 \n",
+ " 15917812 \n",
+ " 2.4042613015988703 \n",
+ " \n",
+ " \n",
+ " US0255371017 \n",
+ " American Electric Power Co., Inc. \n",
+ " 1B4S6S7G0TW5EE83BO58 \n",
+ " 45520637 \n",
+ " 2.1814181749376793 \n",
+ " \n",
+ " \n",
+ " US05351W1036 \n",
+ " Avangrid, Inc. \n",
+ " 549300OX0Q38NLSKPB49 \n",
+ " 10049068 \n",
+ " 1.624145450892199 \n",
+ " \n",
+ " \n",
+ " US05379B1070 \n",
+ " Avista Corp. \n",
+ " Q0IK63NITJD6RJ47SW96 \n",
+ " 2804211 \n",
+ " 1.7099274356102043 \n",
+ " \n",
+ " \n",
+ " US1442851036 \n",
+ " CARPENTER TECHNOLOGY CORP \n",
+ " DX6I6ZD3X5WNNCDJKP85 \n",
+ " 10000000 \n",
+ " 1.9900906690954117 \n",
+ " \n",
+ " \n",
+ " US1258961002 \n",
+ " CMS Energy \n",
+ " 549300IA9XFBAGNIBW29 \n",
+ " 9153135 \n",
+ " 2.1320023723934343 \n",
+ " \n",
+ " \n",
+ " US2017231034 \n",
+ " COMMERCIAL METALS CO \n",
+ " 549300OQS2LO07ZJ7N73 \n",
+ " 10000000 \n",
+ " 1.2990617896624888 \n",
+ " \n",
+ " \n",
+ " US18551QAA58 \n",
+ " Cleco Partners LP \n",
+ " 5493002H80P81B3HXL31 \n",
+ " 3086052 \n",
+ " 2.2803097686608016 \n",
+ " \n",
+ " \n",
+ " US2091151041 \n",
+ " Consolidated Edison, Inc. \n",
+ " 54930033SBW53OO8T749 \n",
+ " 20394113 \n",
+ " 1.7197135175610079 \n",
+ " \n",
+ " \n",
+ " US2333311072 \n",
+ " DTE Energy \n",
+ " 549300IX8SD6XXD71I78 \n",
+ " 14329945 \n",
+ " 2.494203358852266 \n",
+ " \n",
+ " \n",
+ " US25746U1097 \n",
+ " Dominion Energy \n",
+ " ILUL7B6Z54MRYCF6H308 \n",
+ " 33528082 \n",
+ " 1.6421622410252814 \n",
+ " \n",
+ " \n",
+ " US26441C2044 \n",
+ " Duke Energy Corp. \n",
+ " I1BZKREC126H0VB1BL91 \n",
+ " 73069652 \n",
+ " 1.8259317788445726 \n",
+ " \n",
+ " \n",
+ " US283677AZ52 \n",
+ " El Paso Electric Co \n",
+ " OZ8GM8L4AHPKSWZMW205 \n",
+ " 2646941 \n",
+ " 1.8648627254624959 \n",
+ " \n",
+ " \n",
+ " US29364G1031 \n",
+ " Entergy Corp. \n",
+ " 4XM3TW50JULSLG8BNC79 \n",
+ " 29844269 \n",
+ " 1.7272303412977148 \n",
+ " \n",
+ " \n",
+ " US30034W1062 \n",
+ " Evergy, Inc. \n",
+ " 549300PGTHDQY6PSUI61 \n",
+ " 18254954 \n",
+ " 2.186948544996403 \n",
+ " \n",
+ " \n",
+ " US30040W1080 \n",
+ " Eversource Energy \n",
+ " SJ7XXD41SQU3ZNWUJ746 \n",
+ " 18962480 \n",
+ " 1.2636355763883802 \n",
+ " \n",
+ " \n",
+ " US3379321074 \n",
+ " FirstEnergy Corp. \n",
+ " 549300SVYJS666PQJH88 \n",
+ " 27277340 \n",
+ " 3.4408564514595774 \n",
+ " \n",
+ " \n",
+ " CA3495531079 \n",
+ " Fortis, Inc \n",
+ " 549300MQYQ9Y065XPR71 \n",
+ " 12428756 \n",
+ " 2.8403172973777053 \n",
+ " \n",
+ " \n",
+ " US3737371050 \n",
+ " GERDAU S.A. \n",
+ " 254900YDV6SEQQPZVG24 \n",
+ " 10000000 \n",
+ " 1.375590655258247 \n",
+ " \n",
+ " \n",
+ " US6703461052 \n",
+ " NUCOR CORP \n",
+ " 549300GGJCRSI2TIEJ46 \n",
+ " 10000000 \n",
+ " 1.315430185746877 \n",
+ " \n",
+ " \n",
+ " US6362744095 \n",
+ " National Grid plc \n",
+ " 8R95QZMKZLJX5Q2XR704 \n",
+ " 12281584 \n",
+ " 2.5302066248940553 \n",
+ " \n",
+ " \n",
+ " US6680743050 \n",
+ " NorthWestern Corp. \n",
+ " 3BPWMBHR1R9SHUN7J795 \n",
+ " 2703150 \n",
+ " 2.2353033011171273 \n",
+ " \n",
+ " \n",
+ " US6708371033 \n",
+ " OG&E Energy \n",
+ " CE5OG6JPOZMDSA0LAQ19 \n",
+ " 7251242 \n",
+ " 2.5724623858366895 \n",
+ " \n",
+ " \n",
+ " US6896481032 \n",
+ " Otter Tail Corp. \n",
+ " 549300HHVBQRQUVKKD91 \n",
+ " 1264277 \n",
+ " 2.9694066480437593 \n",
+ " \n",
+ " \n",
+ " US69349H1077 \n",
+ " PNM Resources, Inc. \n",
+ " 5493003JOBJGLZSDDQ28 \n",
+ " 3326899 \n",
+ " 2.0136683473204062 \n",
+ " \n",
+ " \n",
+ " KR7005490008 \n",
+ " POSCO \n",
+ " 988400E5HRVX81AYLM04 \n",
+ " 10000000 \n",
+ " 1.5593142658365693 \n",
+ " \n",
+ " \n",
+ " US69351T1060 \n",
+ " PPL \n",
+ " 9N3UAJSNOUXFKQLF3V18 \n",
+ " 18146577 \n",
+ " 2.63461048150702 \n",
+ " \n",
+ " \n",
+ " US7234841010 \n",
+ " Pinnacle West Capital Corp. \n",
+ " TWSEY0NEDUDCKS27AH81 \n",
+ " 12058547 \n",
+ " 2.086103530593631 \n",
+ " \n",
+ " \n",
+ " US7365088472 \n",
+ " Portland General Electric Co. \n",
+ " GJOUP9M7C39GLSK9R870 \n",
+ " 5770964 \n",
+ " 1.8706266553608955 \n",
+ " \n",
+ " \n",
+ " US7445731067 \n",
+ " Public Service Enterprise Group \n",
+ " PUSS41EMO3E6XXNV3U28 \n",
+ " 16912134 \n",
+ " 1.4434071117060308 \n",
+ " \n",
+ " \n",
+ " US8581191009 \n",
+ " STEEL DYNAMICS INC \n",
+ " 549300HGGKEL4FYTTQ83 \n",
+ " 10000000 \n",
+ " 1.3158777300113855 \n",
+ " \n",
+ " \n",
+ " US8168511090 \n",
+ " Sempra Energy \n",
+ " PBBKGKLRK5S5C0Y4T545 \n",
+ " 29579515 \n",
+ " 1.8683533328964472 \n",
+ " \n",
+ " \n",
+ " US8425871071 \n",
+ " Southern Co. \n",
+ " 549300FC3G3YU2FBZD92 \n",
+ " 50294245 \n",
+ " 1.9963792988066476 \n",
+ " \n",
+ " \n",
+ " US88031M1099 \n",
+ " TENARIS SA \n",
+ " 549300Y7C05BKC4HZB40 \n",
+ " 10000000 \n",
+ " 1.3632817562247952 \n",
+ " \n",
+ " \n",
+ " US8808901081 \n",
+ " TERNIUM S.A. \n",
+ " 529900QG4KU23TEI2E46 \n",
+ " 10000000 \n",
+ " 1.5265556596582406 \n",
+ " \n",
+ " \n",
+ " US8873991033 \n",
+ " TIMKENSTEEL CORP \n",
+ " 549300QZTZWHDE9HJL14 \n",
+ " 10000000 \n",
+ " 1.2939425547566503 \n",
+ " \n",
+ " \n",
+ " US9129091081 \n",
+ " UNITED STATES STEEL CORP \n",
+ " JNLUVFYJT1OZSIQ24U47 \n",
+ " 10000000 \n",
+ " 1.5154085205221834 \n",
+ " \n",
+ " \n",
+ " US92939U1060 \n",
+ " WEC Energy Group \n",
+ " 549300IGLYTZUK3PVP70 \n",
+ " 11046675 \n",
+ " 2.11253492554515 \n",
+ " \n",
+ " \n",
+ " US9818111026 \n",
+ " WORTHINGTON INDUSTRIES INC \n",
+ " 1WRCIANKYOIK6KYE5E82 \n",
+ " 10000000 \n",
+ " 1.26782307131814 \n",
+ " \n",
+ " \n",
+ " US98389B1008 \n",
+ " Xcel Energy, Inc. \n",
+ " LGJNMI9GH8XIDG5RCM61 \n",
+ " 27475073 \n",
+ " 1.866547697351554 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " company_name company_lei \\\n",
+ "company_id \n",
+ "US00130H1059 AES Corp. 2NUNNB7D43COUIRE5295 \n",
+ "US0185223007 ALLETE, Inc. 549300NNLSIMY6Z8OT86 \n",
+ "US0158577090 Algonquin Power & Utilities Corp. 549300K5VIUTJXQL7X75 \n",
+ "US0188021085 Alliant Energy 5493009ML300G373MZ12 \n",
+ "US0236081024 Ameren Corp. XRZQ5S7HYJFPHJ78L959 \n",
+ "US0255371017 American Electric Power Co., Inc. 1B4S6S7G0TW5EE83BO58 \n",
+ "US05351W1036 Avangrid, Inc. 549300OX0Q38NLSKPB49 \n",
+ "US05379B1070 Avista Corp. Q0IK63NITJD6RJ47SW96 \n",
+ "US1442851036 CARPENTER TECHNOLOGY CORP DX6I6ZD3X5WNNCDJKP85 \n",
+ "US1258961002 CMS Energy 549300IA9XFBAGNIBW29 \n",
+ "US2017231034 COMMERCIAL METALS CO 549300OQS2LO07ZJ7N73 \n",
+ "US18551QAA58 Cleco Partners LP 5493002H80P81B3HXL31 \n",
+ "US2091151041 Consolidated Edison, Inc. 54930033SBW53OO8T749 \n",
+ "US2333311072 DTE Energy 549300IX8SD6XXD71I78 \n",
+ "US25746U1097 Dominion Energy ILUL7B6Z54MRYCF6H308 \n",
+ "US26441C2044 Duke Energy Corp. I1BZKREC126H0VB1BL91 \n",
+ "US283677AZ52 El Paso Electric Co OZ8GM8L4AHPKSWZMW205 \n",
+ "US29364G1031 Entergy Corp. 4XM3TW50JULSLG8BNC79 \n",
+ "US30034W1062 Evergy, Inc. 549300PGTHDQY6PSUI61 \n",
+ "US30040W1080 Eversource Energy SJ7XXD41SQU3ZNWUJ746 \n",
+ "US3379321074 FirstEnergy Corp. 549300SVYJS666PQJH88 \n",
+ "CA3495531079 Fortis, Inc 549300MQYQ9Y065XPR71 \n",
+ "US3737371050 GERDAU S.A. 254900YDV6SEQQPZVG24 \n",
+ "US6703461052 NUCOR CORP 549300GGJCRSI2TIEJ46 \n",
+ "US6362744095 National Grid plc 8R95QZMKZLJX5Q2XR704 \n",
+ "US6680743050 NorthWestern Corp. 3BPWMBHR1R9SHUN7J795 \n",
+ "US6708371033 OG&E Energy CE5OG6JPOZMDSA0LAQ19 \n",
+ "US6896481032 Otter Tail Corp. 549300HHVBQRQUVKKD91 \n",
+ "US69349H1077 PNM Resources, Inc. 5493003JOBJGLZSDDQ28 \n",
+ "KR7005490008 POSCO 988400E5HRVX81AYLM04 \n",
+ "US69351T1060 PPL 9N3UAJSNOUXFKQLF3V18 \n",
+ "US7234841010 Pinnacle West Capital Corp. TWSEY0NEDUDCKS27AH81 \n",
+ "US7365088472 Portland General Electric Co. GJOUP9M7C39GLSK9R870 \n",
+ "US7445731067 Public Service Enterprise Group PUSS41EMO3E6XXNV3U28 \n",
+ "US8581191009 STEEL DYNAMICS INC 549300HGGKEL4FYTTQ83 \n",
+ "US8168511090 Sempra Energy PBBKGKLRK5S5C0Y4T545 \n",
+ "US8425871071 Southern Co. 549300FC3G3YU2FBZD92 \n",
+ "US88031M1099 TENARIS SA 549300Y7C05BKC4HZB40 \n",
+ "US8808901081 TERNIUM S.A. 529900QG4KU23TEI2E46 \n",
+ "US8873991033 TIMKENSTEEL CORP 549300QZTZWHDE9HJL14 \n",
+ "US9129091081 UNITED STATES STEEL CORP JNLUVFYJT1OZSIQ24U47 \n",
+ "US92939U1060 WEC Energy Group 549300IGLYTZUK3PVP70 \n",
+ "US9818111026 WORTHINGTON INDUSTRIES INC 1WRCIANKYOIK6KYE5E82 \n",
+ "US98389B1008 Xcel Energy, Inc. LGJNMI9GH8XIDG5RCM61 \n",
+ "\n",
+ " investment_value pa_score \n",
+ "company_id \n",
+ "US00130H1059 4351252 2.106926870694208 \n",
+ "US0185223007 3829481 2.043793289146705 \n",
+ "US0158577090 2228185 1.2623320662937099 \n",
+ "US0188021085 3829481 1.8670447665467123 \n",
+ "US0236081024 15917812 2.4042613015988703 \n",
+ "US0255371017 45520637 2.1814181749376793 \n",
+ "US05351W1036 10049068 1.624145450892199 \n",
+ "US05379B1070 2804211 1.7099274356102043 \n",
+ "US1442851036 10000000 1.9900906690954117 \n",
+ "US1258961002 9153135 2.1320023723934343 \n",
+ "US2017231034 10000000 1.2990617896624888 \n",
+ "US18551QAA58 3086052 2.2803097686608016 \n",
+ "US2091151041 20394113 1.7197135175610079 \n",
+ "US2333311072 14329945 2.494203358852266 \n",
+ "US25746U1097 33528082 1.6421622410252814 \n",
+ "US26441C2044 73069652 1.8259317788445726 \n",
+ "US283677AZ52 2646941 1.8648627254624959 \n",
+ "US29364G1031 29844269 1.7272303412977148 \n",
+ "US30034W1062 18254954 2.186948544996403 \n",
+ "US30040W1080 18962480 1.2636355763883802 \n",
+ "US3379321074 27277340 3.4408564514595774 \n",
+ "CA3495531079 12428756 2.8403172973777053 \n",
+ "US3737371050 10000000 1.375590655258247 \n",
+ "US6703461052 10000000 1.315430185746877 \n",
+ "US6362744095 12281584 2.5302066248940553 \n",
+ "US6680743050 2703150 2.2353033011171273 \n",
+ "US6708371033 7251242 2.5724623858366895 \n",
+ "US6896481032 1264277 2.9694066480437593 \n",
+ "US69349H1077 3326899 2.0136683473204062 \n",
+ "KR7005490008 10000000 1.5593142658365693 \n",
+ "US69351T1060 18146577 2.63461048150702 \n",
+ "US7234841010 12058547 2.086103530593631 \n",
+ "US7365088472 5770964 1.8706266553608955 \n",
+ "US7445731067 16912134 1.4434071117060308 \n",
+ "US8581191009 10000000 1.3158777300113855 \n",
+ "US8168511090 29579515 1.8683533328964472 \n",
+ "US8425871071 50294245 1.9963792988066476 \n",
+ "US88031M1099 10000000 1.3632817562247952 \n",
+ "US8808901081 10000000 1.5265556596582406 \n",
+ "US8873991033 10000000 1.2939425547566503 \n",
+ "US9129091081 10000000 1.5154085205221834 \n",
+ "US92939U1060 11046675 2.11253492554515 \n",
+ "US9818111026 10000000 1.26782307131814 \n",
+ "US98389B1008 27475073 1.866547697351554 "
+ ]
+ },
+ "execution_count": 14,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# portfolio_df[portfolio_df.company_name=='POSCO']\n",
+ "portfolio_df.dropna(inplace=True)\n",
+ "portfolio_df.sort_values(by='company_name')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "id": "0e9f1e29-ccb8-4b59-a1ba-95fdf792bf76",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "659616728"
+ ]
+ },
+ "execution_count": 15,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "weight_for_WATS = portfolio_df['investment_value'].sum()\n",
+ "weight_for_WATS"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "id": "f3193208-3029-40d4-a7a2-e820a32eea56",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/michael/opt/miniconda3/envs/jupyter/lib/python3.10/site-packages/pint_pandas/pint_array.py:648: UnitStrippedWarning: The unit of the quantity is stripped when downcasting to ndarray.\n",
+ " return np.array(qtys, dtype=\"object\", copy=copy)\n",
+ "/Users/michael/opt/miniconda3/envs/jupyter/lib/python3.10/site-packages/pint_pandas/pint_array.py:648: UnitStrippedWarning: The unit of the quantity is stripped when downcasting to ndarray.\n",
+ " return np.array(qtys, dtype=\"object\", copy=copy)\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " company_name \n",
+ " company_lei \n",
+ " investment_value \n",
+ " pa_score \n",
+ " WATS_weight \n",
+ " \n",
+ " \n",
+ " company_id \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " US00130H1059 \n",
+ " AES Corp. \n",
+ " 2NUNNB7D43COUIRE5295 \n",
+ " 4351252 \n",
+ " 2.106926870694208 \n",
+ " 0.013898631388198987 \n",
+ " \n",
+ " \n",
+ " US0158577090 \n",
+ " Algonquin Power & Utilities Corp. \n",
+ " 549300K5VIUTJXQL7X75 \n",
+ " 2228185 \n",
+ " 1.2623320662937099 \n",
+ " 0.004264157132071172 \n",
+ " \n",
+ " \n",
+ " US0185223007 \n",
+ " ALLETE, Inc. \n",
+ " 549300NNLSIMY6Z8OT86 \n",
+ " 3829481 \n",
+ " 2.043793289146705 \n",
+ " 0.011865477687998862 \n",
+ " \n",
+ " \n",
+ " US0188021085 \n",
+ " Alliant Energy \n",
+ " 5493009ML300G373MZ12 \n",
+ " 3829481 \n",
+ " 1.8670447665467123 \n",
+ " 0.010839343752422346 \n",
+ " \n",
+ " \n",
+ " US0236081024 \n",
+ " Ameren Corp. \n",
+ " XRZQ5S7HYJFPHJ78L959 \n",
+ " 15917812 \n",
+ " 2.4042613015988703 \n",
+ " 0.058019419115953826 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " company_name company_lei \\\n",
+ "company_id \n",
+ "US00130H1059 AES Corp. 2NUNNB7D43COUIRE5295 \n",
+ "US0158577090 Algonquin Power & Utilities Corp. 549300K5VIUTJXQL7X75 \n",
+ "US0185223007 ALLETE, Inc. 549300NNLSIMY6Z8OT86 \n",
+ "US0188021085 Alliant Energy 5493009ML300G373MZ12 \n",
+ "US0236081024 Ameren Corp. XRZQ5S7HYJFPHJ78L959 \n",
+ "\n",
+ " investment_value pa_score WATS_weight \n",
+ "company_id \n",
+ "US00130H1059 4351252 2.106926870694208 0.013898631388198987 \n",
+ "US0158577090 2228185 1.2623320662937099 0.004264157132071172 \n",
+ "US0185223007 3829481 2.043793289146705 0.011865477687998862 \n",
+ "US0188021085 3829481 1.8670447665467123 0.010839343752422346 \n",
+ "US0236081024 15917812 2.4042613015988703 0.058019419115953826 "
+ ]
+ },
+ "execution_count": 16,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "portfolio_df['WATS_weight'] = portfolio_df['pa_score'] * (portfolio_df['investment_value'] / weight_for_WATS)\n",
+ "portfolio_df.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "id": "24fdeb51-94f1-40a4-ace9-5fdce4f5de8f",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Portfolio temperature score based on WATS = 1.946471711490046 delta_degree_Celsius\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(f\"Portfolio temperature score based on WATS = {portfolio_df['WATS_weight'].sum()}\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "95036586-82cc-4230-8946-eb3f7a07d283",
+ "metadata": {},
+ "source": [
+ "### Calculate portfolio alignment temperature score based on TETS\n",
+ "\n",
+ "We need to carefully meld portfolio data with corp fundamental data (in this case, emissions)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "id": "fddd23f0-7ca4-4ea8-8a54-ea71fee0f40b",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/michael/opt/miniconda3/envs/jupyter/lib/python3.10/site-packages/pint_pandas/pint_array.py:648: UnitStrippedWarning: The unit of the quantity is stripped when downcasting to ndarray.\n",
+ " return np.array(qtys, dtype=\"object\", copy=copy)\n",
+ "/Users/michael/opt/miniconda3/envs/jupyter/lib/python3.10/site-packages/pint_pandas/pint_array.py:648: UnitStrippedWarning: The unit of the quantity is stripped when downcasting to ndarray.\n",
+ " return np.array(qtys, dtype=\"object\", copy=copy)\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " company_name \n",
+ " company_lei \n",
+ " investment_value \n",
+ " pa_score \n",
+ " WATS_weight \n",
+ " TETS_weight \n",
+ " \n",
+ " \n",
+ " company_id \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " US00130H1059 \n",
+ " AES Corp. \n",
+ " 2NUNNB7D43COUIRE5295 \n",
+ " 4351252 \n",
+ " 2.106926870694208 \n",
+ " 0.013898631388198987 \n",
+ " 1.4900271821443577e-07 \n",
+ " \n",
+ " \n",
+ " US0158577090 \n",
+ " Algonquin Power & Utilities Corp. \n",
+ " 549300K5VIUTJXQL7X75 \n",
+ " 2228185 \n",
+ " 1.2623320662937099 \n",
+ " 0.004264157132071172 \n",
+ " 4.162829462365117e-12 \n",
+ " \n",
+ " \n",
+ " US0185223007 \n",
+ " ALLETE, Inc. \n",
+ " 549300NNLSIMY6Z8OT86 \n",
+ " 3829481 \n",
+ " 2.043793289146705 \n",
+ " 0.011865477687998862 \n",
+ " 5.2549678751293906e-08 \n",
+ " \n",
+ " \n",
+ " US0188021085 \n",
+ " Alliant Energy \n",
+ " 5493009ML300G373MZ12 \n",
+ " 3829481 \n",
+ " 1.8670447665467123 \n",
+ " 0.010839343752422346 \n",
+ " 1.261547907437679e-07 \n",
+ " \n",
+ " \n",
+ " US0236081024 \n",
+ " Ameren Corp. \n",
+ " XRZQ5S7HYJFPHJ78L959 \n",
+ " 15917812 \n",
+ " 2.4042613015988703 \n",
+ " 0.058019419115953826 \n",
+ " 3.426510206887004e-07 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " company_name company_lei \\\n",
+ "company_id \n",
+ "US00130H1059 AES Corp. 2NUNNB7D43COUIRE5295 \n",
+ "US0158577090 Algonquin Power & Utilities Corp. 549300K5VIUTJXQL7X75 \n",
+ "US0185223007 ALLETE, Inc. 549300NNLSIMY6Z8OT86 \n",
+ "US0188021085 Alliant Energy 5493009ML300G373MZ12 \n",
+ "US0236081024 Ameren Corp. XRZQ5S7HYJFPHJ78L959 \n",
+ "\n",
+ " investment_value pa_score WATS_weight \\\n",
+ "company_id \n",
+ "US00130H1059 4351252 2.106926870694208 0.013898631388198987 \n",
+ "US0158577090 2228185 1.2623320662937099 0.004264157132071172 \n",
+ "US0185223007 3829481 2.043793289146705 0.011865477687998862 \n",
+ "US0188021085 3829481 1.8670447665467123 0.010839343752422346 \n",
+ "US0236081024 15917812 2.4042613015988703 0.058019419115953826 \n",
+ "\n",
+ " TETS_weight \n",
+ "company_id \n",
+ "US00130H1059 1.4900271821443577e-07 \n",
+ "US0158577090 4.162829462365117e-12 \n",
+ "US0185223007 5.2549678751293906e-08 \n",
+ "US0188021085 1.261547907437679e-07 \n",
+ "US0236081024 3.426510206887004e-07 "
+ ]
+ },
+ "execution_count": 18,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "portfolio_df['TETS_weight'] = vault_company_data.compute_portfolio_weights(portfolio_df['pa_score'], 2019, 'emissions', EScope.S1S2).astype('pint[delta_degC]')\n",
+ "portfolio_df.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "id": "68f22808-4ec2-4167-95ee-5b50f550dc59",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Portfolio temperature score based on TETS = 1.5060118497978 delta_degree_Celsius\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(f\"Portfolio temperature score based on TETS = {portfolio_df['TETS_weight'].sum()}\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "74453d3b-2288-4dfd-bb68-978c0cdf5f67",
+ "metadata": {},
+ "source": [
+ "### Calculate portfolio alignment temperature score based on MOTS, EOTS, ECOTS, AOTS, and ROTS\n",
+ "\n",
+ "* MOTS = market cap weights\n",
+ "* EOTS = enterprise value weights\n",
+ "* ECOTS = EVIC weights\n",
+ "* AOTS = asset weights\n",
+ "* ROTS = revenue weights"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "id": "9c2d630c-10dd-486f-b6c1-4d579e88a597",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "company_name object\n",
+ "company_lei object\n",
+ "investment_value int64\n",
+ "pa_score pint[delta_degree_Celsius]\n",
+ "WATS_weight pint[delta_degree_Celsius]\n",
+ "TETS_weight pint[delta_degree_Celsius]\n",
+ "dtype: object"
+ ]
+ },
+ "execution_count": 20,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "portfolio_df.dtypes"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "id": "0df8c5fc-2939-4ac1-9448-499803583eb1",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Portfolio temperature score based on MOTS = 1.998539728638169 delta_degree_Celsius\n",
+ "Portfolio temperature score based on EOTS = 1.9715101533914599 delta_degree_Celsius\n",
+ "Portfolio temperature score based on ECOTS = 1.9914244268264996 delta_degree_Celsius\n",
+ "Portfolio temperature score based on AOTS = 1.9769581669116627 delta_degree_Celsius\n",
+ "Portfolio temperature score based on ROTS = 1.857229337822963 delta_degree_Celsius\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/michael/opt/miniconda3/envs/jupyter/lib/python3.10/site-packages/pint_pandas/pint_array.py:648: UnitStrippedWarning: The unit of the quantity is stripped when downcasting to ndarray.\n",
+ " return np.array(qtys, dtype=\"object\", copy=copy)\n",
+ "/Users/michael/opt/miniconda3/envs/jupyter/lib/python3.10/site-packages/pint_pandas/pint_array.py:648: UnitStrippedWarning: The unit of the quantity is stripped when downcasting to ndarray.\n",
+ " return np.array(qtys, dtype=\"object\", copy=copy)\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " company_name \n",
+ " company_lei \n",
+ " investment_value \n",
+ " pa_score \n",
+ " WATS_weight \n",
+ " TETS_weight \n",
+ " MOTS_weight \n",
+ " EOTS_weight \n",
+ " ECOTS_weight \n",
+ " AOTS_weight \n",
+ " ROTS_weight \n",
+ " \n",
+ " \n",
+ " company_id \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " US00130H1059 \n",
+ " AES Corp. \n",
+ " 2NUNNB7D43COUIRE5295 \n",
+ " 4351252 \n",
+ " 2.106926870694208 \n",
+ " 0.013898631388198987 \n",
+ " 1.4900271821443577e-07 \n",
+ " 0.03357412161990311 \n",
+ " 0.020337868906115608 \n",
+ " 0.03667288993043838 \n",
+ " 0.04816939688533329 \n",
+ " 0.05276197099873813 \n",
+ " \n",
+ " \n",
+ " US0158577090 \n",
+ " Algonquin Power & Utilities Corp. \n",
+ " 549300K5VIUTJXQL7X75 \n",
+ " 2228185 \n",
+ " 1.2623320662937099 \n",
+ " 0.004264157132071172 \n",
+ " 4.162829462365117e-12 \n",
+ " nan \n",
+ " nan \n",
+ " nan \n",
+ " 0.009358782813005341 \n",
+ " 0.0050413384247108275 \n",
+ " \n",
+ " \n",
+ " US0185223007 \n",
+ " ALLETE, Inc. \n",
+ " 549300NNLSIMY6Z8OT86 \n",
+ " 3829481 \n",
+ " 2.043793289146705 \n",
+ " 0.011865477687998862 \n",
+ " 5.2549678751293906e-08 \n",
+ " 0.012839373901951686 \n",
+ " 0.011385162596862225 \n",
+ " 0.013018784526381704 \n",
+ " 0.007613807008198652 \n",
+ " 0.006231229172975224 \n",
+ " \n",
+ " \n",
+ " US0188021085 \n",
+ " Alliant Energy \n",
+ " 5493009ML300G373MZ12 \n",
+ " 3829481 \n",
+ " 1.8670447665467123 \n",
+ " 0.010839343752422346 \n",
+ " 1.261547907437679e-07 \n",
+ " 0.03174960844912046 \n",
+ " 0.0330110683879106 \n",
+ " 0.031725447685912185 \n",
+ " 0.02118614290495221 \n",
+ " 0.016738395724396053 \n",
+ " \n",
+ " \n",
+ " US0236081024 \n",
+ " Ameren Corp. \n",
+ " XRZQ5S7HYJFPHJ78L959 \n",
+ " 15917812 \n",
+ " 2.4042613015988703 \n",
+ " 0.058019419115953826 \n",
+ " 3.426510206887004e-07 \n",
+ " 0.06477745482537141 \n",
+ " 0.06387775855844922 \n",
+ " 0.06469360527719217 \n",
+ " 0.04726477824338225 \n",
+ " 0.03492280618862091 \n",
+ " \n",
+ " \n",
+ " US0255371017 \n",
+ " American Electric Power Co., Inc. \n",
+ " 1B4S6S7G0TW5EE83BO58 \n",
+ " 45520637 \n",
+ " 2.1814181749376793 \n",
+ " 0.15054127748946447 \n",
+ " 7.719971932013753e-07 \n",
+ " 0.139082507959553 \n",
+ " 0.15303279317063806 \n",
+ " 0.13956919099354945 \n",
+ " 0.11248617091168711 \n",
+ " 0.08343102518455157 \n",
+ " \n",
+ " \n",
+ " US05351W1036 \n",
+ " Avangrid, Inc. \n",
+ " 549300OX0Q38NLSKPB49 \n",
+ " 10049068 \n",
+ " 1.624145450892199 \n",
+ " 0.024743381095553976 \n",
+ " 2.5939403676600244e-10 \n",
+ " 0.00675237883315782 \n",
+ " 0.016801248692288422 \n",
+ " 0.007160665331019981 \n",
+ " 0.0379793742030801 \n",
+ " 0.02529980312047131 \n",
+ " \n",
+ " \n",
+ " US05379B1070 \n",
+ " Avista Corp. \n",
+ " Q0IK63NITJD6RJ47SW96 \n",
+ " 2804211 \n",
+ " 1.7099274356102043 \n",
+ " 0.0072693688934764664 \n",
+ " 2.5464088060658733e-08 \n",
+ " 0.007391183784912206 \n",
+ " 0.008035321000941292 \n",
+ " 0.007399948532530545 \n",
+ " 0.007066740568098292 \n",
+ " 0.005655105952879468 \n",
+ " \n",
+ " \n",
+ " US18551QAA58 \n",
+ " Cleco Partners LP \n",
+ " 5493002H80P81B3HXL31 \n",
+ " 3086052 \n",
+ " 2.2803097686608016 \n",
+ " 0.010668550725710529 \n",
+ " 1.1727968749659208e-07 \n",
+ " nan \n",
+ " nan \n",
+ " nan \n",
+ " 0.011583583746330365 \n",
+ " 0.009189101919284608 \n",
+ " \n",
+ " \n",
+ " US1258961002 \n",
+ " CMS Energy \n",
+ " 549300IA9XFBAGNIBW29 \n",
+ " 9153135 \n",
+ " 2.1320023723934343 \n",
+ " 0.02958461286148185 \n",
+ " 1.624135308468388e-07 \n",
+ " 0.05110745034256367 \n",
+ " 0.05737401152284647 \n",
+ " 0.05143351653370429 \n",
+ " 0.038876229852125306 \n",
+ " 0.035867501304020305 \n",
+ " \n",
+ " \n",
+ " US2091151041 \n",
+ " Consolidated Edison, Inc. \n",
+ " 54930033SBW53OO8T749 \n",
+ " 20394113 \n",
+ " 1.7197135175610079 \n",
+ " 0.0531703189382527 \n",
+ " 1.2591698410405677e-08 \n",
+ " 0.0733626055289818 \n",
+ " 0.07902737580492676 \n",
+ " 0.07567171610839929 \n",
+ " 0.06786373005464445 \n",
+ " 0.05314587328152441 \n",
+ " \n",
+ " \n",
+ " US25746U1097 \n",
+ " Dominion Energy \n",
+ " ILUL7B6Z54MRYCF6H308 \n",
+ " 33528082 \n",
+ " 1.6421622410252814 \n",
+ " 0.08347051846507961 \n",
+ " 3.14248738011264e-07 \n",
+ " 0.14925655201730625 \n",
+ " 0.15010182616211487 \n",
+ " 0.1493324514553829 \n",
+ " 0.11584362182232663 \n",
+ " 0.06688534526952991 \n",
+ " \n",
+ " \n",
+ " US2333311072 \n",
+ " DTE Energy \n",
+ " 549300IX8SD6XXD71I78 \n",
+ " 14329945 \n",
+ " 2.494203358852266 \n",
+ " 0.054185704264262134 \n",
+ " 4.099910696471906e-07 \n",
+ " 0.0844635815144744 \n",
+ " 0.09476515956854094 \n",
+ " 0.08462019002077521 \n",
+ " 0.07097767408945654 \n",
+ " 0.07766300356121279 \n",
+ " \n",
+ " \n",
+ " US26441C2044 \n",
+ " Duke Energy Corp. \n",
+ " I1BZKREC126H0VB1BL91 \n",
+ " 73069652 \n",
+ " 1.8259317788445726 \n",
+ " 0.20226927849518375 \n",
+ " 9.29026546418335e-07 \n",
+ " 0.17193009401045845 \n",
+ " 0.22155105310535217 \n",
+ " 0.17238886319907545 \n",
+ " 0.1970613477213826 \n",
+ " 0.11254721411236115 \n",
+ " \n",
+ " \n",
+ " US283677AZ52 \n",
+ " El Paso Electric Co \n",
+ " OZ8GM8L4AHPKSWZMW205 \n",
+ " 2646941 \n",
+ " 1.8648627254624959 \n",
+ " 0.007483408770370699 \n",
+ " 3.429901756307964e-08 \n",
+ " 0.007206687865731673 \n",
+ " 0.007350616245331297 \n",
+ " 0.007220609667618246 \n",
+ " 0.004831688686038033 \n",
+ " 0.003950855064002834 \n",
+ " \n",
+ " \n",
+ " US29364G1031 \n",
+ " Entergy Corp. \n",
+ " 4XM3TW50JULSLG8BNC79 \n",
+ " 29844269 \n",
+ " 1.7272303412977148 \n",
+ " 0.07814830149463828 \n",
+ " 3.4959645003586115e-07 \n",
+ " 0.05190745937361752 \n",
+ " 0.06458856665766571 \n",
+ " 0.05287080443504318 \n",
+ " 0.06070215564531642 \n",
+ " 0.04618130144084502 \n",
+ " \n",
+ " \n",
+ " US30034W1062 \n",
+ " Evergy, Inc. \n",
+ " 549300PGTHDQY6PSUI61 \n",
+ " 18254954 \n",
+ " 2.186948544996403 \n",
+ " 0.060524003401678836 \n",
+ " 3.5614524723693734e-07 \n",
+ " 0.04532663336445084 \n",
+ " 0.047774119159873875 \n",
+ " 0.045302805246517135 \n",
+ " 0.03859860953695047 \n",
+ " 0.027669430292822126 \n",
+ " \n",
+ " \n",
+ " US30040W1080 \n",
+ " Eversource Energy \n",
+ " SJ7XXD41SQU3ZNWUJ746 \n",
+ " 18962480 \n",
+ " 1.2636355763883802 \n",
+ " 0.03632664747179234 \n",
+ " 1.7023588038521205e-12 \n",
+ " 0.045360009814775525 \n",
+ " 0.046175243275212934 \n",
+ " 0.045290416308094134 \n",
+ " 0.03530846103939446 \n",
+ " 0.026480799897099 \n",
+ " \n",
+ " \n",
+ " US3379321074 \n",
+ " FirstEnergy Corp. \n",
+ " 549300SVYJS666PQJH88 \n",
+ " 27277340 \n",
+ " 3.4408564514595774 \n",
+ " 0.14229082940670418 \n",
+ " 3.897594054855418e-07 \n",
+ " 0.11462889184363255 \n",
+ " 0.13715660868982169 \n",
+ " 0.1175368082535572 \n",
+ " 0.0988962172735531 \n",
+ " 0.09332089148551007 \n",
+ " \n",
+ " \n",
+ " CA3495531079 \n",
+ " Fortis, Inc \n",
+ " 549300MQYQ9Y065XPR71 \n",
+ " 12428756 \n",
+ " 2.8403172973777053 \n",
+ " 0.05351836779325424 \n",
+ " 1.519730021856325e-07 \n",
+ " nan \n",
+ " nan \n",
+ " nan \n",
+ " 0.07911656908686812 \n",
+ " 0.0470667310963962 \n",
+ " \n",
+ " \n",
+ " US6362744095 \n",
+ " National Grid plc \n",
+ " 8R95QZMKZLJX5Q2XR704 \n",
+ " 12281584 \n",
+ " 2.5302066248940553 \n",
+ " 0.047110608148483515 \n",
+ " 3.640382115837752e-08 \n",
+ " 0.15127568349562315 \n",
+ " nan \n",
+ " 0.15215975540910204 \n",
+ " 0.14057664279423704 \n",
+ " 0.12060139050049665 \n",
+ " \n",
+ " \n",
+ " US6680743050 \n",
+ " NorthWestern Corp. \n",
+ " 3BPWMBHR1R9SHUN7J795 \n",
+ " 2703150 \n",
+ " 2.2353033011171273 \n",
+ " 0.009160410677781906 \n",
+ " 3.654881963130282e-08 \n",
+ " 0.011926077613739266 \n",
+ " 0.012924704639595214 \n",
+ " 0.011917103321524026 \n",
+ " 0.008977140347481908 \n",
+ " 0.006910763261421613 \n",
+ " \n",
+ " \n",
+ " US6708371033 \n",
+ " OG&E Energy \n",
+ " CE5OG6JPOZMDSA0LAQ19 \n",
+ " 7251242 \n",
+ " 2.5724623858366895 \n",
+ " 0.02827937270808452 \n",
+ " 1.5803838520201569e-07 \n",
+ " 0.03212831171274879 \n",
+ " nan \n",
+ " nan \n",
+ " 0.019269149564939952 \n",
+ " 0.01410929691134381 \n",
+ " \n",
+ " \n",
+ " US6896481032 \n",
+ " Otter Tail Corp. \n",
+ " 549300HHVBQRQUVKKD91 \n",
+ " 1264277 \n",
+ " 2.9694066480437593 \n",
+ " 0.0056914149829881515 \n",
+ " 4.7091070069869694e-08 \n",
+ " 0.008880331745854566 \n",
+ " 0.007702315685602822 \n",
+ " 0.008953203650381842 \n",
+ " 0.004587174627040453 \n",
+ " 0.0067106225780971685 \n",
+ " \n",
+ " \n",
+ " US7234841010 \n",
+ " Pinnacle West Capital Corp. \n",
+ " TWSEY0NEDUDCKS27AH81 \n",
+ " 12058547 \n",
+ " 2.086103530593631 \n",
+ " 0.0381363546476481 \n",
+ " 1.3398156342413038e-07 \n",
+ " 0.0322213776799511 \n",
+ " 0.03332942990290081 \n",
+ " 0.03218305838813145 \n",
+ " 0.02619284180162325 \n",
+ " 0.017797401906124867 \n",
+ " \n",
+ " \n",
+ " US69349H1077 \n",
+ " PNM Resources, Inc. \n",
+ " 5493003JOBJGLZSDDQ28 \n",
+ " 3326899 \n",
+ " 2.0136683473204062 \n",
+ " 0.010156308848237566 \n",
+ " 6.58053034214854e-08 \n",
+ " 0.011970774049072574 \n",
+ " 0.012639253078697258 \n",
+ " 0.011956170402666324 \n",
+ " 0.00998620210373153 \n",
+ " 0.0072138512624040805 \n",
+ " \n",
+ " \n",
+ " US7365088472 \n",
+ " Portland General Electric Co. \n",
+ " GJOUP9M7C39GLSK9R870 \n",
+ " 5770964 \n",
+ " 1.8706266553608955 \n",
+ " 0.01636604808107313 \n",
+ " 8.680131385312401e-08 \n",
+ " 0.013227637419492053 \n",
+ " 0.014000404723625308 \n",
+ " 0.013281115197873679 \n",
+ " 0.010668873721131752 \n",
+ " 0.009760613126775643 \n",
+ " \n",
+ " \n",
+ " US69351T1060 \n",
+ " PPL \n",
+ " 9N3UAJSNOUXFKQLF3V18 \n",
+ " 18146577 \n",
+ " 2.63461048150702 \n",
+ " 0.07248021455222133 \n",
+ " 4.61599360573883e-07 \n",
+ " 0.08645396244422034 \n",
+ " 0.1094151313740577 \n",
+ " 0.08940788996261195 \n",
+ " 0.08177207191530367 \n",
+ " 0.05030620119633239 \n",
+ " \n",
+ " \n",
+ " US7445731067 \n",
+ " Public Service Enterprise Group \n",
+ " PUSS41EMO3E6XXNV3U28 \n",
+ " 16912134 \n",
+ " 1.4434071117060308 \n",
+ " 0.03700799790772644 \n",
+ " 1.0168628604665428e-07 \n",
+ " 0.06245019087418841 \n",
+ " 0.0635679978881717 \n",
+ " 0.0626254824927157 \n",
+ " 0.04681044465151272 \n",
+ " 0.03574513867355394 \n",
+ " \n",
+ " \n",
+ " US8168511090 \n",
+ " Sempra Energy \n",
+ " PBBKGKLRK5S5C0Y4T545 \n",
+ " 29579515 \n",
+ " 1.8683533328964472 \n",
+ " 0.08378348075446392 \n",
+ " 5.634458021974756e-09 \n",
+ " 0.10325854818136664 \n",
+ " 0.10421959985473984 \n",
+ " 0.10333035558010317 \n",
+ " 0.08335956719180115 \n",
+ " 0.04972643805524998 \n",
+ " \n",
+ " \n",
+ " US8425871071 \n",
+ " Southern Co. \n",
+ " 549300FC3G3YU2FBZD92 \n",
+ " 50294245 \n",
+ " 1.9963792988066476 \n",
+ " 0.15221928933116707 \n",
+ " 7.710068482171506e-07 \n",
+ " 0.1691595610544673 \n",
+ " 0.18622750506679941 \n",
+ " 0.17456125321430907 \n",
+ " 0.16101126726344764 \n",
+ " 0.10509504376408856 \n",
+ " \n",
+ " \n",
+ " US92939U1060 \n",
+ " WEC Energy Group \n",
+ " 549300IGLYTZUK3PVP70 \n",
+ " 11046675 \n",
+ " 2.11253492554515 \n",
+ " 0.03537885829457992 \n",
+ " 1.2699795919947189e-07 \n",
+ " 0.08144891426414327 \n",
+ " 0.07695104488519561 \n",
+ " 0.08138861437944513 \n",
+ " 0.050169056739773205 \n",
+ " 0.03906076269591012 \n",
+ " \n",
+ " \n",
+ " US98389B1008 \n",
+ " Xcel Energy, Inc. \n",
+ " LGJNMI9GH8XIDG5RCM61 \n",
+ " 27475073 \n",
+ " 1.866547697351554 \n",
+ " 0.07774747374617196 \n",
+ " 4.710003986931088e-07 \n",
+ " 0.08381128240682202 \n",
+ " 0.09026302075060627 \n",
+ " 0.0843071254067583 \n",
+ " 0.06398019170908302 \n",
+ " 0.05288965305341673 \n",
+ " \n",
+ " \n",
+ " US1442851036 \n",
+ " CARPENTER TECHNOLOGY CORP \n",
+ " DX6I6ZD3X5WNNCDJKP85 \n",
+ " 10000000 \n",
+ " 1.9900906690954117 \n",
+ " 0.03017040933951893 \n",
+ " 0.011607472600352976 \n",
+ " 0.004922291988089818 \n",
+ " 0.004204096572007335 \n",
+ " 0.004990244394801826 \n",
+ " 0.004310487808706214 \n",
+ " 0.011641965312984528 \n",
+ " \n",
+ " \n",
+ " US2017231034 \n",
+ " COMMERCIAL METALS CO \n",
+ " 549300OQS2LO07ZJ7N73 \n",
+ " 10000000 \n",
+ " 1.2990617896624888 \n",
+ " 0.019694191103996513 \n",
+ " 0.020154780490691044 \n",
+ " 0.003618337414588834 \n",
+ " nan \n",
+ " nan \n",
+ " 0.0033177080579832835 \n",
+ " 0.018610755334314076 \n",
+ " \n",
+ " \n",
+ " US3737371050 \n",
+ " GERDAU S.A. \n",
+ " 254900YDV6SEQQPZVG24 \n",
+ " 10000000 \n",
+ " 1.375590655258247 \n",
+ " 0.020854393117486963 \n",
+ " 0.10005546157880678 \n",
+ " nan \n",
+ " nan \n",
+ " nan \n",
+ " 0.01252243765842747 \n",
+ " 0.03325265337048597 \n",
+ " \n",
+ " \n",
+ " US6703461052 \n",
+ " NUCOR CORP \n",
+ " 549300GGJCRSI2TIEJ46 \n",
+ " 10000000 \n",
+ " 1.315430185746877 \n",
+ " 0.019942341209801415 \n",
+ " 0.07848167099244932 \n",
+ " 0.03197260211182495 \n",
+ " 0.024305171544838817 \n",
+ " 0.03485634781003422 \n",
+ " 0.016396082842808767 \n",
+ " 0.07303012863213186 \n",
+ " \n",
+ " \n",
+ " KR7005490008 \n",
+ " POSCO \n",
+ " 988400E5HRVX81AYLM04 \n",
+ " 10000000 \n",
+ " 1.5593142658365693 \n",
+ " 0.023639701657726442 \n",
+ " 0.7619530611957582 \n",
+ " nan \n",
+ " nan \n",
+ " nan \n",
+ " 0.07263123014493186 \n",
+ " 0.21444667139178533 \n",
+ " \n",
+ " \n",
+ " US8581191009 \n",
+ " STEEL DYNAMICS INC \n",
+ " 549300HGGKEL4FYTTQ83 \n",
+ " 10000000 \n",
+ " 1.3158777300113855 \n",
+ " 0.019949126123608336 \n",
+ " 0.039172201098130216 \n",
+ " 0.009645199046956762 \n",
+ " 0.007987945257169369 \n",
+ " 0.012283462287977612 \n",
+ " 0.007399224052972695 \n",
+ " 0.033844989431466715 \n",
+ " \n",
+ " \n",
+ " US88031M1099 \n",
+ " TENARIS SA \n",
+ " 549300Y7C05BKC4HZB40 \n",
+ " 10000000 \n",
+ " 1.3632817562247952 \n",
+ " 0.020667786281866326 \n",
+ " 0.021579100261655475 \n",
+ " nan \n",
+ " nan \n",
+ " nan \n",
+ " 0.013748950184392398 \n",
+ " 0.024439630936756346 \n",
+ " \n",
+ " \n",
+ " US8808901081 \n",
+ " TERNIUM S.A. \n",
+ " 529900QG4KU23TEI2E46 \n",
+ " 10000000 \n",
+ " 1.5265556596582406 \n",
+ " 0.02314307073877363 \n",
+ " 0.1656445290791045 \n",
+ " nan \n",
+ " nan \n",
+ " nan \n",
+ " 0.013417124921380242 \n",
+ " 0.03824255500688262 \n",
+ " \n",
+ " \n",
+ " US8873991033 \n",
+ " TIMKENSTEEL CORP \n",
+ " 549300QZTZWHDE9HJL14 \n",
+ " 10000000 \n",
+ " 1.2939425547566503 \n",
+ " 0.019616581869898397 \n",
+ " 0.003395288672058109 \n",
+ " 0.0006402471902290573 \n",
+ " 0.0004950917770041775 \n",
+ " 0.0006901566101955718 \n",
+ " 0.0009540854493255154 \n",
+ " 0.0038442306237322942 \n",
+ " \n",
+ " \n",
+ " US9129091081 \n",
+ " UNITED STATES STEEL CORP \n",
+ " JNLUVFYJT1OZSIQ24U47 \n",
+ " 10000000 \n",
+ " 1.5154085205221834 \n",
+ " 0.022974076553773867 \n",
+ " 0.3016836955421658 \n",
+ " 0.005776020500960534 \n",
+ " 0.008152423592683745 \n",
+ " 0.007423865256675461 \n",
+ " 0.011952248543683201 \n",
+ " 0.04818404875572425 \n",
+ " \n",
+ " \n",
+ " US9818111026 \n",
+ " WORTHINGTON INDUSTRIES INC \n",
+ " 1WRCIANKYOIK6KYE5E82 \n",
+ " 10000000 \n",
+ " 1.26782307131814 \n",
+ " 0.0192206021694183 \n",
+ " 0.0022773902818980568 \n",
+ " 0.0030357823938668522 \n",
+ " 0.002779215292872067 \n",
+ " 0.003200509556000493 \n",
+ " 0.0021628807238201053 \n",
+ " 0.011714808549532102 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " company_name company_lei \\\n",
+ "company_id \n",
+ "US00130H1059 AES Corp. 2NUNNB7D43COUIRE5295 \n",
+ "US0158577090 Algonquin Power & Utilities Corp. 549300K5VIUTJXQL7X75 \n",
+ "US0185223007 ALLETE, Inc. 549300NNLSIMY6Z8OT86 \n",
+ "US0188021085 Alliant Energy 5493009ML300G373MZ12 \n",
+ "US0236081024 Ameren Corp. XRZQ5S7HYJFPHJ78L959 \n",
+ "US0255371017 American Electric Power Co., Inc. 1B4S6S7G0TW5EE83BO58 \n",
+ "US05351W1036 Avangrid, Inc. 549300OX0Q38NLSKPB49 \n",
+ "US05379B1070 Avista Corp. Q0IK63NITJD6RJ47SW96 \n",
+ "US18551QAA58 Cleco Partners LP 5493002H80P81B3HXL31 \n",
+ "US1258961002 CMS Energy 549300IA9XFBAGNIBW29 \n",
+ "US2091151041 Consolidated Edison, Inc. 54930033SBW53OO8T749 \n",
+ "US25746U1097 Dominion Energy ILUL7B6Z54MRYCF6H308 \n",
+ "US2333311072 DTE Energy 549300IX8SD6XXD71I78 \n",
+ "US26441C2044 Duke Energy Corp. I1BZKREC126H0VB1BL91 \n",
+ "US283677AZ52 El Paso Electric Co OZ8GM8L4AHPKSWZMW205 \n",
+ "US29364G1031 Entergy Corp. 4XM3TW50JULSLG8BNC79 \n",
+ "US30034W1062 Evergy, Inc. 549300PGTHDQY6PSUI61 \n",
+ "US30040W1080 Eversource Energy SJ7XXD41SQU3ZNWUJ746 \n",
+ "US3379321074 FirstEnergy Corp. 549300SVYJS666PQJH88 \n",
+ "CA3495531079 Fortis, Inc 549300MQYQ9Y065XPR71 \n",
+ "US6362744095 National Grid plc 8R95QZMKZLJX5Q2XR704 \n",
+ "US6680743050 NorthWestern Corp. 3BPWMBHR1R9SHUN7J795 \n",
+ "US6708371033 OG&E Energy CE5OG6JPOZMDSA0LAQ19 \n",
+ "US6896481032 Otter Tail Corp. 549300HHVBQRQUVKKD91 \n",
+ "US7234841010 Pinnacle West Capital Corp. TWSEY0NEDUDCKS27AH81 \n",
+ "US69349H1077 PNM Resources, Inc. 5493003JOBJGLZSDDQ28 \n",
+ "US7365088472 Portland General Electric Co. GJOUP9M7C39GLSK9R870 \n",
+ "US69351T1060 PPL 9N3UAJSNOUXFKQLF3V18 \n",
+ "US7445731067 Public Service Enterprise Group PUSS41EMO3E6XXNV3U28 \n",
+ "US8168511090 Sempra Energy PBBKGKLRK5S5C0Y4T545 \n",
+ "US8425871071 Southern Co. 549300FC3G3YU2FBZD92 \n",
+ "US92939U1060 WEC Energy Group 549300IGLYTZUK3PVP70 \n",
+ "US98389B1008 Xcel Energy, Inc. LGJNMI9GH8XIDG5RCM61 \n",
+ "US1442851036 CARPENTER TECHNOLOGY CORP DX6I6ZD3X5WNNCDJKP85 \n",
+ "US2017231034 COMMERCIAL METALS CO 549300OQS2LO07ZJ7N73 \n",
+ "US3737371050 GERDAU S.A. 254900YDV6SEQQPZVG24 \n",
+ "US6703461052 NUCOR CORP 549300GGJCRSI2TIEJ46 \n",
+ "KR7005490008 POSCO 988400E5HRVX81AYLM04 \n",
+ "US8581191009 STEEL DYNAMICS INC 549300HGGKEL4FYTTQ83 \n",
+ "US88031M1099 TENARIS SA 549300Y7C05BKC4HZB40 \n",
+ "US8808901081 TERNIUM S.A. 529900QG4KU23TEI2E46 \n",
+ "US8873991033 TIMKENSTEEL CORP 549300QZTZWHDE9HJL14 \n",
+ "US9129091081 UNITED STATES STEEL CORP JNLUVFYJT1OZSIQ24U47 \n",
+ "US9818111026 WORTHINGTON INDUSTRIES INC 1WRCIANKYOIK6KYE5E82 \n",
+ "\n",
+ " investment_value pa_score WATS_weight \\\n",
+ "company_id \n",
+ "US00130H1059 4351252 2.106926870694208 0.013898631388198987 \n",
+ "US0158577090 2228185 1.2623320662937099 0.004264157132071172 \n",
+ "US0185223007 3829481 2.043793289146705 0.011865477687998862 \n",
+ "US0188021085 3829481 1.8670447665467123 0.010839343752422346 \n",
+ "US0236081024 15917812 2.4042613015988703 0.058019419115953826 \n",
+ "US0255371017 45520637 2.1814181749376793 0.15054127748946447 \n",
+ "US05351W1036 10049068 1.624145450892199 0.024743381095553976 \n",
+ "US05379B1070 2804211 1.7099274356102043 0.0072693688934764664 \n",
+ "US18551QAA58 3086052 2.2803097686608016 0.010668550725710529 \n",
+ "US1258961002 9153135 2.1320023723934343 0.02958461286148185 \n",
+ "US2091151041 20394113 1.7197135175610079 0.0531703189382527 \n",
+ "US25746U1097 33528082 1.6421622410252814 0.08347051846507961 \n",
+ "US2333311072 14329945 2.494203358852266 0.054185704264262134 \n",
+ "US26441C2044 73069652 1.8259317788445726 0.20226927849518375 \n",
+ "US283677AZ52 2646941 1.8648627254624959 0.007483408770370699 \n",
+ "US29364G1031 29844269 1.7272303412977148 0.07814830149463828 \n",
+ "US30034W1062 18254954 2.186948544996403 0.060524003401678836 \n",
+ "US30040W1080 18962480 1.2636355763883802 0.03632664747179234 \n",
+ "US3379321074 27277340 3.4408564514595774 0.14229082940670418 \n",
+ "CA3495531079 12428756 2.8403172973777053 0.05351836779325424 \n",
+ "US6362744095 12281584 2.5302066248940553 0.047110608148483515 \n",
+ "US6680743050 2703150 2.2353033011171273 0.009160410677781906 \n",
+ "US6708371033 7251242 2.5724623858366895 0.02827937270808452 \n",
+ "US6896481032 1264277 2.9694066480437593 0.0056914149829881515 \n",
+ "US7234841010 12058547 2.086103530593631 0.0381363546476481 \n",
+ "US69349H1077 3326899 2.0136683473204062 0.010156308848237566 \n",
+ "US7365088472 5770964 1.8706266553608955 0.01636604808107313 \n",
+ "US69351T1060 18146577 2.63461048150702 0.07248021455222133 \n",
+ "US7445731067 16912134 1.4434071117060308 0.03700799790772644 \n",
+ "US8168511090 29579515 1.8683533328964472 0.08378348075446392 \n",
+ "US8425871071 50294245 1.9963792988066476 0.15221928933116707 \n",
+ "US92939U1060 11046675 2.11253492554515 0.03537885829457992 \n",
+ "US98389B1008 27475073 1.866547697351554 0.07774747374617196 \n",
+ "US1442851036 10000000 1.9900906690954117 0.03017040933951893 \n",
+ "US2017231034 10000000 1.2990617896624888 0.019694191103996513 \n",
+ "US3737371050 10000000 1.375590655258247 0.020854393117486963 \n",
+ "US6703461052 10000000 1.315430185746877 0.019942341209801415 \n",
+ "KR7005490008 10000000 1.5593142658365693 0.023639701657726442 \n",
+ "US8581191009 10000000 1.3158777300113855 0.019949126123608336 \n",
+ "US88031M1099 10000000 1.3632817562247952 0.020667786281866326 \n",
+ "US8808901081 10000000 1.5265556596582406 0.02314307073877363 \n",
+ "US8873991033 10000000 1.2939425547566503 0.019616581869898397 \n",
+ "US9129091081 10000000 1.5154085205221834 0.022974076553773867 \n",
+ "US9818111026 10000000 1.26782307131814 0.0192206021694183 \n",
+ "\n",
+ " TETS_weight MOTS_weight \\\n",
+ "company_id \n",
+ "US00130H1059 1.4900271821443577e-07 0.03357412161990311 \n",
+ "US0158577090 4.162829462365117e-12 nan \n",
+ "US0185223007 5.2549678751293906e-08 0.012839373901951686 \n",
+ "US0188021085 1.261547907437679e-07 0.03174960844912046 \n",
+ "US0236081024 3.426510206887004e-07 0.06477745482537141 \n",
+ "US0255371017 7.719971932013753e-07 0.139082507959553 \n",
+ "US05351W1036 2.5939403676600244e-10 0.00675237883315782 \n",
+ "US05379B1070 2.5464088060658733e-08 0.007391183784912206 \n",
+ "US18551QAA58 1.1727968749659208e-07 nan \n",
+ "US1258961002 1.624135308468388e-07 0.05110745034256367 \n",
+ "US2091151041 1.2591698410405677e-08 0.0733626055289818 \n",
+ "US25746U1097 3.14248738011264e-07 0.14925655201730625 \n",
+ "US2333311072 4.099910696471906e-07 0.0844635815144744 \n",
+ "US26441C2044 9.29026546418335e-07 0.17193009401045845 \n",
+ "US283677AZ52 3.429901756307964e-08 0.007206687865731673 \n",
+ "US29364G1031 3.4959645003586115e-07 0.05190745937361752 \n",
+ "US30034W1062 3.5614524723693734e-07 0.04532663336445084 \n",
+ "US30040W1080 1.7023588038521205e-12 0.045360009814775525 \n",
+ "US3379321074 3.897594054855418e-07 0.11462889184363255 \n",
+ "CA3495531079 1.519730021856325e-07 nan \n",
+ "US6362744095 3.640382115837752e-08 0.15127568349562315 \n",
+ "US6680743050 3.654881963130282e-08 0.011926077613739266 \n",
+ "US6708371033 1.5803838520201569e-07 0.03212831171274879 \n",
+ "US6896481032 4.7091070069869694e-08 0.008880331745854566 \n",
+ "US7234841010 1.3398156342413038e-07 0.0322213776799511 \n",
+ "US69349H1077 6.58053034214854e-08 0.011970774049072574 \n",
+ "US7365088472 8.680131385312401e-08 0.013227637419492053 \n",
+ "US69351T1060 4.61599360573883e-07 0.08645396244422034 \n",
+ "US7445731067 1.0168628604665428e-07 0.06245019087418841 \n",
+ "US8168511090 5.634458021974756e-09 0.10325854818136664 \n",
+ "US8425871071 7.710068482171506e-07 0.1691595610544673 \n",
+ "US92939U1060 1.2699795919947189e-07 0.08144891426414327 \n",
+ "US98389B1008 4.710003986931088e-07 0.08381128240682202 \n",
+ "US1442851036 0.011607472600352976 0.004922291988089818 \n",
+ "US2017231034 0.020154780490691044 0.003618337414588834 \n",
+ "US3737371050 0.10005546157880678 nan \n",
+ "US6703461052 0.07848167099244932 0.03197260211182495 \n",
+ "KR7005490008 0.7619530611957582 nan \n",
+ "US8581191009 0.039172201098130216 0.009645199046956762 \n",
+ "US88031M1099 0.021579100261655475 nan \n",
+ "US8808901081 0.1656445290791045 nan \n",
+ "US8873991033 0.003395288672058109 0.0006402471902290573 \n",
+ "US9129091081 0.3016836955421658 0.005776020500960534 \n",
+ "US9818111026 0.0022773902818980568 0.0030357823938668522 \n",
+ "\n",
+ " EOTS_weight ECOTS_weight \\\n",
+ "company_id \n",
+ "US00130H1059 0.020337868906115608 0.03667288993043838 \n",
+ "US0158577090 nan nan \n",
+ "US0185223007 0.011385162596862225 0.013018784526381704 \n",
+ "US0188021085 0.0330110683879106 0.031725447685912185 \n",
+ "US0236081024 0.06387775855844922 0.06469360527719217 \n",
+ "US0255371017 0.15303279317063806 0.13956919099354945 \n",
+ "US05351W1036 0.016801248692288422 0.007160665331019981 \n",
+ "US05379B1070 0.008035321000941292 0.007399948532530545 \n",
+ "US18551QAA58 nan nan \n",
+ "US1258961002 0.05737401152284647 0.05143351653370429 \n",
+ "US2091151041 0.07902737580492676 0.07567171610839929 \n",
+ "US25746U1097 0.15010182616211487 0.1493324514553829 \n",
+ "US2333311072 0.09476515956854094 0.08462019002077521 \n",
+ "US26441C2044 0.22155105310535217 0.17238886319907545 \n",
+ "US283677AZ52 0.007350616245331297 0.007220609667618246 \n",
+ "US29364G1031 0.06458856665766571 0.05287080443504318 \n",
+ "US30034W1062 0.047774119159873875 0.045302805246517135 \n",
+ "US30040W1080 0.046175243275212934 0.045290416308094134 \n",
+ "US3379321074 0.13715660868982169 0.1175368082535572 \n",
+ "CA3495531079 nan nan \n",
+ "US6362744095 nan 0.15215975540910204 \n",
+ "US6680743050 0.012924704639595214 0.011917103321524026 \n",
+ "US6708371033 nan nan \n",
+ "US6896481032 0.007702315685602822 0.008953203650381842 \n",
+ "US7234841010 0.03332942990290081 0.03218305838813145 \n",
+ "US69349H1077 0.012639253078697258 0.011956170402666324 \n",
+ "US7365088472 0.014000404723625308 0.013281115197873679 \n",
+ "US69351T1060 0.1094151313740577 0.08940788996261195 \n",
+ "US7445731067 0.0635679978881717 0.0626254824927157 \n",
+ "US8168511090 0.10421959985473984 0.10333035558010317 \n",
+ "US8425871071 0.18622750506679941 0.17456125321430907 \n",
+ "US92939U1060 0.07695104488519561 0.08138861437944513 \n",
+ "US98389B1008 0.09026302075060627 0.0843071254067583 \n",
+ "US1442851036 0.004204096572007335 0.004990244394801826 \n",
+ "US2017231034 nan nan \n",
+ "US3737371050 nan nan \n",
+ "US6703461052 0.024305171544838817 0.03485634781003422 \n",
+ "KR7005490008 nan nan \n",
+ "US8581191009 0.007987945257169369 0.012283462287977612 \n",
+ "US88031M1099 nan nan \n",
+ "US8808901081 nan nan \n",
+ "US8873991033 0.0004950917770041775 0.0006901566101955718 \n",
+ "US9129091081 0.008152423592683745 0.007423865256675461 \n",
+ "US9818111026 0.002779215292872067 0.003200509556000493 \n",
+ "\n",
+ " AOTS_weight ROTS_weight \n",
+ "company_id \n",
+ "US00130H1059 0.04816939688533329 0.05276197099873813 \n",
+ "US0158577090 0.009358782813005341 0.0050413384247108275 \n",
+ "US0185223007 0.007613807008198652 0.006231229172975224 \n",
+ "US0188021085 0.02118614290495221 0.016738395724396053 \n",
+ "US0236081024 0.04726477824338225 0.03492280618862091 \n",
+ "US0255371017 0.11248617091168711 0.08343102518455157 \n",
+ "US05351W1036 0.0379793742030801 0.02529980312047131 \n",
+ "US05379B1070 0.007066740568098292 0.005655105952879468 \n",
+ "US18551QAA58 0.011583583746330365 0.009189101919284608 \n",
+ "US1258961002 0.038876229852125306 0.035867501304020305 \n",
+ "US2091151041 0.06786373005464445 0.05314587328152441 \n",
+ "US25746U1097 0.11584362182232663 0.06688534526952991 \n",
+ "US2333311072 0.07097767408945654 0.07766300356121279 \n",
+ "US26441C2044 0.1970613477213826 0.11254721411236115 \n",
+ "US283677AZ52 0.004831688686038033 0.003950855064002834 \n",
+ "US29364G1031 0.06070215564531642 0.04618130144084502 \n",
+ "US30034W1062 0.03859860953695047 0.027669430292822126 \n",
+ "US30040W1080 0.03530846103939446 0.026480799897099 \n",
+ "US3379321074 0.0988962172735531 0.09332089148551007 \n",
+ "CA3495531079 0.07911656908686812 0.0470667310963962 \n",
+ "US6362744095 0.14057664279423704 0.12060139050049665 \n",
+ "US6680743050 0.008977140347481908 0.006910763261421613 \n",
+ "US6708371033 0.019269149564939952 0.01410929691134381 \n",
+ "US6896481032 0.004587174627040453 0.0067106225780971685 \n",
+ "US7234841010 0.02619284180162325 0.017797401906124867 \n",
+ "US69349H1077 0.00998620210373153 0.0072138512624040805 \n",
+ "US7365088472 0.010668873721131752 0.009760613126775643 \n",
+ "US69351T1060 0.08177207191530367 0.05030620119633239 \n",
+ "US7445731067 0.04681044465151272 0.03574513867355394 \n",
+ "US8168511090 0.08335956719180115 0.04972643805524998 \n",
+ "US8425871071 0.16101126726344764 0.10509504376408856 \n",
+ "US92939U1060 0.050169056739773205 0.03906076269591012 \n",
+ "US98389B1008 0.06398019170908302 0.05288965305341673 \n",
+ "US1442851036 0.004310487808706214 0.011641965312984528 \n",
+ "US2017231034 0.0033177080579832835 0.018610755334314076 \n",
+ "US3737371050 0.01252243765842747 0.03325265337048597 \n",
+ "US6703461052 0.016396082842808767 0.07303012863213186 \n",
+ "KR7005490008 0.07263123014493186 0.21444667139178533 \n",
+ "US8581191009 0.007399224052972695 0.033844989431466715 \n",
+ "US88031M1099 0.013748950184392398 0.024439630936756346 \n",
+ "US8808901081 0.013417124921380242 0.03824255500688262 \n",
+ "US8873991033 0.0009540854493255154 0.0038442306237322942 \n",
+ "US9129091081 0.011952248543683201 0.04818404875572425 \n",
+ "US9818111026 0.0021628807238201053 0.011714808549532102 "
+ ]
+ },
+ "execution_count": 21,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "weighting_dict = {\n",
+ " 'MOTS': 'company_market_cap',\n",
+ " 'EOTS': 'company_ev',\n",
+ " 'ECOTS': 'company_evic',\n",
+ " 'AOTS': 'company_total_assets',\n",
+ " 'ROTS': 'company_revenue',\n",
+ "}\n",
+ "\n",
+ "for k, v in weighting_dict.items():\n",
+ " weight_column = f\"{k}_weight\"\n",
+ " portfolio_df[weight_column] = vault_company_data.compute_portfolio_weights(portfolio_df['pa_score'], 2019, v, EScope.S1S2)\n",
+ " print(f\"Portfolio temperature score based on {k} = {portfolio_df[weight_column].sum()}\")\n",
+ "\n",
+ "portfolio_df"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "02416ac3-892e-4de7-b244-fc8311993ee9",
+ "metadata": {},
+ "source": [
+ "### Companies for which we lack production data (and thus cannot chart)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "id": "d1e39a38-9d3f-4ff7-aa46-965f6cbf4a76",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " company_name \n",
+ " company_lei \n",
+ " investment_value \n",
+ " pa_score \n",
+ " WATS_weight \n",
+ " TETS_weight \n",
+ " MOTS_weight \n",
+ " EOTS_weight \n",
+ " ECOTS_weight \n",
+ " AOTS_weight \n",
+ " ROTS_weight \n",
+ " \n",
+ " \n",
+ " company_id \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ "Empty DataFrame\n",
+ "Columns: [company_name, company_lei, investment_value, pa_score, WATS_weight, TETS_weight, MOTS_weight, EOTS_weight, ECOTS_weight, AOTS_weight, ROTS_weight]\n",
+ "Index: []"
+ ]
+ },
+ "execution_count": 22,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "portfolio_df[portfolio_df.pa_score.isnull()]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "id": "027bf69a-9c4a-48bc-979c-662a7409263d",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[('AES Corp.', '2NUNNB7D43COUIRE5295', 'US00130H1059', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 10870000000.0, 10189000000.0, 10102000000, 11131000000.0, 33648000000.0, 1029000000.0, 261000000.0),\n",
+ " ('ALLETE, Inc.', '549300NNLSIMY6Z8OT86', 'US0185223007', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 4285299935.0, 1240500000.0, 5829799935, 5899099935.0, 5482800000.0, 69300000.0, 1613800000.0),\n",
+ " ('Algonquin Power & Utilities Corp.', '549300K5VIUTJXQL7X75', 'US0158577090', 'Electricity Utilities', 'CA', 'North America', 'equity', 'USD', 2019, None, 1624921000.0, None, None, 10911470000.0, 62485000.0, 6500799000.0),\n",
+ " ('Alliant Energy', '5493009ML300G373MZ12', 'US0188021085', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 11600000000.0, 3647700000.0, 18503600000, 18519900000.0, 16700700000.0, 16300000.0, 6919900000.0),\n",
+ " ('Ameren Corp.', 'XRZQ5S7HYJFPHJ78L959', 'US0236081024', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 18378774986.0, 5910000000.0, 27804774986, 27820774986.0, 28933000000.0, 16000000.0, 9442000000.0),\n",
+ " ('American Electric Power Co., Inc.', '1B4S6S7G0TW5EE83BO58', 'US0255371017', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 43491855142.0, 15561400000.0, 73417055142, 73663855142.0, 75892300000.0, 246800000.0, 30172000000.0),\n",
+ " ('Avangrid, Inc.', '549300OX0Q38NLSKPB49', 'US05351W1036', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 2836000000.0, 6338000000.0, 10826000000, 11004000000.0, 34416000000.0, 178000000.0, 8168000000.0),\n",
+ " ('Avista Corp.', 'Q0IK63NITJD6RJ47SW96', 'US05379B1070', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 2948564738.0, 1345622000.0, 4917868738, 4927764738.0, 6082456000.0, 9896000.0, 1979200000.0),\n",
+ " ('Berkshire Hathaway, Inc.', '5493000C01ZX7D35SD85', 'US0846707026', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 417300000000.0, 254616000000.0, None, 421014902807.7754, 817729000000.0, None, 3714902807.775378),\n",
+ " ('Black Hills Corp.', '3MGELCRSTNSAMJ962671', 'US0921131092', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 4727278183.0, 1734900000.0, 7857597183, 7867374183.0, 7558457000.0, 9777000.0, 3140096000.0),\n",
+ " ('CARPENTER TECHNOLOGY CORP', 'DX6I6ZD3X5WNNCDJKP85', 'US1442851036', 'Steel', 'US', 'North America', 'equity', 'USD', 2019, 1687208892.0, 2380200000.0, 2210808892, 2237808892.0, 3187800000.0, 27000000.0, 550600000.0),\n",
+ " ('CLEVELAND-CLIFFS INC', '549300TM2WLI2BJMDD86', 'US1858991011', 'Steel', 'US', 'North America', 'equity', 'USD', 2019, 2839987963.0, 1989900000.0, 4601187963, 4953787963.0, 3503800000.0, 352600000.0, 2113800000.0),\n",
+ " ('CMS Energy Corp.', '549300IA9XFBAGNIBW29', 'US1258961002', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 16352000000.0, 6845000000.0, 28163000000, 28303000000.0, 26837000000.0, 140000000.0, 11951000000.0),\n",
+ " ('COMMERCIAL METALS CO', '549300OQS2LO07ZJ7N73', 'US2017231034', 'Steel', 'US', 'North America', 'equity', 'USD', 2019, 1900000000.0, 5829002000.0, None, 3154921000.0, 3758771000.0, None, 1254921000.0),\n",
+ " ('Cleco Partners LP', '5493002H80P81B3HXL31', 'US18551QAA58', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, None, 1639605000.0, None, None, 7476298000.0, 116292000.0, 400000000.0),\n",
+ " ('Consolidated Edison, Inc.', '54930033SBW53OO8T749', 'US2091151041', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 29100000000.0, 12574000000.0, 48092000000, 49073000000.0, 58079000000.0, 981000000.0, 19973000000.0),\n",
+ " ('DTE Energy', '549300IX8SD6XXD71I78', 'US2333311072', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 23100000000.0, 12669000000.0, 39762000000, 39855000000.0, 41882000000.0, 93000000.0, 16755000000.0),\n",
+ " ('Dominion Energy', 'ILUL7B6Z54MRYCF6H308', 'US25746U1097', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 62000000000.0, 16572000000.0, 95658000000, 95824000000.0, 103823000000.0, 166000000.0, 33824000000.0),\n",
+ " ('Duke Energy Corp.', 'I1BZKREC126H0VB1BL91', 'US26441C2044', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 64230558771.0, 25079000000.0, 126981558771, 127292558771.0, 158838000000.0, 311000000.0, 63062000000.0),\n",
+ " ('Edison International', '549300I7ROF15MAEVP56', 'US2810201077', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 22000000000.0, 12347000000.0, 42069000000, 42137000000.0, 64382000000.0, 68000000.0, 20137000000.0),\n",
+ " ('El Paso Electric Co', 'OZ8GM8L4AHPKSWZMW205', 'US283677AZ52', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 2636107949.0, 861994000.0, 4125040949, 4135858949.0, 3813200000.0, 10818000.0, 1499751000.0),\n",
+ " ('Entergy Corp.', '4XM3TW50JULSLG8BNC79', 'US29364G1031', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 20500000000.0, 10878673000.0, 39134228000, 39559950000.0, 51723912000.0, 425722000.0, 19059950000.0),\n",
+ " ('Evergy, Inc.', '549300PGTHDQY6PSUI61', 'US30034W1062', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 14138041261.0, 5147800000.0, 22861541261, 22884741261.0, 25975900000.0, 23200000.0, 8746700000.0),\n",
+ " ('Eversource Energy', 'SJ7XXD41SQU3ZNWUJ746', 'US30040W1080', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 24486439602.0, 8526470000.0, 38241835602, 38257267602.0, 41123915000.0, 15432000.0, 13770828000.0),\n",
+ " ('Exelon Corp.', '3SOUA6IRML7435B56G12', 'US30161N1019', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 46542193363.0, 34438000000.0, 81905193363, 82492193363.0, 124977000000.0, 587000000.0, 35950000000.0),\n",
+ " ('FirstEnergy Corp.', '549300SVYJS666PQJH88', 'US3379321074', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 22724895037.0, 11035000000.0, 41715895037, 42342895037.0, 42301000000.0, 627000000.0, 19618000000.0),\n",
+ " ('Fortis, Inc.', '549300MQYQ9Y065XPR71', 'CA3495531079', 'Electricity Utilities', 'CA', 'North America', 'equity', 'USD', 2019, None, 6742286315.707347, None, None, 40995680109.76149, 284031189.4354683, 16505282713.654066),\n",
+ " ('GERDAU S.A.', '254900YDV6SEQQPZVG24', 'US3737371050', 'Steel', 'BR', 'Global', 'equity', 'USD', 2019, None, 9835514922.966234, None, None, 13397913513.781725, 655382935.9664575, None),\n",
+ " ('Hawaiian Electric Industries, Inc.', 'JJ8FWOCWCV22X7GUPJ23', 'US4198701009', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 4745752027.0, 2874601000.0, 6513304027, 6710117027.0, 13745251000.0, 196813000.0, 1964365000.0),\n",
+ " ('Idacorp, Inc.', 'N134NUJDWN8UEFA8B673', 'US4511071064', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 5017481695.0, 1346383000.0, 6636886695, 6854140695.0, 6641201000.0, 217254000.0, 1836659000.0),\n",
+ " ('NUCOR CORP', '549300GGJCRSI2TIEJ46', 'US6703461052', 'Steel', 'US', 'North America', 'equity', 'USD', 2019, 16580000000.0, 22588858000.0, 19336696000, 20871301000.0, 18344666000.0, 1534605000.0, 4291301000.0),\n",
+ " ('National Grid PLC', '8R95QZMKZLJX5Q2XR704', 'US6362744095', 'Electricity Utilities', 'GB', 'Europe', 'equity', 'USD', 2019, 40783780623.596985, 19393506493.506493, None, None, 81770129870.12987, 327272727.27272725, None),\n",
+ " ('Nisource Inc.', '549300D8GOWWH0SJB189', 'US65473P1057', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 10713311150.0, 5053400000.0, 19338411150, 19477711150.0, 22659800000.0, 139300000.0, 8764400000.0),\n",
+ " ('Northwestern Corp.', '3BPWMBHR1R9SHUN7J795', 'US6680743050', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 3639448000.0, 1257910000.0, 6051117000, 6056262000.0, 5910702000.0, 5145000.0, 2416814000.0),\n",
+ " ('OG&E Energy Corp.', 'CE5OG6JPOZMDSA0LAQ19', 'US6708371033', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 8519482559.0, 2231600000.0, None, 11714682559.0, 11024300000.0, None, 3195200000.0),\n",
+ " ('Old Dominion Electric Coop.', 'SW4VC32Z0ZKLJKPONQ50', 'ZZ00000000141', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, None, 932682000.0, None, None, 2169244000.0, 3469000.0, 1300100000.0),\n",
+ " ('Otter Tail Corp.', '549300HHVBQRQUVKKD91', 'US6896481032', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 2040017347.0, 919503000.0, 2714582347, 2735781347.0, 2273595000.0, 21199000.0, 695764000.0),\n",
+ " ('PG&E Corp.', '8YQ2GSDWYZXO2EDN3511', 'US69331C1080', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 12130000000.0, 17129000000.0, 32736000000, 34306000000.0, 85196000000.0, 1570000000.0, 22176000000.0),\n",
+ " ('PNM Resources, Inc.', '5493003JOBJGLZSDDQ28', 'US69349H1077', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 4055165998.0, 1457603000.0, 6568781998, 6572614998.0, 7298774000.0, 3833000.0, 2517449000.0),\n",
+ " ('POSCO', '988400E5HRVX81AYLM04', 'KR7005490008', 'Steel', 'KR', 'Global', 'equity', 'USD', 2019, None, 55955872344.10088, None, None, 68553124892.03662, 3035819657.972016, None),\n",
+ " ('PPL Corp.', '9N3UAJSNOUXFKQLF3V18', 'US69351T1060', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 22384264788.0, 7769000000.0, 43462264788, 44277264788.0, 45680000000.0, 815000000.0, 21893000000.0),\n",
+ " ('Pinnacle West Capital Corp.', 'TWSEY0NEDUDCKS27AH81', 'US7234841010', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 10536165750.0, 3471209000.0, 16720274750, 16730557750.0, 18479247000.0, 10283000.0, 6194392000.0),\n",
+ " ('Portland General Electric Co.', 'GJOUP9M7C39GLSK9R870', 'US7365088472', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 4823580272.0, 2123000000.0, 7832580272, 7862580272.0, 8394000000.0, 30000000.0, 3039000000.0),\n",
+ " ('Public Service Enterprise Group', 'PUSS41EMO3E6XXNV3U28', 'US7445731067', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 29513402185.0, 10076000000.0, 46089402185, 46236402185.0, 47730000000.0, 147000000.0, 16723000000.0),\n",
+ " ('STEEL DYNAMICS INC', '549300HGGKEL4FYTTQ83', 'US8581191009', 'Steel', 'US', 'North America', 'equity', 'USD', 2019, 5000000000.0, 10464991000.0, 6352884000, 7734344000.0, 8275765000.0, 1381460000.0, 2734344000.0),\n",
+ " ('Sempra', 'PBBKGKLRK5S5C0Y4T545', 'US8168511090', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 37700000000.0, 10829000000.0, 58377000000, 58485000000.0, 65665000000.0, 108000000.0, 20785000000.0),\n",
+ " ('Southern Co.', '549300FC3G3YU2FBZD92', 'US8425871071', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 57800000000.0, 21419000000.0, 97623000000, 99598000000.0, 118700000000.0, 1975000000.0, 41798000000.0),\n",
+ " ('TENARIS SA', '549300Y7C05BKC4HZB40', 'US88031M1099', 'Steel', 'LU', 'Europe', 'equity', 'USD', 2019, None, 7294055000.0, None, None, 14842991000.0, 1554299000.0, None),\n",
+ " ('TERNIUM S.A.', '529900QG4KU23TEI2E46', 'US8808901081', 'Steel', 'LU', 'Europe', 'equity', 'USD', 2019, None, 10192818000.0, None, None, 12935533000.0, 519965000.0, None),\n",
+ " ('TIMKENSTEEL CORP', '549300QZTZWHDE9HJL14', 'US8873991033', 'Steel', 'US', 'North America', 'equity', 'USD', 2019, 337525844.0, 1208800000.0, 400425844, 427525844.0, 1085200000.0, 27100000.0, 90000000.0),\n",
+ " ('Tri-State Generation & Transmission Association, Inc.', '549300VDHNFNPADSSV98', 'ZZ00000000180', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, None, 1385472000.0, None, None, 5085818000.0, 83070000.0, 3144906000.0),\n",
+ " ('UNITED STATES STEEL CORP', 'JNLUVFYJT1OZSIQ24U47', 'US9129091081', 'Steel', 'US', 'North America', 'equity', 'USD', 2019, 2600000000.0, 12937000000.0, 5630000000, 6379000000.0, 11608000000.0, 749000000.0, 3779000000.0),\n",
+ " ('WEC Energy Group', '549300IGLYTZUK3PVP70', 'US92939U1060', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 26300000000.0, 7523100000.0, 38120800000, 38158300000.0, 34951800000.0, 37500000.0, 11858300000.0),\n",
+ " ('WORTHINGTON INDUSTRIES INC', '1WRCIANKYOIK6KYE5E82', 'US9818111026', 'Steel', 'US', 'North America', 'equity', 'USD', 2019, 1633376617.0, 3759556000.0, 2294113617, 2386476617.0, 2510796000.0, 92363000.0, 753100000.0),\n",
+ " ('Xcel Energy, Inc.', 'LGJNMI9GH8XIDG5RCM61', 'US98389B1008', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 30629347167.0, 11529000000.0, 50608347167, 50856347167.0, 50448000000.0, 248000000.0, 20227000000.0)]"
+ ]
+ },
+ "execution_count": 23,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "engine_quant.execute(\"select * from demo_dv.company_data\").fetchall()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "96697928-5b47-4e5a-955c-5892f2311535",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.10.2"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/examples/vault_demo_n2.ipynb b/examples/vault_demo_n2.ipynb
new file mode 100644
index 00000000..ac1b8255
--- /dev/null
+++ b/examples/vault_demo_n2.ipynb
@@ -0,0 +1,2340 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "e3c5c7d5-63e0-47a5-ac4a-bb58beb98995",
+ "metadata": {},
+ "source": [
+ "# Data Vault Demo (User, can only score own portfolio)\n",
+ "\n",
+ "The basic concept of the Data Vault is that when a user authenticates themself, they receive an engine that gives them access to all the data (rows, columns, tables, schema, etc.) for which they are authorized. Users who can authenticate themselves for multiple roles can use those roles simultaneously. We are keeping in mind the importance of Data Lineage Management (tracked by issue https://github.com/os-climate/os_c_data_commons/issues/50) but is not treated as part of this particular prototype.\n",
+ "\n",
+ "The steps of this demo are:\n",
+ "\n",
+ "1. **Authenticate and acquire SQLAlchemy engine**\n",
+ " 1. Dev engine sees all\n",
+ " 2. Quant engine can do temp scoring but not see fundamental company info\n",
+ " 3. **User engine can use temp scoring but not see cumulative emissions nor overshoot info**\n",
+ "2. With Dev engine, construct Vaults for:\n",
+ " 1. Fundamental corporate financial information\n",
+ " 2. Corporate emissions data (base year, historical)\n",
+ " 3. Corporate target data (start year, end year, target start value, target end value)\n",
+ " 4. Sector benchmark data (production, CO2e intensity)\n",
+ "3. Dev Engine: Visualize projected emissions (targets and trajectories) and calculate cumulative emissions\n",
+ "4. Quant Engine: Using calculated cumulative emmisions, visualize per-company trajectory and target temperature scores\n",
+ "5. **User Engine: Using consensus probability scoring and own portfolio data (ISIN, position value)**\n",
+ " 1. **Calculate publishable per-company temperature alignment score**\n",
+ " 2. **Based on aggregate corporate and portfolio information, produce weighting scores to yield overall portfolio alignment score**"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "d1ab75f1-dc99-422d-b15b-ce043e32fff8",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import os\n",
+ "import pathlib\n",
+ "from dotenv import load_dotenv\n",
+ "\n",
+ "# Load some standard environment variables from a dot-env file, if it exists.\n",
+ "# If no such file can be found, does not fail, and so allows these environment vars to\n",
+ "# be populated in some other way\n",
+ "dotenv_dir = os.environ.get('CREDENTIAL_DOTENV_DIR', os.environ.get('PWD', '/opt/app-root/src'))\n",
+ "dotenv_path = pathlib.Path(dotenv_dir) / 'credentials.env'\n",
+ "if os.path.exists(dotenv_path):\n",
+ " load_dotenv(dotenv_path=dotenv_path,override=True)\n",
+ "\n",
+ "import trino\n",
+ "from sqlalchemy.engine import create_engine"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "837212ac-6d98-46a2-9a18-c5c026feb84c",
+ "metadata": {},
+ "source": [
+ "### The ITR module provides Vault objects that coordinate the interaction of Dev, Quant, and User roles.\n",
+ "\n",
+ "The SQLAlchemy engines mediate the actual interaction with the Data Vault."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "969b6d53-49d8-47d9-b218-6bdd790a7de4",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/michael/opt/miniconda3/envs/jupyter/lib/python3.10/site-packages/sqlalchemy_trino/dialect.py:259: SAWarning: Dialect trino:rest will not make use of SQL compilation caching as it does not set the 'supports_statement_cache' attribute to ``True``. This can have significant performance implications including some performance degradations in comparison to prior SQLAlchemy versions. Dialect maintainers should seek to set this attribute to True after appropriate development and testing for SQLAlchemy 1.4 caching support. Alternatively, this attribute may be set to False which will disable this warning. (Background on this error at: https://sqlalche.me/e/14/cprf)\n",
+ " res = connection.execute(sql.text(query)).scalar()\n"
+ ]
+ }
+ ],
+ "source": [
+ "import json\n",
+ "import pandas as pd\n",
+ "from numpy.testing import assert_array_equal\n",
+ "import ITR\n",
+ "\n",
+ "# from ITR.portfolio_aggregation import PortfolioAggregationMethod\n",
+ "# from ITR.temperature_score import TemperatureScore\n",
+ "# from ITR.configs import ColumnsConfig, TemperatureScoreConfig\n",
+ "# from ITR.data.data_warehouse import DataWarehouse\n",
+ "from ITR.data.vault_providers import DataVaultWarehouse, VaultCompanyDataProvider\n",
+ "# from ITR.interfaces import ICompanyData, EScope, ETimeFrames, PortfolioCompany, IEIBenchmarkScopes, \\\n",
+ "# IProductionBenchmarkScopes\n",
+ "from ITR.interfaces import EScope # , IProductionBenchmarkScopes, IEIBenchmarkScopes"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "65795474-1de6-4f40-9086-f7d948ae6c66",
+ "metadata": {},
+ "source": [
+ "### Step 5: Show per-company temperature score and weighted portfolio alignment score\n",
+ "\n",
+ "Portfolio weighting scores (which ultimately influence portfolio alignment score) include:\n",
+ "* WATS (size of portfolio company positions used as weights)\n",
+ "* TETS (size of total emissions of portfolio companies used as weights)\n",
+ "* Financial fundamental weights:\n",
+ " * Market Cap\n",
+ " * Enterprise Value\n",
+ " * Assets\n",
+ " * Revenues\n",
+ "\n",
+ "We can pass a list of company IDs to the Data Vault to get back a sum without exposing granular data"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "3e9113eb-d3ef-409c-aa56-3a0c28662ba2",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "connecting with engine Engine(trino://os-climate-user3@trino-secure-odh-trino.apps.odh-cl2.apps.os-climate.org:443/)\n"
+ ]
+ }
+ ],
+ "source": [
+ "sqlstring = 'trino://{user}@{host}:{port}/'.format(\n",
+ " user = os.environ['TRINO_USER_USER3'],\n",
+ " host = os.environ['TRINO_HOST'],\n",
+ " port = os.environ['TRINO_PORT']\n",
+ ")\n",
+ "sqlargs = {\n",
+ " 'auth': trino.auth.JWTAuthentication(os.environ['TRINO_PASSWD_USER3']),\n",
+ " 'http_scheme': 'https',\n",
+ " 'catalog': 'osc_datacommons_dev',\n",
+ " 'schema': 'demo_dv',\n",
+ "}\n",
+ "\n",
+ "ingest_catalog = 'osc_datacommons_dev'\n",
+ "ingest_schema = 'demo_dv'\n",
+ "\n",
+ "engine_user = create_engine(sqlstring, connect_args = sqlargs)\n",
+ "print(\"connecting with engine \" + str(engine_user))\n",
+ "connection_user = engine_user.connect()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "07154a44-d648-40e3-a5cf-8364468356de",
+ "metadata": {},
+ "source": [
+ "Show that we *cannot* access fundamental company data (cannot show until op1st team changes permissions) and cumulative emissions"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "a2f9eecb-1f6e-4e40-bab1-690292437815",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "vault_warehouse = DataVaultWarehouse(engine_user,\n",
+ " company_data=None,\n",
+ " benchmark_projected_production=None,\n",
+ " benchmarks_projected_ei=None,\n",
+ " ingest_schema = 'demo_dv',\n",
+ " column_config=None,\n",
+ " tempscore_config=None)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "df114d27-a6ab-46d9-a942-0e8200c4fcd7",
+ "metadata": {},
+ "source": [
+ "Show that we *can* access only temperature scores and weighting methods"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "76d2ad90-ce27-484f-8de9-359153d32979",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " company_name \n",
+ " company_lei \n",
+ " investment_value \n",
+ " \n",
+ " \n",
+ " company_id \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " US00130H1059 \n",
+ " AES Corp. \n",
+ " 2NUNNB7D43COUIRE5295 \n",
+ " 4351252 \n",
+ " \n",
+ " \n",
+ " US0158577090 \n",
+ " Algonquin Power & Utilities Corp. \n",
+ " 549300K5VIUTJXQL7X75 \n",
+ " 2228185 \n",
+ " \n",
+ " \n",
+ " US0185223007 \n",
+ " ALLETE, Inc. \n",
+ " 549300NNLSIMY6Z8OT86 \n",
+ " 3829481 \n",
+ " \n",
+ " \n",
+ " US0188021085 \n",
+ " Alliant Energy \n",
+ " 5493009ML300G373MZ12 \n",
+ " 3829481 \n",
+ " \n",
+ " \n",
+ " US0236081024 \n",
+ " Ameren Corp. \n",
+ " XRZQ5S7HYJFPHJ78L959 \n",
+ " 15917812 \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " US8873991033 \n",
+ " TIMKENSTEEL CORP \n",
+ " 549300QZTZWHDE9HJL14 \n",
+ " 10000000 \n",
+ " \n",
+ " \n",
+ " US88830M1027 \n",
+ " TITAN INTERNATIONAL INC \n",
+ " 254900CXRGBE7C4B5A06 \n",
+ " 10000000 \n",
+ " \n",
+ " \n",
+ " US9129091081 \n",
+ " UNITED STATES STEEL CORP \n",
+ " JNLUVFYJT1OZSIQ24U47 \n",
+ " 10000000 \n",
+ " \n",
+ " \n",
+ " US9138371003 \n",
+ " UNIVERSAL STAINLESS & ALLOY PRODUCTS INC \n",
+ " 5493001OEIZDUGXZDE09 \n",
+ " 10000000 \n",
+ " \n",
+ " \n",
+ " US9818111026 \n",
+ " WORTHINGTON INDUSTRIES INC \n",
+ " 1WRCIANKYOIK6KYE5E82 \n",
+ " 10000000 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
61 rows × 3 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " company_name company_lei \\\n",
+ "company_id \n",
+ "US00130H1059 AES Corp. 2NUNNB7D43COUIRE5295 \n",
+ "US0158577090 Algonquin Power & Utilities Corp. 549300K5VIUTJXQL7X75 \n",
+ "US0185223007 ALLETE, Inc. 549300NNLSIMY6Z8OT86 \n",
+ "US0188021085 Alliant Energy 5493009ML300G373MZ12 \n",
+ "US0236081024 Ameren Corp. XRZQ5S7HYJFPHJ78L959 \n",
+ "... ... ... \n",
+ "US8873991033 TIMKENSTEEL CORP 549300QZTZWHDE9HJL14 \n",
+ "US88830M1027 TITAN INTERNATIONAL INC 254900CXRGBE7C4B5A06 \n",
+ "US9129091081 UNITED STATES STEEL CORP JNLUVFYJT1OZSIQ24U47 \n",
+ "US9138371003 UNIVERSAL STAINLESS & ALLOY PRODUCTS INC 5493001OEIZDUGXZDE09 \n",
+ "US9818111026 WORTHINGTON INDUSTRIES INC 1WRCIANKYOIK6KYE5E82 \n",
+ "\n",
+ " investment_value \n",
+ "company_id \n",
+ "US00130H1059 4351252 \n",
+ "US0158577090 2228185 \n",
+ "US0185223007 3829481 \n",
+ "US0188021085 3829481 \n",
+ "US0236081024 15917812 \n",
+ "... ... \n",
+ "US8873991033 10000000 \n",
+ "US88830M1027 10000000 \n",
+ "US9129091081 10000000 \n",
+ "US9138371003 10000000 \n",
+ "US9818111026 10000000 \n",
+ "\n",
+ "[61 rows x 3 columns]"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "portfolio_df = pd.read_csv(\"data/mdt-20220116-portfolio.csv\", encoding=\"iso-8859-1\", sep=';', index_col='company_id')\n",
+ "# portfolio_df = pd.read_csv(\"data/rmi_all.csv\", encoding=\"iso-8859-1\", sep=',', index_col='company_id')\n",
+ "portfolio_df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "746fc07d-ca59-4af8-b5bb-9c4fcf4dea70",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "vault_company_data = VaultCompanyDataProvider (engine_user,\n",
+ " company_table='company_data',\n",
+ " target_table=None,\n",
+ " trajectory_table=None,\n",
+ " company_schema='demo_dv',\n",
+ " column_config=None,\n",
+ " tempscore_config=None)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e2d9942b-ec81-4eab-9cca-99e92905e24f",
+ "metadata": {},
+ "source": [
+ "### Calculate portfolio alignment temperature score based on WATS\n",
+ "\n",
+ "We can do this with information exclusive to the user space (and the probability-adjusted temperature scores)\n",
+ "\n",
+ "Note that companies with no production information (such as TITAL INTERNATIONAL INC and UNIVERSAL STAINLESS & ALLOY PRODUCTS INC will show NaN (Not a Number) as a score."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "3840f2c6-a938-43b0-b24e-37f0b284d2c6",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/michael/opt/miniconda3/envs/jupyter/lib/python3.10/site-packages/pint_pandas/pint_array.py:648: UnitStrippedWarning: The unit of the quantity is stripped when downcasting to ndarray.\n",
+ " return np.array(qtys, dtype=\"object\", copy=copy)\n"
+ ]
+ }
+ ],
+ "source": [
+ "# PA_SCORE means \"Probability-Adjusted\" Temperature Score\n",
+ "portfolio_df['pa_score'] = vault_warehouse.get_pa_temp_scores(probability=0.5, company_ids=portfolio_df.index.values).astype('pint[delta_degC]')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "8031e3a0-3d22-4f16-8a9a-e85f855f1b02",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/michael/opt/miniconda3/envs/jupyter/lib/python3.10/site-packages/pint_pandas/pint_array.py:648: UnitStrippedWarning: The unit of the quantity is stripped when downcasting to ndarray.\n",
+ " return np.array(qtys, dtype=\"object\", copy=copy)\n",
+ "/Users/michael/opt/miniconda3/envs/jupyter/lib/python3.10/site-packages/pint_pandas/pint_array.py:648: UnitStrippedWarning: The unit of the quantity is stripped when downcasting to ndarray.\n",
+ " return np.array(qtys, dtype=\"object\", copy=copy)\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " company_name \n",
+ " company_lei \n",
+ " investment_value \n",
+ " pa_score \n",
+ " \n",
+ " \n",
+ " company_id \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " US00130H1059 \n",
+ " AES Corp. \n",
+ " 2NUNNB7D43COUIRE5295 \n",
+ " 4351252 \n",
+ " 2.106926870694208 \n",
+ " \n",
+ " \n",
+ " US0185223007 \n",
+ " ALLETE, Inc. \n",
+ " 549300NNLSIMY6Z8OT86 \n",
+ " 3829481 \n",
+ " 2.043793289146705 \n",
+ " \n",
+ " \n",
+ " US0158577090 \n",
+ " Algonquin Power & Utilities Corp. \n",
+ " 549300K5VIUTJXQL7X75 \n",
+ " 2228185 \n",
+ " 1.2623320662937099 \n",
+ " \n",
+ " \n",
+ " US0188021085 \n",
+ " Alliant Energy \n",
+ " 5493009ML300G373MZ12 \n",
+ " 3829481 \n",
+ " 1.867044766546712 \n",
+ " \n",
+ " \n",
+ " US0236081024 \n",
+ " Ameren Corp. \n",
+ " XRZQ5S7HYJFPHJ78L959 \n",
+ " 15917812 \n",
+ " 2.404261301598871 \n",
+ " \n",
+ " \n",
+ " US0255371017 \n",
+ " American Electric Power Co., Inc. \n",
+ " 1B4S6S7G0TW5EE83BO58 \n",
+ " 45520637 \n",
+ " 2.1814181749376793 \n",
+ " \n",
+ " \n",
+ " US05351W1036 \n",
+ " Avangrid, Inc. \n",
+ " 549300OX0Q38NLSKPB49 \n",
+ " 10049068 \n",
+ " 1.624145450892199 \n",
+ " \n",
+ " \n",
+ " US05379B1070 \n",
+ " Avista Corp. \n",
+ " Q0IK63NITJD6RJ47SW96 \n",
+ " 2804211 \n",
+ " 1.7099274356102043 \n",
+ " \n",
+ " \n",
+ " US1442851036 \n",
+ " CARPENTER TECHNOLOGY CORP \n",
+ " DX6I6ZD3X5WNNCDJKP85 \n",
+ " 10000000 \n",
+ " 1.9900906690954119 \n",
+ " \n",
+ " \n",
+ " US1258961002 \n",
+ " CMS Energy \n",
+ " 549300IA9XFBAGNIBW29 \n",
+ " 9153135 \n",
+ " 2.1320023723934343 \n",
+ " \n",
+ " \n",
+ " US2017231034 \n",
+ " COMMERCIAL METALS CO \n",
+ " 549300OQS2LO07ZJ7N73 \n",
+ " 10000000 \n",
+ " 1.2990617896624888 \n",
+ " \n",
+ " \n",
+ " US18551QAA58 \n",
+ " Cleco Partners LP \n",
+ " 5493002H80P81B3HXL31 \n",
+ " 3086052 \n",
+ " 2.280309768660802 \n",
+ " \n",
+ " \n",
+ " US2091151041 \n",
+ " Consolidated Edison, Inc. \n",
+ " 54930033SBW53OO8T749 \n",
+ " 20394113 \n",
+ " 1.7197135175610079 \n",
+ " \n",
+ " \n",
+ " US2333311072 \n",
+ " DTE Energy \n",
+ " 549300IX8SD6XXD71I78 \n",
+ " 14329945 \n",
+ " 2.494203358852266 \n",
+ " \n",
+ " \n",
+ " US25746U1097 \n",
+ " Dominion Energy \n",
+ " ILUL7B6Z54MRYCF6H308 \n",
+ " 33528082 \n",
+ " 1.6421622410252814 \n",
+ " \n",
+ " \n",
+ " US26441C2044 \n",
+ " Duke Energy Corp. \n",
+ " I1BZKREC126H0VB1BL91 \n",
+ " 73069652 \n",
+ " 1.8259317788445726 \n",
+ " \n",
+ " \n",
+ " US283677AZ52 \n",
+ " El Paso Electric Co \n",
+ " OZ8GM8L4AHPKSWZMW205 \n",
+ " 2646941 \n",
+ " 1.864862725462496 \n",
+ " \n",
+ " \n",
+ " US29364G1031 \n",
+ " Entergy Corp. \n",
+ " 4XM3TW50JULSLG8BNC79 \n",
+ " 29844269 \n",
+ " 1.727230341297715 \n",
+ " \n",
+ " \n",
+ " US30034W1062 \n",
+ " Evergy, Inc. \n",
+ " 549300PGTHDQY6PSUI61 \n",
+ " 18254954 \n",
+ " 2.1869485449964037 \n",
+ " \n",
+ " \n",
+ " US30040W1080 \n",
+ " Eversource Energy \n",
+ " SJ7XXD41SQU3ZNWUJ746 \n",
+ " 18962480 \n",
+ " 1.2636355763883802 \n",
+ " \n",
+ " \n",
+ " US3379321074 \n",
+ " FirstEnergy Corp. \n",
+ " 549300SVYJS666PQJH88 \n",
+ " 27277340 \n",
+ " 3.4408564514595774 \n",
+ " \n",
+ " \n",
+ " CA3495531079 \n",
+ " Fortis, Inc \n",
+ " 549300MQYQ9Y065XPR71 \n",
+ " 12428756 \n",
+ " 2.8403172973777053 \n",
+ " \n",
+ " \n",
+ " US3737371050 \n",
+ " GERDAU S.A. \n",
+ " 254900YDV6SEQQPZVG24 \n",
+ " 10000000 \n",
+ " 1.375590655258247 \n",
+ " \n",
+ " \n",
+ " US6703461052 \n",
+ " NUCOR CORP \n",
+ " 549300GGJCRSI2TIEJ46 \n",
+ " 10000000 \n",
+ " 1.315430185746877 \n",
+ " \n",
+ " \n",
+ " US6362744095 \n",
+ " National Grid plc \n",
+ " 8R95QZMKZLJX5Q2XR704 \n",
+ " 12281584 \n",
+ " 2.5302066248940553 \n",
+ " \n",
+ " \n",
+ " US6680743050 \n",
+ " NorthWestern Corp. \n",
+ " 3BPWMBHR1R9SHUN7J795 \n",
+ " 2703150 \n",
+ " 2.235303301117127 \n",
+ " \n",
+ " \n",
+ " US6708371033 \n",
+ " OG&E Energy \n",
+ " CE5OG6JPOZMDSA0LAQ19 \n",
+ " 7251242 \n",
+ " 2.572462385836689 \n",
+ " \n",
+ " \n",
+ " US6896481032 \n",
+ " Otter Tail Corp. \n",
+ " 549300HHVBQRQUVKKD91 \n",
+ " 1264277 \n",
+ " 2.9694066480437593 \n",
+ " \n",
+ " \n",
+ " US69349H1077 \n",
+ " PNM Resources, Inc. \n",
+ " 5493003JOBJGLZSDDQ28 \n",
+ " 3326899 \n",
+ " 2.013668347320406 \n",
+ " \n",
+ " \n",
+ " KR7005490008 \n",
+ " POSCO \n",
+ " 988400E5HRVX81AYLM04 \n",
+ " 10000000 \n",
+ " 1.5593142658365693 \n",
+ " \n",
+ " \n",
+ " US69351T1060 \n",
+ " PPL \n",
+ " 9N3UAJSNOUXFKQLF3V18 \n",
+ " 18146577 \n",
+ " 2.6346104815070195 \n",
+ " \n",
+ " \n",
+ " US7234841010 \n",
+ " Pinnacle West Capital Corp. \n",
+ " TWSEY0NEDUDCKS27AH81 \n",
+ " 12058547 \n",
+ " 2.086103530593631 \n",
+ " \n",
+ " \n",
+ " US7365088472 \n",
+ " Portland General Electric Co. \n",
+ " GJOUP9M7C39GLSK9R870 \n",
+ " 5770964 \n",
+ " 1.8706266553608955 \n",
+ " \n",
+ " \n",
+ " US7445731067 \n",
+ " Public Service Enterprise Group \n",
+ " PUSS41EMO3E6XXNV3U28 \n",
+ " 16912134 \n",
+ " 1.4434071117060308 \n",
+ " \n",
+ " \n",
+ " US8581191009 \n",
+ " STEEL DYNAMICS INC \n",
+ " 549300HGGKEL4FYTTQ83 \n",
+ " 10000000 \n",
+ " 1.3158777300113855 \n",
+ " \n",
+ " \n",
+ " US8168511090 \n",
+ " Sempra Energy \n",
+ " PBBKGKLRK5S5C0Y4T545 \n",
+ " 29579515 \n",
+ " 1.8683533328964472 \n",
+ " \n",
+ " \n",
+ " US8425871071 \n",
+ " Southern Co. \n",
+ " 549300FC3G3YU2FBZD92 \n",
+ " 50294245 \n",
+ " 1.9963792988066478 \n",
+ " \n",
+ " \n",
+ " US88031M1099 \n",
+ " TENARIS SA \n",
+ " 549300Y7C05BKC4HZB40 \n",
+ " 10000000 \n",
+ " 1.3632817562247952 \n",
+ " \n",
+ " \n",
+ " US8808901081 \n",
+ " TERNIUM S.A. \n",
+ " 529900QG4KU23TEI2E46 \n",
+ " 10000000 \n",
+ " 1.5265556596582406 \n",
+ " \n",
+ " \n",
+ " US8873991033 \n",
+ " TIMKENSTEEL CORP \n",
+ " 549300QZTZWHDE9HJL14 \n",
+ " 10000000 \n",
+ " 1.2939425547566503 \n",
+ " \n",
+ " \n",
+ " US9129091081 \n",
+ " UNITED STATES STEEL CORP \n",
+ " JNLUVFYJT1OZSIQ24U47 \n",
+ " 10000000 \n",
+ " 1.5154085205221834 \n",
+ " \n",
+ " \n",
+ " US92939U1060 \n",
+ " WEC Energy Group \n",
+ " 549300IGLYTZUK3PVP70 \n",
+ " 11046675 \n",
+ " 2.11253492554515 \n",
+ " \n",
+ " \n",
+ " US9818111026 \n",
+ " WORTHINGTON INDUSTRIES INC \n",
+ " 1WRCIANKYOIK6KYE5E82 \n",
+ " 10000000 \n",
+ " 1.26782307131814 \n",
+ " \n",
+ " \n",
+ " US98389B1008 \n",
+ " Xcel Energy, Inc. \n",
+ " LGJNMI9GH8XIDG5RCM61 \n",
+ " 27475073 \n",
+ " 1.8665476973515542 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " company_name company_lei \\\n",
+ "company_id \n",
+ "US00130H1059 AES Corp. 2NUNNB7D43COUIRE5295 \n",
+ "US0185223007 ALLETE, Inc. 549300NNLSIMY6Z8OT86 \n",
+ "US0158577090 Algonquin Power & Utilities Corp. 549300K5VIUTJXQL7X75 \n",
+ "US0188021085 Alliant Energy 5493009ML300G373MZ12 \n",
+ "US0236081024 Ameren Corp. XRZQ5S7HYJFPHJ78L959 \n",
+ "US0255371017 American Electric Power Co., Inc. 1B4S6S7G0TW5EE83BO58 \n",
+ "US05351W1036 Avangrid, Inc. 549300OX0Q38NLSKPB49 \n",
+ "US05379B1070 Avista Corp. Q0IK63NITJD6RJ47SW96 \n",
+ "US1442851036 CARPENTER TECHNOLOGY CORP DX6I6ZD3X5WNNCDJKP85 \n",
+ "US1258961002 CMS Energy 549300IA9XFBAGNIBW29 \n",
+ "US2017231034 COMMERCIAL METALS CO 549300OQS2LO07ZJ7N73 \n",
+ "US18551QAA58 Cleco Partners LP 5493002H80P81B3HXL31 \n",
+ "US2091151041 Consolidated Edison, Inc. 54930033SBW53OO8T749 \n",
+ "US2333311072 DTE Energy 549300IX8SD6XXD71I78 \n",
+ "US25746U1097 Dominion Energy ILUL7B6Z54MRYCF6H308 \n",
+ "US26441C2044 Duke Energy Corp. I1BZKREC126H0VB1BL91 \n",
+ "US283677AZ52 El Paso Electric Co OZ8GM8L4AHPKSWZMW205 \n",
+ "US29364G1031 Entergy Corp. 4XM3TW50JULSLG8BNC79 \n",
+ "US30034W1062 Evergy, Inc. 549300PGTHDQY6PSUI61 \n",
+ "US30040W1080 Eversource Energy SJ7XXD41SQU3ZNWUJ746 \n",
+ "US3379321074 FirstEnergy Corp. 549300SVYJS666PQJH88 \n",
+ "CA3495531079 Fortis, Inc 549300MQYQ9Y065XPR71 \n",
+ "US3737371050 GERDAU S.A. 254900YDV6SEQQPZVG24 \n",
+ "US6703461052 NUCOR CORP 549300GGJCRSI2TIEJ46 \n",
+ "US6362744095 National Grid plc 8R95QZMKZLJX5Q2XR704 \n",
+ "US6680743050 NorthWestern Corp. 3BPWMBHR1R9SHUN7J795 \n",
+ "US6708371033 OG&E Energy CE5OG6JPOZMDSA0LAQ19 \n",
+ "US6896481032 Otter Tail Corp. 549300HHVBQRQUVKKD91 \n",
+ "US69349H1077 PNM Resources, Inc. 5493003JOBJGLZSDDQ28 \n",
+ "KR7005490008 POSCO 988400E5HRVX81AYLM04 \n",
+ "US69351T1060 PPL 9N3UAJSNOUXFKQLF3V18 \n",
+ "US7234841010 Pinnacle West Capital Corp. TWSEY0NEDUDCKS27AH81 \n",
+ "US7365088472 Portland General Electric Co. GJOUP9M7C39GLSK9R870 \n",
+ "US7445731067 Public Service Enterprise Group PUSS41EMO3E6XXNV3U28 \n",
+ "US8581191009 STEEL DYNAMICS INC 549300HGGKEL4FYTTQ83 \n",
+ "US8168511090 Sempra Energy PBBKGKLRK5S5C0Y4T545 \n",
+ "US8425871071 Southern Co. 549300FC3G3YU2FBZD92 \n",
+ "US88031M1099 TENARIS SA 549300Y7C05BKC4HZB40 \n",
+ "US8808901081 TERNIUM S.A. 529900QG4KU23TEI2E46 \n",
+ "US8873991033 TIMKENSTEEL CORP 549300QZTZWHDE9HJL14 \n",
+ "US9129091081 UNITED STATES STEEL CORP JNLUVFYJT1OZSIQ24U47 \n",
+ "US92939U1060 WEC Energy Group 549300IGLYTZUK3PVP70 \n",
+ "US9818111026 WORTHINGTON INDUSTRIES INC 1WRCIANKYOIK6KYE5E82 \n",
+ "US98389B1008 Xcel Energy, Inc. LGJNMI9GH8XIDG5RCM61 \n",
+ "\n",
+ " investment_value pa_score \n",
+ "company_id \n",
+ "US00130H1059 4351252 2.106926870694208 \n",
+ "US0185223007 3829481 2.043793289146705 \n",
+ "US0158577090 2228185 1.2623320662937099 \n",
+ "US0188021085 3829481 1.867044766546712 \n",
+ "US0236081024 15917812 2.404261301598871 \n",
+ "US0255371017 45520637 2.1814181749376793 \n",
+ "US05351W1036 10049068 1.624145450892199 \n",
+ "US05379B1070 2804211 1.7099274356102043 \n",
+ "US1442851036 10000000 1.9900906690954119 \n",
+ "US1258961002 9153135 2.1320023723934343 \n",
+ "US2017231034 10000000 1.2990617896624888 \n",
+ "US18551QAA58 3086052 2.280309768660802 \n",
+ "US2091151041 20394113 1.7197135175610079 \n",
+ "US2333311072 14329945 2.494203358852266 \n",
+ "US25746U1097 33528082 1.6421622410252814 \n",
+ "US26441C2044 73069652 1.8259317788445726 \n",
+ "US283677AZ52 2646941 1.864862725462496 \n",
+ "US29364G1031 29844269 1.727230341297715 \n",
+ "US30034W1062 18254954 2.1869485449964037 \n",
+ "US30040W1080 18962480 1.2636355763883802 \n",
+ "US3379321074 27277340 3.4408564514595774 \n",
+ "CA3495531079 12428756 2.8403172973777053 \n",
+ "US3737371050 10000000 1.375590655258247 \n",
+ "US6703461052 10000000 1.315430185746877 \n",
+ "US6362744095 12281584 2.5302066248940553 \n",
+ "US6680743050 2703150 2.235303301117127 \n",
+ "US6708371033 7251242 2.572462385836689 \n",
+ "US6896481032 1264277 2.9694066480437593 \n",
+ "US69349H1077 3326899 2.013668347320406 \n",
+ "KR7005490008 10000000 1.5593142658365693 \n",
+ "US69351T1060 18146577 2.6346104815070195 \n",
+ "US7234841010 12058547 2.086103530593631 \n",
+ "US7365088472 5770964 1.8706266553608955 \n",
+ "US7445731067 16912134 1.4434071117060308 \n",
+ "US8581191009 10000000 1.3158777300113855 \n",
+ "US8168511090 29579515 1.8683533328964472 \n",
+ "US8425871071 50294245 1.9963792988066478 \n",
+ "US88031M1099 10000000 1.3632817562247952 \n",
+ "US8808901081 10000000 1.5265556596582406 \n",
+ "US8873991033 10000000 1.2939425547566503 \n",
+ "US9129091081 10000000 1.5154085205221834 \n",
+ "US92939U1060 11046675 2.11253492554515 \n",
+ "US9818111026 10000000 1.26782307131814 \n",
+ "US98389B1008 27475073 1.8665476973515542 "
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# portfolio_df[portfolio_df.company_name=='POSCO']\n",
+ "portfolio_df.dropna(inplace=True)\n",
+ "portfolio_df.sort_values(by='company_name')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "0e9f1e29-ccb8-4b59-a1ba-95fdf792bf76",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "659616728"
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "weight_for_WATS = portfolio_df['investment_value'].sum()\n",
+ "weight_for_WATS"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "f3193208-3029-40d4-a7a2-e820a32eea56",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/michael/opt/miniconda3/envs/jupyter/lib/python3.10/site-packages/pint_pandas/pint_array.py:648: UnitStrippedWarning: The unit of the quantity is stripped when downcasting to ndarray.\n",
+ " return np.array(qtys, dtype=\"object\", copy=copy)\n",
+ "/Users/michael/opt/miniconda3/envs/jupyter/lib/python3.10/site-packages/pint_pandas/pint_array.py:648: UnitStrippedWarning: The unit of the quantity is stripped when downcasting to ndarray.\n",
+ " return np.array(qtys, dtype=\"object\", copy=copy)\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " company_name \n",
+ " company_lei \n",
+ " investment_value \n",
+ " pa_score \n",
+ " WATS_weight \n",
+ " \n",
+ " \n",
+ " company_id \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " US00130H1059 \n",
+ " AES Corp. \n",
+ " 2NUNNB7D43COUIRE5295 \n",
+ " 4351252 \n",
+ " 2.106926870694208 \n",
+ " 0.013898631388198987 \n",
+ " \n",
+ " \n",
+ " US0158577090 \n",
+ " Algonquin Power & Utilities Corp. \n",
+ " 549300K5VIUTJXQL7X75 \n",
+ " 2228185 \n",
+ " 1.2623320662937099 \n",
+ " 0.004264157132071172 \n",
+ " \n",
+ " \n",
+ " US0185223007 \n",
+ " ALLETE, Inc. \n",
+ " 549300NNLSIMY6Z8OT86 \n",
+ " 3829481 \n",
+ " 2.043793289146705 \n",
+ " 0.011865477687998862 \n",
+ " \n",
+ " \n",
+ " US0188021085 \n",
+ " Alliant Energy \n",
+ " 5493009ML300G373MZ12 \n",
+ " 3829481 \n",
+ " 1.867044766546712 \n",
+ " 0.010839343752422344 \n",
+ " \n",
+ " \n",
+ " US0236081024 \n",
+ " Ameren Corp. \n",
+ " XRZQ5S7HYJFPHJ78L959 \n",
+ " 15917812 \n",
+ " 2.404261301598871 \n",
+ " 0.058019419115953846 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " company_name company_lei \\\n",
+ "company_id \n",
+ "US00130H1059 AES Corp. 2NUNNB7D43COUIRE5295 \n",
+ "US0158577090 Algonquin Power & Utilities Corp. 549300K5VIUTJXQL7X75 \n",
+ "US0185223007 ALLETE, Inc. 549300NNLSIMY6Z8OT86 \n",
+ "US0188021085 Alliant Energy 5493009ML300G373MZ12 \n",
+ "US0236081024 Ameren Corp. XRZQ5S7HYJFPHJ78L959 \n",
+ "\n",
+ " investment_value pa_score WATS_weight \n",
+ "company_id \n",
+ "US00130H1059 4351252 2.106926870694208 0.013898631388198987 \n",
+ "US0158577090 2228185 1.2623320662937099 0.004264157132071172 \n",
+ "US0185223007 3829481 2.043793289146705 0.011865477687998862 \n",
+ "US0188021085 3829481 1.867044766546712 0.010839343752422344 \n",
+ "US0236081024 15917812 2.404261301598871 0.058019419115953846 "
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "portfolio_df['WATS_weight'] = portfolio_df['pa_score'] * (portfolio_df['investment_value'] / weight_for_WATS)\n",
+ "portfolio_df.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "id": "24fdeb51-94f1-40a4-ace9-5fdce4f5de8f",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Portfolio temperature score based on WATS = 1.946471711490046 delta_degree_Celsius\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(f\"Portfolio temperature score based on WATS = {portfolio_df['WATS_weight'].sum()}\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "95036586-82cc-4230-8946-eb3f7a07d283",
+ "metadata": {},
+ "source": [
+ "### Calculate portfolio alignment temperature score based on TETS\n",
+ "\n",
+ "We need to carefully meld portfolio data with corp fundamental data (in this case, emissions)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "id": "fddd23f0-7ca4-4ea8-8a54-ea71fee0f40b",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/michael/opt/miniconda3/envs/jupyter/lib/python3.10/site-packages/pint_pandas/pint_array.py:648: UnitStrippedWarning: The unit of the quantity is stripped when downcasting to ndarray.\n",
+ " return np.array(qtys, dtype=\"object\", copy=copy)\n",
+ "/Users/michael/opt/miniconda3/envs/jupyter/lib/python3.10/site-packages/pint_pandas/pint_array.py:648: UnitStrippedWarning: The unit of the quantity is stripped when downcasting to ndarray.\n",
+ " return np.array(qtys, dtype=\"object\", copy=copy)\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " company_name \n",
+ " company_lei \n",
+ " investment_value \n",
+ " pa_score \n",
+ " WATS_weight \n",
+ " TETS_weight \n",
+ " \n",
+ " \n",
+ " company_id \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " US00130H1059 \n",
+ " AES Corp. \n",
+ " 2NUNNB7D43COUIRE5295 \n",
+ " 4351252 \n",
+ " 2.106926870694208 \n",
+ " 0.013898631388198987 \n",
+ " 1.4900271821443577e-07 \n",
+ " \n",
+ " \n",
+ " US0158577090 \n",
+ " Algonquin Power & Utilities Corp. \n",
+ " 549300K5VIUTJXQL7X75 \n",
+ " 2228185 \n",
+ " 1.2623320662937099 \n",
+ " 0.004264157132071172 \n",
+ " 4.162829462365117e-12 \n",
+ " \n",
+ " \n",
+ " US0185223007 \n",
+ " ALLETE, Inc. \n",
+ " 549300NNLSIMY6Z8OT86 \n",
+ " 3829481 \n",
+ " 2.043793289146705 \n",
+ " 0.011865477687998862 \n",
+ " 5.2549678751293906e-08 \n",
+ " \n",
+ " \n",
+ " US0188021085 \n",
+ " Alliant Energy \n",
+ " 5493009ML300G373MZ12 \n",
+ " 3829481 \n",
+ " 1.867044766546712 \n",
+ " 0.010839343752422344 \n",
+ " 1.261547907437679e-07 \n",
+ " \n",
+ " \n",
+ " US0236081024 \n",
+ " Ameren Corp. \n",
+ " XRZQ5S7HYJFPHJ78L959 \n",
+ " 15917812 \n",
+ " 2.404261301598871 \n",
+ " 0.058019419115953846 \n",
+ " 3.4265102068870053e-07 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " company_name company_lei \\\n",
+ "company_id \n",
+ "US00130H1059 AES Corp. 2NUNNB7D43COUIRE5295 \n",
+ "US0158577090 Algonquin Power & Utilities Corp. 549300K5VIUTJXQL7X75 \n",
+ "US0185223007 ALLETE, Inc. 549300NNLSIMY6Z8OT86 \n",
+ "US0188021085 Alliant Energy 5493009ML300G373MZ12 \n",
+ "US0236081024 Ameren Corp. XRZQ5S7HYJFPHJ78L959 \n",
+ "\n",
+ " investment_value pa_score WATS_weight \\\n",
+ "company_id \n",
+ "US00130H1059 4351252 2.106926870694208 0.013898631388198987 \n",
+ "US0158577090 2228185 1.2623320662937099 0.004264157132071172 \n",
+ "US0185223007 3829481 2.043793289146705 0.011865477687998862 \n",
+ "US0188021085 3829481 1.867044766546712 0.010839343752422344 \n",
+ "US0236081024 15917812 2.404261301598871 0.058019419115953846 \n",
+ "\n",
+ " TETS_weight \n",
+ "company_id \n",
+ "US00130H1059 1.4900271821443577e-07 \n",
+ "US0158577090 4.162829462365117e-12 \n",
+ "US0185223007 5.2549678751293906e-08 \n",
+ "US0188021085 1.261547907437679e-07 \n",
+ "US0236081024 3.4265102068870053e-07 "
+ ]
+ },
+ "execution_count": 12,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "portfolio_df['TETS_weight'] = vault_company_data.compute_portfolio_weights(portfolio_df['pa_score'], 2019, 'emissions', EScope.S1S2)\n",
+ "portfolio_df.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "id": "68f22808-4ec2-4167-95ee-5b50f550dc59",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Portfolio temperature score based on TETS = 1.5060118497978 delta_degree_Celsius\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(f\"Portfolio temperature score based on TETS = {portfolio_df['TETS_weight'].sum()}\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "74453d3b-2288-4dfd-bb68-978c0cdf5f67",
+ "metadata": {},
+ "source": [
+ "### Calculate portfolio alignment temperature score based on MOTS, EOTS, ECOTS, AOTS, and ROTS\n",
+ "\n",
+ "* MOTS = market cap weights\n",
+ "* EOTS = enterprise value weights\n",
+ "* ECOTS = EVIC weights\n",
+ "* AOTS = asset weights\n",
+ "* ROTS = revenue weights"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "id": "0df8c5fc-2939-4ac1-9448-499803583eb1",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Portfolio temperature score based on MOTS = 1.998539728638169 delta_degree_Celsius\n",
+ "Portfolio temperature score based on EOTS = 1.9715101533914599 delta_degree_Celsius\n",
+ "Portfolio temperature score based on ECOTS = 1.9914244268264996 delta_degree_Celsius\n",
+ "Portfolio temperature score based on AOTS = 1.9769581669116627 delta_degree_Celsius\n",
+ "Portfolio temperature score based on ROTS = 1.8572293378229632 delta_degree_Celsius\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/michael/opt/miniconda3/envs/jupyter/lib/python3.10/site-packages/pint_pandas/pint_array.py:648: UnitStrippedWarning: The unit of the quantity is stripped when downcasting to ndarray.\n",
+ " return np.array(qtys, dtype=\"object\", copy=copy)\n",
+ "/Users/michael/opt/miniconda3/envs/jupyter/lib/python3.10/site-packages/pint_pandas/pint_array.py:648: UnitStrippedWarning: The unit of the quantity is stripped when downcasting to ndarray.\n",
+ " return np.array(qtys, dtype=\"object\", copy=copy)\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " company_name \n",
+ " company_lei \n",
+ " investment_value \n",
+ " pa_score \n",
+ " WATS_weight \n",
+ " TETS_weight \n",
+ " MOTS_weight \n",
+ " EOTS_weight \n",
+ " ECOTS_weight \n",
+ " AOTS_weight \n",
+ " ROTS_weight \n",
+ " \n",
+ " \n",
+ " company_id \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " US00130H1059 \n",
+ " AES Corp. \n",
+ " 2NUNNB7D43COUIRE5295 \n",
+ " 4351252 \n",
+ " 2.106926870694208 \n",
+ " 0.013898631388198987 \n",
+ " 1.4900271821443577e-07 \n",
+ " 0.03357412161990311 \n",
+ " 0.020337868906115608 \n",
+ " 0.03667288993043838 \n",
+ " 0.04816939688533329 \n",
+ " 0.05276197099873813 \n",
+ " \n",
+ " \n",
+ " US0158577090 \n",
+ " Algonquin Power & Utilities Corp. \n",
+ " 549300K5VIUTJXQL7X75 \n",
+ " 2228185 \n",
+ " 1.2623320662937099 \n",
+ " 0.004264157132071172 \n",
+ " 4.162829462365117e-12 \n",
+ " nan \n",
+ " nan \n",
+ " nan \n",
+ " 0.009358782813005341 \n",
+ " 0.0050413384247108275 \n",
+ " \n",
+ " \n",
+ " US0185223007 \n",
+ " ALLETE, Inc. \n",
+ " 549300NNLSIMY6Z8OT86 \n",
+ " 3829481 \n",
+ " 2.043793289146705 \n",
+ " 0.011865477687998862 \n",
+ " 5.2549678751293906e-08 \n",
+ " 0.012839373901951686 \n",
+ " 0.011385162596862225 \n",
+ " 0.013018784526381704 \n",
+ " 0.007613807008198652 \n",
+ " 0.006231229172975224 \n",
+ " \n",
+ " \n",
+ " US0188021085 \n",
+ " Alliant Energy \n",
+ " 5493009ML300G373MZ12 \n",
+ " 3829481 \n",
+ " 1.867044766546712 \n",
+ " 0.010839343752422344 \n",
+ " 1.261547907437679e-07 \n",
+ " 0.03174960844912046 \n",
+ " 0.0330110683879106 \n",
+ " 0.03172544768591218 \n",
+ " 0.021186142904952205 \n",
+ " 0.016738395724396053 \n",
+ " \n",
+ " \n",
+ " US0236081024 \n",
+ " Ameren Corp. \n",
+ " XRZQ5S7HYJFPHJ78L959 \n",
+ " 15917812 \n",
+ " 2.404261301598871 \n",
+ " 0.058019419115953846 \n",
+ " 3.4265102068870053e-07 \n",
+ " 0.06477745482537144 \n",
+ " 0.06387775855844924 \n",
+ " 0.06469360527719219 \n",
+ " 0.04726477824338227 \n",
+ " 0.034922806188620925 \n",
+ " \n",
+ " \n",
+ " US0255371017 \n",
+ " American Electric Power Co., Inc. \n",
+ " 1B4S6S7G0TW5EE83BO58 \n",
+ " 45520637 \n",
+ " 2.1814181749376793 \n",
+ " 0.15054127748946447 \n",
+ " 7.719971932013753e-07 \n",
+ " 0.139082507959553 \n",
+ " 0.15303279317063806 \n",
+ " 0.13956919099354945 \n",
+ " 0.11248617091168711 \n",
+ " 0.08343102518455157 \n",
+ " \n",
+ " \n",
+ " US05351W1036 \n",
+ " Avangrid, Inc. \n",
+ " 549300OX0Q38NLSKPB49 \n",
+ " 10049068 \n",
+ " 1.624145450892199 \n",
+ " 0.024743381095553976 \n",
+ " 2.5939403676600244e-10 \n",
+ " 0.00675237883315782 \n",
+ " 0.016801248692288422 \n",
+ " 0.007160665331019981 \n",
+ " 0.0379793742030801 \n",
+ " 0.02529980312047131 \n",
+ " \n",
+ " \n",
+ " US05379B1070 \n",
+ " Avista Corp. \n",
+ " Q0IK63NITJD6RJ47SW96 \n",
+ " 2804211 \n",
+ " 1.7099274356102043 \n",
+ " 0.0072693688934764664 \n",
+ " 2.5464088060658733e-08 \n",
+ " 0.007391183784912206 \n",
+ " 0.008035321000941292 \n",
+ " 0.007399948532530545 \n",
+ " 0.007066740568098292 \n",
+ " 0.005655105952879468 \n",
+ " \n",
+ " \n",
+ " US18551QAA58 \n",
+ " Cleco Partners LP \n",
+ " 5493002H80P81B3HXL31 \n",
+ " 3086052 \n",
+ " 2.280309768660802 \n",
+ " 0.01066855072571053 \n",
+ " 1.1727968749659209e-07 \n",
+ " nan \n",
+ " nan \n",
+ " nan \n",
+ " 0.011583583746330367 \n",
+ " 0.009189101919284608 \n",
+ " \n",
+ " \n",
+ " US1258961002 \n",
+ " CMS Energy \n",
+ " 549300IA9XFBAGNIBW29 \n",
+ " 9153135 \n",
+ " 2.1320023723934343 \n",
+ " 0.02958461286148185 \n",
+ " 1.624135308468388e-07 \n",
+ " 0.05110745034256367 \n",
+ " 0.05737401152284647 \n",
+ " 0.05143351653370429 \n",
+ " 0.038876229852125306 \n",
+ " 0.035867501304020305 \n",
+ " \n",
+ " \n",
+ " US2091151041 \n",
+ " Consolidated Edison, Inc. \n",
+ " 54930033SBW53OO8T749 \n",
+ " 20394113 \n",
+ " 1.7197135175610079 \n",
+ " 0.0531703189382527 \n",
+ " 1.2591698410405677e-08 \n",
+ " 0.0733626055289818 \n",
+ " 0.07902737580492676 \n",
+ " 0.07567171610839929 \n",
+ " 0.06786373005464445 \n",
+ " 0.05314587328152441 \n",
+ " \n",
+ " \n",
+ " US25746U1097 \n",
+ " Dominion Energy \n",
+ " ILUL7B6Z54MRYCF6H308 \n",
+ " 33528082 \n",
+ " 1.6421622410252814 \n",
+ " 0.08347051846507961 \n",
+ " 3.14248738011264e-07 \n",
+ " 0.14925655201730625 \n",
+ " 0.15010182616211487 \n",
+ " 0.1493324514553829 \n",
+ " 0.11584362182232663 \n",
+ " 0.06688534526952991 \n",
+ " \n",
+ " \n",
+ " US2333311072 \n",
+ " DTE Energy \n",
+ " 549300IX8SD6XXD71I78 \n",
+ " 14329945 \n",
+ " 2.494203358852266 \n",
+ " 0.054185704264262134 \n",
+ " 4.099910696471906e-07 \n",
+ " 0.0844635815144744 \n",
+ " 0.09476515956854094 \n",
+ " 0.08462019002077521 \n",
+ " 0.07097767408945654 \n",
+ " 0.07766300356121279 \n",
+ " \n",
+ " \n",
+ " US26441C2044 \n",
+ " Duke Energy Corp. \n",
+ " I1BZKREC126H0VB1BL91 \n",
+ " 73069652 \n",
+ " 1.8259317788445726 \n",
+ " 0.20226927849518375 \n",
+ " 9.29026546418335e-07 \n",
+ " 0.17193009401045845 \n",
+ " 0.22155105310535217 \n",
+ " 0.17238886319907545 \n",
+ " 0.1970613477213826 \n",
+ " 0.11254721411236115 \n",
+ " \n",
+ " \n",
+ " US283677AZ52 \n",
+ " El Paso Electric Co \n",
+ " OZ8GM8L4AHPKSWZMW205 \n",
+ " 2646941 \n",
+ " 1.864862725462496 \n",
+ " 0.007483408770370701 \n",
+ " 3.429901756307964e-08 \n",
+ " 0.007206687865731673 \n",
+ " 0.007350616245331298 \n",
+ " 0.007220609667618246 \n",
+ " 0.0048316886860380335 \n",
+ " 0.003950855064002835 \n",
+ " \n",
+ " \n",
+ " US29364G1031 \n",
+ " Entergy Corp. \n",
+ " 4XM3TW50JULSLG8BNC79 \n",
+ " 29844269 \n",
+ " 1.727230341297715 \n",
+ " 0.07814830149463829 \n",
+ " 3.4959645003586115e-07 \n",
+ " 0.05190745937361752 \n",
+ " 0.06458856665766571 \n",
+ " 0.05287080443504319 \n",
+ " 0.06070215564531642 \n",
+ " 0.046181301440845035 \n",
+ " \n",
+ " \n",
+ " US30034W1062 \n",
+ " Evergy, Inc. \n",
+ " 549300PGTHDQY6PSUI61 \n",
+ " 18254954 \n",
+ " 2.1869485449964037 \n",
+ " 0.06052400340167886 \n",
+ " 3.5614524723693755e-07 \n",
+ " 0.045326633364450857 \n",
+ " 0.04777411915987389 \n",
+ " 0.045302805246517155 \n",
+ " 0.03859860953695048 \n",
+ " 0.02766943029282214 \n",
+ " \n",
+ " \n",
+ " US30040W1080 \n",
+ " Eversource Energy \n",
+ " SJ7XXD41SQU3ZNWUJ746 \n",
+ " 18962480 \n",
+ " 1.2636355763883802 \n",
+ " 0.03632664747179234 \n",
+ " 1.7023588038521205e-12 \n",
+ " 0.045360009814775525 \n",
+ " 0.046175243275212934 \n",
+ " 0.045290416308094134 \n",
+ " 0.03530846103939446 \n",
+ " 0.026480799897099 \n",
+ " \n",
+ " \n",
+ " US3379321074 \n",
+ " FirstEnergy Corp. \n",
+ " 549300SVYJS666PQJH88 \n",
+ " 27277340 \n",
+ " 3.4408564514595774 \n",
+ " 0.14229082940670418 \n",
+ " 3.897594054855418e-07 \n",
+ " 0.11462889184363255 \n",
+ " 0.13715660868982169 \n",
+ " 0.1175368082535572 \n",
+ " 0.0988962172735531 \n",
+ " 0.09332089148551007 \n",
+ " \n",
+ " \n",
+ " CA3495531079 \n",
+ " Fortis, Inc \n",
+ " 549300MQYQ9Y065XPR71 \n",
+ " 12428756 \n",
+ " 2.8403172973777053 \n",
+ " 0.05351836779325424 \n",
+ " 1.519730021856325e-07 \n",
+ " nan \n",
+ " nan \n",
+ " nan \n",
+ " 0.07911656908686812 \n",
+ " 0.0470667310963962 \n",
+ " \n",
+ " \n",
+ " US6362744095 \n",
+ " National Grid plc \n",
+ " 8R95QZMKZLJX5Q2XR704 \n",
+ " 12281584 \n",
+ " 2.5302066248940553 \n",
+ " 0.047110608148483515 \n",
+ " 3.640382115837752e-08 \n",
+ " 0.15127568349562315 \n",
+ " nan \n",
+ " 0.15215975540910204 \n",
+ " 0.14057664279423704 \n",
+ " 0.12060139050049665 \n",
+ " \n",
+ " \n",
+ " US6680743050 \n",
+ " NorthWestern Corp. \n",
+ " 3BPWMBHR1R9SHUN7J795 \n",
+ " 2703150 \n",
+ " 2.235303301117127 \n",
+ " 0.009160410677781903 \n",
+ " 3.6548819631302805e-08 \n",
+ " 0.011926077613739264 \n",
+ " 0.012924704639595212 \n",
+ " 0.011917103321524023 \n",
+ " 0.008977140347481906 \n",
+ " 0.006910763261421611 \n",
+ " \n",
+ " \n",
+ " US6708371033 \n",
+ " OG&E Energy \n",
+ " CE5OG6JPOZMDSA0LAQ19 \n",
+ " 7251242 \n",
+ " 2.572462385836689 \n",
+ " 0.028279372708084515 \n",
+ " 1.5803838520201566e-07 \n",
+ " 0.03212831171274878 \n",
+ " nan \n",
+ " nan \n",
+ " 0.019269149564939952 \n",
+ " 0.014109296911343806 \n",
+ " \n",
+ " \n",
+ " US6896481032 \n",
+ " Otter Tail Corp. \n",
+ " 549300HHVBQRQUVKKD91 \n",
+ " 1264277 \n",
+ " 2.9694066480437593 \n",
+ " 0.0056914149829881515 \n",
+ " 4.7091070069869694e-08 \n",
+ " 0.008880331745854566 \n",
+ " 0.007702315685602822 \n",
+ " 0.008953203650381842 \n",
+ " 0.004587174627040453 \n",
+ " 0.0067106225780971685 \n",
+ " \n",
+ " \n",
+ " US7234841010 \n",
+ " Pinnacle West Capital Corp. \n",
+ " TWSEY0NEDUDCKS27AH81 \n",
+ " 12058547 \n",
+ " 2.086103530593631 \n",
+ " 0.0381363546476481 \n",
+ " 1.3398156342413038e-07 \n",
+ " 0.0322213776799511 \n",
+ " 0.03332942990290081 \n",
+ " 0.03218305838813145 \n",
+ " 0.02619284180162325 \n",
+ " 0.017797401906124867 \n",
+ " \n",
+ " \n",
+ " US69349H1077 \n",
+ " PNM Resources, Inc. \n",
+ " 5493003JOBJGLZSDDQ28 \n",
+ " 3326899 \n",
+ " 2.013668347320406 \n",
+ " 0.010156308848237565 \n",
+ " 6.580530342148538e-08 \n",
+ " 0.01197077404907257 \n",
+ " 0.012639253078697257 \n",
+ " 0.01195617040266632 \n",
+ " 0.009986202103731528 \n",
+ " 0.00721385126240408 \n",
+ " \n",
+ " \n",
+ " US7365088472 \n",
+ " Portland General Electric Co. \n",
+ " GJOUP9M7C39GLSK9R870 \n",
+ " 5770964 \n",
+ " 1.8706266553608955 \n",
+ " 0.01636604808107313 \n",
+ " 8.680131385312401e-08 \n",
+ " 0.013227637419492053 \n",
+ " 0.014000404723625308 \n",
+ " 0.013281115197873679 \n",
+ " 0.010668873721131752 \n",
+ " 0.009760613126775643 \n",
+ " \n",
+ " \n",
+ " US69351T1060 \n",
+ " PPL \n",
+ " 9N3UAJSNOUXFKQLF3V18 \n",
+ " 18146577 \n",
+ " 2.6346104815070195 \n",
+ " 0.07248021455222131 \n",
+ " 4.615993605738829e-07 \n",
+ " 0.08645396244422032 \n",
+ " 0.10941513137405769 \n",
+ " 0.08940788996261194 \n",
+ " 0.08177207191530365 \n",
+ " 0.05030620119633238 \n",
+ " \n",
+ " \n",
+ " US7445731067 \n",
+ " Public Service Enterprise Group \n",
+ " PUSS41EMO3E6XXNV3U28 \n",
+ " 16912134 \n",
+ " 1.4434071117060308 \n",
+ " 0.03700799790772644 \n",
+ " 1.0168628604665428e-07 \n",
+ " 0.06245019087418841 \n",
+ " 0.0635679978881717 \n",
+ " 0.0626254824927157 \n",
+ " 0.04681044465151272 \n",
+ " 0.03574513867355394 \n",
+ " \n",
+ " \n",
+ " US8168511090 \n",
+ " Sempra Energy \n",
+ " PBBKGKLRK5S5C0Y4T545 \n",
+ " 29579515 \n",
+ " 1.8683533328964472 \n",
+ " 0.08378348075446392 \n",
+ " 5.634458021974756e-09 \n",
+ " 0.10325854818136664 \n",
+ " 0.10421959985473984 \n",
+ " 0.10333035558010317 \n",
+ " 0.08335956719180115 \n",
+ " 0.04972643805524998 \n",
+ " \n",
+ " \n",
+ " US8425871071 \n",
+ " Southern Co. \n",
+ " 549300FC3G3YU2FBZD92 \n",
+ " 50294245 \n",
+ " 1.9963792988066478 \n",
+ " 0.1522192893311671 \n",
+ " 7.710068482171507e-07 \n",
+ " 0.16915956105446733 \n",
+ " 0.18622750506679941 \n",
+ " 0.1745612532143091 \n",
+ " 0.16101126726344764 \n",
+ " 0.10509504376408856 \n",
+ " \n",
+ " \n",
+ " US92939U1060 \n",
+ " WEC Energy Group \n",
+ " 549300IGLYTZUK3PVP70 \n",
+ " 11046675 \n",
+ " 2.11253492554515 \n",
+ " 0.03537885829457992 \n",
+ " 1.2699795919947189e-07 \n",
+ " 0.08144891426414327 \n",
+ " 0.07695104488519561 \n",
+ " 0.08138861437944513 \n",
+ " 0.050169056739773205 \n",
+ " 0.03906076269591012 \n",
+ " \n",
+ " \n",
+ " US98389B1008 \n",
+ " Xcel Energy, Inc. \n",
+ " LGJNMI9GH8XIDG5RCM61 \n",
+ " 27475073 \n",
+ " 1.8665476973515542 \n",
+ " 0.07774747374617197 \n",
+ " 4.710003986931088e-07 \n",
+ " 0.08381128240682202 \n",
+ " 0.0902630207506063 \n",
+ " 0.08430712540675832 \n",
+ " 0.06398019170908303 \n",
+ " 0.05288965305341673 \n",
+ " \n",
+ " \n",
+ " US1442851036 \n",
+ " CARPENTER TECHNOLOGY CORP \n",
+ " DX6I6ZD3X5WNNCDJKP85 \n",
+ " 10000000 \n",
+ " 1.9900906690954119 \n",
+ " 0.030170409339518933 \n",
+ " 0.011607472600352978 \n",
+ " 0.004922291988089818 \n",
+ " 0.004204096572007335 \n",
+ " 0.004990244394801827 \n",
+ " 0.004310487808706214 \n",
+ " 0.011641965312984528 \n",
+ " \n",
+ " \n",
+ " US2017231034 \n",
+ " COMMERCIAL METALS CO \n",
+ " 549300OQS2LO07ZJ7N73 \n",
+ " 10000000 \n",
+ " 1.2990617896624888 \n",
+ " 0.019694191103996513 \n",
+ " 0.020154780490691044 \n",
+ " 0.003618337414588834 \n",
+ " nan \n",
+ " nan \n",
+ " 0.0033177080579832835 \n",
+ " 0.018610755334314076 \n",
+ " \n",
+ " \n",
+ " US3737371050 \n",
+ " GERDAU S.A. \n",
+ " 254900YDV6SEQQPZVG24 \n",
+ " 10000000 \n",
+ " 1.375590655258247 \n",
+ " 0.020854393117486963 \n",
+ " 0.10005546157880678 \n",
+ " nan \n",
+ " nan \n",
+ " nan \n",
+ " 0.01252243765842747 \n",
+ " 0.03325265337048597 \n",
+ " \n",
+ " \n",
+ " US6703461052 \n",
+ " NUCOR CORP \n",
+ " 549300GGJCRSI2TIEJ46 \n",
+ " 10000000 \n",
+ " 1.315430185746877 \n",
+ " 0.019942341209801415 \n",
+ " 0.07848167099244932 \n",
+ " 0.03197260211182495 \n",
+ " 0.024305171544838817 \n",
+ " 0.03485634781003422 \n",
+ " 0.016396082842808767 \n",
+ " 0.07303012863213186 \n",
+ " \n",
+ " \n",
+ " KR7005490008 \n",
+ " POSCO \n",
+ " 988400E5HRVX81AYLM04 \n",
+ " 10000000 \n",
+ " 1.5593142658365693 \n",
+ " 0.023639701657726442 \n",
+ " 0.7619530611957582 \n",
+ " nan \n",
+ " nan \n",
+ " nan \n",
+ " 0.07263123014493186 \n",
+ " 0.21444667139178533 \n",
+ " \n",
+ " \n",
+ " US8581191009 \n",
+ " STEEL DYNAMICS INC \n",
+ " 549300HGGKEL4FYTTQ83 \n",
+ " 10000000 \n",
+ " 1.3158777300113855 \n",
+ " 0.019949126123608336 \n",
+ " 0.039172201098130216 \n",
+ " 0.009645199046956762 \n",
+ " 0.007987945257169369 \n",
+ " 0.012283462287977612 \n",
+ " 0.007399224052972695 \n",
+ " 0.033844989431466715 \n",
+ " \n",
+ " \n",
+ " US88031M1099 \n",
+ " TENARIS SA \n",
+ " 549300Y7C05BKC4HZB40 \n",
+ " 10000000 \n",
+ " 1.3632817562247952 \n",
+ " 0.020667786281866326 \n",
+ " 0.021579100261655475 \n",
+ " nan \n",
+ " nan \n",
+ " nan \n",
+ " 0.013748950184392398 \n",
+ " 0.024439630936756346 \n",
+ " \n",
+ " \n",
+ " US8808901081 \n",
+ " TERNIUM S.A. \n",
+ " 529900QG4KU23TEI2E46 \n",
+ " 10000000 \n",
+ " 1.5265556596582406 \n",
+ " 0.02314307073877363 \n",
+ " 0.1656445290791045 \n",
+ " nan \n",
+ " nan \n",
+ " nan \n",
+ " 0.013417124921380242 \n",
+ " 0.03824255500688262 \n",
+ " \n",
+ " \n",
+ " US8873991033 \n",
+ " TIMKENSTEEL CORP \n",
+ " 549300QZTZWHDE9HJL14 \n",
+ " 10000000 \n",
+ " 1.2939425547566503 \n",
+ " 0.019616581869898397 \n",
+ " 0.003395288672058109 \n",
+ " 0.0006402471902290573 \n",
+ " 0.0004950917770041775 \n",
+ " 0.0006901566101955718 \n",
+ " 0.0009540854493255154 \n",
+ " 0.0038442306237322942 \n",
+ " \n",
+ " \n",
+ " US9129091081 \n",
+ " UNITED STATES STEEL CORP \n",
+ " JNLUVFYJT1OZSIQ24U47 \n",
+ " 10000000 \n",
+ " 1.5154085205221834 \n",
+ " 0.022974076553773867 \n",
+ " 0.3016836955421658 \n",
+ " 0.005776020500960534 \n",
+ " 0.008152423592683745 \n",
+ " 0.007423865256675461 \n",
+ " 0.011952248543683201 \n",
+ " 0.04818404875572425 \n",
+ " \n",
+ " \n",
+ " US9818111026 \n",
+ " WORTHINGTON INDUSTRIES INC \n",
+ " 1WRCIANKYOIK6KYE5E82 \n",
+ " 10000000 \n",
+ " 1.26782307131814 \n",
+ " 0.0192206021694183 \n",
+ " 0.0022773902818980568 \n",
+ " 0.0030357823938668522 \n",
+ " 0.002779215292872067 \n",
+ " 0.003200509556000493 \n",
+ " 0.0021628807238201053 \n",
+ " 0.011714808549532102 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " company_name company_lei \\\n",
+ "company_id \n",
+ "US00130H1059 AES Corp. 2NUNNB7D43COUIRE5295 \n",
+ "US0158577090 Algonquin Power & Utilities Corp. 549300K5VIUTJXQL7X75 \n",
+ "US0185223007 ALLETE, Inc. 549300NNLSIMY6Z8OT86 \n",
+ "US0188021085 Alliant Energy 5493009ML300G373MZ12 \n",
+ "US0236081024 Ameren Corp. XRZQ5S7HYJFPHJ78L959 \n",
+ "US0255371017 American Electric Power Co., Inc. 1B4S6S7G0TW5EE83BO58 \n",
+ "US05351W1036 Avangrid, Inc. 549300OX0Q38NLSKPB49 \n",
+ "US05379B1070 Avista Corp. Q0IK63NITJD6RJ47SW96 \n",
+ "US18551QAA58 Cleco Partners LP 5493002H80P81B3HXL31 \n",
+ "US1258961002 CMS Energy 549300IA9XFBAGNIBW29 \n",
+ "US2091151041 Consolidated Edison, Inc. 54930033SBW53OO8T749 \n",
+ "US25746U1097 Dominion Energy ILUL7B6Z54MRYCF6H308 \n",
+ "US2333311072 DTE Energy 549300IX8SD6XXD71I78 \n",
+ "US26441C2044 Duke Energy Corp. I1BZKREC126H0VB1BL91 \n",
+ "US283677AZ52 El Paso Electric Co OZ8GM8L4AHPKSWZMW205 \n",
+ "US29364G1031 Entergy Corp. 4XM3TW50JULSLG8BNC79 \n",
+ "US30034W1062 Evergy, Inc. 549300PGTHDQY6PSUI61 \n",
+ "US30040W1080 Eversource Energy SJ7XXD41SQU3ZNWUJ746 \n",
+ "US3379321074 FirstEnergy Corp. 549300SVYJS666PQJH88 \n",
+ "CA3495531079 Fortis, Inc 549300MQYQ9Y065XPR71 \n",
+ "US6362744095 National Grid plc 8R95QZMKZLJX5Q2XR704 \n",
+ "US6680743050 NorthWestern Corp. 3BPWMBHR1R9SHUN7J795 \n",
+ "US6708371033 OG&E Energy CE5OG6JPOZMDSA0LAQ19 \n",
+ "US6896481032 Otter Tail Corp. 549300HHVBQRQUVKKD91 \n",
+ "US7234841010 Pinnacle West Capital Corp. TWSEY0NEDUDCKS27AH81 \n",
+ "US69349H1077 PNM Resources, Inc. 5493003JOBJGLZSDDQ28 \n",
+ "US7365088472 Portland General Electric Co. GJOUP9M7C39GLSK9R870 \n",
+ "US69351T1060 PPL 9N3UAJSNOUXFKQLF3V18 \n",
+ "US7445731067 Public Service Enterprise Group PUSS41EMO3E6XXNV3U28 \n",
+ "US8168511090 Sempra Energy PBBKGKLRK5S5C0Y4T545 \n",
+ "US8425871071 Southern Co. 549300FC3G3YU2FBZD92 \n",
+ "US92939U1060 WEC Energy Group 549300IGLYTZUK3PVP70 \n",
+ "US98389B1008 Xcel Energy, Inc. LGJNMI9GH8XIDG5RCM61 \n",
+ "US1442851036 CARPENTER TECHNOLOGY CORP DX6I6ZD3X5WNNCDJKP85 \n",
+ "US2017231034 COMMERCIAL METALS CO 549300OQS2LO07ZJ7N73 \n",
+ "US3737371050 GERDAU S.A. 254900YDV6SEQQPZVG24 \n",
+ "US6703461052 NUCOR CORP 549300GGJCRSI2TIEJ46 \n",
+ "KR7005490008 POSCO 988400E5HRVX81AYLM04 \n",
+ "US8581191009 STEEL DYNAMICS INC 549300HGGKEL4FYTTQ83 \n",
+ "US88031M1099 TENARIS SA 549300Y7C05BKC4HZB40 \n",
+ "US8808901081 TERNIUM S.A. 529900QG4KU23TEI2E46 \n",
+ "US8873991033 TIMKENSTEEL CORP 549300QZTZWHDE9HJL14 \n",
+ "US9129091081 UNITED STATES STEEL CORP JNLUVFYJT1OZSIQ24U47 \n",
+ "US9818111026 WORTHINGTON INDUSTRIES INC 1WRCIANKYOIK6KYE5E82 \n",
+ "\n",
+ " investment_value pa_score WATS_weight \\\n",
+ "company_id \n",
+ "US00130H1059 4351252 2.106926870694208 0.013898631388198987 \n",
+ "US0158577090 2228185 1.2623320662937099 0.004264157132071172 \n",
+ "US0185223007 3829481 2.043793289146705 0.011865477687998862 \n",
+ "US0188021085 3829481 1.867044766546712 0.010839343752422344 \n",
+ "US0236081024 15917812 2.404261301598871 0.058019419115953846 \n",
+ "US0255371017 45520637 2.1814181749376793 0.15054127748946447 \n",
+ "US05351W1036 10049068 1.624145450892199 0.024743381095553976 \n",
+ "US05379B1070 2804211 1.7099274356102043 0.0072693688934764664 \n",
+ "US18551QAA58 3086052 2.280309768660802 0.01066855072571053 \n",
+ "US1258961002 9153135 2.1320023723934343 0.02958461286148185 \n",
+ "US2091151041 20394113 1.7197135175610079 0.0531703189382527 \n",
+ "US25746U1097 33528082 1.6421622410252814 0.08347051846507961 \n",
+ "US2333311072 14329945 2.494203358852266 0.054185704264262134 \n",
+ "US26441C2044 73069652 1.8259317788445726 0.20226927849518375 \n",
+ "US283677AZ52 2646941 1.864862725462496 0.007483408770370701 \n",
+ "US29364G1031 29844269 1.727230341297715 0.07814830149463829 \n",
+ "US30034W1062 18254954 2.1869485449964037 0.06052400340167886 \n",
+ "US30040W1080 18962480 1.2636355763883802 0.03632664747179234 \n",
+ "US3379321074 27277340 3.4408564514595774 0.14229082940670418 \n",
+ "CA3495531079 12428756 2.8403172973777053 0.05351836779325424 \n",
+ "US6362744095 12281584 2.5302066248940553 0.047110608148483515 \n",
+ "US6680743050 2703150 2.235303301117127 0.009160410677781903 \n",
+ "US6708371033 7251242 2.572462385836689 0.028279372708084515 \n",
+ "US6896481032 1264277 2.9694066480437593 0.0056914149829881515 \n",
+ "US7234841010 12058547 2.086103530593631 0.0381363546476481 \n",
+ "US69349H1077 3326899 2.013668347320406 0.010156308848237565 \n",
+ "US7365088472 5770964 1.8706266553608955 0.01636604808107313 \n",
+ "US69351T1060 18146577 2.6346104815070195 0.07248021455222131 \n",
+ "US7445731067 16912134 1.4434071117060308 0.03700799790772644 \n",
+ "US8168511090 29579515 1.8683533328964472 0.08378348075446392 \n",
+ "US8425871071 50294245 1.9963792988066478 0.1522192893311671 \n",
+ "US92939U1060 11046675 2.11253492554515 0.03537885829457992 \n",
+ "US98389B1008 27475073 1.8665476973515542 0.07774747374617197 \n",
+ "US1442851036 10000000 1.9900906690954119 0.030170409339518933 \n",
+ "US2017231034 10000000 1.2990617896624888 0.019694191103996513 \n",
+ "US3737371050 10000000 1.375590655258247 0.020854393117486963 \n",
+ "US6703461052 10000000 1.315430185746877 0.019942341209801415 \n",
+ "KR7005490008 10000000 1.5593142658365693 0.023639701657726442 \n",
+ "US8581191009 10000000 1.3158777300113855 0.019949126123608336 \n",
+ "US88031M1099 10000000 1.3632817562247952 0.020667786281866326 \n",
+ "US8808901081 10000000 1.5265556596582406 0.02314307073877363 \n",
+ "US8873991033 10000000 1.2939425547566503 0.019616581869898397 \n",
+ "US9129091081 10000000 1.5154085205221834 0.022974076553773867 \n",
+ "US9818111026 10000000 1.26782307131814 0.0192206021694183 \n",
+ "\n",
+ " TETS_weight MOTS_weight \\\n",
+ "company_id \n",
+ "US00130H1059 1.4900271821443577e-07 0.03357412161990311 \n",
+ "US0158577090 4.162829462365117e-12 nan \n",
+ "US0185223007 5.2549678751293906e-08 0.012839373901951686 \n",
+ "US0188021085 1.261547907437679e-07 0.03174960844912046 \n",
+ "US0236081024 3.4265102068870053e-07 0.06477745482537144 \n",
+ "US0255371017 7.719971932013753e-07 0.139082507959553 \n",
+ "US05351W1036 2.5939403676600244e-10 0.00675237883315782 \n",
+ "US05379B1070 2.5464088060658733e-08 0.007391183784912206 \n",
+ "US18551QAA58 1.1727968749659209e-07 nan \n",
+ "US1258961002 1.624135308468388e-07 0.05110745034256367 \n",
+ "US2091151041 1.2591698410405677e-08 0.0733626055289818 \n",
+ "US25746U1097 3.14248738011264e-07 0.14925655201730625 \n",
+ "US2333311072 4.099910696471906e-07 0.0844635815144744 \n",
+ "US26441C2044 9.29026546418335e-07 0.17193009401045845 \n",
+ "US283677AZ52 3.429901756307964e-08 0.007206687865731673 \n",
+ "US29364G1031 3.4959645003586115e-07 0.05190745937361752 \n",
+ "US30034W1062 3.5614524723693755e-07 0.045326633364450857 \n",
+ "US30040W1080 1.7023588038521205e-12 0.045360009814775525 \n",
+ "US3379321074 3.897594054855418e-07 0.11462889184363255 \n",
+ "CA3495531079 1.519730021856325e-07 nan \n",
+ "US6362744095 3.640382115837752e-08 0.15127568349562315 \n",
+ "US6680743050 3.6548819631302805e-08 0.011926077613739264 \n",
+ "US6708371033 1.5803838520201566e-07 0.03212831171274878 \n",
+ "US6896481032 4.7091070069869694e-08 0.008880331745854566 \n",
+ "US7234841010 1.3398156342413038e-07 0.0322213776799511 \n",
+ "US69349H1077 6.580530342148538e-08 0.01197077404907257 \n",
+ "US7365088472 8.680131385312401e-08 0.013227637419492053 \n",
+ "US69351T1060 4.615993605738829e-07 0.08645396244422032 \n",
+ "US7445731067 1.0168628604665428e-07 0.06245019087418841 \n",
+ "US8168511090 5.634458021974756e-09 0.10325854818136664 \n",
+ "US8425871071 7.710068482171507e-07 0.16915956105446733 \n",
+ "US92939U1060 1.2699795919947189e-07 0.08144891426414327 \n",
+ "US98389B1008 4.710003986931088e-07 0.08381128240682202 \n",
+ "US1442851036 0.011607472600352978 0.004922291988089818 \n",
+ "US2017231034 0.020154780490691044 0.003618337414588834 \n",
+ "US3737371050 0.10005546157880678 nan \n",
+ "US6703461052 0.07848167099244932 0.03197260211182495 \n",
+ "KR7005490008 0.7619530611957582 nan \n",
+ "US8581191009 0.039172201098130216 0.009645199046956762 \n",
+ "US88031M1099 0.021579100261655475 nan \n",
+ "US8808901081 0.1656445290791045 nan \n",
+ "US8873991033 0.003395288672058109 0.0006402471902290573 \n",
+ "US9129091081 0.3016836955421658 0.005776020500960534 \n",
+ "US9818111026 0.0022773902818980568 0.0030357823938668522 \n",
+ "\n",
+ " EOTS_weight ECOTS_weight \\\n",
+ "company_id \n",
+ "US00130H1059 0.020337868906115608 0.03667288993043838 \n",
+ "US0158577090 nan nan \n",
+ "US0185223007 0.011385162596862225 0.013018784526381704 \n",
+ "US0188021085 0.0330110683879106 0.03172544768591218 \n",
+ "US0236081024 0.06387775855844924 0.06469360527719219 \n",
+ "US0255371017 0.15303279317063806 0.13956919099354945 \n",
+ "US05351W1036 0.016801248692288422 0.007160665331019981 \n",
+ "US05379B1070 0.008035321000941292 0.007399948532530545 \n",
+ "US18551QAA58 nan nan \n",
+ "US1258961002 0.05737401152284647 0.05143351653370429 \n",
+ "US2091151041 0.07902737580492676 0.07567171610839929 \n",
+ "US25746U1097 0.15010182616211487 0.1493324514553829 \n",
+ "US2333311072 0.09476515956854094 0.08462019002077521 \n",
+ "US26441C2044 0.22155105310535217 0.17238886319907545 \n",
+ "US283677AZ52 0.007350616245331298 0.007220609667618246 \n",
+ "US29364G1031 0.06458856665766571 0.05287080443504319 \n",
+ "US30034W1062 0.04777411915987389 0.045302805246517155 \n",
+ "US30040W1080 0.046175243275212934 0.045290416308094134 \n",
+ "US3379321074 0.13715660868982169 0.1175368082535572 \n",
+ "CA3495531079 nan nan \n",
+ "US6362744095 nan 0.15215975540910204 \n",
+ "US6680743050 0.012924704639595212 0.011917103321524023 \n",
+ "US6708371033 nan nan \n",
+ "US6896481032 0.007702315685602822 0.008953203650381842 \n",
+ "US7234841010 0.03332942990290081 0.03218305838813145 \n",
+ "US69349H1077 0.012639253078697257 0.01195617040266632 \n",
+ "US7365088472 0.014000404723625308 0.013281115197873679 \n",
+ "US69351T1060 0.10941513137405769 0.08940788996261194 \n",
+ "US7445731067 0.0635679978881717 0.0626254824927157 \n",
+ "US8168511090 0.10421959985473984 0.10333035558010317 \n",
+ "US8425871071 0.18622750506679941 0.1745612532143091 \n",
+ "US92939U1060 0.07695104488519561 0.08138861437944513 \n",
+ "US98389B1008 0.0902630207506063 0.08430712540675832 \n",
+ "US1442851036 0.004204096572007335 0.004990244394801827 \n",
+ "US2017231034 nan nan \n",
+ "US3737371050 nan nan \n",
+ "US6703461052 0.024305171544838817 0.03485634781003422 \n",
+ "KR7005490008 nan nan \n",
+ "US8581191009 0.007987945257169369 0.012283462287977612 \n",
+ "US88031M1099 nan nan \n",
+ "US8808901081 nan nan \n",
+ "US8873991033 0.0004950917770041775 0.0006901566101955718 \n",
+ "US9129091081 0.008152423592683745 0.007423865256675461 \n",
+ "US9818111026 0.002779215292872067 0.003200509556000493 \n",
+ "\n",
+ " AOTS_weight ROTS_weight \n",
+ "company_id \n",
+ "US00130H1059 0.04816939688533329 0.05276197099873813 \n",
+ "US0158577090 0.009358782813005341 0.0050413384247108275 \n",
+ "US0185223007 0.007613807008198652 0.006231229172975224 \n",
+ "US0188021085 0.021186142904952205 0.016738395724396053 \n",
+ "US0236081024 0.04726477824338227 0.034922806188620925 \n",
+ "US0255371017 0.11248617091168711 0.08343102518455157 \n",
+ "US05351W1036 0.0379793742030801 0.02529980312047131 \n",
+ "US05379B1070 0.007066740568098292 0.005655105952879468 \n",
+ "US18551QAA58 0.011583583746330367 0.009189101919284608 \n",
+ "US1258961002 0.038876229852125306 0.035867501304020305 \n",
+ "US2091151041 0.06786373005464445 0.05314587328152441 \n",
+ "US25746U1097 0.11584362182232663 0.06688534526952991 \n",
+ "US2333311072 0.07097767408945654 0.07766300356121279 \n",
+ "US26441C2044 0.1970613477213826 0.11254721411236115 \n",
+ "US283677AZ52 0.0048316886860380335 0.003950855064002835 \n",
+ "US29364G1031 0.06070215564531642 0.046181301440845035 \n",
+ "US30034W1062 0.03859860953695048 0.02766943029282214 \n",
+ "US30040W1080 0.03530846103939446 0.026480799897099 \n",
+ "US3379321074 0.0988962172735531 0.09332089148551007 \n",
+ "CA3495531079 0.07911656908686812 0.0470667310963962 \n",
+ "US6362744095 0.14057664279423704 0.12060139050049665 \n",
+ "US6680743050 0.008977140347481906 0.006910763261421611 \n",
+ "US6708371033 0.019269149564939952 0.014109296911343806 \n",
+ "US6896481032 0.004587174627040453 0.0067106225780971685 \n",
+ "US7234841010 0.02619284180162325 0.017797401906124867 \n",
+ "US69349H1077 0.009986202103731528 0.00721385126240408 \n",
+ "US7365088472 0.010668873721131752 0.009760613126775643 \n",
+ "US69351T1060 0.08177207191530365 0.05030620119633238 \n",
+ "US7445731067 0.04681044465151272 0.03574513867355394 \n",
+ "US8168511090 0.08335956719180115 0.04972643805524998 \n",
+ "US8425871071 0.16101126726344764 0.10509504376408856 \n",
+ "US92939U1060 0.050169056739773205 0.03906076269591012 \n",
+ "US98389B1008 0.06398019170908303 0.05288965305341673 \n",
+ "US1442851036 0.004310487808706214 0.011641965312984528 \n",
+ "US2017231034 0.0033177080579832835 0.018610755334314076 \n",
+ "US3737371050 0.01252243765842747 0.03325265337048597 \n",
+ "US6703461052 0.016396082842808767 0.07303012863213186 \n",
+ "KR7005490008 0.07263123014493186 0.21444667139178533 \n",
+ "US8581191009 0.007399224052972695 0.033844989431466715 \n",
+ "US88031M1099 0.013748950184392398 0.024439630936756346 \n",
+ "US8808901081 0.013417124921380242 0.03824255500688262 \n",
+ "US8873991033 0.0009540854493255154 0.0038442306237322942 \n",
+ "US9129091081 0.011952248543683201 0.04818404875572425 \n",
+ "US9818111026 0.0021628807238201053 0.011714808549532102 "
+ ]
+ },
+ "execution_count": 14,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "weighting_dict = {\n",
+ " 'MOTS': 'company_market_cap',\n",
+ " 'EOTS': 'company_ev',\n",
+ " 'ECOTS': 'company_evic',\n",
+ " 'AOTS': 'company_total_assets',\n",
+ " 'ROTS': 'company_revenue',\n",
+ "}\n",
+ "\n",
+ "for k, v in weighting_dict.items():\n",
+ " weight_column = f\"{k}_weight\"\n",
+ " portfolio_df[weight_column] = vault_company_data.compute_portfolio_weights(portfolio_df['pa_score'], 2019, v, EScope.S1S2)\n",
+ " print(f\"Portfolio temperature score based on {k} = {portfolio_df[weight_column].sum()}\")\n",
+ "\n",
+ "portfolio_df"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "02416ac3-892e-4de7-b244-fc8311993ee9",
+ "metadata": {},
+ "source": [
+ "### Companies for which we lack production data (and thus cannot chart)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "id": "d1e39a38-9d3f-4ff7-aa46-965f6cbf4a76",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " company_name \n",
+ " company_lei \n",
+ " investment_value \n",
+ " pa_score \n",
+ " WATS_weight \n",
+ " TETS_weight \n",
+ " MOTS_weight \n",
+ " EOTS_weight \n",
+ " ECOTS_weight \n",
+ " AOTS_weight \n",
+ " ROTS_weight \n",
+ " \n",
+ " \n",
+ " company_id \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ "Empty DataFrame\n",
+ "Columns: [company_name, company_lei, investment_value, pa_score, WATS_weight, TETS_weight, MOTS_weight, EOTS_weight, ECOTS_weight, AOTS_weight, ROTS_weight]\n",
+ "Index: []"
+ ]
+ },
+ "execution_count": 15,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "portfolio_df[portfolio_df.pa_score.isnull()]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "id": "027bf69a-9c4a-48bc-979c-662a7409263d",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[('AES Corp.', '2NUNNB7D43COUIRE5295', 'US00130H1059', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 10870000000.0, 10189000000.0, 10102000000, 11131000000.0, 33648000000.0, 1029000000.0, 261000000.0),\n",
+ " ('Alliant Energy', '5493009ML300G373MZ12', 'US0188021085', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 11600000000.0, 3647700000.0, 18503600000, 18519900000.0, 16700700000.0, 16300000.0, 6919900000.0),\n",
+ " ('Ameren Corp.', 'XRZQ5S7HYJFPHJ78L959', 'US0236081024', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 18378774986.0, 5910000000.0, 27804774986, 27820774986.0, 28933000000.0, 16000000.0, 9442000000.0),\n",
+ " ('American Electric Power Co., Inc.', '1B4S6S7G0TW5EE83BO58', 'US0255371017', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 43491855142.0, 15561400000.0, 73417055142, 73663855142.0, 75892300000.0, 246800000.0, 30172000000.0),\n",
+ " ('Avangrid, Inc.', '549300OX0Q38NLSKPB49', 'US05351W1036', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 2836000000.0, 6338000000.0, 10826000000, 11004000000.0, 34416000000.0, 178000000.0, 8168000000.0),\n",
+ " ('ALLETE, Inc.', '549300NNLSIMY6Z8OT86', 'US0185223007', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 4285299935.0, 1240500000.0, 5829799935, 5899099935.0, 5482800000.0, 69300000.0, 1613800000.0),\n",
+ " ('Algonquin Power & Utilities Corp.', '549300K5VIUTJXQL7X75', 'US0158577090', 'Electricity Utilities', 'CA', 'North America', 'equity', 'USD', 2019, None, 1624921000.0, None, None, 10911470000.0, 62485000.0, 6500799000.0),\n",
+ " ('Avista Corp.', 'Q0IK63NITJD6RJ47SW96', 'US05379B1070', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 2948564738.0, 1345622000.0, 4917868738, 4927764738.0, 6082456000.0, 9896000.0, 1979200000.0),\n",
+ " ('Berkshire Hathaway, Inc.', '5493000C01ZX7D35SD85', 'US0846707026', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 417300000000.0, 254616000000.0, None, 421014902807.7754, 817729000000.0, None, 3714902807.775378),\n",
+ " ('Black Hills Corp.', '3MGELCRSTNSAMJ962671', 'US0921131092', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 4727278183.0, 1734900000.0, 7857597183, 7867374183.0, 7558457000.0, 9777000.0, 3140096000.0),\n",
+ " ('CARPENTER TECHNOLOGY CORP', 'DX6I6ZD3X5WNNCDJKP85', 'US1442851036', 'Steel', 'US', 'North America', 'equity', 'USD', 2019, 1687208892.0, 2380200000.0, 2210808892, 2237808892.0, 3187800000.0, 27000000.0, 550600000.0),\n",
+ " ('CLEVELAND-CLIFFS INC', '549300TM2WLI2BJMDD86', 'US1858991011', 'Steel', 'US', 'North America', 'equity', 'USD', 2019, 2839987963.0, 1989900000.0, 4601187963, 4953787963.0, 3503800000.0, 352600000.0, 2113800000.0),\n",
+ " ('CMS Energy Corp.', '549300IA9XFBAGNIBW29', 'US1258961002', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 16352000000.0, 6845000000.0, 28163000000, 28303000000.0, 26837000000.0, 140000000.0, 11951000000.0),\n",
+ " ('COMMERCIAL METALS CO', '549300OQS2LO07ZJ7N73', 'US2017231034', 'Steel', 'US', 'North America', 'equity', 'USD', 2019, 1900000000.0, 5829002000.0, None, 3154921000.0, 3758771000.0, None, 1254921000.0),\n",
+ " ('Cleco Partners LP', '5493002H80P81B3HXL31', 'US18551QAA58', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, None, 1639605000.0, None, None, 7476298000.0, 116292000.0, 400000000.0),\n",
+ " ('Consolidated Edison, Inc.', '54930033SBW53OO8T749', 'US2091151041', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 29100000000.0, 12574000000.0, 48092000000, 49073000000.0, 58079000000.0, 981000000.0, 19973000000.0),\n",
+ " ('DTE Energy', '549300IX8SD6XXD71I78', 'US2333311072', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 23100000000.0, 12669000000.0, 39762000000, 39855000000.0, 41882000000.0, 93000000.0, 16755000000.0),\n",
+ " ('Dominion Energy', 'ILUL7B6Z54MRYCF6H308', 'US25746U1097', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 62000000000.0, 16572000000.0, 95658000000, 95824000000.0, 103823000000.0, 166000000.0, 33824000000.0),\n",
+ " ('Duke Energy Corp.', 'I1BZKREC126H0VB1BL91', 'US26441C2044', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 64230558771.0, 25079000000.0, 126981558771, 127292558771.0, 158838000000.0, 311000000.0, 63062000000.0),\n",
+ " ('Edison International', '549300I7ROF15MAEVP56', 'US2810201077', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 22000000000.0, 12347000000.0, 42069000000, 42137000000.0, 64382000000.0, 68000000.0, 20137000000.0),\n",
+ " ('El Paso Electric Co', 'OZ8GM8L4AHPKSWZMW205', 'US283677AZ52', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 2636107949.0, 861994000.0, 4125040949, 4135858949.0, 3813200000.0, 10818000.0, 1499751000.0),\n",
+ " ('Entergy Corp.', '4XM3TW50JULSLG8BNC79', 'US29364G1031', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 20500000000.0, 10878673000.0, 39134228000, 39559950000.0, 51723912000.0, 425722000.0, 19059950000.0),\n",
+ " ('Evergy, Inc.', '549300PGTHDQY6PSUI61', 'US30034W1062', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 14138041261.0, 5147800000.0, 22861541261, 22884741261.0, 25975900000.0, 23200000.0, 8746700000.0),\n",
+ " ('Eversource Energy', 'SJ7XXD41SQU3ZNWUJ746', 'US30040W1080', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 24486439602.0, 8526470000.0, 38241835602, 38257267602.0, 41123915000.0, 15432000.0, 13770828000.0),\n",
+ " ('Exelon Corp.', '3SOUA6IRML7435B56G12', 'US30161N1019', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 46542193363.0, 34438000000.0, 81905193363, 82492193363.0, 124977000000.0, 587000000.0, 35950000000.0),\n",
+ " ('FirstEnergy Corp.', '549300SVYJS666PQJH88', 'US3379321074', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 22724895037.0, 11035000000.0, 41715895037, 42342895037.0, 42301000000.0, 627000000.0, 19618000000.0),\n",
+ " ('Fortis, Inc.', '549300MQYQ9Y065XPR71', 'CA3495531079', 'Electricity Utilities', 'CA', 'North America', 'equity', 'USD', 2019, None, 6742286315.707347, None, None, 40995680109.76149, 284031189.4354683, 16505282713.654066),\n",
+ " ('GERDAU S.A.', '254900YDV6SEQQPZVG24', 'US3737371050', 'Steel', 'BR', 'Global', 'equity', 'USD', 2019, None, 9835514922.966234, None, None, 13397913513.781725, 655382935.9664575, None),\n",
+ " ('Hawaiian Electric Industries, Inc.', 'JJ8FWOCWCV22X7GUPJ23', 'US4198701009', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 4745752027.0, 2874601000.0, 6513304027, 6710117027.0, 13745251000.0, 196813000.0, 1964365000.0),\n",
+ " ('Idacorp, Inc.', 'N134NUJDWN8UEFA8B673', 'US4511071064', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 5017481695.0, 1346383000.0, 6636886695, 6854140695.0, 6641201000.0, 217254000.0, 1836659000.0),\n",
+ " ('NUCOR CORP', '549300GGJCRSI2TIEJ46', 'US6703461052', 'Steel', 'US', 'North America', 'equity', 'USD', 2019, 16580000000.0, 22588858000.0, 19336696000, 20871301000.0, 18344666000.0, 1534605000.0, 4291301000.0),\n",
+ " ('National Grid PLC', '8R95QZMKZLJX5Q2XR704', 'US6362744095', 'Electricity Utilities', 'GB', 'Europe', 'equity', 'USD', 2019, 40783780623.596985, 19393506493.506493, None, None, 81770129870.12987, 327272727.27272725, None),\n",
+ " ('Nisource Inc.', '549300D8GOWWH0SJB189', 'US65473P1057', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 10713311150.0, 5053400000.0, 19338411150, 19477711150.0, 22659800000.0, 139300000.0, 8764400000.0),\n",
+ " ('Northwestern Corp.', '3BPWMBHR1R9SHUN7J795', 'US6680743050', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 3639448000.0, 1257910000.0, 6051117000, 6056262000.0, 5910702000.0, 5145000.0, 2416814000.0),\n",
+ " ('OG&E Energy Corp.', 'CE5OG6JPOZMDSA0LAQ19', 'US6708371033', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 8519482559.0, 2231600000.0, None, 11714682559.0, 11024300000.0, None, 3195200000.0),\n",
+ " ('Old Dominion Electric Coop.', 'SW4VC32Z0ZKLJKPONQ50', 'ZZ00000000141', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, None, 932682000.0, None, None, 2169244000.0, 3469000.0, 1300100000.0),\n",
+ " ('Otter Tail Corp.', '549300HHVBQRQUVKKD91', 'US6896481032', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 2040017347.0, 919503000.0, 2714582347, 2735781347.0, 2273595000.0, 21199000.0, 695764000.0),\n",
+ " ('PG&E Corp.', '8YQ2GSDWYZXO2EDN3511', 'US69331C1080', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 12130000000.0, 17129000000.0, 32736000000, 34306000000.0, 85196000000.0, 1570000000.0, 22176000000.0),\n",
+ " ('PNM Resources, Inc.', '5493003JOBJGLZSDDQ28', 'US69349H1077', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 4055165998.0, 1457603000.0, 6568781998, 6572614998.0, 7298774000.0, 3833000.0, 2517449000.0),\n",
+ " ('POSCO', '988400E5HRVX81AYLM04', 'KR7005490008', 'Steel', 'KR', 'Global', 'equity', 'USD', 2019, None, 55955872344.10088, None, None, 68553124892.03662, 3035819657.972016, None),\n",
+ " ('PPL Corp.', '9N3UAJSNOUXFKQLF3V18', 'US69351T1060', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 22384264788.0, 7769000000.0, 43462264788, 44277264788.0, 45680000000.0, 815000000.0, 21893000000.0),\n",
+ " ('Pinnacle West Capital Corp.', 'TWSEY0NEDUDCKS27AH81', 'US7234841010', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 10536165750.0, 3471209000.0, 16720274750, 16730557750.0, 18479247000.0, 10283000.0, 6194392000.0),\n",
+ " ('Portland General Electric Co.', 'GJOUP9M7C39GLSK9R870', 'US7365088472', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 4823580272.0, 2123000000.0, 7832580272, 7862580272.0, 8394000000.0, 30000000.0, 3039000000.0),\n",
+ " ('Public Service Enterprise Group', 'PUSS41EMO3E6XXNV3U28', 'US7445731067', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 29513402185.0, 10076000000.0, 46089402185, 46236402185.0, 47730000000.0, 147000000.0, 16723000000.0),\n",
+ " ('STEEL DYNAMICS INC', '549300HGGKEL4FYTTQ83', 'US8581191009', 'Steel', 'US', 'North America', 'equity', 'USD', 2019, 5000000000.0, 10464991000.0, 6352884000, 7734344000.0, 8275765000.0, 1381460000.0, 2734344000.0),\n",
+ " ('Sempra', 'PBBKGKLRK5S5C0Y4T545', 'US8168511090', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 37700000000.0, 10829000000.0, 58377000000, 58485000000.0, 65665000000.0, 108000000.0, 20785000000.0),\n",
+ " ('Southern Co.', '549300FC3G3YU2FBZD92', 'US8425871071', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 57800000000.0, 21419000000.0, 97623000000, 99598000000.0, 118700000000.0, 1975000000.0, 41798000000.0),\n",
+ " ('TENARIS SA', '549300Y7C05BKC4HZB40', 'US88031M1099', 'Steel', 'LU', 'Europe', 'equity', 'USD', 2019, None, 7294055000.0, None, None, 14842991000.0, 1554299000.0, None),\n",
+ " ('TERNIUM S.A.', '529900QG4KU23TEI2E46', 'US8808901081', 'Steel', 'LU', 'Europe', 'equity', 'USD', 2019, None, 10192818000.0, None, None, 12935533000.0, 519965000.0, None),\n",
+ " ('TIMKENSTEEL CORP', '549300QZTZWHDE9HJL14', 'US8873991033', 'Steel', 'US', 'North America', 'equity', 'USD', 2019, 337525844.0, 1208800000.0, 400425844, 427525844.0, 1085200000.0, 27100000.0, 90000000.0),\n",
+ " ('Tri-State Generation & Transmission Association, Inc.', '549300VDHNFNPADSSV98', 'ZZ00000000180', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, None, 1385472000.0, None, None, 5085818000.0, 83070000.0, 3144906000.0),\n",
+ " ('UNITED STATES STEEL CORP', 'JNLUVFYJT1OZSIQ24U47', 'US9129091081', 'Steel', 'US', 'North America', 'equity', 'USD', 2019, 2600000000.0, 12937000000.0, 5630000000, 6379000000.0, 11608000000.0, 749000000.0, 3779000000.0),\n",
+ " ('WEC Energy Group', '549300IGLYTZUK3PVP70', 'US92939U1060', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 26300000000.0, 7523100000.0, 38120800000, 38158300000.0, 34951800000.0, 37500000.0, 11858300000.0),\n",
+ " ('WORTHINGTON INDUSTRIES INC', '1WRCIANKYOIK6KYE5E82', 'US9818111026', 'Steel', 'US', 'North America', 'equity', 'USD', 2019, 1633376617.0, 3759556000.0, 2294113617, 2386476617.0, 2510796000.0, 92363000.0, 753100000.0),\n",
+ " ('Xcel Energy, Inc.', 'LGJNMI9GH8XIDG5RCM61', 'US98389B1008', 'Electricity Utilities', 'US', 'North America', 'equity', 'USD', 2019, 30629347167.0, 11529000000.0, 50608347167, 50856347167.0, 50448000000.0, 248000000.0, 20227000000.0)]"
+ ]
+ },
+ "execution_count": 16,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "engine_user.execute(\"select * from demo_dv.company_data\").fetchall()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "96697928-5b47-4e5a-955c-5892f2311535",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.10.2"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/requirements.txt b/requirements.txt
index 47d96ae7..a5fe1c55 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -10,8 +10,10 @@ Pint==0.18
Pint-Pandas==0.2
pydantic==1.8.2
pygithub==1.55
+python-dotenv==0.21.1
Sphinx==5.1.1
sphinx-autoapi==1.9.0
sphinx-autodoc-typehints==1.19.1
sphinx-rtd-theme==1.0.0
+trino==0.321.0
xlrd==2.0.1
\ No newline at end of file
diff --git a/setup.py b/setup.py
index 038cc29a..49943d4a 100644
--- a/setup.py
+++ b/setup.py
@@ -26,18 +26,21 @@
},
include_package_data=True,
install_requires=[
- 'iam-units>=2021.11.12',
- 'openpyxl>=3.0.9',
- 'openscm-units>=0.5.0',
- 'pandas>=1.4.2',
- 'pint>=0.18',
- 'pint-pandas>=0.2',
- 'pip>=22.0.3',
- 'pydantic>=1.8.2',
- 'setuptools>=65.5.1',
- 'wheel>=0.36.2',
- 'xlrd>=2.0.1',
- ],
+ 'iam-units>=2021.11.12',
+ 'openpyxl>=3.0.9',
+ 'openscm-units>=0.5.0',
+ 'osc-ingest-tools>=0.4.3',
+ 'pandas>=1.4.2',
+ 'pint>=0.18',
+ 'pint-pandas>=0.2',
+ 'pip>=22.0.3',
+ 'pydantic>=1.8.2',
+ 'python-dotenv>=0.21.1',
+ 'setuptools>=65.5.1',
+ 'trino>=0.321.0',
+ 'wheel>=0.36.2',
+ 'xlrd>=2.0.1',
+ ],
python_requires='>=3.8',
extras_require={
'dev': [
diff --git a/test/test_vault_providers.py b/test/test_vault_providers.py
new file mode 100644
index 00000000..cc4e2e16
--- /dev/null
+++ b/test/test_vault_providers.py
@@ -0,0 +1,124 @@
+import json
+import unittest
+import os
+import pathlib
+import pandas as pd
+from numpy.testing import assert_array_equal
+import ITR
+
+from ITR.portfolio_aggregation import PortfolioAggregationMethod
+from ITR.temperature_score import TemperatureScore
+from ITR.configs import ColumnsConfig, TemperatureScoreConfig
+from ITR.data.data_warehouse import DataWarehouse
+from ITR.data.vault_providers import VaultCompanyDataProvider, VaultProviderProductionBenchmark, \
+ VaultProviderIntensityBenchmark, DataVaultWarehouse
+from ITR.interfaces import ICompanyData, EScope, ETimeFrames, PortfolioCompany, IEIBenchmarkScopes, \
+ IProductionBenchmarkScopes
+
+from dotenv import load_dotenv
+import trino
+import osc_ingest_trino as osc
+from sqlalchemy.engine import create_engine
+
+ingest_catalog = 'osc_datacommons_dev'
+demo_schema = 'demo_dv'
+
+dotenv_dir = os.environ.get('CREDENTIAL_DOTENV_DIR', os.environ.get('PWD', '/opt/app-root/src'))
+dotenv_path = pathlib.Path(dotenv_dir) / 'credentials.env'
+if os.path.exists(dotenv_path):
+ load_dotenv(dotenv_path=dotenv_path,override=True)
+
+sqlstring = 'trino://{user}@{host}:{port}/'.format(
+ user = os.environ['TRINO_USER_USER1'],
+ host = os.environ['TRINO_HOST'],
+ port = os.environ['TRINO_PORT']
+)
+sqlargs = {
+ 'auth': trino.auth.JWTAuthentication(os.environ['TRINO_PASSWD_USER1']),
+ 'http_scheme': 'https',
+ 'catalog': ingest_catalog,
+ 'schema': demo_schema,
+}
+engine_init = create_engine(sqlstring, connect_args = sqlargs)
+print("connecting with engine " + str(engine_init))
+connection_init = engine_init.connect()
+
+class TestVaultProvider(unittest.TestCase):
+ """
+ Test the Value provider
+ """
+
+ def setUp(self) -> None:
+ self.root = os.path.dirname(os.path.abspath(__file__))
+ self.benchmark_prod_json = os.path.join(self.root, "inputs", "json", "benchmark_production_OECM.json")
+ self.benchmark_EI_json = os.path.join(self.root, "inputs", "json", "benchmark_EI_OECM.json")
+
+ # load production benchmarks
+ with open(self.benchmark_prod_json) as json_file:
+ parsed_json = json.load(json_file)
+ prod_bms = IProductionBenchmarkScopes.parse_obj(parsed_json)
+ self.vault_production_bm = VaultProviderProductionBenchmark(engine_init, benchmark_name="benchmark_prod", production_benchmarks=prod_bms)
+
+ # load intensity benchmarks
+ with open(self.benchmark_EI_json) as json_file:
+ parsed_json = json.load(json_file)
+ ei_bms = IEIBenchmarkScopes.parse_obj(parsed_json)
+ self.vault_EI_bm = VaultProviderIntensityBenchmark(engine_init, benchmark_name="benchmark_ei", EI_benchmarks=ei_bms)
+
+ # load company data
+ # TODO: ISIC code should read as int, not float
+ self.vault_company_data = VaultCompanyDataProvider(engine_init, "company_data")
+
+ self.vault_warehouse = DataVaultWarehouse(engine_init, self.vault_company_data, self.vault_production_bm, self.vault_EI_bm)
+
+ def test_N0_projections(self):
+ sqlstring = 'trino://{user}@{host}:{port}/'.format(
+ user = os.environ['TRINO_USER_USER1'],
+ host = os.environ['TRINO_HOST'],
+ port = os.environ['TRINO_PORT']
+ )
+ sqlargs = {
+ 'auth': trino.auth.JWTAuthentication(os.environ['TRINO_PASSWD_USER1']),
+ 'http_scheme': 'https'
+ }
+ engine_dev = create_engine(sqlstring, connect_args = sqlargs)
+ print("connecting with engine " + str(engine_dev))
+ connection_dev = engine_dev.connect()
+ # Show projections for emissions trajectories, production, and emission targets (N0 only)
+ # Show cumulative emissions (trajectory, target) and budget (N1 can also see)
+ pass
+
+ def test_N1_temp_scores(self):
+ sqlstring = 'trino://{user}@{host}:{port}/'.format(
+ user = os.environ['TRINO_USER_USER2'],
+ host = os.environ['TRINO_HOST'],
+ port = os.environ['TRINO_PORT']
+ )
+ sqlargs = {
+ 'auth': trino.auth.JWTAuthentication(os.environ['TRINO_PASSWD_USER2']),
+ 'http_scheme': 'https'
+ }
+ engine_quant = create_engine(sqlstring, connect_args = sqlargs)
+ print("connecting with engine " + str(engine_quant))
+ connection_quant = engine_quant.connect()
+ # Show cumulative emissions (trajectory, target) and budget (N1 can see)
+ # Show overshoot ratios (trajectory, target) (N1 can see)
+ # Show trajectory and target temp scores (N2 can also see)
+ pass
+
+ def test_N2_portfolio(self):
+ sqlstring = 'trino://{user}@{host}:{port}/'.format(
+ user = os.environ['TRINO_USER_USER3'],
+ host = os.environ['TRINO_HOST'],
+ port = os.environ['TRINO_PORT']
+ )
+ sqlargs = {
+ 'auth': trino.auth.JWTAuthentication(os.environ['TRINO_PASSWD_USER3']),
+ 'http_scheme': 'https'
+ }
+ engine_user = create_engine(sqlstring, connect_args = sqlargs)
+ print("connecting with engine " + str(engine_user))
+ connection_user = engine_user.connect()
+ # Show weighted temp score over portfolio (N2 can see)
+ # Different weighting types give different coefficients
+ pass