def getGenDicts(fleet): orisCol,genIdCol = fleet[0].index('ORIS Plant Code'), fleet[0].index('Unit ID') capacCol,minloadCol = fleet[0].index('Capacity (MW)'), fleet[0].index('MinLoad(MW)') plantTypeCol,rampCol = fleet[0].index('PlantType'),fleet[0].index('RampRate(MW/hr)') mdtCol = fleet[0].index('MinDownTime(hrs)') genToCapac,genToMinload,genToPlantType,genToRamp,genToMDT = dict(),dict(),dict(),dict(),dict() for row in fleet[1:]: genToCapac[createGenSymbol(row,fleet[0])] = float(row[capacCol]) genToMinload[createGenSymbol(row,fleet[0])] = float(row[minloadCol]) genToPlantType[createGenSymbol(row,fleet[0])] = row[plantTypeCol] genToRamp[createGenSymbol(row,fleet[0])] = float(row[rampCol]) genToMDT[createGenSymbol(row,fleet[0])] = int(float(row[mdtCol])) return (genToCapac,genToMinload,genToPlantType,genToRamp,genToMDT)
def getGenDicts(): fleet = readCSVto2dList(os.path.join(RESULTSDIR, 'genFleetUC2015.csv')) orisCol, genIdCol = fleet[0].index('ORIS Plant Code'), fleet[0].index( 'Unit ID') fuelCol = fleet[0].index('Modeled Fuels') capacCol = fleet[0].index('Capacity (MW)') plantTypeCol = fleet[0].index('PlantType') genToCapac, genToPlantType, genToFuel = dict(), dict(), dict() for row in fleet[1:]: genToCapac[createGenSymbol(row, fleet[0])] = float(row[capacCol]) genToPlantType[createGenSymbol(row, fleet[0])] = row[plantTypeCol] genToFuel[createGenSymbol(row, fleet[0])] = row[fuelCol] return (genToCapac, genToPlantType, genToFuel)
def markAndSaveRetiredUnitsFromAge(genFleet, currYear, capacExpRetiredUnitsByAge, runLoc, scenario): lifetimeByPlantTypeDict = importPlantTypeLifetimes(runLoc, scenario) renewablePlantTypes = [ 'Geothermal', 'Hydro', 'Pumped Storage', 'Wind', 'Solar PV', 'Biomass' ] onlineYearCol = genFleet[0].index('On Line Year') plantTypeCol = genFleet[0].index('PlantType') retiredByAgeCol = genFleet[0].index('YearRetiredByAge') retiredByCECol = genFleet[0].index('YearRetiredByCE') retiredUnitsByAge = [] for row in genFleet[1:]: if row[retiredByAgeCol] == '' and row[ retiredByCECol] == '': #if not already retired by age or CE (onlineYear, plantType) = (row[onlineYearCol], row[plantTypeCol]) lifetimePlantType = lifetimeByPlantTypeDict[plantType] if int(onlineYear) + lifetimePlantType < currYear: if plantType in renewablePlantTypes: readdRenewablePlant( genFleet, row, currYear) #readd to fleet before add retired year! row[retiredByAgeCol] = currYear retiredUnitsByAge.append(createGenSymbol(row, genFleet[0])) capacExpRetiredUnitsByAge.append(['UnitsRetiredByAge' + str(currYear)] + retiredUnitsByAge)
def setupHourlyResultBySto(daysForUC, fleetUC): stoRows = [fleetUC[0]] + [ row for row in fleetUC if row[fleetUC[0].index('PlantType')] == 'Storage' ] #Initialize stuff (genToRow, hourToCol, chargeByStoUnits) = (dict(), dict(), []) #Create empty 2d list numRows = len( stoRows) - 1 + 1 #-1 for header in fleet, +1 for header in new 2d list for idx in range(numRows): chargeByStoUnits.append([''] * (1 + len(daysForUC) * 24)) #Add hours as first row, starting at col 1 since first col is gen IDs hourSymbolsForUC = getHourSymbolsForUC(daysForUC) genIDLabel = 'genID' chargeByStoUnits[0] = [genIDLabel] + hourSymbolsForUC #Create dict mapping hours to col #s for idx in range(1, len(chargeByStoUnits[0])): hourToCol[chargeByStoUnits[0][idx]] = idx #Add gens as first col, starting at row 1 since first row is hours genSymbols = [createGenSymbol(row, stoRows[0]) for row in stoRows[1:]] for idx in range(1, len(chargeByStoUnits)): chargeByStoUnits[idx][0] = genSymbols[ idx - 1] #-1 b/c row 1 of hourlyGen = hours #Create dict mapping gens to row #s firstColVals = [row[0] for row in chargeByStoUnits] genToRow = dict() for idx in range(1, len(firstColVals)): genToRow[firstColVals[idx]] = idx return (chargeByStoUnits, genToRow, hourToCol)
def setupHourlyGenByPlant(hourSymbolsForUC, fleetUC): (genToRow, hourToCol) = (dict(), dict()) #Create empty 2d list numRows = len( fleetUC) - 1 + 1 #-1 for header in fleet, +1 for header in new 2d list hourlyGenByPlant = [] for idx in range(numRows): hourlyGenByPlant.append([''] * (1 + len(hourSymbolsForUC))) #Add hours as first row, starting at col 1 since first col is gen IDs genIDLabel = 'genID' hourlyGenByPlant[0] = [genIDLabel] + hourSymbolsForUC #Create dict mapping hours to col #s for idx in range(1, len(hourlyGenByPlant[0])): hourToCol[hourlyGenByPlant[0][idx]] = idx #Add gens as first col, starting at row 1 since first row is hours genSymbols = [createGenSymbol(row, fleetUC[0]) for row in fleetUC[1:]] for idx in range(1, len(hourlyGenByPlant)): hourlyGenByPlant[idx][0] = genSymbols[ idx - 1] #-1 b/c row 1 of hourlyGen = hours #Create dict mapping gens to row #s firstColVals = [row[0] for row in hourlyGenByPlant] genToRow = dict() for idx in range(1, len(firstColVals)): genToRow[firstColVals[idx]] = idx return (hourlyGenByPlant, genToRow, hourToCol)
def getGenDicts(fleetDir): lbToTon = 2000 fleet = readCSVto2dList(os.path.join(fleetDir, 'genFleetUC2015.csv')) orisCol, genIdCol = fleet[0].index('ORIS Plant Code'), fleet[0].index( 'Unit ID') fuelCol = fleet[0].index('Modeled Fuels') capacCol = fleet[0].index('Capacity (MW)') plantTypeCol = fleet[0].index('PlantType') co2Col = fleet[0].index('CO2EmRate(lb/MMBtu)') hrCol = fleet[0].index('Heat Rate (Btu/kWh)') genToCapac, genToPlantType, genToFuel = dict(), dict(), dict() genToCo2Ems = dict() for row in fleet[1:]: genToCapac[createGenSymbol(row, fleet[0])] = float(row[capacCol]) genToPlantType[createGenSymbol(row, fleet[0])] = row[plantTypeCol] genToFuel[createGenSymbol(row, fleet[0])] = row[fuelCol] genToCo2Ems[createGenSymbol(row, fleet[0])] = float( row[co2Col]) / lbToTon * float(row[hrCol]) #ton/GWh return (genToCapac, genToPlantType, genToFuel, genToCo2Ems)
def plotGenUtilizationOverTime(yearList, resultDir): resultDir = os.path.join(resultDir, 'CE') plt.figure(4, figsize=(25, 35)) ctr = 1 for year in yearList: fleet = readCSVto2dList( os.path.join(resultDir, 'genFleetForCE' + str(year) + '.csv')) capacCol = fleet[0].index('Capacity (MW)') fleetGenRows = [createGenSymbol(row, fleet[0]) for row in fleet[1:]] ax = plt.subplot(3, 2, ctr) ctr += 1 #Update fuel prices to current year newTechs = readCSVto2dList( os.path.join(resultDir, 'newTechsCE' + str(year) + '.csv')) fuelPricesTimeSeries = importFuelPrices() updateFuelPrices(fleet, newTechs, year, fuelPricesTimeSeries) #Get exist gens util & op cost fleetOpcosts, hrs = calcOpCosts(fleet, 2000, 0) genGen = readCSVto2dList( os.path.join(resultDir, 'genByPlantCE' + str(year) + '.csv')) genRegup = readCSVto2dList( os.path.join(resultDir, 'regupByPlantCE' + str(year) + '.csv')) genFlex = readCSVto2dList( os.path.join(resultDir, 'flexByPlantCE' + str(year) + '.csv')) genCont = readCSVto2dList( os.path.join(resultDir, 'contByPlantCE' + str(year) + '.csv')) yearUtils, yearOpcosts = [], [] for row in genGen[1:]: unit, gen = row[0], sum([float(val) for val in row[1:]]) * 1000 regup = sum([ float(val) for val in genRegup[[row[0] for row in genRegup].index(unit)][1:] ]) * 1000 flex = sum([ float(val) for val in genFlex[[row[0] for row in genFlex].index(unit)][1:] ]) * 1000 cont = sum([ float(val) for val in genCont[[row[0] for row in genCont].index(unit)][1:] ]) * 1000 fleetRowIdx = fleetGenRows.index(unit) capac = float(fleet[fleetRowIdx + 1][capacCol]) opcost = fleetOpcosts[fleetRowIdx] util = (gen + regup + flex + cont) / (capac * len(row[1:])) if util > 2: print(unit, capac) yearUtils.append(util) yearOpcosts.append(opcost) ax.scatter(yearOpcosts, yearUtils, color='red', label='ExistingGens') #Get op cost and utilization for new techs addedTechs = readCSVto2dList( os.path.join(resultDir, 'genAdditionsCE' + str(year) + '.csv')) addedCol = addedTechs[0].index('UnitsAdded' + str(year)) fpCol, hrCol = newTechs[0].index( 'FuelCost($/MMBtu)'), newTechs[0].index('HR(Btu/kWh)') vomCol, techCapacCol = newTechs[0].index( 'VOM(2012$/MWh)'), newTechs[0].index('Capacity(MW)') techCol = newTechs[0].index('TechnologyType') techGen = readCSVto2dList( os.path.join(resultDir, 'genByTechCE' + str(year) + '.csv')) techRegup = readCSVto2dList( os.path.join(resultDir, 'regupByTechCE' + str(year) + '.csv')) techFlex = readCSVto2dList( os.path.join(resultDir, 'flexByTechCE' + str(year) + '.csv')) techCont = readCSVto2dList( os.path.join(resultDir, 'contByTechCE' + str(year) + '.csv')) techOpcosts, hrs = calcBaseOpCost(fpCol, hrCol, vomCol, newTechs) yearUtils, yearOpcosts = [], [] for row in techGen[1:]: tech, gen = row[0], sum([float(val) for val in row[1:]]) * 1000 opcost = techOpcosts[[row[techCol] for row in newTechs].index(tech) - 1] regup = sum([ float(val) for val in techRegup[[row[0] for row in techRegup].index(tech)][1:] ]) * 1000 flex = sum([ float(val) for val in techFlex[[row[0] for row in techFlex].index(tech)][1:] ]) * 1000 cont = sum([ float(val) for val in techCont[[row[0] for row in techCont].index(tech)][1:] ]) * 1000 techRowIdx = [row[0] for row in newTechs].index(tech) capac = float(newTechs[techRowIdx][techCapacCol]) numAdded = float(addedTechs[[row[0] for row in addedTechs ].index(tech)][addedCol]) if numAdded > 0: util = (gen + regup + flex + cont) / (capac * numAdded * len(row[1:])) else: util = 0 yearUtils.append(util) yearOpcosts.append(opcost) ax.scatter(yearOpcosts, yearUtils, color='blue', label='NewTechs') plt.xlim(xmin=-3) plt.ylim(ymin=-.02) plt.legend() plt.title('Util versus Op Cost in ' + str(year)) plt.xlabel('Op Cost ($/MWh)') plt.ylabel('Utilization by Gen & Res Prov')