from vc_wrap import SvetObject
from combine_runs import ConstraintObject

# Create a storagevet object
# Note: DA should be turned off due to double counting of enegry arbitrage
pjm_baseline = SvetObject(
    SVet_absolute_path="/Applications/storagevet2v101/StorageVET-master-git/",
    default_params_file="Model_Parameters_2v1-0-2_default_03-2021.csv",
    shortname="PJM RS+DCM on + NSR",
    description="PJM",
    Scenario_n="48",
    Scenario_time_series_filename=
    "/Users/zhenhua/Desktop/ISO_price_data/hourly_timeseries_pjm_2020.csv",
    Finance_customer_tariff_filename=
    "/Users/zhenhua/Desktop/ISO_price_data/tariff_data/pjm_virginia_gs3_2019.csv",
    DCM_active='yes',
    retailTimeShift_active='yes',
    DA_active='no',
    SR_active='no',
    NSR_active='yes',
    FR_active="no",
    FR_CombinedMarket="1")
pjm_baseline.run_storagevet()

nyiso_baseline = SvetObject(
    SVet_absolute_path="/Applications/storagevet2v101/StorageVET-master-git/",
    default_params_file="Model_Parameters_2v1-0-2_default_03-2021.csv",
    shortname="NYISO RS+DCM on + NSR",
    description="NYISO",
    Scenario_n="48",
    Scenario_time_series_filename=
Ejemplo n.º 2
0
from vc_wrap import SvetObject
from combine_runs import ConstraintObject

# Create a storagevet object
# Note: DA should be turned off due to double counting of enegry arbitrage
pjm_baseline = SvetObject(
    SVet_absolute_path="/Applications/storagevet2v101/StorageVET-master-git/",
    default_params_file="Model_Parameters_2v1-0-2_default_03-2021.csv",
    shortname="PJM NSR on",
    description="PJM",
    Scenario_n="48",
    Scenario_time_series_filename=
    "/Users/zhenhua/Desktop/ISO_price_data/hourly_timeseries_pjm_2020.csv",
    DCM_active='no',
    retailTimeShift_active='no',
    DA_active='yes',
    SR_active='no',
    NSR_active='yes',
    FR_active="no",
    FR_CombinedMarket="1")
pjm_baseline.run_storagevet()

nyiso_baseline = SvetObject(
    SVet_absolute_path="/Applications/storagevet2v101/StorageVET-master-git/",
    default_params_file="Model_Parameters_2v1-0-2_default_03-2021.csv",
    shortname="NYISO NSR on",
    description="NYISO",
    Scenario_n="48",
    Scenario_time_series_filename=
    "/Users/zhenhua/Desktop/ISO_price_data/hourly_timeseries_nyiso_2019.csv",
    DCM_active='no',
Ejemplo n.º 3
0
from vc_wrap import SvetObject
from combine_runs import ConstraintObject

# Create a storagevet object
# TODO: change the default params file (and update tariff name)
# Note: DA should be turned off due to double counting of enegry arbitrage
DCM_baseline = SvetObject(SVet_absolute_path="/Applications/storagevet2v101/StorageVET-master-git/",
                          default_params_file="Model_Parameters_2v1-0-2_default_EA.csv",
                          shortname="EA+DCM on",
                          description="test run",
                          Scenario_n="month",
                          Scenario_time_series_filename="/Applications/storagevet2v101/StorageVET-master-git/Data/hourly_timeseries_2019.csv",
                          DCM_active='yes',
                          retailTimeShift_active='yes',
                          DA_active='no',
                          SR_active='no'
                          )
DCM_baseline.run_storagevet()

# DCM constraints
DCMconstraint = ConstraintObject(SVet_absolute_path="/Applications/storagevet2v101/StorageVET-master-git/",
                                 shortname=DCM_baseline.shortname, baseline_runID=DCM_baseline.runID,
                                 app_hours=[0, 23],
                                 regulation_scenario=3,
                                 constraint_init=True)
DCMconstraint.set_DCM_user_constraints()

# DCM priority run based on baseline
DCMpriority = SvetObject(SVet_absolute_path="/Applications/storagevet2v101/StorageVET-master-git/",
                         default_params_file="Model_Parameters_2v1-0-2_default_EA.csv",
                         shortname=DCMconstraint.new_shortname,
#                             Scenario_time_series_filename="/Users/zhenhua/Desktop/ISO_price_data/hourly_timeseries_2019.csv",
#                             Finance_customer_tariff_filename="/Users/zhenhua/Desktop/ISO_price_data/tariff_data/caiso_pge_b20_2020.csv",
#                             DCM_active='yes',
#                             retailTimeShift_active='yes',
#                             DA_active='no',
#                             SR_active='yes',
#                             NSR_active='yes',
#                             FR_active="yes",
#                             FR_CombinedMarket="1"
#                             )
# caiso_baseline.run_storagevet()

ercot_baseline = SvetObject(
    SVet_absolute_path="/Applications/storagevet2v101/StorageVET-master-git/",
    default_params_file="Model_Parameters_2v1-0-2_default_03-2021.csv",
    shortname="ERCOT RS+DCM on + stacking",
    description="ERCOT",
    Scenario_n='48',
    Scenario_time_series_filename=
    "/Users/zhenhua/Desktop/ISO_price_data/hourly_timeseries_ercot_2019.csv",
    Finance_customer_tariff_filename=
    "/Users/zhenhua/Desktop/ISO_price_data/tariff_data/ercot_oncor_2018.csv",
    DCM_active='yes',
    retailTimeShift_active='yes',
    DA_active='no',
    SR_active='yes',
    NSR_active='yes',
    FR_active="yes",
    FR_CombinedMarket="1")
ercot_baseline.run_storagevet()
Ejemplo n.º 5
0
import importlib.util
spec = importlib.util.spec_from_file_location("SvetObject","/Applications/storagevet2v101/svet-wrapper/vc_wrap.py")
foo = importlib.util.module_from_spec(spec)
spec.loader.exec_module(foo)
foo

from vc_wrap import SvetObject
from combine_runs import ConstraintObject

# testing a comparison to run 132 + others in combine_and_run_script.py
SVet_path = "/Applications/storagevet2v101/StorageVET-master-git/"
# unrestricted, RAdisp0
baseline = SvetObject(SVet_absolute_path="/Applications/storagevet2v101/StorageVET-master-git/",
                      shortname="baseline run", description="first run with SR + NSR + DA active",
                      Scenario_time_series_filename="/Applications/storagevet2v101/StorageVET-master-git/Data/hourly_timeseries_nsr133_rs3_14-20.csv",
                      SR_active='yes', NSR_active='yes', DA_active='yes', RA_active='yes', RA_dispmode=0, FR_active='yes')
                      
#SR Only
sronly = SvetObject(SVet_absolute_path="/Applications/storagevet2v101/StorageVET-master-git/",
                      shortname="sr only", description="SR only",
                      Scenario_time_series_filename="/Applications/storagevet2v101/StorageVET-master-git/Data/hourly_timeseries_2019.csv",
                      SR_active='yes', NSR_active='no', DA_active='yes', RA_active='no', RA_dispmode=0, FR_active='no')

# SR priority 24h
# Then, create user constraints (SR) and obtain params necessary for a second run
old_svrun_params, new_svrun_params, new_shortname, new_hourly_timeseries_path, values = \
  ConstraintObject(SvetObject=sronly, app_hours=[0, 23], regulation_scenario=3).set_SR_user_constraints()
# Lastly, use the new params to do a new SV run
new_svrun_params["NSR_active"]='yes'
new_svrun_params["FR_active"] = 'yes'
second_run = SvetObject(SVet_absolute_path="/Applications/storagevet2v101/StorageVET-master-git/",
Ejemplo n.º 6
0
#                           DCM_active='yes', retailTimeShift_active='yes',
#                           DA_active='no', SR_active='no', NSR_active='no', FR_active="no", FR_CombinedMarket="1"
#                           )
#     stanford.run_storagevet()

site = "eCEF"
Scenario_n = "36"
Finance_npv_discount_rate = "7"
Scenario_time_series_filename = "/Users/zhenhua/Desktop/price_data/stanford_data/hourly_timeseries_2019_eCEF.csv"

cef = SvetObject(SVet_absolute_path="/Applications/storagevet2v101/StorageVET-master-git/",
                 default_params_file="Model_Parameters_2v1-0-2_default_03-2021.csv",
                 shortname=site + " RS+DCM on",
                 description=site,
                 Battery_ch_max_rated=2000, Battery_dis_max_rated=2000, Battery_ene_max_rated=8000,
                 Scenario_n=Scenario_n,
                 Finance_npv_discount_rate=Finance_npv_discount_rate,
                 Scenario_time_series_filename=Scenario_time_series_filename,
                 Finance_customer_tariff_filename=Finance_customer_tariff_filename,
                 DCM_active='yes', retailTimeShift_active='yes',
                 DA_active='no', SR_active='no', NSR_active='no', FR_active="no", FR_CombinedMarket="1"
                 )
cef.run_storagevet()

site = "eCampus"
Scenario_n = "36"
Finance_npv_discount_rate = "7"
Scenario_time_series_filename = "/Users/zhenhua/Desktop/price_data/stanford_data/hourly_timeseries_2019_eCampus.csv"

campus = SvetObject(SVet_absolute_path="/Applications/storagevet2v101/StorageVET-master-git/",
                    default_params_file="Model_Parameters_2v1-0-2_default_03-2021.csv",
                    shortname=site + " RS+DCM on",
Ejemplo n.º 7
0
from vc_wrap import SvetObject
from combine_runs import ConstraintObject

path = "/Applications/storagevet2v101/StorageVET-master-git/"
ts = "/Applications/storagevet2v101/StorageVET-master-git/Data/hourly_timeseries_2019.csv"

# baseline run
baseline = SvetObject(
    SVet_absolute_path=path,
    shortname="first run",
    description="first run with SR + NSR + DA + RA + FR active",
    Scenario_time_series_filename=ts,
    SR_active='yes',
    NSR_active='yes',
    DA_active='yes',
    RA_active='yes',
    RA_dispmode='0',
    FR_active="yes",
    FR_CombinedMarket="0")
baseline.run_storagevet()

############## Spinning Reserves ##################

# SR_only run
SRonly = SvetObject(SVet_absolute_path=path,
                    shortname="SR only",
                    description="first run with SR only",
                    Scenario_time_series_filename=ts,
                    SR_active='yes')
SRonly.run_storagevet()
Ejemplo n.º 8
0
def combine_runs(SVet_absolute_path, description, shortname, app_types,
                 app_hours, regulation_scenario, **argument_list):
    """This function takes as input the type of regulatory scenario desired and three
  pieces of information regarding each run used to make the combined run:

    the resource type: [“NSR”,”SR”,”RA0”,”FR”]
    the hours in which a resource is given priority [[6,16], [16,23]]
    the regulation scenario for reach resource type: [1, 3, 3]

    It uses this information to run StorageVET with the desired combination of storage value stacking"""

    # Check that app_types, and app_hours and regulation_scenario are the same length
    if all(
            len(lst) == len(regulation_scenario)
            for lst in [app_types, app_hours]):
        pass
    else:
        raise ValueError("Wrong input list length for combine_runs")

    # Check for overlap in app_hours & that each element has length 2
    if all(len(lst) == 2 for lst in app_hours) & (sum(app_hours, []) == sorted(
            sum(app_hours, []))):
        pass
    else:
        raise ValueError("Wrong input resource hours for combine_runs")

    # Check if app_types contain valid options
    if all(i in ["NSR", "SR", "RA0", "FR"] for i in app_types):
        pass
    else:
        raise ValueError("Wrong input resource types for combine_runs")

    # Iterate through each resource type
    baseline = SvetObject(SVet_absolute_path=SVet_absolute_path,
                          shortname=shortname,
                          description=description,
                          **argument_list)
    baseline.run_storagevet()
    new_svet_object = baseline
    for i in range(len(app_types)):
        constraint_init = True if i == 0 else False
        new_constraint_object = ConstraintObject(
            SVet_absolute_path=SVet_absolute_path,
            shortname=new_svet_object.shortname,
            baseline_runID=new_svet_object.runID,
            app_hours=app_hours[i],
            regulation_scenario=regulation_scenario[i],
            constraint_init=constraint_init)
        getattr(new_constraint_object,
                "set_" + app_types[i] + "_user_constraints")()
        argument_list[app_types[i] + '_active'] = 'no'
        argument_list[
            'Scenario_time_series_filename'] = new_constraint_object.new_hourly_timeseries_path
        print(i, "values ", new_constraint_object.new_shortname,
              new_constraint_object.values,
              new_constraint_object.new_hourly_timeseries_path)
        new_svet_object = SvetObject(
            SVet_absolute_path=SVet_absolute_path,
            shortname=new_constraint_object.new_shortname,
            description="run #{}".format(i),
            User_active="yes",
            User_price=new_constraint_object.values,
            **argument_list)
        new_svet_object.run_storagevet()

    return print("Combine runs has been completed")
Ejemplo n.º 9
0
iso_name = "PJM"
Scenario_time_series_filename = "/Users/zhenhua/Desktop/price_data/hourly_timeseries_pjm_2019_200x.csv"
# Scenario_time_series_filename = "/Users/zhenhua/Desktop/price_data/hourly_timeseries_2019_200x.csv"
Finance_customer_tariff_filename = "/Users/zhenhua/Desktop/price_data/tariff_data_fake/e5d4.csv"
# Finance_customer_tariff_filename = "/Users/zhenhua/Desktop/price_data/tariff_data/original_documents/caiso_pge_b20_2020.csv"

# value stacking, should be the best scenario
caiso_all = SvetObject(
    SVet_absolute_path="/Applications/storagevet2v101/StorageVET-master-git/",
    default_params_file="Model_Parameters_2v1-0-2_default_03-2021.csv",
    shortname="{} DCM+SR+NSR on".format(iso_name),
    description=iso_name,
    Scenario_n="36",
    Scenario_time_series_filename=Scenario_time_series_filename,
    Finance_customer_tariff_filename=Finance_customer_tariff_filename,
    DCM_active='yes',
    retailTimeShift_active='yes',
    DA_active='no',
    SR_active='yes',
    NSR_active='yes',
    FR_active="no",
    FR_CombinedMarket="1")
caiso_all.run_storagevet()

# use ths to determine monthly peak net load
caiso_baseline = SvetObject(
    SVet_absolute_path="/Applications/storagevet2v101/StorageVET-master-git/",
    default_params_file="Model_Parameters_2v1-0-2_default_03-2021.csv",
    shortname="{} DCM on".format(iso_name),
    description=iso_name,
Ejemplo n.º 10
0
from vc_wrap import SvetObject

# Create a storagevet object
test = SvetObject(
    SVet_absolute_path=
    "/Applications/storagevet2v101/StorageVET-master-git/storagevet_dervet/",
    default_params_file="Model_Parameters_2v1-0-2_default.csv",
    shortname="test_run",
    description="test run",
    Scenario_time_series_filename=
    "/Applications/storagevet2v101/StorageVET-master-git/Data/hourly_timeseries_2019.csv",
    SR_active='yes',
    NSR_active='yes',
    DA_active='yes',
    RA_active='no',
    RA_dispmode=0,
    User_active='no',
    FR_active="no",
    FR_CombinedMarket="0")

# Test if storagevet can run
test.run_storagevet()
print(test.runID, test.argument_list)
Ejemplo n.º 11
0
from vc_wrap import SvetObject
from combine_runs import ConstraintObject

iso_name = "pjm"
Scenario_time_series_filename = "/Users/zhenhua/Desktop/price_data/hourly_timeseries_pjm_2019.csv"
Finance_customer_tariff_filename = "/Users/zhenhua/Desktop/price_data/tariff_data/original_documents/caiso_pge_b20_2020.csv"

# value stacking, should be the best scenario
baseline = SvetObject(SVet_absolute_path="/Applications/storagevet2v101/StorageVET-master-git/",
                      default_params_file="Model_Parameters_2v1-0-2_default_03-2021.csv",
                      shortname="{} DA on".format(iso_name),
                      description=iso_name,
                      Scenario_n="24",
                      Scenario_no_export="1",
                      Scenario_time_series_filename=Scenario_time_series_filename,
                      Finance_customer_tariff_filename=Finance_customer_tariff_filename,
                      DCM_active='no',
                      retailTimeShift_active='no',
                      DA_active='yes',
                      SR_active='no',
                      NSR_active='no',
                      FR_active="no",
                      FR_CombinedMarket="1"
                      )
baseline.run_storagevet()
Ejemplo n.º 12
0
def run_double_count(iso_name, tariff):
    # Initialize results
    Finance_customer_tariff_filename = "/Users/zhenhua/Desktop/price_data/tariff_data_fake/{}.csv".format(
        tariff)
    Scenario_time_series_filename = "/Users/zhenhua/Desktop/price_data/hourly_timeseries_{}_2019_200x.csv".format(
        iso_name)
    results = pd.DataFrame(columns=[
        "Case #", "DA ETS", "SR", "NSR", "Avoided Demand", "Avoided Energy",
        "Capex", "O&M Cost", "NPV"
    ])

    # Case 0a: use retail rates for RS
    case0a = SvetObject(
        SVet_absolute_path=
        "/Applications/storagevet2v101/StorageVET-master-git/",
        default_params_file="Model_Parameters_2v1-0-2_default_03-2021.csv",
        shortname="{} RS on".format(iso_name),
        description="{} 200x".format(iso_name),
        Scenario_n="36",
        Finance_npv_discount_rate="7",
        Scenario_time_series_filename=Scenario_time_series_filename,
        Finance_customer_tariff_filename=Finance_customer_tariff_filename,
        DCM_active='no',
        retailTimeShift_active='yes',
        DA_active='no',
        SR_active='no',
        NSR_active='no',
        FR_active="no",
        FR_CombinedMarket="1")
    case0a.run_storagevet()

    results = results.append(
        {
            "Case #": "0 - RS",
            "Avoided Demand": case0a.npv_new["Avoided Demand Charge"][0],
            "Avoided Energy": case0a.npv_new["Avoided Energy Charge"][0],
            "Capex": case0a.npv_new["2MW-5hr Capital Cost"][0],
            "O&M Cost": case0a.npv_new["2MW-5hr Fixed O&M Cost"][0],
            "NPV": case0a.npv_new["Lifetime Present Value"][0]
        },
        ignore_index=True)

    # Case 0b: use retail rates for RS+DCM
    case0b = SvetObject(
        SVet_absolute_path=
        "/Applications/storagevet2v101/StorageVET-master-git/",
        default_params_file="Model_Parameters_2v1-0-2_default_03-2021.csv",
        shortname="{} RS+DCM on".format(iso_name),
        description="{} 200x".format(iso_name),
        Scenario_n="36",
        Finance_npv_discount_rate="7",
        Scenario_time_series_filename=Scenario_time_series_filename,
        Finance_customer_tariff_filename=Finance_customer_tariff_filename,
        DCM_active='yes',
        retailTimeShift_active='yes',
        DA_active='no',
        SR_active='no',
        NSR_active='no',
        FR_active="no",
        FR_CombinedMarket="1")
    case0b.run_storagevet()

    results = results.append(
        {
            "Case #": "0 - RS+DCM",
            "Avoided Demand": case0b.npv_new["Avoided Demand Charge"][0],
            "Avoided Energy": case0b.npv_new["Avoided Energy Charge"][0],
            "Capex": case0b.npv_new["2MW-5hr Capital Cost"][0],
            "O&M Cost": case0b.npv_new["2MW-5hr Fixed O&M Cost"][0],
            "NPV": case0b.npv_new["Lifetime Present Value"][0]
        },
        ignore_index=True)

    # Case 0c: use DA rates for wholesale participation only
    case0c = SvetObject(
        SVet_absolute_path=
        "/Applications/storagevet2v101/StorageVET-master-git/",
        default_params_file="Model_Parameters_2v1-0-2_default_03-2021.csv",
        shortname="{} DA+SR on".format(iso_name),
        description="{} 200x".format(iso_name),
        Scenario_n="36",
        Finance_npv_discount_rate="7",
        Scenario_time_series_filename=Scenario_time_series_filename,
        Finance_customer_tariff_filename=Finance_customer_tariff_filename,
        DCM_active='no',
        retailTimeShift_active='no',
        DA_active='yes',
        SR_active='yes',
        NSR_active='no',
        FR_active="no",
        FR_CombinedMarket="1")
    case0c.run_storagevet()

    results = results.append(
        {
            "Case #": "0 - DA+SR",
            "DA ETS": case0c.npv_new["DA ETS"][0],
            "SR": case0c.npv_new["Spinning Reserves"][0],
            "Capex": case0c.npv_new["2MW-5hr Capital Cost"][0],
            "O&M Cost": case0c.npv_new["2MW-5hr Fixed O&M Cost"][0],
            "NPV": case0c.npv_new["Lifetime Present Value"][0]
        },
        ignore_index=True)

    case1b = SvetObject(
        SVet_absolute_path=
        "/Applications/storagevet2v101/StorageVET-master-git/",
        default_params_file="Model_Parameters_2v1-0-2_default_03-2021.csv",
        shortname="{} DA+SR+DCM on".format(iso_name),
        description="{} 200x".format(iso_name),
        Scenario_n="36",
        Finance_npv_discount_rate="7",
        Scenario_time_series_filename=Scenario_time_series_filename,
        Finance_customer_tariff_filename=Finance_customer_tariff_filename,
        DCM_active='yes',
        retailTimeShift_active='no',
        DA_active='yes',
        SR_active='yes',
        NSR_active='no',
        FR_active="no",
        FR_CombinedMarket="1")
    case1b.run_storagevet()

    results = results.append(
        {
            "Case #": "1 - use DA for DA+SR+DCM after double counting",
            "DA ETS": case1b.npv_new["DA ETS"][0],
            "SR": case1b.npv_new["Spinning Reserves"][0],
            "Avoided Demand": case1b.npv_new["Avoided Demand Charge"][0],
            "Avoided Energy": case1b.npv_new["Avoided Energy Charge"][0],
            "Capex": case1b.npv_new["2MW-5hr Capital Cost"][0],
            "O&M Cost": case1b.npv_new["2MW-5hr Fixed O&M Cost"][0],
            "NPV": case1b.npv_new["Lifetime Present Value"][0]
        },
        ignore_index=True)
    results = results.append(
        {
            "Case #":
            "1 - use DA for DA+SR+DCM before double counting",
            "DA ETS":
            case1b.npv_new["DA ETS"][0],
            "SR":
            case1b.npv_new["Spinning Reserves"][0],
            "Avoided Demand":
            case1b.npv_new["Avoided Demand Charge"][0],
            "Avoided Energy":
            0,
            "Capex":
            case1b.npv_new["2MW-5hr Capital Cost"][0],
            "O&M Cost":
            case1b.npv_new["2MW-5hr Fixed O&M Cost"][0],
            "NPV":
            case1b.npv_new["Lifetime Present Value"][0] -
            case1b.npv_new["Avoided Energy Charge"][0]
        },
        ignore_index=True)
    results = results.append(
        {
            "Case #": "1 - double count delta",
            "NPV": case1b.npv_new["Avoided Energy Charge"][0]
        },
        ignore_index=True)

    case2a = SvetObject(
        SVet_absolute_path=
        "/Applications/storagevet2v101/StorageVET-master-git/",
        default_params_file="Model_Parameters_2v1-0-2_default_03-2021.csv",
        shortname="{} RS+SR+DCM on".format(iso_name),
        description="{} 200x".format(iso_name),
        Scenario_n="36",
        Finance_npv_discount_rate="7",
        Scenario_time_series_filename=Scenario_time_series_filename,
        Finance_customer_tariff_filename=Finance_customer_tariff_filename,
        DCM_active='yes',
        retailTimeShift_active='yes',
        DA_active='no',
        SR_active='yes',
        NSR_active='no',
        FR_active="no",
        FR_CombinedMarket="1")
    case2a.run_storagevet()

    results = results.append(
        {
            "Case #": "2 - use RS for RS+SR+DCM before double counting",
            "SR": case2a.npv_new["Spinning Reserves"][0],
            "Avoided Demand": case2a.npv_new["Avoided Demand Charge"][0],
            "Avoided Energy": case2a.npv_new["Avoided Energy Charge"][0],
            "Capex": case2a.npv_new["2MW-5hr Capital Cost"][0],
            "O&M Cost": case2a.npv_new["2MW-5hr Fixed O&M Cost"][0],
            "NPV": case2a.npv_new["Lifetime Present Value"][0]
        },
        ignore_index=True)

    # TODO
    case2a_ts_results = pd.read_csv(case2a.runID_dispatch_timeseries_path)
    da_ets_corrected_yearly = np.dot(case2a.initial_hourly_timeseries["DA Price ($/kWh)"],
                                     case2a_ts_results["Load (kW)"]) - \
                              np.dot(case2a.initial_hourly_timeseries["DA Price ($/kWh)"],
                                     case2a_ts_results["Net Load (kW)"])
    da_ets_corrected_npv_list = []
    for i in range(0, 15):
        da_ets_corrected_npv_list.append(da_ets_corrected_yearly *
                                         (1 + 0.03)**i)
    da_ets_corrected_npv_list = [0] + da_ets_corrected_npv_list
    da_ets_corrected_npv = np.npv(0.07, da_ets_corrected_npv_list)
    results = results.append(
        {
            "Case #":
            "2 - use RS for RS+SR+DCM after double counting",
            "DA ETS":
            da_ets_corrected_npv,
            "SR":
            case2a.npv_new["Spinning Reserves"][0],
            "Avoided Demand":
            case2a.npv_new["Avoided Demand Charge"][0],
            "Avoided Energy":
            case2a.npv_new["Avoided Energy Charge"][0],
            "Capex":
            case2a.npv_new["2MW-5hr Capital Cost"][0],
            "O&M Cost":
            case2a.npv_new["2MW-5hr Fixed O&M Cost"][0],
            "NPV":
            case2a.npv_new["Lifetime Present Value"][0] + da_ets_corrected_npv
        },
        ignore_index=True)
    results = results.append(
        {
            "Case #": "2 - double count delta",
            "NPV": da_ets_corrected_npv
        },
        ignore_index=True)

    case3 = SvetObject(
        SVet_absolute_path=
        "/Applications/storagevet2v101/StorageVET-master-git/",
        default_params_file="Model_Parameters_2v1-0-2_default_03-2021.csv",
        shortname="{} DA+RS+DCM+SR on".format(iso_name),
        description="{} 200x".format(iso_name),
        Scenario_n="36",
        Finance_npv_discount_rate="7",
        Scenario_time_series_filename=Scenario_time_series_filename,
        Finance_customer_tariff_filename=Finance_customer_tariff_filename,
        DCM_active='yes',
        retailTimeShift_active='yes',
        DA_active='yes',
        SR_active='yes',
        NSR_active='no',
        FR_active="no",
        FR_CombinedMarket="1")
    case3.run_storagevet()

    results = results.append(
        {
            "Case #": "3 - use DA and RS for DA+SR+RS+DCM",
            "DA ETS": case3.npv_new["DA ETS"][0],
            "SR": case3.npv_new["Spinning Reserves"][0],
            "Avoided Demand": case3.npv_new["Avoided Demand Charge"][0],
            "Avoided Energy": case3.npv_new["Avoided Energy Charge"][0],
            "Capex": case3.npv_new["2MW-5hr Capital Cost"][0],
            "O&M Cost": case3.npv_new["2MW-5hr Fixed O&M Cost"][0],
            "NPV": case3.npv_new["Lifetime Present Value"][0]
        },
        ignore_index=True)
    results.sort_values(by="Case #").reset_index(drop=True)\
        .to_csv("/Users/zhenhua/Desktop/double_count_results_0410/{}_{}.csv".format(iso_name, tariff))

    # Plot prices & results
    case1b_ts_results = pd.read_csv(case1b.runID_dispatch_timeseries_path)
    case2a_ts_results = pd.read_csv(case2a.runID_dispatch_timeseries_path)
    case1b_ts_results["date"] = pd.to_datetime(
        case1b_ts_results["Start Datetime (hb)"]).dt.date
    case1b_ts_results["hour (hb)"] = pd.to_datetime(
        case1b_ts_results["Start Datetime (hb)"]).dt.hour
    case2a_ts_results["date"] = pd.to_datetime(
        case2a_ts_results["Start Datetime (hb)"]).dt.date
    case2a_ts_results["hour (hb)"] = pd.to_datetime(
        case2a_ts_results["Start Datetime (hb)"]).dt.hour

    fig = make_subplots(rows=2,
                        cols=2,
                        subplot_titles=("DA and retail", "SR",
                                        "DA as signal, RS to double count",
                                        "RS as signal, DA to double count"))
    for date in set(case1b_ts_results["date"]):
        data = case1b_ts_results[case1b_ts_results["date"] ==
                                 date].reset_index()
        fig.add_trace(go.Scatter(x=data["hour (hb)"],
                                 y=data["DA Price Signal ($/kWh)"],
                                 line=dict(color='blue'),
                                 opacity=0.2,
                                 name=str(date)),
                      row=1,
                      col=1)
        fig.add_trace(go.Scatter(x=data["hour (hb)"],
                                 y=data["SR Price Signal ($/kW)"],
                                 line=dict(color='green'),
                                 opacity=0.5,
                                 name=str(date)),
                      row=1,
                      col=2)
        fig.add_trace(go.Scatter(x=data["hour (hb)"],
                                 y=data["2MW-5hr Power (kW)"],
                                 line=dict(color='blue'),
                                 opacity=0.2,
                                 name=str(date)),
                      row=2,
                      col=1)
        data2 = case2a_ts_results[case2a_ts_results["date"] ==
                                  date].reset_index()
        fig.add_trace(go.Scatter(x=data2["hour (hb)"],
                                 y=data2["Energy Price ($/kWh)"],
                                 line=dict(color='red'),
                                 opacity=0.5,
                                 name=str(date)),
                      row=1,
                      col=1)
        fig.add_trace(go.Scatter(x=data2["hour (hb)"],
                                 y=data2["2MW-5hr Power (kW)"],
                                 line=dict(color='blue'),
                                 opacity=0.2,
                                 name=str(date)),
                      row=2,
                      col=2)
    fig.update_layout(title="{}_{}".format(iso_name, tariff))

    return results, fig
from vc_wrap import SvetObject
from combine_runs import ConstraintObject

# First, run the baseline scenario
baseline = SvetObject(
    SVet_absolute_path="/Applications/storagevet2v101/StorageVET-master-git/",
    shortname="first run",
    description="first run with SR + NSR + DA + RA + FR active",
    Scenario_time_series_filename=
    "/Applications/storagevet2v101/StorageVET-master-git/Data/hourly_timeseries_2019.csv",
    SR_active='yes',
    NSR_active='yes',
    DA_active='yes',
    RA_active='yes',
    RA_dispmode=0,
    FR_active="yes",
    FR_CombinedMarket="0")
baseline.run_storagevet()

# Then, create NSR constraint by passing baseline shortname and runID
constraint = ConstraintObject(
    SVet_absolute_path="/Applications/storagevet2v101/StorageVET-master-git/",
    shortname=baseline.shortname,
    baseline_runID=baseline.runID,
    app_hours=[14, 20],
    regulation_scenario=1,
    constraint_init=True)
constraint.set_NSR_user_constraints()
print(" ", constraint.new_shortname, constraint.new_hourly_timeseries_path,
      constraint.values)
Ejemplo n.º 14
0
from vc_wrap import SvetObject
from combine_runs import ConstraintObject

# value stacking, should be the best scenario
pjm_all = SvetObject(
    SVet_absolute_path="/Applications/storagevet2v101/StorageVET-master-git/",
    default_params_file="Model_Parameters_2v1-0-2_default_03-2021.csv",
    shortname="PJM DCM+SR+NSR on",
    description="PJM",
    Scenario_n="48",
    Scenario_time_series_filename=
    "/Users/zhenhua/Desktop/ISO_price_data/hourly_timeseries_pjm_2020.csv",
    Finance_customer_tariff_filename=
    "/Users/zhenhua/Desktop/ISO_price_data/tariff_data/pjm_virginia_gs3_2019.csv",
    DCM_active='yes',
    retailTimeShift_active='yes',
    DA_active='no',
    SR_active='yes',
    NSR_active='yes',
    FR_active="no",
    FR_CombinedMarket="1")
pjm_all.run_storagevet()

# use ths to determine monthly peak net load
pjm_baseline = SvetObject(
    SVet_absolute_path="/Applications/storagevet2v101/StorageVET-master-git/",
    default_params_file="Model_Parameters_2v1-0-2_default_03-2021.csv",
    shortname="PJM DCM+SR on",
    description="PJM",
    Scenario_n="48",
    Scenario_time_series_filename=
# Test if we can just usepre-existing baseline run for creating constraints by specifying shortname and baseline runID
# VERIFIED ~143507
# sr4 = ConstraintObject(SVet_absolute_path="/Applications/storagevet2v101/StorageVET-master-git/",
#                        shortname="Patricia 132", baseline_runID="4",
#                        app_hours=[-1, 23], regulation_scenario=3, constraint_init=True)
# sr4.set_SR_user_constraints()
# print(" ", sr4.new_shortname, sr4.new_hourly_timeseries_path, sr4.values)

Patricia_133 = SvetObject(
    SVet_absolute_path="/Applications/storagevet2v101/StorageVET-master-git/",
    shortname="Patricia 133",
    description="NSR + DA active",
    Scenario_time_series_filename=
    "/Applications/storagevet2v101/StorageVET-master-git/Data/hourly_timeseries_2019.csv",
    SR_active='no',
    NSR_active='yes',
    DA_active='yes',
    RA_active='no',
    RA_dispmode=0,
    FR_active="no",
    FR_CombinedMarket="0")
Patricia_133.run_storagevet()
# VERIFIED ~636
nsr1 = ConstraintObject(
    SVet_absolute_path="/Applications/storagevet2v101/StorageVET-master-git/",
    shortname=Patricia_133.shortname,
    baseline_runID=Patricia_133.runID,
    app_hours=[14, 20],
    regulation_scenario=1,
    constraint_init=True)