コード例 #1
0
def fetchSection1_1_hydroContext(appDbConnStr: str, startDt: dt.datetime,
                                 endDt: dt.datetime) -> ISection_1_1_hydro:
    mRepo = MetricsDataRepo(appDbConnStr)
    # get hydro mu
    hydroMuVals = mRepo.getEntityMetricDailyData("wr", "Hydro(MU)", startDt,
                                                 endDt)
    cgsHrdroMuVals = mRepo.getEntityMetricDailyData("wr", "CGS Hydro(Mus)",
                                                    startDt, endDt)

    maxHydroMuObj = hydroMuVals[0]
    tot_month_hydro_gen_mu = 0
    for h, c in zip(hydroMuVals, cgsHrdroMuVals):
        tot_month_hydro_gen_mu += h["data_value"] + c["data_value"]
        iterationSum = h["data_value"] + c["data_value"]
        if iterationSum > maxHydroMuObj["data_value"]:
            maxHydroMuObj["data_value"] = iterationSum
    avg_month_hydro_gen_mu = tot_month_hydro_gen_mu / len(hydroMuVals)
    max_month_hydro_gen_mu = round(maxHydroMuObj["data_value"], 2)
    max_month_hydro_gen_mu_date = dt.datetime.strftime(
        maxHydroMuObj["time_stamp"], "%d-%b-%Y")

    # get hydro mu for last year
    hydroMuLastYrVals = mRepo.getEntityMetricDailyData("wr", "Hydro(MU)",
                                                       addMonths(startDt, -12),
                                                       addMonths(endDt, -12))
    cgsHrdroMuLastYrVals = mRepo.getEntityMetricDailyData(
        "wr", "CGS Hydro(Mus)", addMonths(startDt, -12), addMonths(endDt, -12))
    tot_last_year_hydro_gen_mu = 0
    for h, c in zip(hydroMuLastYrVals, cgsHrdroMuLastYrVals):
        tot_last_year_hydro_gen_mu += h["data_value"] + c["data_value"]

    tot_last_year_hydro_gen_mu_perc = round(
        100 * (tot_month_hydro_gen_mu - tot_last_year_hydro_gen_mu) /
        tot_last_year_hydro_gen_mu, 2)

    tot_last_year_hydro_gen_mu_perc_str = ""
    if tot_last_year_hydro_gen_mu_perc < 0:
        tot_last_year_hydro_gen_mu_perc_str = "reduced by {0}%".format(
            -1 * tot_last_year_hydro_gen_mu_perc)
    else:
        tot_last_year_hydro_gen_mu_perc_str = "increased by {0}%".format(
            tot_last_year_hydro_gen_mu_perc)

    secData: ISection_1_1_hydro = {
        "tot_month_hydro_gen_mu": round(tot_month_hydro_gen_mu),
        "tot_last_year_hydro_gen_mu": round(tot_last_year_hydro_gen_mu),
        "tot_last_year_hydro_gen_mu_perc_str":
        tot_last_year_hydro_gen_mu_perc_str,
        "avg_month_hydro_gen_mu": round(avg_month_hydro_gen_mu),
        "max_month_hydro_gen_mu": round(max_month_hydro_gen_mu),
        "max_month_hydro_gen_mu_date": max_month_hydro_gen_mu_date
    }
    return secData
