MCA Bilanz

Bibliotheken importieren

# Name des aktuellen Notebooks für die exportierten Datein
file_name = "Bilanz" 
# Ordner auf dem Server (nach files/)
ftp_folder = 'Notebooks/Auswertung'

## Bibliotheken, Module und Text- bzw- Grafikformatierungen aus zentraler Datei laden
%run ../Template/libraries_and_styles.ipynb 
## Warum auch immer muss rcParams.update() in eine eigene Zelle... 
# mpl.rcParams['figure.figsize']
mpl.use('WebAgg')
mpl.use("pgf")
mpl.rcParams.update(params)  

Daten importieren

## Auflösung der Messdaten in Sekunden / Stunde in Sekunden    

# res         = 3600/3600
# daten       = pd.read_csv('../1_Daten/Arbeitsdaten/Daten_1H.csv')

res         = 60/3600
daten       = pd.read_csv('../1_Daten/Arbeitsdaten/Daten_60s.csv')

daten.set_index(['Zeit'], inplace=True)
daten.index = pd.to_datetime(daten.index) 

## dfs erstellen um sie füllen zu können
Energie_Tag   = pd.DataFrame().astype(np.float32)
Energie_Monat = pd.DataFrame().astype(np.float32)
Energie_Jahr  = pd.DataFrame(index=['1']).astype(np.float32)
## print columns
#print_md(str(daten.columns).replace("dtype='object')", "").replace("',", "\n").replace("\n\n", "\n").replace("Index(['", "").replace("'", "").replace("\"", "").replace("\n", "\n\n").replace("       ", "").replace("],", ""))

Funktionen

# Gauß`sche Addition
####################
def unc_2sign(u1=1.,u2=1.):
    uges = np.sqrt((u1*u1) + (u2*u2))
    return uges


# Berechnung der stochastischen und systematischen Messfehler
#############################################################
def unc_Q_combined(name, Th,uth,usysh, Tc,utc,usysc, md,u_md,usysmd, cp, dt, dist,nr,f_sigma,plot):

    ## Notwendig, um den moving_average aus der Funktion zu bekommen
    movemean = pd.DataFrame().astype(np.float32)
    DF_MEAN = pd.DataFrame().astype(np.float32)

    # Berechnung der stochastischen Unsicherheiten:
    Qt,u_Qt, Qday,u_Qday, Qmonth,u_Qmonth, Qyear,u_Qyear = unc_Q_stochastisch(T1=Th,ut1=uth,T2=Tc,ut2=utc,md=md,u_md=u_md,cp=cp,dt=dt, dist=dist)

    # Berechnung der systematischen Unsicherheiten
    u_Qday_sys,u_Qmonth_sys,u_Qyear_sys,qsys_mean,movemean = unc_Q_systematisch (T1=Th,usys1=usysh, T2=Tc,usys2=usysc, md=md,usysmd=usysmd, cp=cp, dt=dt, dist=dist,nr=nr,f_sigma=f_sigma,plot=plot)

    # Kombinieren der stochastischen und systematischen Messfehler
    u_Qday_comb   = unc_2sign(u_Qday,   u_Qday_sys)
    u_Qmonth_comb = unc_2sign(u_Qmonth, u_Qmonth_sys)
    u_Qyear_comb  = unc_2sign(u_Qyear,  u_Qyear_sys)

    Energie_Tag  [name + '_Wert']   = Qday
    Energie_Tag  [name + '_Fehler'] = u_Qday_comb
    Energie_Monat[name+'_Wert']   = Qmonth
    Energie_Monat[name+'_Fehler'] = u_Qmonth_comb
    Energie_Jahr[name+'_Wert']    = Qyear
    Energie_Jahr[name+'_Fehler']  = u_Qyear_comb

    return np.round(Qyear,3), np.round(u_Qyear_comb,3),np.round(u_Qyear,3), np.round(u_Qyear_sys,3), np.round(qsys_mean,5), movemean 



# Berechnung der stochastischen Messfehler
##########################################
def unc_Q_stochastisch(T1,ut1, T2,ut2, md,u_md, cp, dt, dist):

    ## maximaler stochsastischer Fehler
    if dist == 'max_error':
        dT       = np.maximum(T1-T2,0)
        #dT       = T1-T2
        Qt       = md*cp*dT*dt

        dT_max   = dT + ut1 + ut2
        md_max   = md + u_md
        Qt_max   = md_max*cp*dT_max*dt
        u_Qt     = Qt_max - Qt

        Qday     = Qt.resample('D').sum()
        u_Qday   = u_Qt.resample('D').sum()
        Qmonth   = Qt.resample('M').sum()
        u_Qmonth = u_Qt.resample('M').sum()
        Qyear    = Qt.resample('Y').sum().sum()               # angepasst um jahresübergreifen zu summieren
        u_Qyear  = u_Qt.resample('Y').sum().sum()           # angepasst um jahresübergreifen zu summieren 

    else: ## Normal oder Gleichverteilung
        ## Berechnung nur mit positiven Temperaturdifferenzen, damit der Vergleich stimmt.   
        dT      = np.maximum(T1-T2,0)
        #dT       = T1-T2
        u_dT     = unc_2sign(u1=ut1,u2=ut2)
        Qt       = md*cp*dT*dt 
        u_Qt     = np.sqrt((((md>0)*cp*dt*dT*u_md)**2+(cp*dt*md*u_dT)**2))
        u_Qt2    = u_Qt*u_Qt

        Qday     = Qt.resample('D').sum()
        u_Qday   = np.sqrt(u_Qt2.resample('D').sum())
        Qmonth   = Qt.resample('M').sum()
        u_Qmonth = np.sqrt(u_Qt2.resample('M').sum())
        Qyear    = Qt.resample('Y').sum().sum()               # angepasst um jahresübergreifen zu summieren
        u_Qyear  = np.sqrt(u_Qt2.resample('Y').sum().sum())   # angepasst um jahresübergreifen zu summieren 

    return (np.round(Qt,decimals=3),     np.round(u_Qt,decimals=3), 
            np.round(Qday,decimals=3),   np.round(u_Qday,decimals=3), 
            np.round(Qmonth,decimals=3), np.round(u_Qmonth,decimals=3),
            np.round(Qyear,decimals=3),  np.round(u_Qyear,decimals=3))




# Berechnung der systematischen Messfehler
##########################################
def unc_Q_systematisch(T1,usys1,T2,usys2,md,usysmd,cp,dt,dist,nr,f_sigma,plot):
    ## Vergleichsberechnung
    #Q_single = (md*cp*np.maximum(T1-T2,0)*dt).resample('Y').sum().sum()

    ## maximaler systematischer Fehler   
    if dist == 'max_error':
        dT          = T1 - T2 
        Qt          = md*cp*dT*dt
        dT_max      = dT + usys1 + usys2
        md_max      = md + usysmd
        Qt_max      = md_max*cp*dT_max*dt
        uQsys_max   = Qt_max - Qt

        Qday        = Qt.resample('D').sum()
        uQday_sys   = uQsys_max.resample('D').sum()
        Qmonth      = Qt.resample('M').sum()
        uQmonth_sys = uQsys_max.resample('M').sum()
        Qyear       = Qt.resample('Y').sum().sum()                    # angepasst um jahresübergreifend zu summieren
        uQyear_sys  = uQsys_max.resample('Y').sum().sum()           # angepasst um jahresübergreifend zu summieren

        # werden bei MAX nicht berechnet, müssen aber zurückgegeben werden
        qsys_mean = uQyear_sys 
        movmean   = 0 
        sigma_mov = 0
        movemean  = movmean
    else:


        ## Zufallszahlen generieren
        rand1 = np.random.RandomState(seed = 456)
        rand2 = np.random.RandomState(seed = 8822)
        rand3 = np.random.RandomState(seed = 42)
        rand4 = np.random.RandomState(seed = 4432)

        if dist == 'uniform': ## gleichverteilt
            uTh = rand1.uniform(-usys1,  usys1,  nr)
            uTc = rand2.uniform(-usys2,  usys2 , nr)
            umd = rand3.uniform(-usysmd, usysmd, nr)

        else:                 ## normalverteilt
            udT = rand4.normal(0, (usys1  / f_sigma), nr)
            uTh = rand1.normal(0, (usys1  / f_sigma), nr)
            uTc = rand2.normal(0, (usys2  / f_sigma), nr)
            umd = rand3.normal(0, (usysmd / f_sigma), nr) 


        Th  = 0 
        Tc  = 0
        dT0 = 0 

        for i in range(0,nr,1):           
            if dist == 'getrennt':            
                # beide Temperaturen bekommen eine systematiche Unsicherheit
                Th       =  T1 + uTh[i] 
                Tc       =  T2 + uTc[i] 
                dT       = np.maximum(Th-Tc,0)
            else:
                ## nur die Temperaturdifferenz bekommt eine systematische Unsicherheit
                dT0      = np.maximum(T1-T2,0)
                dT       = dT0 + udT[i]
                dT       = np.maximum(dT,0)

            md_manip = (md * (1+(umd[i]/100.)))## wenn dT + udT negaviv wird, wieder auf 0 setzen            
            ## Berechne Q
            Q_tmp    = md_manip*cp*dT*dt



            i_neg = np.where(Q_tmp<0)[0]      
            if len(i_neg)>1:
                print('Negative Energien vorhanden! '+str(i))
                Q_tmp[i_neg]=0

            tmp_str = "Q_{0}".format(i)
            if  i == 0:
                Q          = pd.DataFrame(Q_tmp, index=dT.index).astype(np.float32)#MemoryError:
                Q.columns  = [tmp_str]
            else:
                Q[tmp_str] = Q_tmp.values.astype(np.float32) #MemoryError: Unable to allocate array with shape (892, 2088412) and data type float64


        del [[Q_tmp, Th, Tc, md_manip, dT, dT0, tmp_str ]]; gc.collect()

        Qday        = Q.resample('D').sum().astype(np.float32) 
        uQday_sys   = Qday.std(axis=1) 
        Qmonth      = Q.resample('M').sum().astype(np.float32) 
        uQmonth_sys = Qmonth.std(axis=1) 
        Qyear       = Q.resample('Y').sum().sum().astype(np.float32) # angepasst um jahresübergreifend zu summieren
        uQyear_sys  = Qyear.std(axis=0)          # angepasst um jahresübergreifend zu summieren

        list_qsys = []
        for element in Q.columns:
            list_qsys.append(np.sum(Q[element]))
        #display(list_qsys)

        # display(Q.info())   
        del Q;  gc.collect()
        #display('Q.: '+str(round(process.memory_info().rss/1024/1024/1024,4))+' GB')

        qsys_mean = np.mean(list_qsys)
        movmean   = []
        sigma_mov = []

        for i in range(0,nr,1):
            movmean.append(np.mean(list_qsys[0:(i+1)]))
            sigma_mov.append(np.std(list_qsys[0:(i+1)]))

        movemean = movmean # for return 

        del list_qsys; gc.collect() 

        if plot==1: 
            # plot 
            fig, ax  = plt.subplots()  
            ax.ticklabel_format(useLocale=True) ## dot as thousand separator
            # moving lines
            plt.plot(np.arange(0,nr,1),movmean,             color=colo('blau',1), linestyle='--', linewidth=0.8, label = r'gleitender Mittelwert: $Q$')
            plt.plot(np.arange(0,nr,1),qsys_mean+sigma_mov, color=colo('rot',1),  linestyle='--', linewidth=0.8, label = r'gleitender Mittelwert: $u_{Q, sys}$')
            plt.plot(np.arange(0,nr,1),qsys_mean-sigma_mov, color=colo('rot',1),  linestyle='--', linewidth=0.8, label = '')
            # result of moving lines
            plt.axhline(y=int(round(qsys_mean,1)),                        color=colo('blau',1), linestyle='-', linewidth=0.8, label = r'Mittelwert: $Q$')
            plt.axhline(y=int(round(qsys_mean,1) + round(uQyear_sys,1)),  color=colo('rot',1),  linestyle='-', linewidth=0.8, label = r'Mittelwert: $u_{Q, sys}$')
            plt.axhline(y=int(round(qsys_mean,1) - round(uQyear_sys,1)),  color=colo('rot',1),  linestyle='-', linewidth=0.8, label = '')
            # Text for result of moving lines right side
