# -*- coding: utf-8 -*- """ Analyse revenue and prices, checking total revenue is collected and looking for decomposition of revenue. With RCPD, revenue is AC to load and DC to south island generation With AoB, revenue is AC and DC to load and generation according to benefits from existing and future assets. Plus load pays for a residual that declines through time """ import numpy as np import pandas as pd import random import matplotlib import matplotlib.pyplot as plt import itertools in_fn = "C:/Users/theot/Dropbox (Sense.)/2018-19 EA TPM CBA (Shared)/Step 3/AoB model/Output/All_major_capex/" out_fn="C:/Users/theot/Dropbox (Sense.)/2018-19 EA TPM CBA (Shared)/Step 3/AoB model/Output/All_major_capex/" # Objective, function that takes two files as arguments and returns a file of # analysis for revenue # DG costs - assumed capital cost per MW and rate of growth dg_capex_per_mw=733000 dg_capex_g = 0.93 #Discount rate r=1.06 # Demand results rcpd = pd.read_csv(in_fn+"rcpd.csv") aob = pd.read_csv(in_fn+"aob.csv") gen_rcpd = pd.read_csv(in_fn+"gen_rcpd.csv") gen_aob = pd.read_csv(in_fn+"gen_aob.csv") # Parameters # A. TRANSMISSION REVENUE # (i) Load load_revenue=rcpd[['bb','type','m_yr']].copy() load_revenue['rcpd']=rcpd.pk_rev+rcpd.dg_rev+rcpd.sh_rev+rcpd.off_rev load_revenue['aob']=aob.pk_rev+aob.dg_rev+aob.sh_rev+aob.off_rev load_revenue['change']=load_revenue.aob-load_revenue.rcpd load_revenue['percentage_change']=load_revenue.aob/load_revenue.rcpd-1 load_revenue.to_csv(out_fn+"load_revenue.csv") load_tot_rev=load_revenue[['m_yr','rcpd','aob']].groupby(['m_yr']).sum().reset_index() # (ii) Generation gen_revenue=gen_rcpd[['bb','m_yr']].copy() gen_revenue['gen_rcpd']=gen_rcpd.pk_rev+gen_rcpd.dg_rev+gen_rcpd.sh_rev+gen_rcpd.off_rev gen_revenue['gen_aob']=gen_aob.pk_rev+gen_aob.dg_rev+gen_aob.sh_rev+gen_aob.off_rev gen_revenue['change']=gen_revenue.gen_aob-gen_revenue.gen_rcpd gen_revenue['percentage_change']=gen_revenue.gen_aob/gen_revenue.gen_rcpd-1 gen_revenue.to_csv(out_fn+"gen_revenue.csv") gen_tot_rev = gen_revenue[['m_yr','gen_rcpd','gen_aob']].groupby(['m_yr']).sum().reset_index() # Totals total_revenue = load_tot_rev[['m_yr','rcpd','aob']] total_revenue = total_revenue.merge(gen_tot_rev) total_revenue.columns=['m_yr','load_rcpd','load_aob','gen_rcpd','gen_aob'] total_revenue['rcpd']=total_revenue.load_rcpd+total_revenue.gen_rcpd total_revenue['aob']=total_revenue.load_aob+total_revenue.gen_aob total_revenue.to_csv(out_fn+"total_revenue.csv") # B. DEMAND VOLUMES # (i) Demand load_q=rcpd[['bb','type','m_yr']].copy() load_q['rcpd']=rcpd.pk_q+rcpd.dg_q+rcpd.sh_q+rcpd.off_q load_q['aob']=aob.pk_q+aob.dg_q+aob.sh_q+aob.off_q load_q['change']=load_q.aob-load_q.rcpd load_q['percentage_change']=load_q.aob/load_q.rcpd-1 load_tot_q=load_q[['m_yr','rcpd','aob']].groupby(['m_yr']).sum().reset_index() load_tot_q['percentage_change']=load_tot_q.aob/load_tot_q.rcpd-1 load_q.to_csv(out_fn+"load.csv") load_tot_q.to_csv(out_fn+"total_load.csv") # (ii) Generation quantites gen_q=gen_rcpd[['bb','type','m_yr']].copy() gen_q['rcpd']=gen_rcpd.pk_q+gen_rcpd.dg_q+gen_rcpd.sh_q+gen_rcpd.off_q gen_q['aob']=gen_aob.pk_q+gen_aob.dg_q+gen_aob.sh_q+gen_aob.off_q gen_q['change']=gen_q.aob-gen_q.rcpd gen_q['percentage_change']=gen_q.aob/gen_q.rcpd-1 gen_tot_q=gen_q[['m_yr','rcpd','aob']].groupby(['m_yr']).sum().reset_index() gen_tot_q['percentage_change']=gen_tot_q.aob/gen_tot_q.rcpd-1 gen_q.to_csv(out_fn+"generation.csv") gen_tot_q.to_csv(out_fn+"total_generation.csv") # C. EXPENDITURE load_e=rcpd[['bb','type','m_yr']].copy() load_e['rcpd']=rcpd.pk_e+rcpd.dg_e+rcpd.sh_e+rcpd.off_e load_e['aob']=aob.pk_e+aob.dg_e+aob.sh_e+aob.off_e load_e['change']=load_e.aob-load_e.rcpd load_e['percentage_change']=load_e.aob/load_e.rcpd-1 load_e.to_csv(out_fn+"expenditure.csv") load_tot_e=load_e[['m_yr','rcpd','aob']].groupby(['m_yr']).sum().reset_index() load_tot_e.to_csv(out_fn+"total_expenditure.csv") # Average prices - inclusive of transmission costs load_p=rcpd[['bb','type','m_yr']].copy() load_p['rcpd']=load_e.rcpd/load_q.rcpd load_p['aob']=load_e.aob/load_q.aob load_p['change']=load_p.aob-load_p.rcpd load_p['percentage_change']=load_p.aob/load_p.rcpd-1 load_tot_p=pd.DataFrame(load_tot_e['m_yr'].copy()) load_tot_p['rcpd']=load_tot_e.rcpd/load_tot_q.rcpd load_tot_p['aob']=load_tot_e.aob/load_tot_q.aob load_tot_p['change']=load_tot_p.aob-load_tot_p.rcpd load_tot_p['percentage_change']=load_tot_p.aob/load_tot_p.rcpd-1 load_p.to_csv(out_fn+"average_prices.csv") load_tot_p.to_csv(out_fn+"total_average_prices.csv") # DG investment dg=pd.DataFrame(load_tot_e['m_yr'].copy()) dg['rcpd_mw']=rcpd.groupby(['m_yr'])['dg_max'].sum().reset_index()['dg_max'] dg['rcpd_inv']=dg.rcpd_mw.diff()*(dg_capex_per_mw*(dg_capex_g**(dg.m_yr-2017))) dg['rcpd_q']=rcpd.groupby(['m_yr'])['dg_q'].sum().reset_index()['dg_q'] dg['aob_mw']=aob.groupby(['m_yr'])['dg_max'].sum().reset_index()['dg_max'] dg['aob_inv']=dg.aob_mw.diff()*(dg_capex_per_mw*(dg_capex_g**(dg.m_yr-2017))) dg['aob_q']=aob.groupby(['m_yr'])['dg_q'].sum().reset_index()['dg_q'] dg['mw_change']=dg.aob_mw-dg.rcpd_mw dg['mw_percentage_change']=dg.aob_mw/dg.rcpd_mw-1 dg['mw_cost']=dg_capex_per_mw*(dg_capex_g**(dg.m_yr-2017)) dg['inv_change']=dg.aob_inv-dg.rcpd_inv dg['pv_inv_change']=dg.inv_change*(1/(r**(dg.m_yr-2019))) dg.to_csv(out_fn+'total_dg.csv') dg.pv_inv_change.sum()