Source code for prereise.gather.demanddata.transportation_electrification.generate_BEV_vehicle_profiles

import os

import pandas as pd

from prereise.gather.demanddata.transportation_electrification import (
    const,
    immediate,
    immediate_charging_HDV,
    smart_charging,
)
from prereise.gather.demanddata.transportation_electrification.data_helper import (
    generate_daily_weighting,
    get_kwhmi,
    load_rural_scaling_factor,
    load_urbanized_scaling_factor,
)


[docs]def generate_bev_vehicle_profiles( vehicle_trip_data_filepath, charging_strategy, veh_type, veh_range, projection_year, state, external_signal=None, power=6.6, location_strategy=2, trip_strategy=1, ): """Generate Battery Electric Vehicle (BEV) profiles :param str vehicle_trip_data_filepath: filepath of collected trip data from external sources representing driving patterns :param str charging_strategy: establishes whether charging happens immediately ("immediate") or optimize based on external signals, i.e. smart charging ("smart") :param str veh_type: vehicle category: LDV: light duty vehicle, LDT: light duty truck, MDV: medium duty vehicle, HDV: heavy duty vehicle :param int veh_range: 100, 200, or 300, represents how far vehicle can travel on single charge in miles. :param int projection_year: year that is being modelled/projected to, 2017, 2030, 2040, 2050. :param str state: US state abbreviation :param numpy.ndarray (optional) external_signal: initial load demand (MW for each hour) :param int power: (optional) charger power, EVSE kW; default value: 6.6 kW; :param int location_strategy: (optional) where the vehicle can charge-1, 2, 3, 4, or 5; 1-home only, 2-home and work related, 3-anywhere if possibile, 4-home and school only, 5-home and work and school. default value: 2 :param int trip_strategy: (optional) determine to charge after any trip (1) or only after the last trip (2); default value: 1 :return: (*pandas.DataFrame*) -- yearly charging profiles for all urban areas and the rural area in each state (MW for each hour) """ census_region = const.state2census_region[state] kwhmi = get_kwhmi(projection_year, veh_type, veh_range) daily_values = generate_daily_weighting(projection_year) if power > 19.2: charging_efficiency = 0.95 else: charging_efficiency = 0.9 geographic_area_bev_vmt = {} urban_scaling_filepath = os.path.join( const.data_folder_path, "regional_scaling_factors", "regional_scaling_factors_UA_", ) urban_scaling_factors = pd.read_csv( urban_scaling_filepath + str(projection_year) + ".csv", index_col="State" ) state_urban_areas = urban_scaling_factors.loc[state.upper(), "UA"] # scaling factors for listed urban areas for urban_area in state_urban_areas.to_list(): urban_bev_vmt = load_urbanized_scaling_factor( model_year=projection_year, veh_type=veh_type, veh_range=veh_range, urbanized_area=urban_area, state=state, filepath=urban_scaling_filepath, ) geographic_area_bev_vmt.update({f"{state}_{urban_area}": urban_bev_vmt}) # scaling factors for rural areas rural_bev_vmt = load_rural_scaling_factor( projection_year, veh_type, veh_range, state.upper(), filepath=os.path.join( const.data_folder_path, "regional_scaling_factors", "regional_scaling_factors_RA_", ), ) geographic_area_bev_vmt.update({f"{state}_rural": rural_bev_vmt}) # calculate demand for all geographic areas with scaling factors state_demand_profiles = {} for geographic_area, bev_vmt in geographic_area_bev_vmt.items(): if charging_strategy == "immediate": if veh_type.lower() in {"ldv", "ldt"}: normalized_demand, _, _ = immediate.immediate_charging( census_region=census_region, model_year=projection_year, veh_range=veh_range, power=power, location_strategy=location_strategy, veh_type=veh_type, filepath=vehicle_trip_data_filepath, ) elif veh_type.lower() in {"mdv", "hdv"}: normalized_demand, _, _ = immediate_charging_HDV.immediate_charging( model_year=projection_year, veh_range=veh_range, power=power, location_strategy=location_strategy, veh_type=veh_type, filepath=vehicle_trip_data_filepath, ) final_demand = immediate.adjust_bev( hourly_profile=normalized_demand, adjustment_values=daily_values, model_year=projection_year, veh_type=veh_type, veh_range=veh_range, bev_vmt=bev_vmt, charging_efficiency=charging_efficiency, ) elif charging_strategy == "smart": final_demand, _, _ = smart_charging.smart_charging( census_region=census_region, model_year=projection_year, veh_range=veh_range, kwhmi=kwhmi, power=power, location_strategy=location_strategy, veh_type=veh_type, filepath=vehicle_trip_data_filepath, daily_values=daily_values, external_signal=external_signal, bev_vmt=bev_vmt, trip_strategy=trip_strategy, ) state_demand_profiles.update({geographic_area: final_demand}) state_demand_profiles_df = pd.DataFrame( state_demand_profiles, index=pd.date_range( start=f"{projection_year}-01-01 00:00:00", end=f"{projection_year}-12-31 23:00:00", freq="H", ), ) return state_demand_profiles_df