コード例 #2
0
def fetchSection1_1_4Context(appDbConnStr: str, startDt: dt.datetime,
                             endDt: dt.datetime) -> ISection_1_1_4:
    monthDtObj = dt.datetime(startDt.year, startDt.month, 1)
    month_name = dt.datetime.strftime(startDt, "%b %y")
    mRepo = MetricsDataRepo(appDbConnStr)
    # get WR Unrestricted demand hourly values for this month and prev yr month
    wrConMuVals = mRepo.getEntityMetricDailyData('wr', 'Requirement (MU)',
                                                 startDt, endDt)
    wrConMuDf = pd.DataFrame(wrConMuVals)
    wrConMuDf = wrConMuDf.pivot(index='time_stamp',
                                columns='metric_name',
                                values='data_value')

    lastYrStartDt = addMonths(startDt, -12)
    lastYrEndDt = addMonths(endDt, -12)
    last_yr_month_name = dt.datetime.strftime(lastYrStartDt, "%b %y")
    wrLastYrConMuVals = mRepo.getEntityMetricDailyData('wr',
                                                       'Requirement (MU)',
                                                       lastYrStartDt,
                                                       lastYrEndDt)
    wrLastYrConMuDf = pd.DataFrame(wrLastYrConMuVals)
    wrLastYrConMuDf = wrLastYrConMuDf.pivot(index='time_stamp',
                                            columns='metric_name',
                                            values='data_value')

    wr_tot_req_mu = round(wrConMuDf['Requirement (MU)'].sum())
    wr_avg_req_mu = round(wrConMuDf['Requirement (MU)'].mean())
    wr_max_req_mu = round(wrConMuDf['Requirement (MU)'].max())
    wrMaxConsMuDate = wrConMuDf['Requirement (MU)'].idxmax()
    wr_avg_req_mu_last_yr = round(wrLastYrConMuDf['Requirement (MU)'].mean())

    wr_max_req_mu_date = "{0}".format(
        dt.datetime.strftime(wrMaxConsMuDate, "%d-%b-%y"))

    wr_avg_req_mu_perc_inc = round(
        100 * (wr_avg_req_mu - wr_avg_req_mu_last_yr) / wr_avg_req_mu_last_yr,
        2)
    secData: ISection_1_1_4 = {
        'wr_tot_req_mu': wr_tot_req_mu,
        'wr_avg_req_mu': wr_avg_req_mu,
        'wr_max_req_mu': wr_max_req_mu,
        'wr_max_req_mu_date': wr_max_req_mu_date,
        'wr_avg_req_mu_perc_inc': wr_avg_req_mu_perc_inc,
        'wr_avg_req_mu_last_yr': wr_avg_req_mu_last_yr
    }
    return secData
コード例 #3
0
def fetchSection1_5_1Context(appDbConnStr: str, startDt: dt.datetime, endDt: dt.datetime) -> dict:
    # get WR demand from recent Fin year start till this month
    # and WR demand from 2 years back fin year to last fin year
    # example: For Jan 21, we require data from 1-Apr-2019 to 31-Mar-2020 and 1-Apr-2020 to 31 Jan 21

    finYrStart = getFinYrDt(startDt)
    prevFinYrStart = getPrevFinYrDt(finYrStart)

    finYrName = '{0}-{1}'.format(finYrStart.year, (finYrStart.year+1) % 100)
    prevFinYrName = '{0}-{1}'.format(finYrStart.year-1, finYrStart.year % 100)
    mRepo = MetricsDataRepo(appDbConnStr)
    # get WR hourly demand values for this financial year
    wrDemVals = mRepo.getEntityMetricDailyData(
        'wr', 'Max Demand(MW)', finYrStart, endDt)
    wrPrevFinYrDemVals = mRepo.getEntityMetricDailyData(
        'wr', 'Max Demand(MW)', prevFinYrStart, finYrStart-dt.timedelta(days=1))

    # create plot image for demands of prev fin year and this fin year
    pltDemObjs = [{'MONTH': x["time_stamp"], 'colName': finYrName,
                   'val': x["data_value"]} for x in wrDemVals]
    pltDemObjsLastYear = [{'MONTH': x["time_stamp"],
                           'colName': prevFinYrName, 'val': x["data_value"]} for x in wrPrevFinYrDemVals]

    pltDataObjs = pltDemObjs + pltDemObjsLastYear

    pltDataDf = pd.DataFrame(pltDataObjs)
    pltDataDf = pltDataDf.pivot(
        index='MONTH', columns='colName', values='val')
    maxTs = pltDataDf.index.max()
    for rIter in range(pltDataDf.shape[0]):
        # check if Prev fin Yr data column is not Nan, if yes set this year data column
        lastYrDt = pltDataDf.index[rIter].to_pydatetime()
        if not pd.isna(pltDataDf[prevFinYrName].iloc[rIter]):
            thisYrTs = pd.Timestamp(addMonths(lastYrDt, 12))
            if thisYrTs <= maxTs:
                thisYrVal = pltDataDf[finYrName].loc[thisYrTs]
                pltDataDf.at[pd.Timestamp(lastYrDt), finYrName] = thisYrVal
    pltDataDf = pltDataDf[~pltDataDf[prevFinYrName].isna()]

    # save plot data as excel
    pltDataDf.to_excel("assets/plot_1_5_1.xlsx", index=True)

    # derive plot title
    pltTitle = 'WR seasonal demand (daily max.) Plot {0} to {1}'.format(
        prevFinYrName, finYrName)

    # create a plotting area and get the figure, axes handle in return
    fig, ax = plt.subplots(figsize=(7.5, 4.8))
    # set plot title
    ax.set_title(pltTitle)
    # set x and y labels
    ax.set_xlabel('MONTH')
    ax.set_ylabel('MW')

    # set x axis locator as month
    ax.xaxis.set_major_locator(mdates.MonthLocator())
    # set x axis formatter as month name
    ax.xaxis.set_major_formatter(mdates.DateFormatter('%b'))

    # ax.set_xlim(xmin=finYrStart)

    # plot data and get the line artist object in return
    laThisYr, = ax.plot(pltDataDf.index.values,
                        pltDataDf[finYrName].values, color='#ff0000')
    laThisYr.set_label(finYrName)

    laLastYear, = ax.plot(pltDataDf.index.values,
                          pltDataDf[prevFinYrName].values, color='#0000ff')
    laLastYear.set_label(prevFinYrName)

    # enable axis grid lines
    ax.yaxis.grid(True)
    ax.xaxis.grid(True)
    # enable legends
    ax.legend(bbox_to_anchor=(0.0, -0.3, 1, 0), loc='lower center',
              ncol=2, borderaxespad=0.)
    fig.subplots_adjust(bottom=0.25, top=0.8)
    fig.savefig('assets/section_1_5_1.png')

    secData: dict = {}
    return secData
