Source code for cea.plots.graphs_demand

# -*- coding: utf-8 -*-
"""
graphs algorithm
"""
from __future__ import division

import matplotlib.pyplot as plt
import pandas as pd

import cea
import cea.inputlocator
import multiprocessing as mp

MAX_ANALYSIS_FIELDS = 4

__author__ = "Jimeno A. Fonseca"
__copyright__ = "Copyright 2015, Architecture and Building Systems - ETH Zurich"
__credits__ = ["Jimeno A. Fonseca", "Daren Thomas"]
__license__ = "MIT"
__version__ = "0.1"
__maintainer__ = "Daren Thomas"
__email__ = "cea@arch.ethz.ch"
__status__ = "Production"

[docs]def graphs_demand(locator, analysis_fields, gv): """ algorithm to print graphs in PDF concerning the dynamics of each and all buildings :param locator: an InputLocator set to the scenario to compute :type locator: inputlocator.InputLocator :param analysis_fields: list of fields (column names in Totals.csv) to analyse :type analysis_fields: list[string] :returns: - Graphs of each building and total: .Pdf - heat map file per variable of interest n. """ color_palette = 'Set1' total_file = pd.read_csv(locator.get_total_demand()).set_index('Name') building_names = list(total_file.index) fields_MWhyr = [field.split('_')[0] + "_MWhyr" for field in analysis_fields] total_demand = total_file[fields_MWhyr] area_df = total_file['GFA_m2'] fields_date = analysis_fields + ['DATE'] num_buildings = len(building_names) print('Storing results in: %s' % locator.get_demand_plots_folder()) if gv.multiprocessing and mp.cpu_count() > 1: pool = mp.Pool() gv.log("Using %i CPU's" % mp.cpu_count()) joblist = [] for name in building_names: job = pool.apply_async(create_demand_graph_for_building, [analysis_fields, area_df, color_palette, fields_date, locator, name, total_demand]) joblist.append(job) for i, job in enumerate(joblist): job.get(60) gv.log('Building No. %(bno)i completed out of %(btot)i: %(bname)s', bno=i + 1, btot=num_buildings, bname=building_names[i]) pool.close() else: for i, name in enumerate(building_names): create_demand_graph_for_building(analysis_fields, area_df, color_palette, fields_date, locator, name, total_demand) gv.log('Building No. %(bno)i completed out of %(btot)i: %(bname)s', bno=i+1, btot=num_buildings, bname=building_names[i])
[docs]def create_demand_graph_for_building(analysis_fields, area_df, color_palette, fields_date, locator, name, total_demand): # CREATE PDF FILE from matplotlib.backends.backend_pdf import PdfPages pdf = PdfPages(locator.get_demand_plots_file(name)) # CREATE FIRST PAGE WITH TIMESERIES df = pd.read_csv(locator.get_demand_results_file(name), usecols=fields_date) df.index = pd.to_datetime(df.DATE) fig, (ax1, ax2, ax3, ax4) = plt.subplots(4, figsize=(12, 16)) fig.text(0.07, 0.5, 'Demand [kW]', va='center', rotation='vertical') df.plot(ax=ax1, y=analysis_fields, title='YEAR', colormap=color_palette, label=' ', legend=False) df[408:576].plot(ax=ax2, y=analysis_fields, title='WINTER', legend=False, colormap=color_palette) df[4102:4270].plot(ax=ax3, y=analysis_fields, title='SUMMER', legend=False, colormap=color_palette) df[3096:3264].plot(ax=ax4, y=analysis_fields, title='SPRING AND FALL', legend=False, colormap=color_palette) ax4.legend(bbox_to_anchor=(0, -0.4, 1, 0.102), loc=0, ncol=4, mode="expand", borderaxespad=0, fontsize=15) ax1.set_xlabel('') ax2.set_xlabel('') ax3.set_xlabel('') ax4.set_xlabel('') fig.subplots_adjust(hspace=0.5) pdf.savefig() plt.close() # CREATE SECOND PAGE WITH PLOTS OF TOTAL VALUES fig = plt.figure(figsize=(12, 6)) ax1 = fig.add_subplot(121) ax2 = fig.add_subplot(122) dftogether = pd.DataFrame({'TOTAL': total_demand.ix[name]}).T dftogether.plot(ax=ax1, kind='bar', title='TOTAL YEARLY CONSUMPTION', legend=False, stacked=True, colormap=color_palette) ax1.set_ylabel('Yearly Consumption [MWh/yr]') dftogether2 = pd.DataFrame({'EUI': (total_demand.ix[name] / area_df.ix[name] * 1000)}).T dftogether2.plot(ax=ax2, kind='bar', legend=False, title='ENERGY USE INTENSITY', stacked=True, colormap=color_palette) ax2.set_ylabel('Energy Use Intensity EUI [kWh/m2.yr]') pdf.savefig() plt.close() plt.clf() pdf.close()
[docs]def run_as_script(scenario_path=None, analysis_fields=["Ealf_kWh", "Qhsf_kWh", "Qwwf_kWh", "Qcsf_kWh"]): # HINTS FOR ARCGIS INTERFACE: # the user should see all the column names of the total_demands.csv # the user can select a maximum of 4 of those column names to graph (analysis fields! import cea.globalvar gv = cea.globalvar.GlobalVariables() if scenario_path is None: scenario_path = gv.scenario_reference locator = cea.inputlocator.InputLocator(scenario_path=scenario_path) graphs_demand(locator=locator, analysis_fields=analysis_fields, gv=gv) print('done.')
[docs]def demand_graph_fields(scenario_path): """Lists the available fields for the demand graphs - these are fields that are present in both the building demand results files as well as the totals file (albeit with different units).""" locator = cea.inputlocator.InputLocator(scenario_path) df_total_demand = pd.read_csv(locator.get_total_demand()) total_fields = set(df_total_demand.columns.tolist()) first_building = df_total_demand['Name'][0] df_building = pd.read_csv(locator.get_demand_results_file(first_building)) fields = set(df_building.columns.tolist()) fields.remove('DATE') fields.remove('Name') # remove fields in demand results files that do not have a corresponding field in the totals file bad_fields = set(field for field in fields if not field.split('_')[0] + "_MWhyr" in total_fields) fields = fields - bad_fields return list(fields)
if __name__ == '__main__': import argparse parser = argparse.ArgumentParser() parser.add_argument('-s', '--scenario', help='Path to the scenario folder') parser.add_argument('-a', '--analysis_fields', default='Ealf_kWh;Qhsf_kWh;Qwwf_kWh;Qcsf_kWh', help='Fields to analyse (separated by ";")') args = parser.parse_args() run_as_script(scenario_path=args.scenario, analysis_fields=args.analysis_fields.split(';')[:MAX_ANALYSIS_FIELDS])