#             ax.text(1.02, qsys_mean,            str(int(qsys_mean))           +' kWh', va='center', ha="left", transform=ax.get_yaxis_transform())
#             ax.text(1.02, qsys_mean+uQyear_sys, str(int(qsys_mean+uQyear_sys))+' kWh', va='center', ha="left", transform=ax.get_yaxis_transform())
#             ax.text(1.02, qsys_mean-uQyear_sys, str(int(qsys_mean-uQyear_sys))+' kWh', va='center', ha="left", transform=ax.get_yaxis_transform())


            ax.text(1.02, qsys_mean+uQyear_sys/2, '+'+str(int(round(uQyear_sys,1)))+' kWh \n+'+str(round(uQyear_sys/qsys_mean*100,1))+'\%' , va='center', ha="left", fontsize=6, color='black', transform=ax.get_yaxis_transform())
            ax.text(1.02, qsys_mean-uQyear_sys/2, '-'+str(int(round(uQyear_sys,1)))+' kWh \n-'+str(round(uQyear_sys/qsys_mean*100,1))+'\%' , va='center', ha="left", fontsize=6, color='black', transform=ax.get_yaxis_transform())

#             ax.set_title(name)
            ax.set_ylabel(r'\textbf{Wärmemenge} (kWh)')
            ax.set_xlabel(r'\textbf{Wiederholungen} (n)')
            ax.get_yaxis().set_major_formatter(mpl.ticker.FuncFormatter(lambda x, loc: locale.format_string('%d', x, 1))) ## dot as thousand separator for Y
            ax.get_xaxis().set_major_formatter(mpl.ticker.FuncFormatter(lambda x, loc: locale.format_string('%d', x, 1))) ## dot as thousand separator for X

#             ax.xaxis.set_tick_params(width=0.5)
#             ax.yaxis.set_tick_params(width=0.5) 

            ## Beschriftung der Y Achse nur mit den Ergebniswerten 
            ax.get_yaxis().set_ticks([int(qsys_mean),int(qsys_mean+uQyear_sys),int(qsys_mean-uQyear_sys)])

            ax.set_xlim(0, nr)

            h0, l0 = ax.get_legend_handles_labels() 

            legend = plt.legend(h0, l0, loc=1, ncol=2)   
            set_legend_linewidth(legend) 
            plt.savefig(output_folder + '/' + file_name + '_' + name +'_MCA.pdf') 
            display(fig)
            close_all()

    #del [[movmean, sigma_mov ]]; gc.collect()

    return uQday_sys,uQmonth_sys,uQyear_sys,qsys_mean, movemean

Energieberechnung

## Faktor für die systematischen Unsicherheiten
kalibriert = .5
cp         = (4.2/3.6) / 1000.0 
dt         = res
dist       = "normal"
f_sigma    = 2.0
nr         = 2000
plot       = 1

Solar

name   = 'Solar'
Th     = daten.S_Solar_VL
uth    = 1.0 * kalibriert
usysh  = 0.8 * kalibriert
Tc     = daten.S_Solar_RL
utc    = 1.0 * kalibriert
usysc  = 0.8 * kalibriert
md     = daten.S_Solar_Vpunkt * 0.998
u_md   = 5.0 * kalibriert
usysmd = 3.0 * kalibriert

# Funktionsaufruf
Qyear,u_Qyear_comb,u_Qyear,u_Qyear_sys, qsys_mean, movemean = unc_Q_combined(name,Th,uth,usysh,Tc,utc,usysc,md,u_md,usysmd,((4.2/3.6) / 1000.0),res,'normal',2000,2.0,1)
# Vergleichsrechnung
Q_single = (md*cp*np.maximum(Th-Tc,0)*dt).resample('Y').sum().sum()
Markdown('**'+name+'**    <br />'
         'Verteilung:             **'+dist+'**, \u03C3: **'+str(f_sigma)+'**, Runden: **'+str(nr)+'**, Datensätze: **'+str(Th.count())+'**, <span class="burk">Zeitschritt</span>: **'+str(int(dt*3600))+'s**    <br />'  
         'Wärmemenge Gesamtunsicherheit:                **'+str(int(Qyear.sum()))+' kWh \u00B1 '+str(int(u_Qyear_comb))+'** kWh   <br />'  
         'deterministische Unsicherheit:           \u00B1 '+str(round(u_Qyear_sys,3))+' kWh   <br />'         
         'stochastische Unsicherheit:              \u00B1 '+str(round(u_Qyear,3))+' kWh   <br />' 
         'Verhältnis von Referenz zu Q:  **'+str(round(Q_single/qsys_mean,5))+'**   <br />'          
         'Variationskoeffizient letztes 1/3:**'+str(round( (np.std(movemean[-int(nr/3):]) / np.mean(movemean[-int(nr/3):]) ), 6))+'**<br />' )

Solar
Verteilung: normal, σ: 2.0, Runden: 2000, Datensätze: 522105, Zeitschritt: 60s
Wärmemenge Gesamtunsicherheit: 3210 kWh ± 167 kWh
deterministische Unsicherheit: ± 167.793 kWh
stochastische Unsicherheit: ± 2.214 kWh
Verhältnis von Referenz zu Q: 1.00024
Variationskoeffizient letztes 1/3:0.000233

Kessel

name   = 'Kessel'
Th     = daten.S_Kessel_VL
uth    = 1.0 * kalibriert
usysh  = 0.8 * kalibriert
Tc     = daten.S_Kessel_RL
utc    = 1.0 * kalibriert
usysc  = 0.8 * kalibriert
md     = daten.S_Kessel_Vpunkt * 0.998
u_md   = 5.0 * kalibriert
usysmd = 3.0 * kalibriert

# Funktionsaufruf
Qyear,u_Qyear_comb,u_Qyear,u_Qyear_sys, qsys_mean, movemean = unc_Q_combined(name,Th,uth,usysh,Tc,utc,usysc,md,u_md,usysmd,((4.2/3.6) / 1000.0),res,'normal',2000,2.0,1)
# Vergleichsrechnung
Q_single = (md*cp*np.maximum(Th-Tc,0)*dt).resample('Y').sum().sum()
Markdown('**'+name+'**    <br />'
         'Verteilung:             **'+dist+'**, \u03C3: **'+str(f_sigma)+'**, Runden: **'+str(nr)+'**, Datensätze: **'+str(Th.count())+'**, <span class="burk">Zeitschritt</span>: **'+str(int(dt*3600))+'s**    <br />'  
         'Wärmemenge Gesamtunsicherheit:                **'+str(int(Qyear.sum()))+' kWh \u00B1 '+str(int(u_Qyear_comb))+'** kWh   <br />'  
         'deterministische Unsicherheit:           \u00B1 '+str(round(u_Qyear_sys,3))+' kWh   <br />'         
         'stochastische Unsicherheit:              \u00B1 '+str(round(u_Qyear,3))+' kWh   <br />' 
         'Verhältnis von Referenz zu Q:  **'+str(round(Q_single/qsys_mean,5))+'**   <br />'          
         'Variationskoeffizient letztes 1/3:**'+str(round( (np.std(movemean[-int(nr/3):]) / np.mean(movemean[-int(nr/3):]) ), 6))+'**<br />' )

Kessel
Verteilung: normal, σ: 2.0, Runden: 2000, Datensätze: 522105, Zeitschritt: 60s
Wärmemenge Gesamtunsicherheit: 20831 kWh ± 306 kWh
deterministische Unsicherheit: ± 306.32 kWh
stochastische Unsicherheit: ± 2.129 kWh
Verhältnis von Referenz zu Q: 0.99981
Variationskoeffizient letztes 1/3:6.7e-05

Heizung

name   = 'Heizung'
Th     = daten.S_Heizung_VL
uth    = 1.0 * kalibriert
usysh  = 0.8 * kalibriert
Tc     = daten.S_Heizung_RL
utc    = 1.0 * kalibriert
usysc  = 0.8 * kalibriert
md     = daten.S_Heizung_Vpunkt * 0.998
u_md   = 5.0 * kalibriert
usysmd = 3.0 * kalibriert

# Funktionsaufruf
Qyear,u_Qyear_comb,u_Qyear,u_Qyear_sys, qsys_mean, movemean = unc_Q_combined(name,Th,uth,usysh,Tc,utc,usysc,md,u_md,usysmd,((4.2/3.6) / 1000.0),res,'normal',2000,2.0,1)
# Vergleichsrechnung
Q_single = (md*cp*np.maximum(Th-Tc,0)*dt).resample('Y').sum().sum()
Markdown('**'+name+'**    <br />'
         'Verteilung:             **'+dist+'**, \u03C3: **'+str(f_sigma)+'**, Runden: **'+str(nr)+'**, Datensätze: **'+str(Th.count())+'**, <span class="burk">Zeitschritt</span>: **'+str(int(dt*3600))+'s**    <br />'  
         'Wärmemenge Gesamtunsicherheit:                **'+str(int(Qyear.sum()))+' kWh \u00B1 '+str(int(u_Qyear_comb))+'** kWh   <br />'  
         'deterministische Unsicherheit:           \u00B1 '+str(round(u_Qyear_sys,3))+' kWh   <br />'         
         'stochastische Unsicherheit:              \u00B1 '+str(round(u_Qyear,3))+' kWh   <br />' 
         'Verhältnis von Referenz zu Q:  **'+str(round(Q_single/qsys_mean,5))+'**   <br />'          
         'Variationskoeffizient letztes 1/3:**'+str(round( (np.std(movemean[-int(nr/3):]) / np.mean(movemean[-int(nr/3):]) ), 6))+'**<br />' )

Heizung
Verteilung: normal, σ: 2.0, Runden: 2000, Datensätze: 522105, Zeitschritt: 60s
Wärmemenge Gesamtunsicherheit: 20087 kWh ± 1095 kWh
deterministische Unsicherheit: ± 1095.474 kWh
stochastische Unsicherheit: ± 7.357 kWh
Verhältnis von Referenz zu Q: 1.00006
Variationskoeffizient letztes 1/3:0.000243

FriWa sek

name   = 'FriWa_Sek'
Th     = daten.S_FriWa_VL_Sek
uth    = 1.0 * kalibriert
usysh  = 0.8 * kalibriert
Tc     = daten.S_FriWa_RL_Sek
utc    = 1.0 * kalibriert
usysc  = 0.8 * kalibriert
md     = daten.S_FriWa_Vpunkt_Sek * 0.998
u_md   = 5.0 * kalibriert
usysmd = 3.0 * kalibriert

# Funktionsaufruf
Qyear,u_Qyear_comb,u_Qyear,u_Qyear_sys, qsys_mean, movemean = unc_Q_combined(name,Th,uth,usysh,Tc,utc,usysc,md,u_md,usysmd,((4.2/3.6) / 1000.0),res,'normal',2000,2.0,1)
# Vergleichsrechnung
Q_single = (md*cp*np.maximum(Th-Tc,0)*dt).resample('Y').sum().sum()
Markdown('**'+name+'**    <br />'
         'Verteilung:             **'+dist+'**, \u03C3: **'+str(f_sigma)+'**, Runden: **'+str(nr)+'**, Datensätze: **'+str(Th.count())+'**, <span class="burk">Zeitschritt</span>: **'+str(int(dt*3600))+'s**    <br />'  
         'Wärmemenge Gesamtunsicherheit:                **'+str(int(Qyear.sum()))+' kWh \u00B1 '+str(int(u_Qyear_comb))+'** kWh   <br />'  
         'deterministische Unsicherheit:           \u00B1 '+str(round(u_Qyear_sys,3))+' kWh   <br />'         
         'stochastische Unsicherheit:              \u00B1 '+str(round(u_Qyear,3))+' kWh   <br />' 
         'Verhältnis von Referenz zu Q:  **'+str(round(Q_single/qsys_mean,5))+'**   <br />'          
         'Variationskoeffizient letztes 1/3:**'+str(round( (np.std(movemean[-int(nr/3):]) / np.mean(movemean[-int(nr/3):]) ), 6))+'**<br />' )

FriWa_Sek
Verteilung: normal, σ: 2.0, Runden: 2000, Datensätze: 522105, Zeitschritt: 60s
Wärmemenge Gesamtunsicherheit: 599 kWh ± 16 kWh
deterministische Unsicherheit: ± 16.161 kWh
stochastische Unsicherheit: ± 0.356 kWh
Verhältnis von Referenz zu Q: 0.9994
Variationskoeffizient letztes 1/3:0.000116