コード例 #4
0
def fetchSection1_1_WindSolarContext(
        appDbConnStr: str, startDt: dt.datetime,
        endDt: dt.datetime) -> ISection_1_1_wind_solar:
    mRepo = MetricsDataRepo(appDbConnStr)
    # get solar mu
    solarMuVals = mRepo.getEntityMetricDailyData("wr", "Solar(MU)", startDt,
                                                 endDt)
    cgsSolarMuVals = mRepo.getEntityMetricDailyData("wr", "CGS Solar(Mus)",
                                                    startDt, endDt)

    tot_month_solar_gen_mu = 0
    for s, c in zip(solarMuVals, cgsSolarMuVals):
        tot_month_solar_gen_mu += s["data_value"] + c["data_value"]
    avg_month_solar_gen_mu = tot_month_solar_gen_mu / len(solarMuVals)

    # get solar mu for last year
    solarMuLastYrVals = mRepo.getEntityMetricDailyData("wr", "Solar(MU)",
                                                       addMonths(startDt, -12),
                                                       addMonths(endDt, -12))

    cgsSolarMuLastYrVals = mRepo.getEntityMetricDailyData(
        "wr", "CGS Solar(Mus)", addMonths(startDt, -12), addMonths(endDt, -12))

    tot_last_year_solar_gen_mu = 0
    for s, c in zip(solarMuLastYrVals, cgsSolarMuLastYrVals):
        tot_last_year_solar_gen_mu += s["data_value"] + c["data_value"]

    tot_last_year_solar_gen_mu_perc = round(
        100 * (tot_month_solar_gen_mu - tot_last_year_solar_gen_mu) /
        tot_last_year_solar_gen_mu, 2)

    tot_last_year_solar_gen_mu_perc_str = ""
    if tot_last_year_solar_gen_mu_perc < 0:
        tot_last_year_solar_gen_mu_perc_str = "reduced by {0}%".format(
            -1 * tot_last_year_solar_gen_mu_perc)
    else:
        tot_last_year_solar_gen_mu_perc_str = "increased by {0}%".format(
            tot_last_year_solar_gen_mu_perc)

    solarMwVals = mRepo.getEntityMetricHourlyData("wr", "Solar(MW)", startDt,
                                                  endDt)
    maxSolarMwObj = solarMwVals[0]
    for v in solarMwVals:
        if v["data_value"] > maxSolarMwObj["data_value"]:
            maxSolarMwObj = v
    max_month_solar_gen_mw = maxSolarMwObj["data_value"]
    max_month_solar_gen_mw_date = '{0} at {1} hrs'.format(
        dt.datetime.strftime(maxSolarMwObj["time_stamp"], "%d %b %Y"),
        dt.datetime.strftime(maxSolarMwObj["time_stamp"], "%H:%M"))

    # get wind mu
    windMuVals = mRepo.getEntityMetricDailyData("wr", "Wind(MU)", startDt,
                                                endDt)
    cgsWindMuVals = mRepo.getEntityMetricDailyData("wr", "CGS Wind(Mus)",
                                                   startDt, endDt)
    tot_month_wind_gen_mu = 0
    for w, c in zip(windMuVals, cgsWindMuVals):
        tot_month_wind_gen_mu += w["data_value"] + c["data_value"]
    avg_month_wind_gen_mu = tot_month_wind_gen_mu / len(windMuVals)

    # get wind mu for last year
    windMuLastYrVals = mRepo.getEntityMetricDailyData("wr", "Wind(MU)",
                                                      addMonths(startDt, -12),
                                                      addMonths(endDt, -12))
    cgsWindMuLastYrVals = mRepo.getEntityMetricDailyData(
        "wr", "CGS Wind(Mus)", addMonths(startDt, -12), addMonths(endDt, -12))
    tot_last_year_wind_gen_mu = 0
    for w, c in zip(windMuLastYrVals, cgsWindMuLastYrVals):
        tot_last_year_wind_gen_mu += w["data_value"] + c["data_value"]

    tot_last_year_wind_gen_mu_perc = round(
        100 * (tot_month_wind_gen_mu - tot_last_year_wind_gen_mu) /
        tot_last_year_wind_gen_mu, 2)

    tot_last_year_wind_gen_mu_perc_str = ""
    if tot_last_year_wind_gen_mu_perc < 0:
        tot_last_year_wind_gen_mu_perc_str = "reduced by {0}%".format(
            -1 * tot_last_year_wind_gen_mu_perc)
    else:
        tot_last_year_wind_gen_mu_perc_str = "increased by {0}%".format(
            tot_last_year_wind_gen_mu_perc)

    windMwVals = mRepo.getEntityMetricHourlyData("wr", "Wind(MW)", startDt,
                                                 endDt)
    maxWindMwObj = windMwVals[0]
    for v in windMwVals:
        if v["data_value"] > maxWindMwObj["data_value"]:
            maxWindMwObj = v
    max_month_wind_gen_mw = maxWindMwObj["data_value"]
    max_month_wind_gen_mw_date = '{0} at {1} hrs'.format(
        dt.datetime.strftime(maxWindMwObj["time_stamp"], "%d %b %Y"),
        dt.datetime.strftime(maxWindMwObj["time_stamp"], "%H:%M"))

    # create dataframe for solar and wind addition
    resDf = pd.DataFrame(windMwVals + solarMwVals)
    resDf = resDf.pivot(index="time_stamp",
                        columns="metric_name",
                        values="data_value")
    resDf["Renewable"] = resDf["Wind(MW)"] + resDf["Solar(MW)"]
    max_month_ren_gen_mw = resDf["Renewable"].max()
    maxRenDt = resDf["Renewable"].idxmax().to_pydatetime()
    max_month_ren_gen_mw_date = '{0} at {1} hrs'.format(
        dt.datetime.strftime(maxRenDt, "%d %b %Y"),
        dt.datetime.strftime(maxRenDt, "%H:%M"))
    secData: ISection_1_1_wind_solar = {
        'tot_month_wind_gen_mu': round(tot_month_wind_gen_mu),
        'avg_month_wind_gen_mu': round(avg_month_wind_gen_mu, 1),
        'tot_last_year_wind_gen_mu_perc_str':
        tot_last_year_wind_gen_mu_perc_str,
        'tot_last_year_wind_gen_mu': round(tot_last_year_wind_gen_mu),
        'max_month_wind_gen_mw': round(max_month_wind_gen_mw),
        'max_month_wind_gen_mw_date': max_month_wind_gen_mw_date,
        'tot_month_solar_gen_mu': round(tot_month_solar_gen_mu),
        'avg_month_solar_gen_mu': round(avg_month_solar_gen_mu, 1),
        'tot_last_year_solar_gen_mu_perc_str':
        tot_last_year_solar_gen_mu_perc_str,
        'tot_last_year_solar_gen_mu': round(tot_last_year_solar_gen_mu),
        'max_month_solar_gen_mw': round(max_month_solar_gen_mw),
        'max_month_solar_gen_mw_date': max_month_solar_gen_mw_date,
        'max_month_ren_gen_mw': round(max_month_ren_gen_mw),
        'max_month_ren_gen_mw_date': max_month_ren_gen_mw_date
    }
    return secData
