def fetchIexGraphContext(appDbConnStr: str, startDt: dt.datetime, endDt: dt.datetime) -> bool:
    mRepo = MetricsDataRepo(appDbConnStr)
    
    # get iex rtm data for the range between start date and end date
    startDt = endDt - dt.timedelta(days=1)
    iexDamMcvVals = mRepo.getIexDamBlockWiseData('MCV (MW)', startDt, endDt)
    iexDamMcpVals = mRepo.getIexDamBlockWiseData('MCP (Rs/MWh) ', startDt, endDt)
    for itr in range(len(iexDamMcvVals)):
        iexDamMcvVals[itr]['metric_name'] = 'DAM MCV(MW)'
        iexDamMcvVals[itr]['time_stamp'] = itr+1
    for itr in range(len(iexDamMcpVals)):
        iexDamMcpVals[itr]['metric_name'] = 'DAM MCP(Rs/KWH)'
        iexDamMcpVals[itr]['time_stamp'] = itr+1
    iexRtmMcvVals = mRepo.getIexRtmBlockWiseData('MCV (MW)', startDt, endDt)
    iexRtmMcpVals = mRepo.getIexRtmBlockWiseData('MCP (Rs/MWh) ', startDt, endDt)
    for itr in range(len(iexRtmMcvVals)):
        iexRtmMcvVals[itr]['metric_name'] = 'RTM MCV(MW)'
        iexRtmMcvVals[itr]['time_stamp'] = itr+1
    for itr in range(len(iexRtmMcpVals)):
        iexRtmMcpVals[itr]['metric_name'] = 'RTM MCP(Rs/KWH)'
        iexRtmMcpVals[itr]['time_stamp'] = itr+1

    # create plot image for demands of prev yr, prev month, this month
    iexDamMcvObjs = [{'Date': 
        x["time_stamp"], 'colName': x['metric_name'], 'val': x["data_value"]} for x in iexDamMcvVals]
    iexDamMcpObjs = [{'Date': 
        x["time_stamp"], 'colName': x['metric_name'], 'val': x["data_value"]} for x in iexDamMcpVals]
    iexRtmMcvObjs = [{'Date': 
        x["time_stamp"], 'colName': x['metric_name'], 'val': x["data_value"]} for x in iexRtmMcvVals]
    iexRtmMcpObjs = [{'Date': 
        x["time_stamp"], 'colName': x['metric_name'], 'val': x["data_value"]} for x in iexRtmMcpVals]
    pltDataObjs = iexDamMcvObjs + iexDamMcpObjs + iexRtmMcvObjs + iexRtmMcpObjs
    pltDataDf = pd.DataFrame(pltDataObjs)
    pltDataDf = pltDataDf.pivot(
        index='Date', columns='colName', values='val')
    pltDataDf['DAM MCP(Rs/KWH)'] = pltDataDf['DAM MCP(Rs/KWH)']/1000
    pltDataDf['RTM MCP(Rs/KWH)'] = pltDataDf['RTM MCP(Rs/KWH)']/1000
    pltDataDf['RTM MCP(Rs/KWH)'].replace(to_replace=0, method='ffill', inplace=True)
    pltDataDf['RTM MCV(MW)'].replace(to_replace=0, method='ffill', inplace=True)

    # derive plot title
    pltTitle = 'MCP & MCV Data as per IEX Data'
    dateStr = startDt.strftime("%d-%m-%Y")
    pltTitle = 'MCP & MCV Data as per IEX Data for {0}'.format(dateStr)

    # create a plotting area and get the figure, axes handle in return
    fig, ax = plt.subplots(figsize=(7.5, 4.5))
    # instantiate a second axes that shares the same x-axis
    ax2 = ax.twinx()
    # set plot title
    ax.set_title(pltTitle)
    # set y labels
    ax2.set_ylabel('Rs/KWH')
    ax.set_ylabel('MWH')
    ax.set_facecolor("#474747")

    # set y axis limit
    # fig.patch.set_facecolor('#d9ccff')

    clr = ['#66b3ff', '#df80ff', '#ff6666', '#00b359']
    # set x xis manually
    x_test = [1,6,11,16,21,26,31,36,41,46,51,56,61,66,71,76,81,86,91,96]

    # plot data and get the line artist object in return
    laThisMonth, = ax.plot(
        pltDataDf.index.values, pltDataDf['DAM MCV(MW)'].values, color='#66b3ff')
    laThisMonth.set_label('DAM MCV(MW)')

    laLastYear, = ax2.plot(
        pltDataDf.index.values, pltDataDf['DAM MCP(Rs/KWH)'].values, color='#df80ff')
    laLastYear.set_label('DAM MCP(Rs/KWH)')

    laPrevMonth, = ax.plot(
        pltDataDf.index.values, pltDataDf['RTM MCV(MW)'].values, color='#00b359')
    laPrevMonth.set_label('RTM MCV(MW)')

    laPrevMonth, = ax2.plot(
        pltDataDf.index.values, pltDataDf['RTM MCP(Rs/KWH)'].values, color='#ff6666')
    laPrevMonth.set_label('RTM MCP(Rs/KWH)')

    ax.set_xlim((1,96), auto = True)
    ax.set_xticks([1,6,11,16,21,26,31,36,41,46,51,56,61,66,71,76,81,86,91,96])
    # ax.set_xlim((1, 31), auto=True)
    # enable legends
    ax.legend(bbox_to_anchor=(0.0, -0.3, 1, 0), loc='best',
              ncol=3, mode="expand", borderaxespad=0.)
    ax2.legend(bbox_to_anchor=(0.0, -0.3, 1, 0), loc='lower right',
              ncol=3, mode="expand", borderaxespad=0.)
    fig.subplots_adjust(bottom=0.25, top=0.8)
    fig.savefig('assets/section_1_3.png')
    plt.close()

    return True