FriWa prim

name   = 'FriWa_Prim'
Th     = daten.S_FriWa_VL_Prim
uth    = 1.0 * kalibriert
usysh  = 0.8 * kalibriert
Tc     = daten.S_FriWa_RL_Prim
utc    = 1.0 * kalibriert
usysc  = 0.8 * kalibriert
md     = daten.S_FriWa_Vpunkt_Prim * 0.998
u_md   = 5.0 * kalibriert
usysmd = 3.0 * kalibriert

# Funktionsaufruf
Qyear,u_Qyear_comb,u_Qyear,u_Qyear_sys, qsys_mean, movemean = unc_Q_combined(name,Th,uth,usysh,Tc,utc,usysc,md,u_md,usysmd,((4.2/3.6) / 1000.0),res,'normal',2000,2.0,1)
# Vergleichsrechnung
Q_single = (md*cp*np.maximum(Th-Tc,0)*dt).resample('Y').sum().sum()
Markdown('**'+name+'**    <br />'
         'Verteilung:             **'+dist+'**, \u03C3: **'+str(f_sigma)+'**, Runden: **'+str(nr)+'**, Datensätze: **'+str(Th.count())+'**, <span class="burk">Zeitschritt</span>: **'+str(int(dt*3600))+'s**    <br />'  
         'Wärmemenge Gesamtunsicherheit:                **'+str(int(Qyear.sum()))+' kWh \u00B1 '+str(int(u_Qyear_comb))+'** kWh   <br />'  
         'deterministische Unsicherheit:           \u00B1 '+str(round(u_Qyear_sys,3))+' kWh   <br />'         
         'stochastische Unsicherheit:              \u00B1 '+str(round(u_Qyear,3))+' kWh   <br />' 
         'Verhältnis von Referenz zu Q:  **'+str(round(Q_single/qsys_mean,5))+'**   <br />'          
         'Variationskoeffizient letztes 1/3:**'+str(round( (np.std(movemean[-int(nr/3):]) / np.mean(movemean[-int(nr/3):]) ), 6))+'**<br />' )

FriWa_Prim
Verteilung: normal, σ: 2.0, Runden: 2000, Datensätze: 522105, Zeitschritt: 60s
Wärmemenge Gesamtunsicherheit: 468 kWh ± 14 kWh
deterministische Unsicherheit: ± 14.349 kWh
stochastische Unsicherheit: ± 0.71 kWh
Verhältnis von Referenz zu Q: 0.99517
Variationskoeffizient letztes 1/3:0.000128

Speicher

Speichermitteltemperatur stochastisch

## Ungenauigkeiten Speichermitteltemperatur

## Höhenanteile
H1 = 0.2415
H2 = 0.2317
H3 = 0.1935
H4 = 0.1725
H5 = 0.1606

## Ungenauigkeiten Höhenanteile
U_H  = 0.1
U_H1 = H1 * U_H
U_H2 = H2 * U_H
U_H3 = H3 * U_H
U_H4 = H4 * U_H
U_H5 = H5 * U_H

## Temperaturen
T1 = daten["S_Speicher_1"]  
T2 = daten["S_Speicher_2"]
T3 = daten["S_Speicher_3"]
T4 = daten["S_Speicher_4"]
T5 = daten["S_Speicher_5"]

## Ungenauigkeiten Temperatur
U_T = 0.8 * kalibriert
U_T1 = T1 * U_T
U_T2 = T2 * U_T
U_T3 = T3 * U_T
U_T4 = T4 * U_T
U_T5 = T5 * U_T

## Mitteltemperatur
T_M_1 = H1 * T1 
T_M_2 = H2 * T2 
T_M_3 = H3 * T3 
T_M_4 = H4 * T4 
T_M_5 = H5 * T5
T_M   = T_M_1 + T_M_2 + T_M_3 + T_M_4 + T_M_5


# ## Ungenauigkeit Mitteltemperatur
# U_T_M_1 = np.sqrt(pow(H1 * U_T ,2) + pow(U_H * T1 ,2))
# U_T_M_2 = np.sqrt(pow(H2 * U_T ,2) + pow(U_H * T2 ,2))
# U_T_M_3 = np.sqrt(pow(H3 * U_T ,2) + pow(U_H * T3 ,2))
# U_T_M_4 = np.sqrt(pow(H4 * U_T ,2) + pow(U_H * T4 ,2))
# U_T_M_5 = np.sqrt(pow(H5 * U_T ,2) + pow(U_H * T5 ,2))
# U_T_M   = np.sqrt(  pow(U_T_M_1,2) + pow(U_T_M_2,2) + pow(U_T_M_3,2) + pow(U_T_M_4,2) + pow(U_T_M_5,2)  )

## Vereinfacht: Ungenauigkeit Mitteltemperatur
U_T_M_1 = pow(H1 * U_T ,2) + pow(U_H * T1 ,2)
U_T_M_2 = pow(H2 * U_T ,2) + pow(U_H * T2 ,2)
U_T_M_3 = pow(H3 * U_T ,2) + pow(U_H * T3 ,2)
U_T_M_4 = pow(H4 * U_T ,2) + pow(U_H * T4 ,2)
U_T_M_5 = pow(H5 * U_T ,2) + pow(U_H * T5 ,2)
U_T_M   = np.sqrt(U_T_M_1 + U_T_M_2 + U_T_M_3 + U_T_M_4 + U_T_M_5)

daten['S_Speicher_Mitteltemperatur_sto']        =  T_M
# daten['S_Speicher_Mitteltemperatur_vorher'] =  daten['S_Speicher_Mitteltemperatur'].shift()
daten["u_Speicher_Mitteltemperatur_sto"]        =  U_T_M
#daten['u_Speicher_Mitteltemperatur_vorher'] =  U_T_M.shift()


## für die nächste Zelle
u_Speicher_Mitteltemperatur_sto = daten['u_Speicher_Mitteltemperatur_sto'].resample("Y").mean().mean()
# print(u_Speicher_Mitteltemperatur_sto)
# 19.860803889155626

Speichermitteltemperatur systematisch

# Berechnung der systematischen Messfehler
##########################################
def unc_TM_systematisch(H1,H2,H3,H4,H5,T1,T2,T3,T4,T5,usys_H,usys_T, nr): 
    rand0 = np.random.RandomState(seed = 8822)
    rand1 = np.random.RandomState(seed = 5429)
    rand2 = np.random.RandomState(seed = 7845)
    rand3 = np.random.RandomState(seed = 6257)
    rand4 = np.random.RandomState(seed = 4432)
    rand5 = np.random.RandomState(seed = 4689)
    rand6 = np.random.RandomState(seed = 2357)
    rand7 = np.random.RandomState(seed = 1254)
    rand8 = np.random.RandomState(seed = 6587)
    rand9 = np.random.RandomState(seed = 2145)
    u_H1 = rand0.normal(0, (usys_H  / 2), nr)
    u_H2 = rand1.normal(0, (usys_H  / 2), nr)
    u_H3 = rand2.normal(0, (usys_H  / 2), nr)
    u_H4 = rand3.normal(0, (usys_H  / 2), nr)
    u_H5 = rand4.normal(0, (usys_H  / 2), nr)
    u_T1 = rand5.normal(0, (usys_T  / 2), nr)
    u_T2 = rand6.normal(0, (usys_T  / 2), nr)
    u_T3 = rand7.normal(0, (usys_T  / 2), nr)
    u_T4 = rand8.normal(0, (usys_T  / 2), nr)
    u_T5 = rand9.normal(0, (usys_T  / 2), nr)

    for i in range(0,nr,1):            
            T1_sys   =  T1 + u_T1[i] 
            T2_sys   =  T2 + u_T2[i] 
            T3_sys   =  T3 + u_T3[i] 
            T4_sys   =  T4 + u_T4[i] 
            T5_sys   =  T5 + u_T5[i] 
            H1_sys   =  H1 + u_H1[i] 
            H2_sys   =  H2 + u_H2[i] 
            H3_sys   =  H3 + u_H3[i] 
            H4_sys   =  H4 + u_H4[i] 
            H5_sys   =  H5 + u_H5[i]             
            TM_tmp   = T1_sys*H1_sys+T2_sys*H2_sys+T3_sys*H3_sys+T4_sys*H4_sys+T5_sys*H5_sys

            tmp_str = "Q_{0}".format(i)
            if  i == 0:
                Q          = pd.DataFrame(TM_tmp, index=T1_sys.index).astype(np.float32)#MemoryError:
                Q.columns  = [tmp_str]
            else:
                Q[tmp_str] = TM_tmp.values.astype(np.float32) #MemoryError: Unable to allocate array with shape (892, 2088412) and data type float6

    Qday        = Q.mean(axis=1) 
    uQday_sys   = Q.std(axis=1)   
    del [[TM_tmp,  tmp_str ]]; gc.collect()
    return Qday,uQday_sys 


## Höhenanteile
H1 = 0.2415
H2 = 0.2317
H3 = 0.1935
H4 = 0.1725
H5 = 0.1606

## Ungenauigkeiten Höhenanteile
usys_H  = 0.1 

## Temperaturen
T1 = daten["S_Speicher_1"]  
T2 = daten["S_Speicher_2"]
T3 = daten["S_Speicher_3"]
T4 = daten["S_Speicher_4"]
T5 = daten["S_Speicher_5"]

## Ungenauigkeiten Temperatur
usys_T = 0.8 * kalibriert

nr = 1000

TM,uTM_sys  = unc_TM_systematisch(H1,H2,H3,H4,H5,T1,T2,T3,T4,T5,usys_H,usys_T,nr)

daten['S_Speicher_Mitteltemperatur_sys']        =  TM 
daten["u_Speicher_Mitteltemperatur_sys"]        =  uTM_sys


daten['S_Speicher_Mitteltemperatur_sys'].head() 
Zeit
2017-05-01 00:00:00    58.140083
2017-05-01 00:01:00    58.153553
2017-05-01 00:02:00    58.180882
2017-05-01 00:03:00    58.161358
2017-05-01 00:04:00    58.192280
Name: S_Speicher_Mitteltemperatur_sys, dtype: float32

Speichermitteltempertaur Unsicherheiten verbinden

daten['u_Speicher_Mitteltemperatur'] = unc_2sign(daten['u_Speicher_Mitteltemperatur_sys'] ,daten['u_Speicher_Mitteltemperatur_sto'])
vergleich = daten['S_Speicher_Mitteltemperatur_sys'].resample("Y").sum().sum() / daten['S_Speicher_Mitteltemperatur_sto'].resample("Y").sum().sum()
display(vergleich)
daten['S_Speicher_Mitteltemperatur'] = daten['S_Speicher_Mitteltemperatur_sto']
1.0056010545686662

Plot Speichermitteltemperaturen inkl Unsicherheiten

close_all()
fig, ax = plt.subplots()
## muss gesampelt werden, sonst schafft LaTeX nicht die PDF zu erzeugen
sample ='1H'
daten['S_Speicher_Mitteltemperatur'].resample(sample).mean().plot(    ax=ax,color=colo('blau',1),  linewidth=0.5,alpha = 1,label = 'Speicher Mitteltemperatur') 
daten['u_Speicher_Mitteltemperatur_sys'].resample(sample).mean().plot(ax=ax,color=colo('grün',1),  linewidth=0.5,alpha = 1,label = 'sys Unsicherheit')
daten['u_Speicher_Mitteltemperatur_sto'].resample(sample).mean().plot(ax=ax,color=colo('rot',1),   linewidth=0.5,alpha = 1,label = 'sto Unsicherheit')
daten['u_Speicher_Mitteltemperatur'].resample(sample).mean().plot(    ax=ax,color=colo('orange',1),linewidth=0.5,alpha = 1,label = 'comb. Unsicherheit')

ax.set_ylabel(r'\textbf{Temperatur} ($^\circ$C)') 
ax.set(xlim=[pd.to_datetime("05.01.17 00:00:00"),pd.to_datetime("30.04.18 23:00:00")])
ax.set(ylim=0) 
ax.set_xlabel('') 