def fetchSection1_11_windPLF(appDbConnStr: str, startDt: dt.datetime,
                             endDt: dt.datetime) -> ISection_1_11_PLFCUF:
    constituentsInfos = getREConstituentsMappings()
    mRepo = MetricsDataRepo(appDbConnStr)

    numOfDays = (endDt - startDt).days + 1

    soFarHighestAllEntityGenVals = mRepo.getSoFarHighestAllEntityData(
        'soFarHighestWindGen', addMonths(startDt, -1))
    soFarHighestGenLookUp = {}
    for v in soFarHighestAllEntityGenVals:
        soFarHighestGenLookUp[v['constituent']] = {
            'value': v['data_value'],
            'ts': v['data_time']
        }

    dispRows: List[IPLFCUFDataRow] = []
    for cIter in range(len(constituentsInfos)):
        constInfo = constituentsInfos[cIter]

        if (math.isnan(constInfo['windCapacity'])):
            continue

        maxGenData = mRepo.getEntityMetricHourlyData(constInfo["entity_tag"],
                                                     "Wind(MW)", startDt,
                                                     endDt)

        if constInfo['entity_tag'] == 'central':
            windEnerConsumption = mRepo.getEntityMetricDailyData(
                'wr', 'CGS Wind(Mus)', startDt, endDt)
        elif constInfo['entity_tag'] == 'wr':
            windEnerConsumption = mRepo.getEntityMetricDailyData(
                'wr', "Wind(MU)", startDt, endDt)
            cgsWindEnerConsumption = mRepo.getEntityMetricDailyData(
                'wr', 'CGS Wind(Mus)', startDt, endDt)
            for w, c in zip(windEnerConsumption, cgsWindEnerConsumption):
                w["data_value"] += c["data_value"]
        else:
            windEnerConsumption = mRepo.getEntityMetricDailyData(
                constInfo['entity_tag'], 'Wind(MU)', startDt, endDt)

        energyConsumption = mRepo.getEntityMetricDailyData(
            constInfo['entity_tag'], 'Consumption(MU)', startDt, endDt)

        maxGenDf = pd.DataFrame(maxGenData)
        maxGenDf = maxGenDf.pivot(index='time_stamp',
                                  columns='metric_name',
                                  values='data_value')
        windEnerConsumptionSum = pd.DataFrame(windEnerConsumption).groupby(
            'entity_tag').sum().iloc[0]['data_value']

        if (len(energyConsumption) == 0):
            # This is for central sector as we dont have consumption data
            # calculate mu from mw
            # df = pd.DataFrame(maxGenData)
            # average = df.groupby('entity_tag').mean()
            # windEnerConsumptionSumDf = average * 0.024 * numOfDays #To Calculate Avg MU from MW
            # windEnerConsumptionSum = windEnerConsumptionSumDf.iloc[0]['data_value']
            EnerConsumptionSum = 0
            penetrationLevel = 0
        else:
            EnerConsumptionSum = pd.DataFrame(energyConsumption).groupby(
                'entity_tag').sum().iloc[0]['data_value']
            penetrationLevel = round(
                (windEnerConsumptionSum / EnerConsumptionSum) * 100, 2)

        maxWind = maxGenDf["Wind(MW)"].max()
        maxWindDt = maxGenDf["Wind(MW)"].idxmax()

        plf = (windEnerConsumptionSum *
               1000) / (int(constInfo['windCapacity']) * 24 * numOfDays)
        cuf = maxWind * 100 / (int(constInfo['windCapacity']))

        prevHighestWindObj = soFarHighestGenLookUp[constInfo["entity_tag"]]
        newHighestWind = maxWind
        newHighestWindTime = maxWindDt.to_pydatetime()

        if newHighestWind < prevHighestWindObj["value"]:
            newHighestWind = prevHighestWindObj["value"]
            newHighestWindTime = prevHighestWindObj["ts"]

        mRepo.insertSoFarHighest(constInfo['entity_tag'],
                                 "soFarHighestWindGen", startDt,
                                 newHighestWind, newHighestWindTime)
        # soFarHighestAllEntityGenVals = mRepo.getSoFarHighestAllEntityData(
        # 'soFarHighestWindGen', startDt)
        # soFarHighestGenLookUp = {}
        # for v in soFarHighestAllEntityGenVals:
        #     soFarHighestGenLookUp[v['constituent']] = {
        #     'value': v['data_value'], 'ts': v['data_time']}
        so_far_high_gen_str = str(
            round(newHighestWind)) + ' on ' + dt.datetime.strftime(
                newHighestWindTime,
                '%d-%b-%Y') + ' at ' + dt.datetime.strftime(
                    newHighestWindTime, '%H:%S')

        const_display_row: IPLFCUFDataRow = {
            'entity': constInfo['display_name'],
            'capacityMW': round(constInfo['windCapacity']),
            'maxgenerationMW': round(maxWind),
            'soFarHighestGenMW': so_far_high_gen_str,
            'energyGeneration': round(windEnerConsumptionSum),
            'energyConsumption': round(EnerConsumptionSum),
            'penetration': penetrationLevel,
            'plf': round(plf * 100),
            'cuf': round(cuf)
        }
        dispRows.append(const_display_row)

    secData: ISection_1_11_PLFCUF = {"so_far_hig_win_gen_plf": dispRows}
    return secData