def fetchIexRtmTableContext(appDbConnStr: str, startDt: dt.datetime,
                            endDt: dt.datetime) -> IIexRtmRecord:
    mRepo = MetricsDataRepo(appDbConnStr)

    # get iex rtm data for the range between start date and end date
    iexRtmMcvVals = mRepo.getIexRtmBlockWiseData('MCV (MW)', startDt, endDt)
    iexRtmMcpVals = mRepo.getIexRtmBlockWiseData('MCP (Rs/MWh) ', startDt,
                                                 endDt)
    iexRtmMcvDf = pd.DataFrame(iexRtmMcvVals)
    iexRtmMcpDf = pd.DataFrame(iexRtmMcpVals)

    tableDf = iexRtmMcvDf.groupby(['time_stamp']).mean()
    tableDf = tableDf.rename(columns={'data_value': 'avg_mcv_data'})
    tableDf.reset_index(inplace=True)
    minDf = iexRtmMcvDf.groupby(['time_stamp']).min()
    minDf.reset_index(inplace=True)
    minDf = minDf.rename(columns={'data_value': 'min_mcv_data'})
    tableDf = tableDf.merge(minDf[['min_mcv_data', 'time_stamp']],
                            on='time_stamp')
    maxDf = iexRtmMcvDf.groupby(['time_stamp']).max()
    maxDf = maxDf.rename(columns={'data_value': 'max_mcv_data'})
    maxDf.reset_index(inplace=True)
    tableDf = tableDf.merge(maxDf[['max_mcv_data', 'time_stamp']],
                            on='time_stamp')

    minMcpDf = iexRtmMcpDf.groupby(['time_stamp']).min()
    minMcpDf.reset_index(inplace=True)
    minMcpDf = minMcpDf.rename(columns={'data_value': 'min_mcp_data'})
    minMcpDf['min_mcp_data'] = minMcpDf['min_mcp_data'] / 1000
    tableDf = tableDf.merge(minMcpDf[['min_mcp_data', 'time_stamp']],
                            on='time_stamp')
    maxMcpDf = iexRtmMcpDf.groupby(['time_stamp']).max()
    maxMcpDf.reset_index(inplace=True)
    maxMcpDf = maxMcpDf.rename(columns={'data_value': 'max_mcp_data'})
    maxMcpDf['max_mcp_data'] = maxMcpDf['max_mcp_data'] / 1000
    tableDf = tableDf.merge(maxMcpDf[['max_mcp_data', 'time_stamp']],
                            on='time_stamp')
    avgMcpDf = iexRtmMcpDf.groupby(['time_stamp']).mean()
    avgMcpDf.reset_index(inplace=True)
    avgMcpDf = avgMcpDf.rename(columns={'data_value': 'avg_mcp_data'})
    avgMcpDf['avg_mcp_data'] = avgMcpDf['avg_mcp_data'] / 1000
    tableDf = tableDf.merge(avgMcpDf[['avg_mcp_data', 'time_stamp']],
                            on='time_stamp')
    tableDf['rtm_energy'] = tableDf['avg_mcv_data'] * 24 / 1000

    iexRtmTableList: ISection_1_1["iex_rtm_table"] = []

    for i in tableDf.index:
        iexRtmDailyRecord: IIexRtmRecord = {
            'date_time': dt.datetime.strftime(tableDf['time_stamp'][i],
                                              '%d-%m-%Y'),
            'min_mcv': round(tableDf['min_mcv_data'][i]),
            'max_mcv': round(tableDf['max_mcv_data'][i]),
            'avg_mcv': round(tableDf['avg_mcv_data'][i]),
            'min_mcp': round(tableDf['min_mcp_data'][i], 2),
            'max_mcp': round(tableDf['max_mcp_data'][i], 2),
            'avg_mcp': round(tableDf['avg_mcp_data'][i], 2),
            'rtm_energy': round(tableDf['rtm_energy'][i])
        }
        iexRtmTableList.append(iexRtmDailyRecord)
    reportDt = dt.datetime(endDt.year, endDt.month, endDt.day)
    reportDt = reportDt - dt.timedelta(days=1)
    reportDt = dt.datetime.strftime(reportDt, '%Y-%m-%d')
    secData: IIexRtmRecord = {
        'iex_rtm_table': iexRtmTableList,
        'reportDt': reportDt
    }

    return secData