h0, l0 = ax.get_legend_handles_labels() 
legend = plt.legend(h0, l0, loc=1 )   
set_legend_linewidth(legend) 

plt.savefig(output_folder + '/' + file_name + '_Speichermitteltemperatur.pdf') 
display(fig)
close_all()

Speicherverluste


name   = 'Speicherverluste_MCA'
Th     = daten.S_Speicher_Mitteltemperatur 
uth    = u_Speicher_Mitteltemperatur_sto # ist der Durchschnitt, weil hier keine "pd.series" funktioniert
usysh  = uth / 2
Tc     = daten.S_Dachbodentemperatur
utc    = 3.5
usysc  = 1.7
md     = daten.S_Speicher_UA
u_md   = 0.5 / 1000
usysmd = 1.1 / 1000


cp      = (4.2/3.6) / 1000.0 
dt      = res
dist    = "normal"
f_sigma = 2.0
nr      = 2000
plot    = 1
# Funktionsaufruf dist=getrennt für unabhängige Unsicherheiten der Temperaturen
Qyear,u_Qyear_comb,u_Qyear,u_Qyear_sys, qsys_mean, movemean = unc_Q_combined(name,Th,uth,usysh,Tc,utc,usysc,md,u_md,usysmd,1,res,'getrennt',2000,2.0,1)
# Vergleichsrechnung
Q_single = (md*1*np.maximum(Th-Tc,0)*dt).resample('Y').sum().sum()
Markdown('**'+name+'**    <br />'
         'Verteilung:             **'+dist+'**, \u03C3: **'+str(f_sigma)+'**, Runden: **'+str(nr)+'**, Datensätze: **'+str(Th.count())+'**, <span class="burk">Zeitschritt</span>: **'+str(int(dt*3600))+'s**    <br />'  
         'Wärmemenge Gesamtunsicherheit:                **'+str(int(Qyear.sum()))+' kWh \u00B1 '+str(int(u_Qyear_comb))+'** kWh   <br />'  
         'deterministische Unsicherheit:           \u00B1 '+str(round(u_Qyear_sys,3))+' kWh   <br />'         
         'stochastische Unsicherheit:              \u00B1 '+str(round(u_Qyear,3))+' kWh   <br />' 
         'Verhältnis von Referenz zu Q:  **'+str(round(Q_single/qsys_mean,5))+'**   <br />'          
         'Variationskoeffizient letztes 1/3:**'+str(round( (np.std(movemean[-int(nr/3):]) / np.mean(movemean[-int(nr/3):]) ), 6))+'**<br />' )

Speicherverluste_MCA
Verteilung: normal, σ: 2.0, Runden: 2000, Datensätze: 522105, Zeitschritt: 60s
Wärmemenge Gesamtunsicherheit: 1916 kWh ± 191 kWh
deterministische Unsicherheit: ± 191.729 kWh
stochastische Unsicherheit: ± 1.106 kWh
Verhältnis von Referenz zu Q: 0.9994
Variationskoeffizient letztes 1/3:0.000373

Speicherbilanz

## eigentlich nur bei täglicher Analyse sinnvoll

name   = 'Speicher_Bilanz'
Th     = daten.S_Speicher_Mitteltemperatur 
uth    = u_Speicher_Mitteltemperatur_sto
usysh  = uth / 2
Tc     = daten.S_Speicher_Mitteltemperatur.shift()
utc    = uth
usysc  = uth / 2
md     = 1022
u_md   = 0.0
usysmd = 10

# Funktionsaufruf
Qyear,u_Qyear_comb,u_Qyear,u_Qyear_sys, qsys_mean, movemean = unc_Q_combined(name,Th,uth,usysh,Tc,utc,usysc,md,u_md,usysmd,((4.2/3.6) / 1000.0),res,'normal',2000,2.0,1)
# Vergleichsrechnung
Q_single = (md*cp*np.maximum(Th-Tc,0)*dt).resample('Y').sum().sum()
Markdown('**'+name+'**    <br />'
         'Verteilung:             **'+dist+'**, \u03C3: **'+str(f_sigma)+'**, Runden: **'+str(nr)+'**, Datensätze: **'+str(Th.count())+'**, <span class="burk">Zeitschritt</span>: **'+str(int(dt*3600))+'s**    <br />'  
         'Wärmemenge Gesamtunsicherheit:                **'+str(int(Qyear.sum()))+' kWh \u00B1 '+str(int(u_Qyear_comb))+'** kWh   <br />'  
         'deterministische Unsicherheit:           \u00B1 '+str(round(u_Qyear_sys,3))+' kWh   <br />'         
         'stochastische Unsicherheit:              \u00B1 '+str(round(u_Qyear,3))+' kWh   <br />' 
         'Verhältnis von Referenz zu Q:  **'+str(round(Q_single/qsys_mean,5))+'**   <br />'          
         'Variationskoeffizient letztes 1/3:**'+str(round( (np.std(movemean[-int(nr/3):]) / np.mean(movemean[-int(nr/3):]) ), 6))+'**<br />' )


Speicher_Bilanz
Verteilung: normal, σ: 2.0, Runden: 2000, Datensätze: 522105, Zeitschritt: 60s
Wärmemenge Gesamtunsicherheit: 175 kWh ± 17482 kWh
deterministische Unsicherheit: ± 17481.334 kWh
stochastische Unsicherheit: ± 236.902 kWh
Verhältnis von Referenz zu Q: 0.01474
Variationskoeffizient letztes 1/3:0.007015

Korrekturen und Erweiterungen

## Korrekturen und Erweiterungen

## Die Bilanzierung der im Speicher enthaltenen Wärmeenergie ist bei monatlicher bzw Jährlicher Betrachtung nicht mehr relevant.
Energie_Jahr.Speicher_Wert    = 0
Energie_Jahr.Speicher_Fehler  = 0
Energie_Monat.Speicher_Wert   = 0
Energie_Monat.Speicher_Fehler = 0

# selten (14kWh/a) gibt es negative Energie vom Kessel, die wird dann auch zu 'raus' gezählt 
Energie_Tag['Kessel_Wert_neg']               = np.where(Energie_Tag['Kessel_Wert']        < 0, Energie_Tag['Kessel_Wert']          * -1 , 0)
Energie_Tag['Kessel_Wert']                   = np.where(Energie_Tag['Kessel_Wert']        > 0, Energie_Tag['Kessel_Wert']               , 0)
Energie_Tag['Kessel_Fehler_neg']             = np.where(Energie_Tag['Kessel_Wert']        < 0, Energie_Tag['Kessel_Fehler']        * -1 , 0)
Energie_Tag['Kessel_Fehler']                 = np.where(Energie_Tag['Kessel_Wert']        > 0, Energie_Tag['Kessel_Fehler']             , 0)

Energie_Monat['Kessel_Wert_neg']             = np.where(Energie_Monat['Kessel_Wert']        < 0, Energie_Monat['Kessel_Wert']    * -1 , 0)
Energie_Monat['Kessel_Wert']                 = np.where(Energie_Monat['Kessel_Wert']        > 0, Energie_Monat['Kessel_Wert']         , 0)
Energie_Monat['Kessel_Fehler_neg']           = np.where(Energie_Monat['Kessel_Wert']        < 0, Energie_Monat['Kessel_Fehler']  * -1 , 0)
Energie_Monat['Kessel_Fehler']               = np.where(Energie_Monat['Kessel_Wert']        > 0, Energie_Monat['Kessel_Fehler']       , 0)

Energie_Jahr['Kessel_Wert_neg']              = np.where(Energie_Jahr['Kessel_Wert']        < 0, Energie_Jahr['Kessel_Wert']       * -1 , 0)
Energie_Jahr['Kessel_Wert']                  = np.where(Energie_Jahr['Kessel_Wert']        > 0, Energie_Jahr['Kessel_Wert']            , 0)
Energie_Jahr['Kessel_Fehler_neg']            = np.where(Energie_Jahr['Kessel_Wert']        < 0, Energie_Jahr['Kessel_Fehler']     * -1 , 0)
Energie_Jahr['Kessel_Fehler']                = np.where(Energie_Jahr['Kessel_Wert']        > 0, Energie_Jahr['Kessel_Fehler']          , 0)

## eigentlich nur bei täglicher Betrachtung sinnvoll, daher Monat und Jahr auf null
# Speicher bilanzieren
Energie_Tag['Speicher_Bilanz_Wert_rein']     = np.where(Energie_Tag['Speicher_Bilanz_Wert'] < 0, Energie_Tag['Speicher_Bilanz_Wert']       * -1, 0)
Energie_Tag['Speicher_Bilanz_Wert_raus']     = np.where(Energie_Tag['Speicher_Bilanz_Wert'] > 0, Energie_Tag['Speicher_Bilanz_Wert']           , 0)
Energie_Tag['Speicher_Bilanz_Fehler_rein']   = np.where(Energie_Tag['Speicher_Bilanz_Wert'] < 0, Energie_Tag['Speicher_Bilanz_Fehler']         , 0)
Energie_Tag['Speicher_Bilanz_Fehler_raus']   = np.where(Energie_Tag['Speicher_Bilanz_Wert'] > 0, Energie_Tag['Speicher_Bilanz_Fehler']         , 0)

# Energie_Monat['Speicher_Bilanz_Wert_rein']   = np.where(Energie_Monat['Speicher_Bilanz_Wert'] < 0, Energie_Monat['Speicher_Bilanz_Wert']   * -1, 0)
# Energie_Monat['Speicher_Bilanz_Wert_raus']   = np.where(Energie_Monat['Speicher_Bilanz_Wert'] > 0, Energie_Monat['Speicher_Bilanz_Wert']       , 0)
# Energie_Monat['Speicher_Bilanz_Fehler_rein'] = np.where(Energie_Monat['Speicher_Bilanz_Wert'] < 0, Energie_Monat['Speicher_Bilanz_Fehler']     , 0)
# Energie_Monat['Speicher_Bilanz_Fehler_raus'] = np.where(Energie_Monat['Speicher_Bilanz_Wert'] > 0, Energie_Monat['Speicher_Bilanz_Fehler']     , 0)

# Energie_Jahr['Speicher_Bilanz_Wert_rein']    = np.where(Energie_Jahr['Speicher_Bilanz_Wert'] < 0, Energie_Jahr['Speicher_Bilanz_Wert']     * -1, 0)
# Energie_Jahr['Speicher_Bilanz_Wert_raus']    = np.where(Energie_Jahr['Speicher_Bilanz_Wert'] > 0, Energie_Jahr['Speicher_Bilanz_Wert']         , 0)
# Energie_Jahr['Speicher_Bilanz_Fehler_rein']  = np.where(Energie_Jahr['Speicher_Bilanz_Wert'] < 0, Energie_Jahr['Speicher_Bilanz_Fehler']       , 0)
# Energie_Jahr['Speicher_Bilanz_Fehler_raus']  = np.where(Energie_Jahr['Speicher_Bilanz_Wert'] > 0, Energie_Jahr['Speicher_Bilanz_Fehler']       , 0)


Energie_Monat['Speicher_Bilanz_Wert_rein']   = 0
Energie_Monat['Speicher_Bilanz_Wert_raus']   = 0
Energie_Monat['Speicher_Bilanz_Fehler_rein'] = 0
Energie_Monat['Speicher_Bilanz_Fehler_raus'] = 0

Energie_Jahr['Speicher_Bilanz_Wert_rein']    = 0
Energie_Jahr['Speicher_Bilanz_Wert_raus']    = 0
Energie_Jahr['Speicher_Bilanz_Fehler_rein']  = 0
Energie_Jahr['Speicher_Bilanz_Fehler_raus']  = 0

# display(Energie_Jahr)
Energie_Tag.to_csv('Energie_Fehler_tgl.csv')

Energie_Tag.columns
Index(['Solar_Wert', 'Solar_Fehler', 'Kessel_Wert', 'Kessel_Fehler',
       'Heizung_Wert', 'Heizung_Fehler', 'FriWa_Sek_Wert', 'FriWa_Sek_Fehler',
       'FriWa_Prim_Wert', 'FriWa_Prim_Fehler', 'Speicherverluste_MCA_Wert',
       'Speicherverluste_MCA_Fehler', 'Speicher_Bilanz_Wert',
       'Speicher_Bilanz_Fehler', 'Kessel_Wert_neg', 'Kessel_Fehler_neg',
       'Speicher_Bilanz_Wert_rein', 'Speicher_Bilanz_Wert_raus',
       'Speicher_Bilanz_Fehler_rein', 'Speicher_Bilanz_Fehler_raus'],
      dtype='object')