def fetchSection1_5_3Context(appDbConnStr: str, startDt: dt.datetime,
                             endDt: dt.datetime) -> ISection_1_5_3:
    monthName = dt.datetime.strftime(startDt, "%b %y")
    mRepo = MetricsDataRepo(appDbConnStr)
    # get WR consumption Daily values for this month and prev yr month
    wrConVals = mRepo.getEntityMetricDailyData('wr', 'Consumption(MU)',
                                               startDt, endDt)
    conVals = [x['data_value'] for x in wrConVals]
    wr_max_con = max(conVals)
    wrMaxConDt = wrConVals[conVals.index(wr_max_con)]['time_stamp']
    wr_max_con_date_str = dt.datetime.strftime(wrMaxConDt, "%d-%b-%y")
    wr_avg_con = sum(conVals) / len(conVals)
    # wrMaxDemTimestampStr = dt.datetime.strftime(
    #     wrMaxConDt, "%d-%b-%y %H:%M")+" hrs"

    lastYrStartDt = addMonths(startDt, -12)
    lastYrEndDt = addMonths(endDt, -12)
    monthNameLastYear = dt.datetime.strftime(lastYrStartDt, "%b %y")
    wrLastYrConVals = mRepo.getEntityMetricDailyData('wr', 'Consumption(MU)',
                                                     lastYrStartDt,
                                                     lastYrEndDt)
    conVals = [x['data_value'] for x in wrLastYrConVals]
    wr_max_con_last_year = max(conVals)
    wr_max_con_date_str_last_year = dt.datetime.strftime(
        wrLastYrConVals[conVals.index(wr_max_con_last_year)]['time_stamp'],
        "%d-%b-%y")
    wr_avg_con_last_year = sum(conVals) / len(conVals)

    wr_avg_con_perc_change_last_year = round(
        100 * (wr_avg_con - wr_avg_con_last_year) / wr_avg_con_last_year, 2)
    wr_max_con_perc_change_last_year = round(
        100 * (wr_max_con - wr_max_con_last_year) / wr_max_con_last_year, 2)

    prevMonthStartDt = addMonths(startDt, -1)
    prevMonthEndDt = addMonths(endDt, -1)
    prev_month_name = dt.datetime.strftime(prevMonthStartDt, "%b %y")
    wrPrevMonthDemVals = mRepo.getEntityMetricDailyData(
        'wr', 'Consumption(MU)', prevMonthStartDt, prevMonthEndDt)
    conVals = [x['data_value'] for x in wrPrevMonthDemVals]
    wr_max_con_prev_month = max(conVals)
    wr_max_con_date_str_prev_month = dt.datetime.strftime(
        wrPrevMonthDemVals[conVals.index(wr_max_con_prev_month)]['time_stamp'],
        "%d-%b-%y")
    wr_avg_con_prev_month = sum(conVals) / len(conVals)

    wr_avg_con_perc_change_prev_month = round(
        100 * (wr_avg_con - wr_avg_con_prev_month) / wr_avg_con_prev_month, 2)
    wr_max_con_perc_change_prev_month = round(
        100 * (wr_max_con - wr_max_con_prev_month) / wr_max_con_prev_month, 2)

    # create plot image for demands of prev yr, prev month, this month
    pltDemObjs = [{
        'Date': convertDtToDayNum(x["time_stamp"]),
        'colName': monthName,
        'val': x["data_value"]
    } for x in wrConVals]
    pltDemObjsLastYear = [{
        'Date': convertDtToDayNum(x["time_stamp"]),
        'colName': monthNameLastYear,
        'val': x["data_value"]
    } for x in wrLastYrConVals]
    pltDemObjsPrevMonth = [{
        'Date': convertDtToDayNum(x["time_stamp"]),
        'colName': prev_month_name,
        'val': x["data_value"]
    } for x in wrPrevMonthDemVals]
    pltDataObjs = pltDemObjs + pltDemObjsLastYear + pltDemObjsPrevMonth

    pltDataDf = pd.DataFrame(pltDataObjs)
    pltDataDf = pltDataDf.pivot(index='Date', columns='colName', values='val')
    pltDataDf.reset_index(inplace=True)
    pltDataDf["Date"] = [math.floor(x) for x in pltDataDf["Date"]]
    # pltDataDf = pltDataDf.groupby(by="Date").max()
    # save plot data as excel
    pltDataDf.to_excel("assets/plot_1_5_3.xlsx", index=True)

    # derive plot title
    pltTitle = 'Energy Cons-{0}, {1} & {2} \n Max- {3}MUs, {4}MUs and {5}MUs'.format(
        monthName, prev_month_name, monthNameLastYear, round(wr_max_con),
        round(wr_max_con_prev_month), round(wr_max_con_last_year))

    # create a plotting area and get the figure, axes handle in return
    fig, ax = plt.subplots(figsize=(7.5, 4.5))
    # set plot title
    ax.set_title(pltTitle)
    # set x and y labels
    ax.set_xlabel('Date')
    ax.set_ylabel('MUs')
    # plot data and get the line artist object in return
    laThisMonth, = ax.plot(pltDataDf.index.values,
                           pltDataDf[monthName].values,
                           color='#ff0000')
    laThisMonth.set_label(monthName)

    laLastYear, = ax.plot(pltDataDf.index.values,
                          pltDataDf[monthNameLastYear].values,
                          color='#00ff00')
    laLastYear.set_label(monthNameLastYear)

    laPrevMonth, = ax.plot(pltDataDf.index.values,
                           pltDataDf[prev_month_name].values,
                           color='#A52A2A')
    laPrevMonth.set_label(prev_month_name)

    # enable y axis grid lines
    ax.yaxis.grid(True)
    ax.set_xlim((1, 31), auto=True)
    # enable legends
    ax.legend(bbox_to_anchor=(0.0, -0.3, 1, 0),
              loc='lower center',
              ncol=3,
              mode="expand",
              borderaxespad=0.)
    fig.subplots_adjust(bottom=0.25, top=0.8)
    fig.savefig('assets/section_1_5_3.png')

    secData: ISection_1_5_3 = {
        'prev_month_name': prev_month_name,
        'wr_max_con': round(wr_max_con),
        'wr_max_con_date_str': wr_max_con_date_str,
        'wr_avg_con': round(wr_avg_con),
        'wr_max_con_last_year': round(wr_max_con_last_year),
        'wr_max_con_date_str_last_year': wr_max_con_date_str_last_year,
        'wr_avg_con_last_year': round(wr_avg_con_last_year),
        'wr_avg_con_perc_change_last_year': wr_avg_con_perc_change_last_year,
        'wr_max_con_perc_change_last_year': wr_max_con_perc_change_last_year,
        'wr_max_con_prev_month': round(wr_max_con_prev_month),
        'wr_max_con_date_str_prev_month': wr_max_con_date_str_prev_month,
        'wr_avg_con_prev_month': round(wr_avg_con_prev_month),
        'wr_avg_con_perc_change_prev_month': wr_avg_con_perc_change_prev_month,
        'wr_max_con_perc_change_prev_month': wr_max_con_perc_change_prev_month
    }
    return secData
