Source code for new_effects

from tool_code.dict_and_df_converters import create_effects_dict, convert_dict_to_df


[docs]def calc_new_fatality_metrics(df): """ Note: This function calculates 'Fatality risk per billion VMT' and removes 'Fatalities from Rebound.' Parameters: df: A DataFrame containing 'Fatalities', 'Fatalities from Rebound' and 'kVMT.' Return: The passed DataFrame without 'Fatalities from Rebound' and with 'Fatality risk per billion VMT.' """ # remove fatalities from rebound and calc fatalities per billion VMT df.drop(columns='Fatalities From Rebound', inplace=True) df.insert(df.columns.get_loc('Fatalities') + 1, 'Fatality risk per billion VMT', df['Fatalities'] / df['kVMT'] * 1e6) return df
[docs]def calc_new_effects(settings, df, id_cols): """ Note: This function calculates new effects for the effects file, including:\n - fatalities from the change in risk\n - fatalities from the change in VMT\n - and several fuel-related parameters such a barrels of oil, imported oil and share of US fuel consumption Parameters: settings: The SetInputs class.\n df: A DataFrame based on an effects report.\n id_cols: The identifying columns to use as keys for the dictionary that is created in function. Return: The passed DataFrame with new effects. """ no_action = settings.base_social_name calc_dict = create_effects_dict(df, id_cols) base_key = () # delta_dict = dict() for key in calc_dict.keys(): if len(key) == 4: scenario_name, year, reg_class, fuel_type = key base_key = (no_action, year, reg_class, fuel_type) # filename_keyword = 'summary' if len(key) == 6: scenario_name, model_year, age, calendar_year, reg_class, fuel_type = key base_key = (no_action, model_year, age, calendar_year, reg_class, fuel_type) # filename_keyword = 'lifetime' # calc new fatality effects fatality_risk_no_action = calc_dict[base_key]['Fatality risk per billion VMT'] fatality_risk_action = calc_dict[key]['Fatality risk per billion VMT'] fatalities_action = calc_dict[key]['Fatalities'] kvmt_action = calc_dict[key]['kVMT'] fatalities_from_change_in_risk = (fatality_risk_action - fatality_risk_no_action) * kvmt_action / 1e6 fatalities_from_change_in_vmt = fatalities_action - fatalities_from_change_in_risk calc_dict[key].update({'Fatalities from Change in Risk': fatalities_from_change_in_risk, 'Fatalities from Change in VMT': fatalities_from_change_in_vmt}) # calc new fuel effects (ignoring diesel, E85, hydrogen since deltas are so small) gallons, oil_bbl, share_of_annual, imported_oil_bbl, imported_oil_bbl_per_day, kwh_electricity = 0, 0, 0, 0, 0, 0 # if fuel_type != 'TOTAL': if fuel_type != 'Electricity': if fuel_type == 'Gasoline': share = settings.e0_in_retail_gasoline ratio = settings.energy_density_ratio_e0 elif fuel_type == 'E85': # CCEMS expresses kGallons in gallons of gasoline equivalents, so treat as retail share = settings.e0_in_retail_gasoline ratio = settings.energy_density_ratio_e0 # share = settings.e0_in_e85 # ratio = settings.energy_density_ratio_e0 elif fuel_type == 'Hydrogen': share = 0 ratio = 0 else: # CCEMS expresses kGallons in gallons of gasoline equivalents, so treat as retail share = settings.e0_in_retail_gasoline ratio = settings.energy_density_ratio_e0 # share = 1 # ratio = settings.energy_density_ratio_diesel gallons = calc_dict[key]['kGallons'] * 1000 oil_bbl = gallons * share * ratio / settings.gal_per_bbl imported_oil_bbl = oil_bbl * settings.imported_oil_share imported_oil_bbl_per_day = imported_oil_bbl / 365 share_of_annual_gasoline = gallons / settings.gallons_of_gasoline_us_annual share_of_annual = oil_bbl / settings.bbl_oil_us_annual elif fuel_type == 'Electricity': kwh_electricity = calc_dict[key]['kGallons'] * 1000 * settings.kwh_per_gge share_of_annual = kwh_electricity / settings.kwh_us_annual calc_dict[key].update({f'Share of {settings.year_for_compares} US gasoline': share_of_annual_gasoline, 'Barrels of Oil': oil_bbl, f'Share of {settings.year_for_compares} US oil/elec': share_of_annual, 'Barrels of Imported Oil': imported_oil_bbl, 'Barrels of Imported Oil per Day': imported_oil_bbl_per_day, 'kWh': kwh_electricity, } ) # now sum the new petroleum and electricity args by reg-class (i.e., where fuel_type = 'TOTAL') for key in calc_dict.keys(): try: scenario_name, year, reg_class, fuel_type = key except: scenario_name, model_year, age, calendar_year, reg_class, fuel_type = key fuel_types = ['Gasoline', 'Electricity', 'Diesel', 'E85', 'Hydrogen'] reg_classes = ['Passenger Car', 'Light Truck'] args_for_totals = [f'Share of {settings.year_for_compares} US gasoline', 'Barrels of Oil', f'Share of {settings.year_for_compares} US oil/elec', 'Barrels of Imported Oil', 'Barrels of Imported Oil per Day', 'kWh', ] if fuel_type == 'TOTAL': for arg in args_for_totals: for reg_class in reg_classes: arg_value = 0 for fuel_type in fuel_types: try: arg_value += calc_dict[scenario_name, year, reg_class, fuel_type][arg] calc_dict[scenario_name, year, reg_class, 'TOTAL'][arg] = arg_value except: arg_value += calc_dict[scenario_name, model_year, age, calendar_year, reg_class, fuel_type][arg] calc_dict[scenario_name, model_year, age, calendar_year, reg_class, 'TOTAL'][arg] = arg_value for key in calc_dict.keys(): try: scenario_name, year, reg_class, fuel_type = key except: scenario_name, model_year, age, calendar_year, reg_class, fuel_type = key if reg_class == 'TOTAL': for arg in args_for_totals: arg_value = 0 for reg_class in reg_classes: try: arg_value += calc_dict[scenario_name, year, reg_class, 'TOTAL'][arg] calc_dict[scenario_name, year, 'TOTAL', 'TOTAL'][arg] = arg_value except: arg_value += calc_dict[scenario_name, model_year, age, calendar_year, reg_class, 'TOTAL'][arg] calc_dict[scenario_name, model_year, age, calendar_year, 'TOTAL', 'TOTAL'][arg] = arg_value return_df = convert_dict_to_df(calc_dict, *id_cols) # make use of below for QA/QC # return_df.to_csv(settings.path_tool_runs_runid_outputs / f'calcs_df_{filename_keyword}.csv', index=False) return return_df
if __name__ == '__main__': print('This module does not run as a script.')