Zuweisungen für die Balkendiagramme

## Zuweisungen für die Balkendiagramme

Label_rein  = ['Kessel',         'Solar',          'Speicherbilanz'              ]
Werte_rein  = ['Kessel_Wert',    'Solar_Wert',     'Speicher_Bilanz_Wert_rein'   ]
Fehler_rein = ['Kessel_Fehler',  'Solar_Fehler',   'Speicher_Bilanz_Fehler_rein' ]
Farben_rein = [ colo('blau',1),   colo('orange',1), colo('violet',1)             ]

Label_raus  = ['Heizung',        'FriWa',             'Speicherverl.',                 'Speicherbilanz',                 'Kessel_neg'         ] 
Werte_raus  = ['Heizung_Wert',   'FriWa_Prim_Wert',   'Speicherverluste_MCA_Wert',        'Speicher_Bilanz_Wert_raus',      'Kessel_Wert_neg'    ]
Fehler_raus = ['Heizung_Fehler', 'FriWa_Prim_Fehler', 'Speicherverluste_MCA_Fehler',      'Speicher_Bilanz_Fehler_raus',    'Kessel_Fehler_neg'  ]
Farben_raus = [ colo('grau',1),   colo('rot',1),       colo('grün',1),                     colo('violet',1),                 colo('blau',1)      ]

Label = Label_rein + Label_raus

## Labels für die Legende, ohne die zweite Speicherbilanz und Kessel_neg
L_Kessel           = mpatches.Patch(facecolor=Farben_rein[0], label=Label_rein[0],edgecolor='black', linewidth=0.3) 
L_Solar            = mpatches.Patch(facecolor=Farben_rein[1], label=Label_rein[1],edgecolor='black', linewidth=0.3) 
L_Speicherbilanz   = mpatches.Patch(facecolor=Farben_rein[2], label=Label_rein[2],edgecolor='black', linewidth=0.3) 
L_Heizung          = mpatches.Patch(facecolor=Farben_raus[0], label=Label_raus[0],edgecolor='black', linewidth=0.3) 
L_FriWa            = mpatches.Patch(facecolor=Farben_raus[1], label=Label_raus[1],edgecolor='black', linewidth=0.3) 
L_Speicherverluste = mpatches.Patch(facecolor=Farben_raus[2], label=Label_raus[2],edgecolor='black', linewidth=0.3)  
L_Dummy            = mpatches.Patch(facecolor=Farben_raus[2], label='Dummy',edgecolor='black', linewidth=0.3)  
handles            = [L_Kessel,L_Solar,L_Speicherbilanz,L_Heizung,L_FriWa,L_Speicherverluste]

Ungenauigkeiten in den täglichen Bilanzen

## df erstellen um ihn zu füllen
Ungenauigkeiten = pd.DataFrame()

## Energien (rein und raus) auf täglicher Basis aufsummieren
Ungenauigkeiten['Werte_rein']             = Energie_Tag[Werte_rein].sum(axis=1)
Ungenauigkeiten['Werte_raus']             = Energie_Tag[Werte_raus].sum(axis=1)
Ungenauigkeiten['Werte_Summe']            = Ungenauigkeiten['Werte_rein']            + Ungenauigkeiten['Werte_raus']  
## Ungenauigkeiten berechnen
Ungenauigkeiten['Ungenauigkeit_absolut']  = Ungenauigkeiten['Werte_rein']            - Ungenauigkeiten['Werte_raus'] 
Ungenauigkeiten['Ungenauigkeit_relativ']  = Ungenauigkeiten['Ungenauigkeit_absolut'] / Ungenauigkeiten['Werte_Summe']  * 100
## Anteil Solarenergie bezogen auf gesamte erzeugte Wärmeenergie 
solar_relativ = Energie_Tag['Solar_Wert'] / (Energie_Tag['Solar_Wert'] + Energie_Tag['Kessel_Wert']) * 100#* Energie_Tag['Solar_Wert']
# solar_relativ = 1 / (Energie_Tag['Solar_Wert'] + Energie_Tag['Kessel_Wert'])  
## Kurve glätten auf 2D
sample ='1D'
## Größe ändern?
mpl.rcParams['figure.figsize'] = 5.9,3.5

## Plot
## constraines muss false wegen subplots_adjust
fig, (ax1, ax2) = plt.subplots(2, sharex=True , constrained_layout=False)  
plt.subplots_adjust(hspace=.5)
## erster Plot linke Achse
ax1.set_zorder(1)
ax1.patch.set_visible(False)
ax1.plot(Ungenauigkeiten['Ungenauigkeit_absolut'],color=colo('rot',1), linewidth=0.6, label = r'Ungenauigkeit absolut ($kWh$)') 
ax1.set_ylim(-30,30) 
ax1.set_yticks([-30,0,30])
## erster Plot rechte Achse
ax12 = ax1.twinx()
ax12.plot(Ungenauigkeiten['Ungenauigkeit_relativ'],color=colo('blau',1.), linewidth=0.4, label = r'Ungenauigkeit relativ ($\%$)') 
ax12.set_ylim(-105,105) 
ax12.set_yticks([-100,0,100])
## Legende erster Plot
h0, l0 = ax1.get_legend_handles_labels()
h2, l2 = ax12.get_legend_handles_labels()  
legend  = plt.legend(h0+h2, l0+l2, loc=1, ncol=2, bbox_to_anchor=(1., 1.35))  
set_legend_linewidth(legend) 
## zweiter Plot linke Achse
ax2.plot(daten['S_Speicher_Mitteltemperatur'].resample(sample).mean(),color=colo('grün',1), linewidth=0.6, label = r'Speichermitteltemperatur ($^\circ$C)')
ax2.set_ylim(30,80) 
ax2.set_yticks([40,70])
## zweiter Plot rechte Achse
ax22 = ax2.twinx()   
ax22.plot(Ungenauigkeiten['Ungenauigkeit_relativ'].resample(sample).mean(),color=colo('blau',1), linewidth=0.6, label = "_nolegend_")
ax22.plot(solar_relativ.resample(sample).mean(),color=colo('orange',1), linewidth=0.6, label = r'Solarenergie relativ ($\%$)')
ax22.set_ylim(-105,105) 
ax22.set_yticks([0,50,100])
## Zeroline
# plt.axhline(y=0, xmin=.5, xmax=1,linewidth=0.3,clip_on = False,color='black',ls='--')
## Legende zweiter Plot
h0, l0 = ax2.get_legend_handles_labels()
h2, l2 = ax22.get_legend_handles_labels()  
legend  = plt.legend(h0+h2, l0+l2, loc=1, ncol=2, bbox_to_anchor=(1., 1.35))  
set_legend_linewidth(legend) 
# ## X Achse formatieren
ax.set(xlim=[pd.to_datetime("05.01.17 00:00:00"),pd.to_datetime("30.04.18 23:00:00")])
ax2.set(xlim=[pd.to_datetime("05.01.17 00:00:00"),pd.to_datetime("30.04.18 23:00:00")])
monthlyX(ax2)
## Beschriftungen Y Achse
# ax1.text(0., 1,r'\textbf{Energie} ($kWh$)')
# ax12.text(0., 1,r'\textbf{Ungenauigkeit} ($\%$)')
# ax2.text(1, 1,r'\textbf{Temperatur} ($^\circ C$)')
# ax22.text(1, 1,r'\textbf{Anteil} ($\%$)')
ax2.text(-0.12, 93, r'\textbf{Temperatur} ($^\circ$C) \hphantom{XXxXX} \textbf{Energie} ($kWh$) ', va='center', rotation='vertical', transform=ax2.get_yaxis_transform())
ax2.text(1.1, 100,   r'\textbf{Anteil Solar} ($\%$) \hphantom{XXXXX} \textbf{Ungenauigkeit} ($\%$)', va='center', rotation='vertical', transform=ax2.get_yaxis_transform())
# Save
plt.savefig(output_folder + '/' + file_name + '_Ungenauigkeiten_doppelt.pdf') 
display(fig)
close_all()
## bach to default: 5.9,3
mpl.rcParams['figure.figsize'] = 5.9,3

Plots einzeln

## df erstellen um ihn zu füllen
Ungenauigkeiten = pd.DataFrame()
## Energien (rein und raus) auf täglicher Basis aufsummieren
Ungenauigkeiten['Werte_rein']             = Energie_Tag[Werte_rein].sum(axis=1)
Ungenauigkeiten['Werte_raus']             = Energie_Tag[Werte_raus].sum(axis=1)
Ungenauigkeiten['Werte_Summe']            = Ungenauigkeiten['Werte_rein']            + Ungenauigkeiten['Werte_raus']  
## Ungenauigkeiten berechnen
Ungenauigkeiten['Ungenauigkeit_absolut']  = Ungenauigkeiten['Werte_rein']            - Ungenauigkeiten['Werte_raus'] 
Ungenauigkeiten['Ungenauigkeit_relativ']  = Ungenauigkeiten['Ungenauigkeit_absolut'] / Ungenauigkeiten['Werte_Summe']  * 100

## Plot
fig, ax = plt.subplots()
## linke Achse
Ungenauigkeiten['Ungenauigkeit_absolut'].plot(ax=ax,color=colo('rot',1), linewidth=0.5, label = 'kWh')
ax.set_ylabel(r'\textbf{Ungenauigkeit} (kWh)')
## rechte Achse
ax2 = ax.twinx()
Ungenauigkeiten['Ungenauigkeit_relativ'].plot(ax=ax2,color=colo('blau',1) ,linewidth=0.5, label = '\%')
ax2.set_ylabel(r'\textbf{Ungenauigkeit} (\%)')
## Achsen formatieren
ax.set(xlim=[pd.to_datetime("23.07.17 00:00:00"),pd.to_datetime("30.07.17 23:00:00")])
ax.set_xlabel('')
## Legende formatieren
h0, l0 = ax.get_legend_handles_labels()
h2, l2 = ax2.get_legend_handles_labels()  
legend  = plt.legend(h0+h2, l0+l2, loc=1, ncol=2)  
set_legend_linewidth(legend) 
## Save
plt.savefig(output_folder + '/' + file_name + '_Ungenauigkeiten.pdf')
display(fig)
close_all()

# ## Plot mit Solar und Speicher
# fig, ax = plt.subplots()
# sample ='2D'
# ## linke Achse
# daten['S_Speicher_Mitteltemperatur'].resample(sample).mean().plot(ax=ax,color=colo('grün',1),linewidth=0.8, label = 'S_Speicher_Mitteltemperatur')
# solar_relativ.resample(sample).mean().plot(ax=ax,color=colo('orange',1), linewidth=0.8, label = 'Solarenergie (rel.)')
# ax.set_ylabel(r'\textbf{Energie} (kWh) / \textbf{Temperatur} ($^\circ$C)')
# # ## rechte Achse
# ax2 = ax.twinx() 
# Ungenauigkeiten['Ungenauigkeit_relativ'].resample(sample).mean().plot(ax=ax2,color=colo('blau',1),linewidth=0.8, label = 'Ungenauigkeit (\%)')
# ax2.set_ylabel(r'\textbf{Ungenauigkeit} (\%)')
# # ## X-Achse
# ax.set(xlim=[pd.to_datetime("05.01.17 00:00:00"),pd.to_datetime("30.04.18 23:00:00")])
# ax.set_xlabel('') 
# # ## Legende formatieren
# h0, l0 = ax.get_legend_handles_labels()
# h2, l2 = ax2.get_legend_handles_labels() 
# legend  = plt.legend(h2+h0, l2+l0, loc=1, ncol=1, bbox_to_anchor=(.94, .99))  
# set_legend_linewidth(legend) 
# ## Save
# plt.savefig(output_folder + '/' + file_name + '_Ungenauigkeiten_mit_Solar.pdf')
# display(fig)
# close_all() 

normierte Unsicherheiten

## normierte Unsicherheiten auf monatlicher Basis

F_rein                        = Energie_Monat[Fehler_rein]
F_raus                        = Energie_Monat[Fehler_raus]