def fetchSection1_11_Solar_A(appDbConnStr: str, startDt: dt.datetime,
                             endDt: dt.datetime) -> dict:

    constituentsInfos = getREConstituentsMappings()
    mRepo = MetricsDataRepo(appDbConnStr)
    solarDataObj: list = []
    for cIter in range(len(constituentsInfos)):
        constInfo = constituentsInfos[cIter]

        if (math.isnan(constInfo['solarCapacity'])):
            continue

        if (constInfo['entity_tag'] == 'wr'):
            solarEnerGeneration = mRepo.getEntityMetricDailyData(
                constInfo['entity_tag'], 'Solar(MU)', startDt, endDt)
            cgsSolarGeneration = mRepo.getEntityMetricDailyData(
                constInfo['entity_tag'], 'CGS Solar(Mus)', startDt, endDt)

            for s, c in zip(solarEnerGeneration, cgsSolarGeneration):
                s['data_value'] += c['data_value']

        elif constInfo['entity_tag'] == 'central':
            solarEnerGeneration = mRepo.getEntityMetricDailyData(
                'wr', 'CGS Solar(Mus)', startDt, endDt)
            for c in solarEnerGeneration:
                c['entity_tag'] = 'central'

        else:
            solarEnerGeneration = mRepo.getEntityMetricDailyData(
                constInfo['entity_tag'], 'Solar(MU)', startDt, endDt)

        solarDataObj.append(solarEnerGeneration)

    if (len(solarDataObj) > 0):
        pltDataObj: list = []

        for temp in range(len(solarDataObj)):
            pltDataObj = pltDataObj + [{
                'Date': x["time_stamp"],
                'colName': x['entity_tag'],
                'val': x["data_value"]
            } for x in solarDataObj[temp]]

        pltDataDf = pd.DataFrame(pltDataObj)

        pltDataDf = pltDataDf.pivot(index='Date',
                                    columns='colName',
                                    values='val')
        pltDataDf.reset_index(inplace=True)
        pltDataDf.to_excel("assets/plot_1_11_solar_1.xlsx", index=True)

        pltTitle = 'Total Solar Generation (MUs) {0} '.format(
            startDt.strftime('%b-%y'))

        fig, ax = plt.subplots(figsize=(7.5, 5.5))

        ax.set_title(pltTitle)
        ax.set_ylabel('Mus')
        ax.set_xlabel('Date')

        # ax.set_facecolor("#ffffdc")
        fig.patch.set_facecolor("#ffffdc")

        ax.xaxis.set_major_locator(mdates.DayLocator(interval=2))
        ax.xaxis.set_major_formatter(mdates.DateFormatter('%d-%b-%Y'))

        clr = [
            '#00ccff', '#ff8533', '#ff0000', '#9900ff', '#ff3300', '#44ff66'
        ]
        for col in range(1, len(pltDataDf.columns)):
            ax.plot(pltDataDf['Date'],
                    pltDataDf[pltDataDf.columns[col]],
                    color=clr[col - 1],
                    label=pltDataDf.columns[col])

        ax.yaxis.grid(True)
        ax.legend(loc='best', ncol=4, borderaxespad=0.)

        plt.xticks(rotation=90)
        ax.set_xlim(xmin=startDt, xmax=endDt)
        fig.subplots_adjust(bottom=0.25, top=0.8)

        fig.savefig('assets/section_1_11_solar_1.png')
        # plt.show()
        # plt.close()

    secData: dict = {}
    return secData