index                         = ['Mai\n2017', 'Jun', 'Jul','Aug','Sep','Okt','Nov','Dez','Jan\n2018', 'Feb', 'Mrz','Apr']
gewichtete_Fehler             = pd.DataFrame(index=index)
Summe                         = F_rein.Kessel_Fehler.values + F_rein.Solar_Fehler.values + F_raus.Heizung_Fehler.values + F_raus.FriWa_Prim_Fehler.values + F_raus.Speicherverluste_MCA_Fehler.values

gewichtete_Fehler["Kessel"]   = (F_rein.Kessel_Fehler.values               / Summe)
gewichtete_Fehler["Solar"]    = (F_rein.Solar_Fehler.values                / Summe) 
gewichtete_Fehler["Heizung"]  = (F_raus.Heizung_Fehler.values              / Summe)
gewichtete_Fehler["FriWa"]    = (F_raus.FriWa_Prim_Fehler.values           / Summe)
gewichtete_Fehler["Speicher"] = (F_raus.Speicherverluste_MCA_Fehler.values / Summe) 

## halbe Bilanz monatlich für Linienplot
gesamt_U              = pd.DataFrame(index=index)
gesamt_U['kWh']       = F_rein.Kessel_Fehler.values + F_rein.Solar_Fehler.values + F_raus.Heizung_Fehler.values + F_raus.FriWa_Prim_Fehler.values + F_raus.Speicherverluste_MCA_Fehler.values

fig, ax = plt.subplots()
stacked = True
width = 0.6 

handles = [L_Speicherverluste,L_FriWa,L_Heizung, L_Solar,L_Kessel] 
Farben  = [colo('blau',1),colo('orange',1),colo('grau',1),colo('rot',1),colo('grün',1) ]

gewichtete_Fehler.plot.bar(position= 0.5, color=(Farben),  edgecolor='black',linewidth = 0.3,   width=width, ax=ax, stacked=stacked,alpha = 1) 


## notwendig um die Grafik etwas breiter zu machen, da sonst in der PDF die linke Seite abgeschnitten wird
ax.text(-.31, .5, r'\hphantom{Bilanz ausgeglichen}' , va='center', ha="left", fontsize=8, color='black', transform=ax.get_yaxis_transform())

# Legende 
# legend  = plt.legend(handles=handles, bbox_to_anchor=(-.3, 1.025), ncol=1, loc=2) 

# Legende1
handles = [L_Solar,L_Kessel]
legend1  = plt.legend(handles=handles ,bbox_to_anchor=(-.3, 0.16), ncol=1, loc=2)   
# Legende2
handles = [L_Speicherverluste,L_FriWa,L_Heizung ]
legend2  = plt.legend(handles=handles, bbox_to_anchor=(-.3, 1.025), ncol=1, loc=2) 
# erste Legende wiederholen
ax.add_artist(legend1)


## Liniendiagrammauf zweiter Achse
ax2 = ax.twinx()
gesamt_U['kWh'] .plot(ax=ax2,color=colo('black',1) ,linewidth=0.8)

## Achsen formatieren
ax.set_xlabel('') 
ax.set_xticklabels(index, rotation=0)
ax.set_ylabel(r'\textbf{normierte} \hphantom{ }' '\n' r'\textbf{Unsicherheiten} \hphantom{ }')
ax.set_ylim(0,1) 
ax.set_yticks([0,.5,1])
ax2.set_ylabel(r'\textbf{absolute Unsicherheit} (kWh)')

plt.savefig(output_folder + '/' + file_name + '_normierte_Unsicherheiten.pdf')
display(fig)
close_all()
del [[gewichtete_Fehler ]]; gc.collect()
#display(round(gewichtete_Fehler,1))
12

Einbruch im Dezember

sample = '1W'
Uns                        = pd.DataFrame()
Uns                        = Energie_Tag.resample(sample).mean() 
Uns['Summe_Fehler']        = Uns.Solar_Fehler + Uns.Kessel_Fehler + Uns.Heizung_Fehler + Uns.FriWa_Prim_Fehler + Uns.Speicherverluste_MCA_Fehler 
Uns['Summe_Energie']       = Uns.Solar_Wert + Uns.Kessel_Wert + Uns.Heizung_Wert + Uns.FriWa_Prim_Wert + Uns.Speicherverluste_MCA_Wert 
Uns['Solar_gew_Fehler']    = Uns.Solar_Fehler / Uns.Summe_Fehler
Uns['Kessel_gew_Fehler']   = Uns.Kessel_Fehler / Uns.Summe_Fehler
Uns['Heizung_gew_Fehler']  = Uns.Heizung_Fehler / Uns.Summe_Fehler
Uns['FriWa_gew_Fehler']    = Uns.FriWa_Prim_Fehler / Uns.Summe_Fehler
Uns['Speicher_gew_Fehler'] = Uns.Speicherverluste_MCA_Fehler / Uns.Summe_Fehler

## Delta T der Heizung
deltaT = daten.S_Heizung_VL - daten.S_Heizung_RL
Uns['Heizung_deltaT'] = deltaT.resample(sample).mean()
Uns['aussenT']        = daten.L_Aussenlufttemperatur_1


mpl.rcParams['figure.figsize'] = 15.9,3  
fig, ax = plt.subplots() 

## Unsicherheiten und Heizungsspreizung
Uns.Kessel_Fehler.plot(ax=ax,color=colo('blau',1.5) ,linewidth=1) 
Uns.Solar_Fehler.plot(ax=ax,color=colo('orange',1.5) ,linewidth=1) 
Uns.Heizung_Fehler.plot(ax=ax,color=colo('grau',1.5) ,linewidth=1) 
Uns.FriWa_Prim_Fehler.plot(ax=ax,color=colo('rot',1.5) ,linewidth=1) 
Uns.Speicherverluste_MCA_Fehler.plot(ax=ax,color=colo('grün',1.5) ,linewidth=1) 
Uns.Summe_Fehler.plot(ax=ax,color=colo('black',1.5) ,linewidth=1) 
Uns.Heizung_deltaT.plot(ax=ax,color=colo('violet',1.5) ,linewidth=1) 
Uns.aussenT.plot(ax=ax,color=colo('gelb',1.5) ,linewidth=1) 

## Wärmeenergien
ax2 = ax.twinx()
Uns.Kessel_Wert.plot(ax=ax2,color=colo('blau',1.5) ,linewidth=1.5) 
Uns.Solar_Wert.plot(ax=ax2,color=colo('orange',1.5) ,linewidth=1.5) 
Uns.Heizung_Wert.plot(ax=ax2,color=colo('grau',1.5) ,linewidth=1.5) 
Uns.FriWa_Prim_Fehler.plot(ax=ax2,color=colo('rot',1.5) ,linewidth=1.5) 
Uns.Speicherverluste_MCA_Fehler.plot(ax=ax2,color=colo('grün',1.5) ,linewidth=1.5) 
# Uns.Summe_Energie.plot(ax=ax2,color=colo('black',1.5) ,linewidth=1.5) 



# plt.savefig(output_folder + '/' + file_name + '_normierte_Unsicherheiten_tgl.pdf')
display(fig)
close_all() 

mpl.rcParams['figure.figsize'] = 5.9,3     
# display(round(Uns,1))

normierte Wärmemengen

## normierte Unsicherheiten auf monatlicher Basis
index                         = ['Mai\n2017', 'Jun', 'Jul','Aug','Sep','Okt','Nov','Dez','Jan\n2018', 'Feb', 'Mrz','Apr']
Farben                        = [colo('blau',1),colo('orange',1),colo('grau',1),colo('rot',1),colo('grün',1) ]

## Wärmemengen 
Q_rein                        = Energie_Monat[Werte_rein]
Q_raus                        = Energie_Monat[Werte_raus]
gewichtete_Wärme              = pd.DataFrame(index=index)

SummeQ                       = Q_rein.Kessel_Wert.values + Q_rein.Solar_Wert.values + Q_raus.Heizung_Wert.values + Q_raus.FriWa_Prim_Wert.values + Q_raus.Speicherverluste_MCA_Wert.values
gewichtete_Wärme["Kessel"]   = (Q_rein.Kessel_Wert.values               / SummeQ)
gewichtete_Wärme["Solar"]    = (Q_rein.Solar_Wert.values                / SummeQ) 
gewichtete_Wärme["Heizung"]  = (Q_raus.Heizung_Wert.values              / SummeQ)
gewichtete_Wärme["FriWa"]    = (Q_raus.FriWa_Prim_Wert.values           / SummeQ)
gewichtete_Wärme["Speicher"] = (Q_raus.Speicherverluste_MCA_Wert.values / SummeQ)

## halbe Bilanz monatlich für Linienplot
halbe_Bilanz              = pd.DataFrame(index=index)
halbe_Bilanz['Energie']   = (Q_rein.Kessel_Wert.values + Q_rein.Solar_Wert.values + Q_raus.Heizung_Wert.values + Q_raus.FriWa_Prim_Wert.values + Q_raus.Speicherverluste_MCA_Wert.values) / 2


L_halbe_Bilanz =  mpatches.Patch(facecolor=colo('grau',1), label='halbe Bilanz',edgecolor='black', linewidth=0.3) 

## Unsicherheiten 
F_rein                        = Energie_Monat[Fehler_rein]
F_raus                        = Energie_Monat[Fehler_raus]
gewichtete_Fehler             = pd.DataFrame(index=index)
SummeF                        = F_rein.Kessel_Fehler.values + F_rein.Solar_Fehler.values + F_raus.Heizung_Fehler.values + F_raus.FriWa_Prim_Fehler.values + F_raus.Speicherverluste_MCA_Fehler.values
gewichtete_Fehler["Kessel"]   = (F_rein.Kessel_Fehler.values               / SummeQ)
gewichtete_Fehler["Solar"]    = (F_rein.Solar_Fehler.values                / SummeQ)
gewichtete_Fehler["Heizung"]  = (F_raus.Heizung_Fehler.values              / SummeQ)
gewichtete_Fehler["FriWa"]    = (F_raus.FriWa_Prim_Fehler.values           / SummeQ)
gewichtete_Fehler["Speicher"] = (F_raus.Speicherverluste_MCA_Fehler.values / SummeQ)



## Barplot
fig, ax = plt.subplots()

###################################ls='None',uplims=False, lolims=False,
error_kw = dict(lw=2, capsize=.0001, uplims=True, capthick=.0001, ecolor=('white'))##     yerr=gewichtete_Fehler.values.T, error_kw=error_kw,    
gewichtete_Wärme.plot.bar(position= 0.5,  color=(Farben),yerr=gewichtete_Fehler.values.T, error_kw=error_kw,  edgecolor='black',linewidth = 0.3,   width=0.6, ax=ax, stacked=True) 


# Legende1
handles = [L_Solar,L_Kessel]
legend1  = plt.legend(handles=handles ,bbox_to_anchor=(-.3, 0.16), ncol=1, loc=2)   
# Legende2
handles = [L_Speicherverluste,L_FriWa,L_Heizung ]
legend2  = plt.legend(handles=handles, bbox_to_anchor=(-.3, .98), ncol=1, loc=2) 
# erste Legende wiederholen
# ax.add_artist(legend1)


# plt.errorbar(index, gewichtete_Wärme["Kessel"], xerr=4)

# Mittellinie und Text
plt.axhline(y=.5, xmin=0, xmax=.98,linewidth=0.5,clip_on = False,color='black',ls='--')
## notwendig um die Grafik etwas breiter zu machen, da sonst in der PDF die linke Seite abgeschnitten wird
ax.text(-.31, .5, r'\hphantom{Bilanz ausgeglichen}' , va='center', ha="left", fontsize=8, color='black', transform=ax.get_yaxis_transform())

## Liniendiagrammauf zweiter Achse
ax2 = ax.twinx()
halbe_Bilanz['Energie'].plot(ax=ax2,color=colo('black',1) ,linewidth=0.8)

## Achsen formatieren 
ax.set_xlabel('') 
ax.set_xticklabels(index, rotation=0)
ax.set_ylabel(r'\textbf{normierte Anteile}' '\n' r'\textbf{der Wärmemengen}')
ax.set_ylim(0,1) 
ax.set_yticks([0,.5,1])
ax2.set_ylabel(r'\textbf{absolute Wärmemenge} (kWh)')
ax2.get_yaxis().set_major_formatter(mpl.ticker.FuncFormatter(lambda x, loc: locale.format_string('%d', x, 1))) ## dot as thousand separator for X

leg2 = ax2.legend(['abs. Wärme'],bbox_to_anchor=(-0.018, 0.27))
# Manually add the first legend back
ax.add_artist(legend1)
ax.add_artist(legend2)


plt.savefig(output_folder + '/' + file_name + '_normierte_Wärmemengen.pdf')
display(fig)
close_all()

# del [[gewichtete_Fehler ]]; gc.collect() 
display(round(gewichtete_Fehler,2))
display(round(gewichtete_Wärme,2))
# display(round(Kombi,1))

# display(halbe_Bilanz)
Kessel Solar Heizung FriWa Speicher
Mai\n2017 0.01 0.01 0.03 0.0 0.01
Jun 0.00 0.04 0.00 0.0 0.04
Jul 0.00 0.04 0.00 0.0 0.03
Aug 0.00 0.03 0.00 0.0 0.02
Sep 0.00 0.01 0.04 0.0 0.01
Okt 0.00 0.00 0.05 0.0 0.00
Nov 0.01 0.00 0.03 0.0 0.00
Dez 0.01 0.00 0.01 0.0 0.00
Jan\n2018 0.01 0.00 0.02 0.0 0.00
Feb 0.01 0.00 0.02 0.0 0.00
Mrz 0.01 0.00 0.03 0.0 0.00
Apr 0.00 0.01 0.04 0.0 0.01
Kessel Solar Heizung FriWa Speicher
Mai\n2017 0.39 0.12 0.35 0.00 0.15
Jun 0.02 0.48 0.00 0.00 0.50
Jul 0.04 0.52 0.00 0.10 0.35
Aug 0.05 0.49 0.02 0.18 0.26
Sep 0.34 0.18 0.34 0.06 0.08
Okt 0.42 0.09 0.44 0.01 0.05
Nov 0.51 0.01 0.46 0.01 0.02
Dez 0.52 0.00 0.46 0.00 0.01
Jan\n2018 0.51 0.01 0.46 0.00 0.02
Feb 0.49 0.03 0.47 0.00 0.01
Mrz 0.45 0.06 0.47 0.00 0.02
Apr 0.19 0.32 0.39 0.02 0.08
# display(gewichtete_Fehler.values.T)
# alt = gewichtete_Fehler.values.T 
# display(type(alt))
# print(alt.shape)
# data = alt.reshape((alt.shape[0], alt.shape[1], 1))
# display(data)

Plot jährlich

# mpl.use("pgf")
# mpl.rcParams.update(params)

## beide Jahre zusammenfassen Energie_Jahr => Q
Q = round(Energie_Jahr,0) #round(Energie_Jahr.groupby((Energie_Jahr.index.year//10)*10).sum(),0)

W_rein  = Q[Werte_rein]
F_rein  = Q[Fehler_rein]
W_raus  = Q[Werte_raus]
F_raus  = Q[Fehler_raus]


# mpl.rcParams.update({'font.size': 10}) 
mpl.rcParams['figure.figsize'] = 3.3,2.3


fig, ax = plt.subplots(constrained_layout=True) 
ax.ticklabel_format(useLocale=True) ## dot as thousand separator 

W_rein.plot.barh(position =  .3, color = (Farben_rein), edgecolor='black',linewidth = 0.3, width = 0.5, ax = ax, stacked = True, alpha = 1,align='edge')
W_raus.plot.barh(position = 1.5, color = (Farben_raus), edgecolor='black',linewidth = 0.3, width = 0.5, ax = ax, stacked = True, alpha = 1,align='edge')

## Errorbars 
plt.errorbar(Q['Kessel_Wert'],                                                           0.40, xerr=Q['Kessel_Fehler'],               color="k", lw=0.5, capsize=1, capthick=0.5)
plt.errorbar(Q['Kessel_Wert']  + Q['Solar_Wert'],                                        0.30, xerr=Q['Solar_Fehler'],                color="k", lw=0.5, capsize=1, capthick=0.5) 
plt.errorbar(Q['Heizung_Wert'],                                                         -0.15, xerr=Q['Heizung_Fehler'],              color="k", lw=0.5, capsize=1, capthick=0.5)
plt.errorbar(Q['Heizung_Wert'] + Q['FriWa_Prim_Wert'],                                  -0.25, xerr=Q['FriWa_Prim_Fehler'],           color="k", lw=0.5, capsize=1, capthick=0.5)
plt.errorbar(Q['Heizung_Wert'] + Q['FriWa_Prim_Wert'] + Q['Speicherverluste_MCA_Wert'], -0.35, xerr=Q['Speicherverluste_MCA_Fehler'], color="k", lw=0.5, capsize=1, capthick=0.5)

# Legende
handles = [L_Kessel,L_Heizung,L_Solar,L_FriWa,L_Dummy,L_Speicherverluste] 
legend = plt.legend(handles=handles, loc=1, ncol=3 ) 
legend.get_frame().set_linewidth(0.3)   
legend.legendHandles[4].set_visible(False) 
legend.texts[4].set_visible(False) 


# Achsen
ax.set_ylim(-.6,1.3)
ax.set_yticks([])
ax.set_yticklabels('')
ax.set_ylabel('') 
ax.set_xlabel(r'\textbf{Wärmeenergie} (kWh)') 
ax.set_xlim(0,24500)
ax.set_xticks([0,10000,20000])
ax.get_xaxis().set_major_formatter(mpl.ticker.FuncFormatter(lambda x, loc: locale.format_string('%d', x, 1))) ## dot as thousand separator

plt.savefig(output_folder + '/' + file_name + '_Balken_jährlich.pdf')
display(fig)
close_all()
## Größe wieder zurücksetzen WICHTIG !!!!
mpl.rcParams['figure.figsize'] = 5.9,3 
#display(Q) 

Tabellen

## Tabelle für LaTeX Ausgabe
ungenauigkeit = Q.Kessel_Wert[0] + Q.Solar_Wert[0] - Q.Heizung_Wert[0] - Q.FriWa_Prim_Wert[0] - Q.Speicherverluste_MCA_Wert[0]
gesamtenergie = Q.Kessel_Wert[0] + Q.Solar_Wert[0] + Q.Heizung_Wert[0] + Q.FriWa_Prim_Wert[0] + Q.Speicherverluste_MCA_Wert[0] + ungenauigkeit
plusenergie   = Q.Kessel_Wert[0] + Q.Solar_Wert[0]  
minusenergie  = Q.Heizung_Wert[0] + Q.FriWa_Prim_Wert[0] + Q.Speicherverluste_MCA_Wert[0]

## mit ausgewiesener Ungenauigkeit
tabelle = pd.DataFrame(columns=[['Wert kWh', 'Wert %','Unsicherheit','Unsicherheit %']])
tabelle.loc['Kessel']           = [Q.Kessel_Wert[0],               round(Q.Kessel_Wert[0] / gesamtenergie *100,1),               Q.Kessel_Fehler[0],               round(Q.Kessel_Fehler[0]               / Q.Kessel_Wert[0]*100,1) ]
tabelle.loc['Solar']            = [Q.Solar_Wert[0],                round(Q.Solar_Wert[0] / gesamtenergie *100,1),                Q.Solar_Fehler[0],                round(Q.Solar_Fehler[0]                / Q.Solar_Wert[0]*100,1) ]
tabelle.loc['Heizung']          = [Q.Heizung_Wert[0],              round(Q.Heizung_Wert[0] / gesamtenergie *100,1),              Q.Heizung_Fehler[0],              round(Q.Heizung_Fehler[0]              / Q.Heizung_Wert[0]*100,1) ]
tabelle.loc['FriWa']            = [Q.FriWa_Prim_Wert[0],           round(Q.FriWa_Prim_Wert[0] / gesamtenergie *100,1),           Q.FriWa_Prim_Fehler[0],           round(Q.FriWa_Prim_Fehler[0]           / Q.FriWa_Prim_Wert[0]*100,1) ]
tabelle.loc['Speicherverluste'] = [Q.Speicherverluste_MCA_Wert[0], round(Q.Speicherverluste_MCA_Wert[0] / gesamtenergie *100,1), Q.Speicherverluste_MCA_Fehler[0], round(Q.Speicherverluste_MCA_Fehler[0] / Q.Speicherverluste_MCA_Wert[0]*100,1) ]
tabelle.loc['Ungenauigkeit']    = [ungenauigkeit,                  round(ungenauigkeit / gesamtenergie *100,1),                  '0',                              '0' ]

## mit verteileter Ungenauigkeit
tabelle_U = pd.DataFrame(columns=[['Verteilt','vorher', 'nachher' ]])
tabelle_U.loc['Kessel']           = Q.Kessel_Wert[0]               / plusenergie  * ungenauigkeit/2,    Q.Kessel_Wert[0],                   Q.Kessel_Wert[0]               + Q.Kessel_Wert[0]               / plusenergie * ungenauigkeit/2 
tabelle_U.loc['Solar']            = Q.Solar_Wert[0]                / plusenergie  * ungenauigkeit/2,    Q.Solar_Wert[0],                    Q.Solar_Wert[0]                + Q.Solar_Wert[0]                / plusenergie * ungenauigkeit/2 
tabelle_U.loc['Heizung']          = Q.Heizung_Wert[0]              / minusenergie * ungenauigkeit/2,    Q.Heizung_Wert[0],                  Q.Heizung_Wert[0]              + Q.Heizung_Wert[0]              / minusenergie * ungenauigkeit/2
tabelle_U.loc['FriWa']            = Q.FriWa_Prim_Wert[0]           / minusenergie * ungenauigkeit/2,    Q.FriWa_Prim_Wert[0],               Q.FriWa_Prim_Wert[0]           + Q.FriWa_Prim_Wert[0]           / minusenergie * ungenauigkeit/2
tabelle_U.loc['Speicherverluste'] = Q.Speicherverluste_MCA_Wert[0] / minusenergie * ungenauigkeit/2,    Q.Speicherverluste_MCA_Wert[0],     Q.Speicherverluste_MCA_Wert[0] + Q.Speicherverluste_MCA_Wert[0] / minusenergie * ungenauigkeit/2

print('Prozentwerte mit verteilter Ungenauigkeit')
print(round(tabelle_U.loc['Kessel']['nachher']           /  (tabelle_U.loc['Kessel']['nachher']  + tabelle_U.loc['Solar']['nachher'])                                                * 100,0)[0])
print(round(tabelle_U.loc['Solar']['nachher']            /  (tabelle_U.loc['Kessel']['nachher']  + tabelle_U.loc['Solar']['nachher'])                                                * 100,0)[0])
print(round(tabelle_U.loc['Heizung']['nachher']          /  (tabelle_U.loc['Heizung']['nachher'] + tabelle_U.loc['FriWa']['nachher'] + tabelle_U.loc['Speicherverluste']['nachher']) * 100,0)[0])
print(round(tabelle_U.loc['FriWa']['nachher']            /  (tabelle_U.loc['Heizung']['nachher'] + tabelle_U.loc['FriWa']['nachher'] + tabelle_U.loc['Speicherverluste']['nachher']) * 100,0)[0])
print(round(tabelle_U.loc['Speicherverluste']['nachher'] /  (tabelle_U.loc['Heizung']['nachher'] + tabelle_U.loc['FriWa']['nachher'] + tabelle_U.loc['Speicherverluste']['nachher']) * 100,0)[0])

display(round(tabelle_U,0))    
print('Tabelle für LaTeX')
print(tabelle.to_latex(index=True)) 
Prozentwerte mit verteilter Ungenauigkeit
87.0
13.0
89.0
2.0
9.0
Verteilt vorher nachher
Kessel 680.0 20831.0 21511.0
Solar 105.0 3211.0 3316.0
Heizung 702.0 20087.0 20789.0
FriWa 16.0 469.0 485.0
Speicherverluste 67.0 1916.0 1983.0
Tabelle für LaTeX
\begin{tabular}{lrrll}
\toprule
{} & Wert kWh & Wert \% & Unsicherheit & Unsicherheit \% \\
\midrule
Kessel           &  20831.0 &   43.3 &          306 &            1.5 \\
Solar            &   3211.0 &    6.7 &          168 &            5.2 \\
Heizung          &  20087.0 &   41.8 &         1095 &            5.5 \\
FriWa            &    469.0 &    1.0 &           14 &              3 \\
Speicherverluste &   1916.0 &    4.0 &          192 &             10 \\
Ungenauigkeit    &   1570.0 &    3.3 &            0 &              0 \\
\bottomrule
\end{tabular}

Plot monatlich

W_rein  = Energie_Monat[Werte_rein]
F_rein  = Energie_Monat[Fehler_rein]
W_raus  = Energie_Monat[Werte_raus]
F_raus  = Energie_Monat[Fehler_raus]




fig, ax = plt.subplots(constrained_layout=True) 
ax.ticklabel_format(useLocale=True) ## dot as thousand separator
stacked = True
width         = 0.3
error_kw_rein = dict(lw=0.5, capsize=1, capthick=0.5, ecolor=('black'))##  yerr=F_rein.values.T,error_kw=error_kw_rein,
error_kw_raus = dict(lw=0.5, capsize=1, capthick=0.5, ecolor=('black'))##  yerr=F_raus.values.T,error_kw=error_kw_raus,

W_rein.plot.bar(position= 0.5, yerr=F_rein.values.T,error_kw=error_kw_rein, color=(Farben_rein), edgecolor='black',linewidth = 0.3, width=width,ax=ax,stacked=stacked,alpha = 1)
W_raus.plot.bar(position=-0.5, yerr=F_raus.values.T,error_kw=error_kw_raus, color=(Farben_raus), edgecolor='black',linewidth = 0.3, width=width,ax=ax,stacked=stacked,alpha = 1)


## Errorbars separat plotten
# W_rein.plot.bar(position= 0.5, color=(Farben_rein),  edgecolor='black',linewidth = 0.3, width=width,ax=ax,stacked=stacked,alpha = 1)
# W_raus.plot.bar(position=-0.5, color=(Farben_raus),  edgecolor='black',linewidth = 0.3, width=width,ax=ax,stacked=stacked,alpha = 1)
## Errorbars 
# plt.errorbar(Q['Kessel_Wert'],                                                           0.2, yerr=Q['Kessel_Fehler'],               color="k", lw=0.5, capsize=1, capthick=0.5)
# plt.errorbar(Q['Kessel_Wert']  + Q['Solar_Wert'],                                        0.7, yerr=Q['Solar_Fehler'],                color="k", lw=0.5, capsize=1, capthick=0.5) 
# plt.errorbar(Q['Heizung_Wert'],                                                         -0.2, yerr=Q['Heizung_Fehler'],              color="k", lw=0.5, capsize=1, capthick=0.5)
# plt.errorbar(Q['Heizung_Wert'] + Q['FriWa_Prim_Wert'],                                  -0.5, yerr=Q['FriWa_Prim_Fehler'],           color="k", lw=0.5, capsize=1, capthick=0.5)
# plt.errorbar(Q['Heizung_Wert'] + Q['FriWa_Prim_Wert'] + Q['Speicherverluste_MCA_Wert'], -0.7, yerr=Q['Speicherverluste_MCA_Fehler'], color="k", lw=0.5, capsize=1, capthick=0.5)
#plt.errorbar(-0.2,  W_rein.Kessel_Wert ,  yerr=5,  color="k", lw=.5, capsize=1, capthick=.5) ## TEST




# Legende
handles = [L_Dummy,L_Solar,L_Kessel, L_Speicherverluste,L_FriWa,L_Heizung] 
legend = plt.legend(handles=handles, loc=2, ncol=2 ) 
legend.legendHandles[0].set_visible(False) 
legend.texts[0].set_visible(False) 


## Achsen formatieren
ax.set_xlabel('')
ax.set_xlim(-0.5,12)  
ax.set_xticklabels(index, rotation=0)
ax.set_xticks(np.arange(0.15, 12, step = 1))

ax.set_ylim(0,4500)
ax.set_ylabel(r'\textbf{Wärmeenergie} (kWh)')
ax.get_yaxis().set_major_formatter(mpl.ticker.FuncFormatter(lambda x, loc: locale.format_string('%d', x, 1))) ## dot as thousand separator

plt.savefig(output_folder + '/' + file_name + '_monatlich.pdf')
display(fig)
close_all()

display(round(W_rein,0))
display(round(W_raus,0))
# from pprint import pprint
# pprint(W_rein)
# pprint('')
# pprint(F_rein.values.T)
# pprint(Q['Kessel_Wert']) 
# pprint(W_rein.Kessel_Wert)
Kessel_Wert Solar_Wert Speicher_Bilanz_Wert_rein
Zeit
2017-05-31 683.0 218.0 0
2017-06-30 10.0 243.0 0
2017-07-31 22.0 310.0 0
2017-08-31 41.0 369.0 0
2017-09-30 702.0 387.0 0
2017-10-31 1269.0 277.0 0
2017-11-30 3043.0 58.0 0
2017-12-31 3973.0 12.0 0
2018-01-31 3622.0 43.0 0
2018-02-28 3884.0 221.0 0
2018-03-31 3178.0 411.0 0
2018-04-30 404.0 663.0 0
Heizung_Wert FriWa_Prim_Wert Speicherverluste_MCA_Wert Speicher_Bilanz_Wert_raus Kessel_Wert_neg
Zeit
2017-05-31 613.0 0.0 259.0 0 0.0
2017-06-30 1.0 0.0 253.0 0 0.0
2017-07-31 2.0 60.0 207.0 0 0.0
2017-08-31 12.0 139.0 193.0 0 0.0
2017-09-30 718.0 120.0 169.0 0 0.0
2017-10-31 1340.0 23.0 146.0 0 0.0
2017-11-30 2776.0 31.0 95.0 0 0.0
2017-12-31 3509.0 28.0 102.0 0 0.0
2018-01-31 3280.0 6.0 109.0 0 0.0
2018-02-28 3754.0 9.0 101.0 0 0.0
2018-03-31 3272.0 20.0 108.0 0 0.0
2018-04-30 810.0 34.0 174.0 0 0.0
# W_rein  = Energie_Monat[Werte_rein]
# F_rein  = Energie_Monat[Fehler_rein]
# W_raus  = Energie_Monat[Werte_raus]
# F_raus  = Energie_Monat[Fehler_raus]
Werte = W_rein.sum(axis=1) + W_raus.sum(axis=1)
Fehler = F_rein.sum(axis=1) + F_raus.sum(axis=1)
Anteil = Fehler / Werte * 100
print(Anteil) 
Zeit
2017-05-31    5.740407
2017-06-30    7.762514
2017-07-31    6.972255
2017-08-31    5.599983
2017-09-30    6.072151
2017-10-31    6.012533
2017-11-30    3.596573
2017-12-31    2.121069
2018-01-31    3.202016
2018-02-28    3.170875
2018-03-31    3.816876
2018-04-30    5.789474
Freq: M, dtype: float64

Plot Senkey

Energie_Sankey   = round(Energie_Jahr / 1000,1) #(round((Energie_Jahre / 50),0) * 50).astype(int) 

Faktor           = 1
Kessel           = Energie_Sankey.Kessel_Wert.loc['1'] * Faktor
Solar            = Energie_Sankey.Solar_Wert.loc['1'] * Faktor
Speicherverluste = Energie_Sankey.Speicherverluste_MCA_Wert.loc['1'] * Faktor
Heizung          = Energie_Sankey.Heizung_Wert.loc['1'] * Faktor
FriWa            = Energie_Sankey.FriWa_Prim_Wert.loc['1'] * Faktor
Gas_rein         = round(21.836 ,1)
Gas_raus         = Gas_rein * 0.902
Kesselverluste   = round((Gas_rein - Gas_raus) * - 1,1)

## Ungenauigkeit der Werte als Differenz zwischen rein und raus
ungenauigkeit_0 = round((Gas_raus - Kessel) * - 1, 1)
ungenauigkeit   = (Heizung + FriWa + Speicherverluste - Kessel - Solar) * -1 

## Zwischensummen für den mittleren Teil des Diagramms     
summe_s  = round(Gas_raus + ungenauigkeit_0,1)
summe_s0 = Solar  +  Kessel
summe_s1 = summe_s0 - ungenauigkeit  -  Speicherverluste

## Sankey plotten        
fig    = plt.figure()
ax     = fig.add_subplot(1, 1, 1,)
s      = Sankey(ax = ax, scale = 1/40, unit = 'MWh', gap = .4, shoulder = 0.05,)


## linker oberer Teil
s.add( 
    flows        = [ungenauigkeit_0,   Kesselverluste,     Gas_rein,   -summe_s  ], 
    orientations = [              1,               -1,            1,          0  ],
    labels       = [       "Ungen.", "Kesselverluste",     "Erdgas",       None  ],
    trunklength  = 0.8, pathlengths = 0.4, edgecolor = '#000000', facecolor = '#3f3f3f', 
    lw = 0.5,
)

## linker Teil
s.add(
    flows        = [  Solar,    Kessel,   -summe_s0  ], 
    orientations = [      1,         0,           0  ],
    labels       = ["Solar",  None,        None  ],
    trunklength  = 1.6, pathlengths = 0.4, edgecolor = '#000000', facecolor = '#5e5e5e', 
    prior = 0, connect = (3,1), lw = 0.5,
)

## mittlerer Teil
s.add(
    flows        = [summe_s0,  -ungenauigkeit,  -Speicherverluste,  -summe_s1  ],
    orientations = [       0,               1,                 -1,          0  ], 
    labels       = [None,     "Ungenauigkeit",  "Speicherverluste",       None  ],
    trunklength  = 1.6, pathlengths=0.45, edgecolor = '#000000', facecolor = '#7e7e7e',
    prior = 1, connect = (2,0), lw = 0.5,
    )

## rechter Teil
s.add(
    flows        = [summe_s1,    -Heizung,    -FriWa  ],
    orientations = [       0,          -1,        -1  ],
    labels       =     [None,   "Heizung",   "FriWa"  ],
    trunklength  = 1.7, pathlengths = 0.3, edgecolor = '#000000', facecolor = '#9e9e9e',
    prior = 2, connect = (3,0), lw = 0.5,
)


## Labels bearbeiten
diagrams = s.finish() 
## Label und Wert linksbündig
for d in diagrams:
    for t in d.texts:
        t.set_horizontalalignment('left')
## Positionsanzeige der Labels
#print(diagrams[0].texts[0])
#print(diagrams[0].texts[1])
#print(diagrams[0].texts[2])
#print(diagrams[1].texts[0])
#print(diagrams[1].texts[1]) 
#print(diagrams[2].texts[1]) 
#print(diagrams[2].texts[2])
#print(diagrams[3].texts[1]) 
#print(diagrams[3].texts[2])

## Positionierung der Labels        
diagrams[0].texts[0].set_position(xy = [-0.5,   1.0 ])  # Ungenauigkeit
diagrams[0].texts[1].set_position(xy = [ 0.3,  -1.0 ])  # Kesselverluste
diagrams[0].texts[2].set_position(xy = [-1.6,   1.0 ])  # Erdgas
diagrams[1].texts[0].set_position(xy = [ 0.5,   1.0 ])  # Solar
diagrams[1].texts[1].set_position(xy = [-0.3,   4.0 ])  # Kessel
diagrams[2].texts[1].set_position(xy = [ 2.0,   1.0 ])  # Ungenauigkeit
diagrams[2].texts[2].set_position(xy = [ 2.0,  -1.0 ])  # Specherverluste
diagrams[3].texts[1].set_position(xy = [ 5.0,  -1.0 ])  # Heizung
diagrams[3].texts[2].set_position(xy = [ 4.0,  -1.0 ])  # FriWa

## Keine Achsen 
plt.axis("off") 

plt.savefig(output_folder + '/' + file_name + '_Sankey.pdf') 
display(fig)
close_all()

Save&Upload


## Skriptlaufzeit Ende (Funktion in: libraries_and_styles.ipynb)
hours, minutes, seconds = laufzeit()
## Notebook speichern vor dem Upload (Funktion in: libraries_and_styles.ipynb)
save_notebook() 
## Notebook als Markdown Datei mit eingebetten Grafiken speichern und auf den Server laden
%run ../Template/save_and_upload.ipynb  
 MCA_Speicherverluste Lueftung_kalibrieren