Lueftung_kalibrieren

Druckschwelle begründen

MINMAX auch für Bilanz der Lüftung
dafür plot_bilanzfehler(Wärmebilanz oder Lüftung)

Fehlerbalken im Wärmeflussplot funktionieren nicht, minmax und daten_tgl vergleichen

self kalibrierung der Tatenlogger kontrollieren!

Bibliotheken importieren

# Name des aktuellen Notebooks für die exportierten Datein
file_name = "Lueftung_kalibrieren" 
# Ordner auf dem Server (nach files/)
ftp_folder = 'Notebooks/Aufbereitung'
## 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.update(params)

Daten Import

Daten zusammenführen (einmalig)

## einmalig Daten aus unterschiedlichen Datien zusammenfügen und als Testo_Arbeitsdaten_15s.csv speichern

# wrg = pd.read_csv("MA_WGR_Daten_Testo.csv",sep=";",decimal=",",encoding="cp1252")
# wrg['Datum'] = pd.to_datetime(wrg["Datum"],dayfirst=True,)
# wrg.set_index(["Datum"], inplace=True)

# wrgF = pd.read_csv("MA_WGR_Daten_Testo_Feb.csv",sep=";",decimal=",",encoding="cp1252")
# wrgF['Datum'] = pd.to_datetime(wrgF["Datum"],dayfirst=True,)
# wrgF.set_index(["Datum"], inplace=True)

# wrgF2 = pd.read_csv("MA_WGR_Daten_Testo_Feb2.csv",sep=";",decimal=",",encoding="cp1252")
# wrgF2['Datum'] = pd.to_datetime(wrgF2["Datum"],dayfirst=True,)
# wrgF2.set_index(["Datum"], inplace=True)

# wrg   = wrg.resample('15s').interpolate(method='linear')
# wrgF  = wrgF.resample('15s').interpolate(method='linear')
# wrgF2 = wrgF2.resample('15s').interpolate(method='linear')

# daten = pd.read_csv('../1_Daten/Arbeitsdaten/Daten_15s.csv')
# daten["Zeit"] = pd.to_datetime(daten["Zeit"],dayfirst=True)
# daten["Zeit1"] = daten["Zeit"]
# daten.set_index(['Zeit1'], inplace=True)
# daten = daten.loc['2017-12-05 10:00:00':'2018-02-23 14:38:00']
# daten['L_Zuluft_VPunkt'] = daten['L_Zuluft_1_VPunkt']  + daten['L_Zuluft_2_VPunkt'] + daten['L_Zuluft_3_VPunkt'] 

# # concat wrg`s
# frames = [wrg, wrgF, wrgF2]
# testo = pd.concat(frames)
# testo.columns = ['Außenluft_C', 'Außenluft_rF', 'Zuluft_C', 'Zuluft_rF', 'Abluft_C','Abluft_rF', 'Fortluft_C', 'Fortluft_rF']
# testo['Zeit'] = testo.index
# testo.to_csv('Testo_174H.csv')

# ## GET the data, just for saving, not use
# # Testo_174H = pd.read_csv("Testo_174H.csv")
# # Testo_174H['Datum'] = pd.to_datetime(Testo_174H["Datum"],dayfirst=True,)
# # Testo_174H.set_index(["Datum"], inplace=True)
# # Testo_174H.head()


# # merge mit testo
# testo  = testo.merge(daten , left_on=['Zeit'], right_on=['Zeit'], how='outer')
# testo["Zeit"] = pd.to_datetime(testo["Zeit"],dayfirst=True)
# testo.set_index(['Zeit'], inplace=True)
# testo.to_csv('Testo_Arbeitsdaten_15s.csv')
# # testo.head()

Daten aufbereiten



def reload_Daten():

    global daten
    daten = pd.DataFrame()
    daten = pd.read_csv("Testo_Arbeitsdaten_15s.csv")
    daten['Zeit'] = pd.to_datetime(daten["Zeit"],dayfirst=True,)
    daten.set_index(["Zeit"], inplace=True)

    ## Luftdruck
    ## topo: http://media.heimatundwelt.de/omeda/501/100264_009_3.jpg -> 139m ü.n.N 101.325 
    ## barometrische Höhenformel: http://wetter.andreae-gymnasium.de/interaktives/Druck/barometrische.htm bei 5°C -> 995,9 hPa
    daten['W_Luftdruck'] =   daten['W_Luftdruck'] /10 + 5.1 ## 40 Hohenmeter Differenz zw Wetterstation und Bootshaus

    ## DataFrame für den Zeitraum der Kalibrierung
    # daten_kal = daten.loc['2018-02-22 16:40:00':'2018-02-23 14:38:00'].copy()
    # daten_kal_selbst = daten_kal.copy()
    # daten_kal_T480   = daten_kal.copy()

    ## ungenaue Enden abschneiden
    datena = daten.loc['2017-12-06 00:00:00':'2017-12-11 23:59:45']
    datenb = daten.loc['2018-01-31 00:00:00':'2018-02-11 23:59:45'] 
    datenc = daten.loc['2018-02-16 00:00:00':'2018-02-23 14:38:45'] 
    daten  = pd.concat([datena, datenb, datenc])
    # del [[datena, datenb, datenc]] gc.collect()
    daten.dropna(inplace=True)
    ## wurde in dem Zeitraum noch mal kalibriert?
    datena = daten.loc['2017-12-06 00:00:00':'2018-02-04 23:59:45']
    datenb = daten.loc['2018-02-06 00:00:00':'2018-02-23 14:38:45'] 
    daten  = pd.concat([datena, datenb])
    daten.dropna(inplace=True)

    ## rename the columns from testo174
    daten.rename(columns={'Außenluft_C' : 'T_Außenluft_C','Außenluft_rF' : 'T_Außenluft_rF','Zuluft_C' : 'T_Zuluft_C','Zuluft_rF' : 'T_Zuluft_rF','Abluft_C' : 'T_Abluft_C','Abluft_rF' : 'T_Abluft_rF','Fortluft_C' : 'T_Fortluft_C','Fortluft_rF' : 'T_Fortluft_rF'}, inplace=True)

    ## add columns for controlling
    daten['Kalibrierung'] = 'noch keine'
    daten['Datenquelle']  = 'Lüftung'



reload_Daten()

# daten = daten.replace(0, np.nan)
# daten = daten.dropna(how='all', axis=0)
# daten = daten.replace(np.nan, 0)


## Subsets für alles weitere
# daten_sub    = daten.copy()
# daten_sub1   = daten.copy() 
# daten_tgl    = pd.DataFrame()  

## gesamter Messzeitraum 6.12.2017 - 20.2.2018
# ## alt
# von = '2017-12-06 00:00:00'
# bis = '2018-02-20 23:59:45'
von  = pd.to_datetime("2017-12-06 00:00", infer_datetime_format=True).to_pydatetime()
bis  = pd.to_datetime("2018-02-20 23:59:45", infer_datetime_format=True).to_pydatetime()
## Periode 1
eins  = pd.to_datetime("2017-12-06 00:00", infer_datetime_format=True).to_pydatetime()
zwei  = pd.to_datetime("2017-12-11 23:59", infer_datetime_format=True).to_pydatetime()
## Periode 2
drei  = pd.to_datetime("2018-01-31 00:00", infer_datetime_format=True).to_pydatetime()
vier  = pd.to_datetime("2018-02-11 23:59", infer_datetime_format=True).to_pydatetime()
## Periode 3
fünf  = pd.to_datetime("2018-02-16 00:00", infer_datetime_format=True).to_pydatetime()
sechs = pd.to_datetime("2018-02-20 23:59", infer_datetime_format=True).to_pydatetime()
## Zeitraum für Mischkalibrierung
Mischkal_start = pd.to_datetime("2018-02-22 16:40:00", infer_datetime_format=True).to_pydatetime()
Mischkal_ende  = pd.to_datetime("2018-02-23 14:38:00", infer_datetime_format=True).to_pydatetime()

# daten.info()
# print_md(str(daten.columns))


Kontrollplot

fig, ax = plt.subplots(figsize=(6,2)) 
daten['T_Außenluft_C'].plot(ax=ax,color=colo('blau',1),  linewidth=0.5, label = 'Testo')  
daten['L_Aussenlufttemperatur_1'].plot(ax=ax,color=colo('rot',1),  linewidth=0.5, label = 'Lüftung')  
daten['W_Temperatur'].plot(ax=ax,color=colo('grün',1),  linewidth=0.5, label = 'Wetterstation')  


ax.set_xlabel('')   
ax.set_ylabel(r'\textbf{Temperatur} ($^\circ$C)')   
# Legende
h0, l0 = ax.get_legend_handles_labels()   
legend = plt.legend(h0, l0, ncol=4, loc=2)
set_legend_linewidth(legend) 
# monthlyX(ax)

ax = plt.gca()
ax.xaxis.set_major_locator(mdates.DayLocator(interval=10))
ax.xaxis.set_major_formatter(mdates.DateFormatter('%d.%m.'))  
plt.setp(ax.get_xticklabels(), rotation=0, ha="center", rotation_mode="anchor")
plt.title('Außenluft') 
## alt
# ax.xaxis.set_tick_params(rotation=0,ha='center')
# fig.autofmt_xdate(rotation=0,ha='center') 
# xlabels = ['6. Dez','7.','8.','9.','10.','11.','12.']
# ax.set_xticklabels(ax.get_xticklabels(), rotation=0, ha='center')
# plt.xticks(rotation=0)
# ax.xaxis.set_tick_params(rotation=0)
# plt.setp(ax.get_xticklabels(), rotation=0, ha="center", rotation_mode="anchor")

Text(0.5, 1.0, 'Außenluft')

direkte Vergleiche

## direkter Vergleich von jeweils zwei gleichen Werten unterschiedlicher Sensoren
## dient zur Qualitätsischerung der Kalibrierung

## Zeitraum
dV_start = drei
dV_Ende  = vier

## DataFrame
df = daten

fig, axes = plt.subplots(nrows=6, ncols=1, sharex=True, constrained_layout=False,figsize=(5.8,8.05)) 

## Titel und Zeitraum
axes[0].set_title('Vergleiche - Rohdaten')
axes[0].set(xlim=[pd.to_datetime(dV_start),pd.to_datetime(dV_Ende)]) 

axes[0].plot(df['T_Außenluft_rF'],color=colo('blau',1),  linewidth=0.8,  label='Testo 174H') 
axes[0].plot(df['W_Luftfeuchtigkeit'],color=colo('orange',1),  linewidth=0.8,  label='Wetterstation')  
axes[0].text(0.012,  0.84, r"rel LF Außen", transform=axes[0].transAxes, fontsize=10, bbox=dict(edgecolor='black', facecolor=colo('grau',2.5), alpha=1)) 
axes[0].set_ylim(50,120)  
axes[0].set_yticks([70,90]) 

axes[1].plot(df['T_Abluft_rF'],color=colo('blau',1),  linewidth=0.8,  label='Testo 174H') 
axes[1].plot(df['L_Duschen_Ablufttfeuchte'],color=colo('orange',1),  linewidth=0.8,  label='Lüftung')  
axes[1].text(0.012,  0.84, r"rel LF Abluft", transform=axes[1].transAxes, fontsize=10, bbox=dict(edgecolor='black', facecolor=colo('grau',2.5), alpha=1)) 
axes[1].set_ylim(20,70) 
axes[1].set_yticks([30,50]) 

axes[2].plot(df['T_Außenluft_C'],color=colo('blau',1),  linewidth=0.8,  label='Testo 174H') 
axes[2].plot(df['L_Aussenlufttemperatur_1'],color=colo('orange',1),  linewidth=0.8,  label='Lüftung')  
axes[2].text(0.012,  0.84, r"Temp. Außen", transform=axes[2].transAxes, fontsize=10, bbox=dict(edgecolor='black', facecolor=colo('grau',2.5), alpha=1))     
axes[2].set_ylim(-5,15)  
axes[2].set_yticks([0,10]) 

axes[3].plot(df['T_Zuluft_C'],color=colo('blau',1),  linewidth=0.8,  label='Testo 174H') 
axes[3].plot(df['L_Zulufttemperatur'],color=colo('orange',1),  linewidth=0.8,  label='Lüftung')  
axes[3].text(0.012,  0.84, r"Temp. Zuluft", transform=axes[3].transAxes, fontsize=10, bbox=dict(edgecolor='black', facecolor=colo('grau',2.5), alpha=1)) 
axes[3].set_ylim(10,40)  
axes[3].set_yticks([20,30]) 

axes[4].plot(df['T_Abluft_C'],color=colo('blau',1),  linewidth=0.8,  label='Testo 174H') 
axes[4].plot(df['L_Ablufttemperatur'],color=colo('orange',1),  linewidth=0.8,  label='Lüftung')  
axes[4].text(0.012,  0.84, r"Temp. Abluft", transform=axes[4].transAxes, fontsize=10, bbox=dict(edgecolor='black', facecolor=colo('grau',2.5), alpha=1)) 
axes[4].set_ylim(17,25)  
axes[4].set_yticks([18,22]) 

axes[5].plot(df['T_Fortluft_C'],color=colo('blau',1),  linewidth=0.8,  label='Testo 174H') 
axes[5].plot(df['L_Fortlufttemperatur'],color=colo('orange',1),  linewidth=0.8,  label='Lüftung')  
axes[5].text(0.012,  0.84, r"Temp. Fortluft", transform=axes[5].transAxes, fontsize=10, bbox=dict(edgecolor='black', facecolor=colo('grau',2.5), alpha=1)) 
axes[5].set_ylim(0,20)  
axes[5].set_yticks([5,15]) 


## Legende
for ax in axes:
    ax.legend( ncol=6, loc=1,  bbox_to_anchor=(1., 1)) 
    ax.yaxis.get_label().set_fontsize(8)

## Formatierung X-Achse
axes[0] = plt.gca()
axes[0].xaxis.set_minor_locator(AutoMinorLocator(2))
axes[0].xaxis.set_major_locator(mdates.DayLocator(interval=2))
axes[0].xaxis.set_major_formatter(mdates.DateFormatter('%d.%m.'))  
x_ticks = axes[0].xaxis.get_major_ticks() 
x_ticks[0].label1.set_visible(False)  
plt.setp(axes[0].get_xticklabels(), rotation=0, ha="center", rotation_mode="anchor")
plt.subplots_adjust(hspace=.1)  
plt.show()     

174H kalibrieren

def TESTO_Kalibrierung(variante='testo'):
    global testo
    testo = daten.copy()

    if variante == '0':
        testo['T_Abluft_rF']    = daten['T_Abluft_rF']     
        testo['T_Fortluft_rF']  = daten['T_Fortluft_rF']  
        testo['T_Außenluft_rF'] = daten['T_Außenluft_rF']  
        testo['T_Zuluft_rF']    = daten['T_Zuluft_rF']     
        testo['T_Abluft_C']     = daten['T_Abluft_C']     
        testo['T_Fortluft_C']   = daten['T_Fortluft_C']   
        testo['T_Außenluft_C']  = daten['T_Außenluft_C']         
        testo['T_Zuluft_C']     = daten['T_Zuluft_C']     
        daten['Kalibrierung']   = variante
        daten['Datenquelle']    = 'Testo'


    if variante == 'testo':
        ## Aus der Kalibrierung vom 25.03.2019 gegen das Testo480 
        ## Excel MA_Testo_174_Kalibrierung
        testo['T_Abluft_rF']    = daten['T_Abluft_rF']    * 1.0386 - 0.0826
        testo['T_Fortluft_rF']  = daten['T_Fortluft_rF']  * 0.9522 + 2.5642
        testo['T_Außenluft_rF'] = daten['T_Außenluft_rF'] * 1.0568 + 3.1864
        testo['T_Zuluft_rF']    = daten['T_Zuluft_rF']    * 1.0489 + 2.9552
        testo['T_Abluft_C']     = daten['T_Abluft_C']     * 1.0447 - 0.5989
        testo['T_Fortluft_C']   = daten['T_Fortluft_C']   * 1.0002 + 0.2829
        testo['T_Außenluft_C']  = daten['T_Außenluft_C']  * 1.0191 - 0.809
        testo['T_Zuluft_C']     = daten['T_Zuluft_C']     * 1.0059 - 0.3276
        daten['Kalibrierung'] = variante+'480'
        daten['Datenquelle'] = 'Testo'

    if variante == 'self':
        ## kal['ref_rF'] = (kal.Abluft_rF + kal.Fortluft_rF ) / 2
        ## kal['ref_C']  = (kal.Abluft_C + kal.Fortluft_C + kal.Zuluft_C) / 3
        testo['T_Abluft_rF']    = daten['T_Abluft_rF']    * 0.828993573070746  +  6.801455317349444
        testo['T_Fortluft_rF']  = daten['T_Fortluft_rF']  * 1.0674200418092923 + -2.6412934624410167
        testo['T_Außenluft_rF'] = daten['T_Außenluft_rF'] * 0.8002161817773167 +  5.231630936999777
        testo['T_Zuluft_rF']    = daten['T_Zuluft_rF']    * 0.9223667924445846 +  1.4339541677129877
        testo['T_Abluft_C']     = daten['T_Abluft_C']     * 1.0209706144779265 + -0.4144120307172744
        testo['T_Fortluft_C']   = daten['T_Fortluft_C']   * 0.9647290370199838 +  0.6981836985112495
        testo['T_Außenluft_C']  = daten['T_Außenluft_C']  * 1.1242036726591484 + -2.0880414590720107
        testo['T_Zuluft_C']     = daten['T_Zuluft_C']     * 0.9913301797188931 +  0.1560904830431007 
        daten['Kalibrierung'] = variante
        daten['Datenquelle']  = 'Testo'

    if variante == 'self1':
        ## kal['ref_rF'] = (kal.Abluft_rF + kal.Fortluft_rF  + kal.Zuluft_rF + kal.Außenluft_rF) / 4 
        ## kal['ref_C']  = (kal.Abluft_C + kal.Fortluft_C + kal.Zuluft_C + kal.Außenluft_C) / 4          
        testo['T_Abluft_rF']    = daten['T_Abluft_rF']    * 0.8305882666625446 +  8.055745638372443
        testo['T_Fortluft_rF']  = daten['T_Fortluft_rF']  * 1.062370224215799  + -1.121169045293179
        testo['T_Außenluft_rF'] = daten['T_Außenluft_rF'] * 0.8354930285393901 +  5.015519047999741
        testo['T_Zuluft_rF']    = daten['T_Zuluft_rF']    * 0.9236537106550828 +  2.6983173712048316
        testo['T_Abluft_C']     = daten['T_Abluft_C']     * 0.9596161144526612 +  0.6980052676578619
        testo['T_Fortluft_C']   = daten['T_Fortluft_C']   * 0.9053512255469426 +  1.7706350319492505
        testo['T_Außenluft_C']  = daten['T_Außenluft_C']  * 1.0931527544943642 + -1.5660310943041458
        testo['T_Zuluft_C']     = daten['T_Zuluft_C']     * 0.9264435014124848 +  1.3362432683236858
        daten['Kalibrierung'] = variante
        daten['Datenquelle']  = 'Testo'

 ## Funktion kalibriert und gib Strings für copy&paste aus
# def kalibrieren(X,Y):
#     polyfit = np.polyfit(X,Y,deg=1)
#     schaetzer = np.poly1d(polyfit)
#     print('daten_kalibriert[\''+X.name+'\'] = daten[\''+X.name+'\'] * ' +str(schaetzer[1]) +   ' + ' +str(schaetzer[0])    )
#     return schaetzer(X)



# TESTO_Kalibrierung('0') 
# TESTO_Kalibrierung('testo') 
# TESTO_Kalibrierung('self') 
TESTO_Kalibrierung() 

Mischkalibrierung für die Variante "self"

# ## Funktion kalibriert und gib Strings für copy&paste aus
# def kalibrieren(X,Y):
#     polyfit = np.polyfit(X,Y,deg=1)
#     schaetzer = np.poly1d(polyfit)
#    # print(schaetzer)
# #     print('daten_kal_selbst[\''+X.name+'\'] = pow(daten_kal_selbst[\''+X.name+'\'],3) * ' +str(schaetzer[3]) +   ' + pow(daten_kal_selbst[\''+X.name+'\'],2) * ' +str(schaetzer[2]) +   ' + daten_kal_selbst[\''+X.name+'\'] * ' +str(schaetzer[1]) +   ' + ' +str(schaetzer[0])    )
#     print('daten_sub[\''+X.name+'\'] = daten[\''+X.name+'\'] * ' +str(schaetzer[1]) +   ' + ' +str(schaetzer[0])    )
#     return schaetzer(X)



# ## Referenzen definieren
# daten_kal['ref_rF'] = (daten_kal.Abluft_rF + daten_kal.Fortluft_rF  + daten_kal.Zuluft_rF + daten_kal.Außenluft_rF) / 4 
# daten_kal['ref_C']  = (daten_kal.Abluft_C + daten_kal.Fortluft_C + daten_kal.Zuluft_C + daten_kal.Außenluft_C) / 4

# kalibrieren(daten_kal['Abluft_rF'],   daten_kal['ref_rF'])
# kalibrieren(daten_kal['Fortluft_rF'], daten_kal['ref_rF'])
# kalibrieren(daten_kal['Außenluft_rF'],daten_kal['ref_rF'])
# kalibrieren(daten_kal['Zuluft_rF'],   daten_kal['ref_rF']) 
# kalibrieren(daten_kal['Abluft_C'],    daten_kal['ref_C'])  
# kalibrieren(daten_kal['Fortluft_C'],  daten_kal['ref_C']) 
# kalibrieren(daten_kal['Außenluft_C'], daten_kal['ref_C'])  
# kalibrieren(daten_kal['Zuluft_C'],    daten_kal['ref_C']) 

Plot Kalibrierung

def TESTO_Kalibrierung_plot(df,titel): 
    fig, ax = plt.subplots(figsize=(6,2)) 
    df['T_Außenluft_C'].plot(ax=ax,color=colo('blau',1),  linewidth=0.8, label = 'Außenluft') 
    df['T_Zuluft_C'].plot(ax=ax,color=colo('rot',1),      linewidth=0.8, label = 'Zuluft') 
    df['T_Abluft_C'].plot(ax=ax,color=colo('orange',1),   linewidth=0.8, label = 'Abluft') 
    df['T_Fortluft_C'].plot(ax=ax,color=colo('violet',1), linewidth=0.8, label = 'Fortluft') 

    ax2 = ax.twinx()
    df['T_Außenluft_rF'].plot(ax=ax2,color=colo('blau',1),  linewidth=0.8, label = '__nolable__') 
    df['T_Zuluft_rF'].plot(ax=ax2,color=colo('rot',1),      linewidth=0.8, label = '__nolable__') 
    df['T_Abluft_rF'].plot(ax=ax2,color=colo('orange',1),   linewidth=0.8, label = '__nolable__') 
    df['T_Fortluft_rF'].plot(ax=ax2,color=colo('violet',1), linewidth=0.8, label = '__nolable__') 

    ## Y Achse formatieren
    ax.set(ylim=[18,23])
    ax.set_yticks([18.5,19.5])  
    ax.set_ylabel(r'\textbf{Temperatur} ($^\circ$C)')  
    ax2.set(ylim=[25,58]) 
    ax2.set_yticks([40,45])
    ax2.set_ylabel(r'\textbf{rel. Luftfeuchte} (\%)') 

    # Legende
    h0, l0 = ax.get_legend_handles_labels()  
    h2, l2 = ax2.get_legend_handles_labels()  
    legend = plt.legend(h0+h2, l0+l2, ncol=4, loc=1)
    set_legend_linewidth(legend) 
    plt.title(titel) 
    # X Achse formatieren
    ax.set_xlabel('') 
    ax.set(xlim=[Mischkal_start, Mischkal_ende])
#     ax = plt.gca()
    ax.xaxis.set_major_locator(mdates.HourLocator(interval=6))
    ax.xaxis.set_major_formatter(mdates.DateFormatter('%d.%m. %H:%M'))  
    plt.setp(ax.get_xticklabels(), rotation=0, ha="center", rotation_mode="anchor")
#     fig.autofmt_xdate(rotation=0,ha='center') 

reload_Daten()

## Kalibrierung und Plot aufrufen
# TESTO_Kalibrierung('0')
# TESTO_Kalibrierung_plot(df=testo, titel='Testo 174H Rohdaten')

TESTO_Kalibrierung('self')
TESTO_Kalibrierung_plot(df=testo, titel='Testo 174H Mischkalibrierung')

TESTO_Kalibrierung('self1')
TESTO_Kalibrierung_plot(df=testo, titel='Testo 174H Mischkalibrierung 1')

# TESTO_Kalibrierung('testo')
# TESTO_Kalibrierung_plot(df=testo, titel='Testo 174H gegen Testo 480')

Kalibrierungsabfrage

def welche_Kalibrierung(df):
    print_md('**Datenquelle**: '+str(df['Datenquelle'].iloc[1])+' \t\t **Kalibrierung**: '+str(df['Kalibrierung'].iloc[1])+   '\n\n')
    return ('Datenquelle: '+str(df['Datenquelle'].iloc[1])+'  |  Kalibrierung: '+str(df['Kalibrierung'].iloc[1]))

## Kalibrierung und Datenquelle abfragen
# TESTO_Kalibrierung('0')
# welche_Kalibrierung(testo)

# TESTO_Kalibrierung('self')
# welche_Kalibrierung(testo)

# TESTO_Kalibrierung('testo')
welche_Kalibrierung(testo)

Datenquelle: Testo Kalibrierung: self

'Datenquelle: Testo  |  Kalibrierung: self'

direkte Vergleiche

## direkter Vergleich von jeweils zwei gleichen Werten unterschiedlicher Sensoren
## dient zur Qualitätsischerung der Kalibrierung

## Zeitraum
dV_start = drei
dV_Ende  = vier

## DataFrame
df = testo

fig, axes = plt.subplots(nrows=6, ncols=1, sharex=True, constrained_layout=False,figsize=(5.8,8.05)) 

## Titel und Zeitraum
axes[0].set_title('Vergleiche - Testo kalibriert '+str(df['Kalibrierung'].iloc[1]))
axes[0].set(xlim=[pd.to_datetime(dV_start),pd.to_datetime(dV_Ende)]) 

axes[0].plot(df['T_Außenluft_rF'],color=colo('blau',1),  linewidth=0.8,  label='Testo 174H') 
axes[0].plot(df['W_Luftfeuchtigkeit'],color=colo('orange',1),  linewidth=0.8,  label='Wetterstation')  
axes[0].text(0.012,  0.84, r"rel LF Außen", transform=axes[0].transAxes, fontsize=10, bbox=dict(edgecolor='black', facecolor=colo('grau',2.5), alpha=1)) 
axes[0].set_ylim(50,120)  
axes[0].set_yticks([70,90]) 

axes[1].plot(df['T_Abluft_rF'],color=colo('blau',1),  linewidth=0.8,  label='Testo 174H') 
axes[1].plot(df['L_Duschen_Ablufttfeuchte'],color=colo('orange',1),  linewidth=0.8,  label='Lüftung')  
axes[1].text(0.012,  0.84, r"rel LF Abluft", transform=axes[1].transAxes, fontsize=10, bbox=dict(edgecolor='black', facecolor=colo('grau',2.5), alpha=1)) 
axes[1].set_ylim(20,70) 
axes[1].set_yticks([30,50]) 

axes[2].plot(df['T_Außenluft_C'],color=colo('blau',1),  linewidth=0.8,  label='Testo 174H') 
axes[2].plot(df['L_Aussenlufttemperatur_1'],color=colo('orange',1),  linewidth=0.8,  label='Lüftung')  
axes[2].text(0.012,  0.84, r"Temp. Außen", transform=axes[2].transAxes, fontsize=10, bbox=dict(edgecolor='black', facecolor=colo('grau',2.5), alpha=1))     
axes[2].set_ylim(-5,15)  
axes[2].set_yticks([0,10]) 

axes[3].plot(df['T_Zuluft_C'],color=colo('blau',1),  linewidth=0.8,  label='Testo 174H') 
axes[3].plot(df['L_Zulufttemperatur'],color=colo('orange',1),  linewidth=0.8,  label='Lüftung')  
axes[3].text(0.012,  0.84, r"Temp. Zuluft", transform=axes[3].transAxes, fontsize=10, bbox=dict(edgecolor='black', facecolor=colo('grau',2.5), alpha=1)) 
axes[3].set_ylim(10,40)  
axes[3].set_yticks([20,30]) 

axes[4].plot(df['T_Abluft_C'],color=colo('blau',1),  linewidth=0.8,  label='Testo 174H') 
axes[4].plot(df['L_Ablufttemperatur'],color=colo('orange',1),  linewidth=0.8,  label='Lüftung')  
axes[4].text(0.012,  0.84, r"Temp. Abluft", transform=axes[4].transAxes, fontsize=10, bbox=dict(edgecolor='black', facecolor=colo('grau',2.5), alpha=1)) 
axes[4].set_ylim(17,25)  
axes[4].set_yticks([18,22]) 

axes[5].plot(df['T_Fortluft_C'],color=colo('blau',1),  linewidth=0.8,  label='Testo 174H') 
axes[5].plot(df['L_Fortlufttemperatur'],color=colo('orange',1),  linewidth=0.8,  label='Lüftung')  
axes[5].text(0.012,  0.84, r"Temp. Fortluft", transform=axes[5].transAxes, fontsize=10, bbox=dict(edgecolor='black', facecolor=colo('grau',2.5), alpha=1)) 
axes[5].set_ylim(0,20)  
axes[5].set_yticks([5,15]) 

## Legende
for ax in axes:
    ax.legend( ncol=6, loc=1,  bbox_to_anchor=(1., 1)) 
    ax.yaxis.get_label().set_fontsize(8)

## Formatierung X-Achse
axes[0] = plt.gca()
axes[0].xaxis.set_minor_locator(AutoMinorLocator(2))
axes[0].xaxis.set_major_locator(mdates.DayLocator(interval=2))
axes[0].xaxis.set_major_formatter(mdates.DateFormatter('%d.%m.'))  
x_ticks = axes[0].xaxis.get_major_ticks() 
x_ticks[0].label1.set_visible(False)  
plt.setp(axes[0].get_xticklabels(), rotation=0, ha="center", rotation_mode="anchor")
plt.subplots_adjust(hspace=.1)  
plt.show()     

Lüftung gegen T174H kalibrieren

WRG_Kalibrierung()



def kalibrieren(X,Y,output=0):
    polyfit   = np.polyfit(X,Y,deg=1)
    kalval    = np.poly1d(polyfit)
    if output == 1:
        print('WGR_kal[\''+X.name+'\'] = WGR_kal[\''+X.name+'\'] * ' +str(kalval[1]) +   ' + '+str(kalval[0]))
    return kalval(X)




def WRG_Kalibrierung(TE_Kalibrierung='testo', nur_Testo=0):

    TESTO_Kalibrierung(TE_Kalibrierung)

    global WGR_kal, testo
    WGR_kal = pd.DataFrame()
    WGR_kal = testo.copy()          

    if nur_Testo == 0:
        WGR_kal['Datenquelle']  = 'Lüftung'
        WGR_kal['Kalibrierung'] = TE_Kalibrierung

        WGR_kal['L_Aussenlufttemperatur_1_korr'] = kalibrieren(daten['L_Aussenlufttemperatur_1'], testo['T_Außenluft_C'])
        WGR_kal['L_Ablufttemperatur_korr']       = kalibrieren(daten['L_Ablufttemperatur'],       testo['T_Abluft_C'])
        WGR_kal['L_Fortlufttemperatur_korr']     = kalibrieren(daten['L_Fortlufttemperatur'],     testo['T_Fortluft_C'])
        WGR_kal['W_Luftfeuchtigkeit_korr']       = kalibrieren(daten['W_Luftfeuchtigkeit'],        testo['T_Außenluft_rF'])
        WGR_kal['L_Duschen_Ablufttfeuchte_korr'] = kalibrieren(daten['L_Duschen_Ablufttfeuchte'],  testo['T_Abluft_rF'])

    if nur_Testo == 1:
        WGR_kal['Datenquelle']  = 'Testo'
        WGR_kal['Kalibrierung'] = TE_Kalibrierung 

        WGR_kal['L_Aussenlufttemperatur_1_korr'] = testo['T_Außenluft_C']          
        WGR_kal['L_Ablufttemperatur_korr']       = testo['T_Abluft_C']          
        WGR_kal['L_Fortlufttemperatur_korr']     = testo['T_Fortluft_C']              
        WGR_kal['W_Luftfeuchtigkeit_korr']       = testo['T_Außenluft_rF']  
        WGR_kal['L_Duschen_Ablufttfeuchte_korr'] = testo['T_Abluft_rF']      




    ## Zuluftfeuchte
    WGR_kal['Außenluft_WG']                  = psy.Hum_rat2(WGR_kal['L_Aussenlufttemperatur_1_korr'],  WGR_kal['W_Luftfeuchtigkeit_korr']/100,        daten['W_Luftdruck'])
    ## Fortluftfeuchte
    WGR_kal['Abluft_WG']                     = psy.Hum_rat2(WGR_kal['L_Ablufttemperatur_korr'],        WGR_kal['L_Duschen_Ablufttfeuchte_korr']/100,  daten['W_Luftdruck'])
    WGR_kal['Fortluft_relF']                 = psy.Rel_hum2(WGR_kal['L_Fortlufttemperatur_korr'],      WGR_kal['Abluft_WG']*100,                      daten['W_Luftdruck'])

    ## Kalibrierung gegen Testo
    if nur_Testo == 0:
        WGR_kal['Fortluft_relF_korr']        = kalibrieren(WGR_kal['Fortluft_relF'],     testo['T_Fortluft_rF'])

    if nur_Testo == 1:
        WGR_kal['Fortluft_relF_korr']        = testo['T_Fortluft_rF'] 


    ## Gewicht der Luft in kg/m³
    WGR_kal['Außenluft_Masse']               = psy.Dry_Air_Density(daten['W_Luftdruck'], daten['L_Zulufttemperatur'], WGR_kal['Außenluft_WG']) * (1 + WGR_kal['Außenluft_WG'])

    ## abgegebene Energie des Nacherhitzers in kWh
    WGR_kal['Nacherhitzer_Energie']          = energie(daten['L_Nacherhitzer_VL'], daten['L_Nacherhitzer_RL'], daten['S_Heizung_Vpunkt'])
    # WGR_kal['Nacherhitzer_Energie']          = energie(daten['S_Heizung_VL'], daten['S_Heizung_RL'], daten['S_Heizung_Vpunkt'])

    ## 2 Enthalpie der Luft nach dem Nacherhitzer in kJ/kg
    WGR_kal['Zuluft_nach_NE_h']              = psy.Enthalpy_Air_H2O(daten['L_Zulufttemperatur'],    WGR_kal['Außenluft_WG'])

    ## 3 Energie der Luft nach dem Nacherhitzer in kWh
    WGR_kal['Zuluft_nach_NE_Energie']        = WGR_kal['Zuluft_nach_NE_h'] *  WGR_kal['Außenluft_Masse'] * daten['L_Zuluft_VPunkt'] * (1/3600) ## kJ in kWh

    ## 4 Energie der Luft vor dem Nacherhitzer in kWh
    WGR_kal['Zuluft_vor_NE_Energie']         = WGR_kal['Zuluft_nach_NE_Energie'] - WGR_kal['Nacherhitzer_Energie']

    ## 5 Enthalpie der Luft vor dem Nacherhitzer in kJ/kg 
    WGR_kal['Zuluft_vor_NE_h']               = WGR_kal['Zuluft_vor_NE_Energie'] / (WGR_kal['Außenluft_Masse'] * daten['L_Zuluft_VPunkt'] * (1/3600) ) 

    ## 6 Temperatur der Luft vor dem Nacherhitzer 
    WGR_kal['Zuluft_vor_NE_C']               = 500 * (WGR_kal['Zuluft_vor_NE_h'] - 2510 * WGR_kal['Außenluft_WG'])  /  (930 * WGR_kal['Außenluft_WG'] + 503)
    WGR_kal['Zuluft_vor_NE_C_rol']           = WGR_kal['Zuluft_vor_NE_C'].rolling(50, center=True, min_periods=1).mean()  

    if nur_Testo == 0:
        WGR_kal['Zuluft_vor_NE_C_kal']       = kalibrieren(WGR_kal['Zuluft_vor_NE_C_rol'],       testo['T_Zuluft_C'])

    if nur_Testo == 1:
        WGR_kal['Zuluft_vor_NE_C_kal']       = testo['T_Zuluft_C']


    ## Zuluftfeuchte
    WGR_kal['Zuluft_relF_vor_NE']            = psy.Rel_hum2(WGR_kal['Zuluft_vor_NE_C_kal'], WGR_kal['Außenluft_WG']*100, daten['W_Luftdruck'])
    WGR_kal['Zuluft_relF_nach_NE']           = psy.Rel_hum2(WGR_kal['L_Zulufttemperatur'], WGR_kal['Außenluft_WG']*100, daten['W_Luftdruck'])

    if nur_Testo == 0:
        WGR_kal['Zuluft_rF_vor_NE']          = kalibrieren(WGR_kal['Zuluft_relF_vor_NE'],       testo['T_Zuluft_rF'])

    if nur_Testo == 1:
        WGR_kal['Zuluft_rF_vor_NE']          = testo['T_Zuluft_rF'] 


    WGR_kal['Zuluft_C_vor_NE']               = WGR_kal['Zuluft_vor_NE_C_kal'] 

    print_md('**Datenquelle**: '+str(WGR_kal['Datenquelle'].iloc[1])+' - **Kalibrierung**: '+str(WGR_kal['Kalibrierung'].iloc[1])+   '\n\n')

#     return WGR_kal



WRG_Kalibrierung()

Datenquelle: Lüftung - Kalibrierung: testo

Zuweisungen

## Zuweisungen der acht klaibrierten Werte zu dem ursprünglichen Datensatz
def Kalibrierung_zuweisen():
    global daten, WGR_kal 
    daten['Außenluft_C']        = WGR_kal['L_Aussenlufttemperatur_1_korr']
    daten['Zuluft_C_nach_NE']   = WGR_kal['L_Zulufttemperatur']    
    daten['Abluft_C']           = WGR_kal['L_Ablufttemperatur_korr']   
    daten['Fortluft_C']         = WGR_kal['L_Fortlufttemperatur_korr']

    daten['Außenluft_rF']       = WGR_kal['W_Luftfeuchtigkeit_korr']
    daten['Zuluft_rF_nach_NE']  = WGR_kal['Zuluft_relF_nach_NE']
    daten['Abluft_rF']          = WGR_kal['L_Duschen_Ablufttfeuchte_korr']
    daten['Fortluft_rF']        = WGR_kal['Fortluft_relF_korr'] 

    daten['Zuluft_rF_vor_NE']   = WGR_kal['Zuluft_rF_vor_NE']
    daten['Zuluft_C_vor_NE']    = WGR_kal['Zuluft_vor_NE_C_kal'] 

    daten['Kalibrierung']       = WGR_kal['Kalibrierung']
    daten['Datenquelle']        = WGR_kal['Datenquelle'] 

    daten['T_Abluft_rF']        = WGR_kal['T_Abluft_rF']     
    daten['T_Fortluft_rF']      = WGR_kal['T_Fortluft_rF']  
    daten['T_Außenluft_rF']     = WGR_kal['T_Außenluft_rF']  
    daten['T_Zuluft_rF']        = WGR_kal['T_Zuluft_rF']     
    daten['T_Abluft_C']         = WGR_kal['T_Abluft_C']     
    daten['T_Fortluft_C']       = WGR_kal['T_Fortluft_C']   
    daten['T_Außenluft_C']      = WGR_kal['T_Außenluft_C']         
    daten['T_Zuluft_C']         = WGR_kal['T_Zuluft_C']   

Kalibrierung durchführen

reset und neu laden

def reset_daten(Kalibrierung='testo', Datenlogger=0):
    ## daten sicherheitshalber nochmal neu aus der Date laden & Kontrollvariable ausgeben: 2.8
    reload_Daten()  
    ## Kalibirierung durchführen
    ## wenn keine Parameter angegeben sind, wird gegen das Testo480 kalibriert
    WRG_Kalibrierung(TE_Kalibrierung=Kalibrierung, nur_Testo=Datenlogger)
    ## Kalibrierung zuweisen
    Kalibrierung_zuweisen()

reset_daten(Kalibrierung='self', Datenlogger=0)

Datenquelle: Lüftung - Kalibrierung: self

Testplot

Kalibrierung

def überprüfung_plot(df): 
#     print_md('Kalibrierung: '+str(WGR_kal['Kalibrierung'].iloc[1])+'\n\n')
#     print_md(str(WGR_kal['L_Duschen_Ablufttfeuchte_korr'].loc['2017-12-06 00:00:00']))
    fig, ax = plt.subplots(figsize=(6,3), constrained_layout=False) 
    df['Außenluft_C'].plot(ax=ax,color=colo('blau',1),  linewidth=0.8, label = 'Außenluft') 
    df['Fortluft_C'].plot(ax=ax,color=colo('violet',1), linewidth=0.8, label = 'Fortluft') 
    df['Zuluft_C_nach_NE'].plot(ax=ax,color=colo('rot',1),      linewidth=0.8, label = 'Zuluft nach NE') 
    df['Abluft_C'].plot(ax=ax,color=colo('orange',1),   linewidth=0.8, label = 'Abluft') 
    df['Zuluft_C_vor_NE'].plot(ax=ax,color=colo('rot',1.5),      linewidth=0.8, label = 'vor NE') 

    ax2 = ax.twinx()
    df['Außenluft_rF'].plot(ax=ax2,color=colo('blau',1),  linewidth=0.8, label = '__nolable__', linestyle="--") 
    df['Zuluft_rF_nach_NE'].plot(ax=ax2,color=colo('rot',1),      linewidth=0.8, label = '__nolable__', linestyle="--") 
    df['Zuluft_rF_vor_NE'].plot(ax=ax2,color=colo('rot',1.5),      linewidth=0.8, label = '__nolable__', linestyle="--") 
    df['Abluft_rF'].plot(ax=ax2,color=colo('orange',1),   linewidth=0.8, label = '__nolable__', linestyle="--") 
    df['Fortluft_rF'].plot(ax=ax2,color=colo('violet',1), linewidth=0.8, label = '__nolable__', linestyle="--") 

    ## Y Achse formatieren
    ax.set(ylim=[-5,120])
    ax.set_yticks([0,20])  
    ax.set_ylabel(r'\textbf{Temperatur} ($^\circ$C)')  
    ax2.set(ylim=[-80,130]) 
    ax2.set_yticks([20,50,80])
    ax2.set_ylabel(r'\textbf{rel. Luftfeuchte} (\%)') 

    # Legende
    h0, l0 = ax.get_legend_handles_labels()  
    h2, l2 = ax2.get_legend_handles_labels()  
    legend = plt.legend(h0+h2, l0+l2, ncol=3, loc=1)
    set_legend_linewidth(legend) 
    plt.title('Datenquelle: '+str(df['Datenquelle'].iloc[1])+' Kalibrierung: '+str(df['Kalibrierung'].iloc[1])) 
    # X Achse formatieren
    ax.set_xlabel('') 
    ax.set(xlim=[pd.to_datetime("2018-01-31 00:00:00"),pd.to_datetime("2018-02-02 11:00:00")])

    ax = plt.gca()
    ax.xaxis.set_major_locator(mdates.DayLocator(interval=1))
    ax.xaxis.set_major_formatter(mdates.DateFormatter('%d.%m.'))  
    fig.autofmt_xdate(rotation=0,ha='center')  

    plt.show()




WRG_Kalibrierung(TE_Kalibrierung='testo',     nur_Testo=0) 
Kalibrierung_zuweisen()
überprüfung_plot(daten)     

# WRG_Kalibrierung(TE_Kalibrierung='self',  nur_Testo=1) 
# Kalibrierung_zuweisen()
# überprüfung_plot(daten)   

Datenquelle: Lüftung - Kalibrierung: testo

direkte Vergleiche

## direkter Vergleich von jeweils zwei gleichen Werten unterschiedlicher Sensoren
## dient zur Qualitätsischerung der Kalibrierung

## Zeitraum
dV_start = drei
dV_Ende  = vier

## DataFrame
df = daten

fig, axes = plt.subplots(nrows=6, ncols=1, sharex=True, constrained_layout=False,figsize=(5.8,8.05)) 

## Titel und Zeitraum
axes[0].set_title('Vergleiche - Lüftung kalibriert '+str(df['Kalibrierung'].iloc[1]))
axes[0].set(xlim=[pd.to_datetime(dV_start),pd.to_datetime(dV_Ende)]) 

axes[0].plot(df['T_Außenluft_rF'],color=colo('blau',1),  linewidth=0.8,  label='Testo 174H') 
axes[0].plot(df['Außenluft_rF'],color=colo('orange',1),  linewidth=0.8,  label='Lüftung')  
axes[0].text(0.012,  0.84, r"rel LF Außen", transform=axes[0].transAxes, fontsize=10, bbox=dict(edgecolor='black', facecolor=colo('grau',2.5), alpha=1)) 
axes[0].set_ylim(50,120)  
axes[0].set_yticks([70,90]) 

axes[1].plot(df['T_Abluft_rF'],color=colo('blau',1),  linewidth=0.8,  label='Testo 174H') 
axes[1].plot(df['Abluft_rF'],color=colo('orange',1),  linewidth=0.8,  label='Lüftung')  
axes[1].text(0.012,  0.84, r"rel LF Abluft", transform=axes[1].transAxes, fontsize=10, bbox=dict(edgecolor='black', facecolor=colo('grau',2.5), alpha=1)) 
axes[1].set_ylim(20,70) 
axes[1].set_yticks([30,50]) 

axes[2].plot(df['T_Außenluft_C'],color=colo('blau',1),  linewidth=0.8,  label='Testo 174H') 
axes[2].plot(df['Außenluft_C'],color=colo('orange',1),  linewidth=0.8,  label='Lüftung')  
axes[2].text(0.012,  0.84, r"Temp. Außen", transform=axes[2].transAxes, fontsize=10, bbox=dict(edgecolor='black', facecolor=colo('grau',2.5), alpha=1))     
axes[2].set_ylim(-5,15)  
axes[2].set_yticks([0,10]) 

axes[3].plot(df['T_Zuluft_C'],color=colo('blau',1),  linewidth=0.8,  label='Testo 174H') 
axes[3].plot(df['Zuluft_C_vor_NE'],color=colo('orange',1),  linewidth=0.8,  label='Lüftung')  
axes[3].text(0.012,  0.84, r"Temp. Zuluft", transform=axes[3].transAxes, fontsize=10, bbox=dict(edgecolor='black', facecolor=colo('grau',2.5), alpha=1)) 
axes[3].set_ylim(10,40)  
axes[3].set_yticks([20,30]) 

axes[4].plot(df['T_Abluft_C'],color=colo('blau',1),  linewidth=0.8,  label='Testo 174H') 
axes[4].plot(df['Abluft_C'],color=colo('orange',1),  linewidth=0.8,  label='Lüftung')  
axes[4].text(0.012,  0.84, r"Temp. Abluft", transform=axes[4].transAxes, fontsize=10, bbox=dict(edgecolor='black', facecolor=colo('grau',2.5), alpha=1)) 
axes[4].set_ylim(17,25)  
axes[4].set_yticks([18,22]) 

axes[5].plot(df['T_Fortluft_C'],color=colo('blau',1),  linewidth=0.8,  label='Testo 174H') 
axes[5].plot(df['Fortluft_C'],color=colo('orange',1),  linewidth=0.8,  label='Lüftung')  
axes[5].text(0.012,  0.84, r"Temp. Fortluft", transform=axes[5].transAxes, fontsize=10, bbox=dict(edgecolor='black', facecolor=colo('grau',2.5), alpha=1)) 
axes[5].set_ylim(0,20)  
axes[5].set_yticks([5,15]) 

## Legende
for ax in axes:
    ax.legend( ncol=6, loc=1,  bbox_to_anchor=(1., 1)) 
    ax.yaxis.get_label().set_fontsize(8)

## Formatierung X-Achse
axes[0] = plt.gca()
axes[0].xaxis.set_minor_locator(AutoMinorLocator(2))
axes[0].xaxis.set_major_locator(mdates.DayLocator(interval=2))
axes[0].xaxis.set_major_formatter(mdates.DateFormatter('%d.%m.'))  
x_ticks = axes[0].xaxis.get_major_ticks() 
x_ticks[0].label1.set_visible(False)  
plt.setp(axes[0].get_xticklabels(), rotation=0, ha="center", rotation_mode="anchor")
plt.subplots_adjust(hspace=.1)  
plt.show()     

Zulufttemperatur vor NE

fig, ax = plt.subplots()  
daten['T_Zuluft_C'].plot(ax=ax,color=colo('grau',1.4), linewidth=1, label = 'gemessen')      
daten['Zuluft_C_vor_NE'].plot(ax=ax,color=colo('rot',1), linewidth=1, label = ' berechnet')      
ax.set_ylabel(r'\textbf{Temperatur}')  
ax.set_xlabel('')   
ax.set_ylim(10,20)  
h0, l0 = ax.get_legend_handles_labels() 
legend = plt.legend(h0, l0, ncol=2, loc=1)
set_legend_linewidth(legend) 
ax = plt.gca()
ax.xaxis.set_major_locator(mdates.DayLocator(interval=1))
ax.xaxis.set_major_formatter(mdates.DateFormatter('%d.%m.'))   
plt.setp(ax.get_xticklabels(), rotation=0, ha="center", rotation_mode="anchor")
ax.set(xlim=[pd.to_datetime(dV_start),pd.to_datetime(dV_Ende)]) 
ax.set_title('Zulufttemperatur vor NE - Kalibrierung '+str(df['Kalibrierung'].iloc[1]))
Text(0.5, 1.0, 'Zulufttemperatur vor NE - Kalibrierung testo')
welche_Kalibrierung(daten)

Datenquelle: Lüftung Kalibrierung: testo

'Datenquelle: Lüftung  |  Kalibrierung: testo'

Effizienz berechnen

## findet Werte (x) zwischen low und high mit der länge thresh
def sequence(x, low, high, thresh):
    ind                 = np.flatnonzero(np.diff(np.r_[False, ((x >= low) & (x <= high)), False]))
    start               = ind[::2]
    end                 = ind[1::2]
    mask                = end - start >= thresh
    result              = np.zeros(x.size, dtype=np.int8)
    result[start[mask]] = + 1
    mask[-1]            = False
    result[end[mask]]   = - 1
    return np.cumsum(result, out=result).view(bool) 

def effizienz(by=0, außen_C=0, zu_C=0, ab_C=0, fort_C=0, außen_rF=0, zu_rf=0, ab_rF=0, fort_rf=0, zu_Vp=0):
    by = (45+by)/100
    global daten 

    ## Schwellenwerte im Zuluftdruck für Bypass
    schwelle_oben  = 1000
    schwelle_unten = 85.5
    ## Anteil an Luft durch den Bypass:
    Anteil_Bypass  = by

    ## MIN MAX
    daten['Außenluft_C']     = daten['Außenluft_C']      + außen_C
    daten['Zuluft_C_vor_NE'] = daten['Zuluft_C_vor_NE']  + zu_C
    daten['Abluft_C']        = daten['Abluft_C']         + ab_C
    daten['Fortluft_C']      = daten['Fortluft_C']       + fort_C
    daten['Außenluft_rF']    = daten['Außenluft_rF']     + außen_rF
    daten['Zuluft_rF_vor_NE']= daten['Zuluft_rF_vor_NE'] + zu_rf
    daten['Abluft_rF']       = daten['Abluft_rF']        + ab_rF
    daten['Fortluft_rF']     = daten['Fortluft_rF']      + fort_rf
    daten['L_Zuluft_VPunkt'] = daten['L_Zuluft_VPunkt']  * (1+zu_Vp/100) 

    ## abgegebene Energie des Nacherhitzers in kWh
    daten['Nacherhitzer_Energie']          = energie(daten['L_Nacherhitzer_VL'], daten['L_Nacherhitzer_RL'], daten['S_Heizung_Vpunkt'])
#     daten['Nacherhitzer_Energie']          = energie(daten['S_Heizung_VL'], daten['S_Heizung_RL'], daten['S_Heizung_Vpunkt'])


    ## Wassergehalte (WG) in den  Luftströmen daten
    daten['Außenluft_WG']         = psy.Hum_rat2(daten['Außenluft_C'],     daten['Außenluft_rF'] /100,       daten['W_Luftdruck'])
    daten['Zuluft_WG']            = psy.Hum_rat2(daten['Zuluft_C_vor_NE'], daten['Zuluft_rF_vor_NE'] /100,   daten['W_Luftdruck'])
    daten['Abluft_WG']            = psy.Hum_rat2(daten['Abluft_C'],        daten['Abluft_rF']    /100,       daten['W_Luftdruck'])
    daten['Fortluft_WG']          = psy.Hum_rat2(daten['Fortluft_C'],      daten['Fortluft_rF']  /100,       daten['W_Luftdruck']) 
#     daten['Zuluft_WG']            = daten['Außenluft_WG'] 

    ## Enthalpien in den  Luftströmen daten
    daten['h21_Außenluft']        = psy.Enthalpy_Air_H2O(daten['Außenluft_C'],      daten['Außenluft_WG'])
    daten['h22_Zuluft']           = psy.Enthalpy_Air_H2O(daten['Zuluft_C_vor_NE'],  daten['Zuluft_WG'])
    daten['h11_Abluft']           = psy.Enthalpy_Air_H2O(daten['Abluft_C'],         daten['Abluft_WG'])
    daten['h12_Fortluft']         = psy.Enthalpy_Air_H2O(daten['Fortluft_C'],       daten['Fortluft_WG'])

    ## Enthalpien im Bypassbetrieb
    daten['h21_Außenluft_by']     = daten['h21_Außenluft'] * (1-Anteil_Bypass) + daten['h11_Abluft'] * Anteil_Bypass  
    daten['h21_Außenluft_bypass'] = np.where((daten['L_Zuluft_Druck'] < schwelle_oben) & (daten['L_Zuluft_Druck'] > schwelle_unten),  daten['h21_Außenluft'],  daten['h21_Außenluft_by'])
    daten['h21_Außenluft_pure']   = daten['h21_Außenluft']

    ## Effizienz der Wärmerückgewinnung
    daten['EÜG_Außenluft_vorl']   = (daten['h22_Zuluft'] - daten['h21_Außenluft_bypass']) / (daten['h11_Abluft'] - daten['h21_Außenluft_bypass']) * 100
    daten['EÜG_Fortluft_vorl']    = (daten['h11_Abluft'] - daten['h12_Fortluft'])         / (daten['h11_Abluft'] - daten['h21_Außenluft_bypass']) * 100
    ## Rückwärmezahl 
    daten['RWZ_Außenluft_vorl']   = (daten['Zuluft_C_vor_NE']   - daten['Außenluft_C'])   / (daten['Abluft_C'] - daten['Außenluft_C']) * 100 
    daten['RWZ_Fortluft_vorl']    = (daten['Abluft_C']          - daten['Fortluft_C'])    / (daten['Abluft_C'] - daten['Außenluft_C']) * 100 
    ## Gewicht der feuchten Luft
    daten['Außenluft_Masse']      = psy.Dry_Air_Density(daten['W_Luftdruck'], daten['Außenluft_C'],     daten['Außenluft_WG']) * (1 + daten['Außenluft_WG'])
    daten['Zuluft_Masse']         = psy.Dry_Air_Density(daten['W_Luftdruck'], daten['Zuluft_C_vor_NE'], daten['Zuluft_WG'])    * (1 + daten['Zuluft_WG'])
    daten['Abluft_Masse']         = psy.Dry_Air_Density(daten['W_Luftdruck'], daten['Abluft_C'],        daten['Abluft_WG'])    * (1 + daten['Abluft_WG'])
    daten['Fortluft_Masse']       = psy.Dry_Air_Density(daten['W_Luftdruck'], daten['Fortluft_C'],      daten['Fortluft_WG'])  * (1 + daten['Fortluft_WG'])  

    ## Luftströme definieren, für die Unterscheidung des Bypass Betriebes
    daten['Vpunkt_intern']        = daten['L_Zuluft_VPunkt']
    daten['Vpunkt_extern']        = daten['L_Zuluft_VPunkt']

    ## Luftstrom im Bypassfall
    daten['Vpunkt_extern']        = daten['L_Zuluft_VPunkt'] * (1-Anteil_Bypass) 
    daten['Vpunkt_extern']        = np.where((daten['L_Zuluft_Druck'] < schwelle_oben) & (daten['L_Zuluft_Druck'] > schwelle_unten),  daten['L_Zuluft_VPunkt'],  daten['Vpunkt_extern'])


    ## Energie der Luftmassenströme
    daten['Außenluft_Energie']    = daten['h21_Außenluft_pure']    *  daten['Außenluft_Masse'] * daten['Vpunkt_extern'] * (1/3600) ## kJ in kWh
    daten['Zuluft_Energie']       = daten['h22_Zuluft']            *  daten['Zuluft_Masse']    * daten['Vpunkt_intern'] * (1/3600) ## kJ in kWh
    daten['Abluft_Energie']       = daten['h11_Abluft']            *  daten['Abluft_Masse']    * daten['Vpunkt_intern'] * (1/3600) ## kJ in kWh
    daten['Fortluft_Energie']     = daten['h12_Fortluft']          *  daten['Fortluft_Masse']  * daten['Vpunkt_extern'] * (1/3600) ## kJ in kWh

    daten['verlorene_Energie']    = daten['Außenluft_Energie']     +  daten['Zuluft_Energie']  - daten['Abluft_Energie'] - daten['Fortluft_Energie'] 


    ## Schwellen wann die WRG zu 100% läuft, Bypass ist zu
    daten['between_p']            = sequence(daten['L_Zuluft_Druck'], schwelle_unten, schwelle_oben, 1000) 
    daten['EÜG_Außenluft']        = np.where(daten['between_p'] ==  True ,daten['EÜG_Außenluft_vorl'] ,np.NaN)
    daten['between_p']            = sequence(daten['L_Zuluft_Druck'], schwelle_unten, schwelle_oben, 1000) 
    daten['RWZ_Außenluft']        = np.where(daten['between_p'] ==  True ,daten['RWZ_Außenluft_vorl'] ,np.NaN) 
    daten['between_p']            = sequence(daten['L_Zuluft_Druck'], schwelle_unten, schwelle_oben, 1000) 
    daten['EÜG_Fortluft']         = np.where(daten['between_p'] ==  True ,daten['EÜG_Fortluft_vorl'] ,np.NaN)
    daten['between_p']            = sequence(daten['L_Zuluft_Druck'], schwelle_unten, schwelle_oben, 1000) 
    daten['RWZ_Fortluft']         = np.where(daten['between_p'] ==  True ,daten['RWZ_Fortluft_vorl'] ,np.NaN) 
    ## Mittelwerte 
    daten['EÜG_Außenluft_mean']   = daten['EÜG_Außenluft'].mean()
    daten['RWZ_Außenluft_mean']   = daten['RWZ_Außenluft'].mean()
    daten['EÜG_Fortluft_mean']    = daten['EÜG_Fortluft'].mean()
    daten['RWZ_Fortluft_mean']    = daten['RWZ_Fortluft'].mean()

effizienz() 

Effizienz_plot

def effizienz_plot():
#     global daten 
    fig, ax = plt.subplots(figsize=(6,2))
    ax.fill_between(daten.index, 0, 1, where=daten['between_p']==1, color=colo('grau',1.5), alpha=1, transform=ax.get_xaxis_transform())

    # EÜG & RWZ
    daten['EÜG_Außenluft_vorl'].plot(ax=ax,color=colo('grün',1),   linewidth=.5, label = 'EÜG_Außenluft')  
    daten['RWZ_Außenluft_vorl'].plot(ax=ax,color=colo('blau',1),   linewidth=.5, label = 'RWZ_Außenluft')  
    # EÜG & RWZ in Druckintervall
    daten['EÜG_Außenluft'].plot(ax=ax,color=colo('grün',1),        linewidth=1, label = '__nolable__')  
    daten['RWZ_Außenluft'].plot(ax=ax,color=colo('blau',1),        linewidth=1, label = '__nolable__')  
    # EÜG & RWZ Durchschnittslinien
    daten['EÜG_Außenluft_mean'].plot(ax=ax,color=colo('grün',1),   linewidth=0.8, label = '__nolable__')  
    daten['RWZ_Außenluft_mean'].plot(ax=ax,color=colo('blau',1),   linewidth=0.8, label = '__nolable__')  

    ax.text(0.05,  0.06, 'EÜG Außen: '+str(int(daten['EÜG_Außenluft_mean'].mean()))+' \%', color=colo('grün',1), transform=ax.transAxes, fontsize=10, bbox=dict(facecolor=colo('grau',1.5), alpha=1)) 
    ax.text(0.3,   0.06, 'RWZ Außen: '+str(int(daten['RWZ_Außenluft_mean'].mean()))+' \%', color=colo('blau',1), transform=ax.transAxes, fontsize=10, bbox=dict(facecolor=colo('grau',1.5), alpha=1))  

    ax.set(xlim=[pd.to_datetime("2018-01-31 00:00:00"),pd.to_datetime("2018-02-12 11:00:00")])
    ax.set(ylabel="Energie(kWh)", xlabel="Zeit",ylim=[30,100])
    ax.set_xlabel('')
    h0, l0 = ax.get_legend_handles_labels() 
    legend = plt.legend(h0, l0, ncol=4, loc=1) 
    set_legend_linewidth(legend) 
    plt.title('Effizienz - '+welche_Kalibrierung(daten)) 
    plt.setp(ax.get_xticklabels(), rotation=0, ha="center", rotation_mode="anchor")
    ax.get_xaxis().set_major_formatter(mdates.DateFormatter("%d.%m.")) 
#     plt.savefig(output_folder + '/' + file_name + '_Effizienz - '+welche_Kalibrierung(daten) + '.pdf') 
    plt.show()

effizienz_plot()

Datenquelle: Lüftung Kalibrierung: testo

Testplots

reset_daten(Kalibrierung='testo', Datenlogger=0)
effizienz()
effizienz_plot()

reset_daten(Kalibrierung='self', Datenlogger=1)
effizienz()
effizienz_plot()

Datenquelle: Lüftung - Kalibrierung: testo

Datenquelle: Lüftung Kalibrierung: testo

Datenquelle: Testo - Kalibrierung: self

Datenquelle: Testo Kalibrierung: self

RESET

reset_daten()
effizienz()

Datenquelle: Lüftung - Kalibrierung: testo

Effizienz bax Plot

def effizienz_bax(title):
    global daten
    fig = plt.figure(constrained_layout=False, figsize=(6.9,2))
    bax = brokenaxes(xlims=((eins, zwei), (drei, vier), (fünf,sechs)),  hspace=1.2)  
    bax.plot(daten.index, daten['RWZ_Außenluft'],  color=colo('blau',1),   linewidth=1, label = r'RWZ_Außenluft')
    bax.plot(daten.index, daten['EÜG_Außenluft'],  color=colo('rot',1),    linewidth=1, label = r'EÜG_Außenluft') 
    fig.axes[0].get_xaxis().set_major_formatter(mdates.DateFormatter("%d.%m."))
    fig.axes[1].get_xaxis().set_major_formatter(mdates.DateFormatter("%d.%m."))
    fig.axes[2].get_xaxis().set_major_formatter(mdates.DateFormatter("%d.%m."))
    # bax.set_xlabel('')  
    bax.set(ylim=[50,100])
    bax.set_yticks([60,70,80])  
    # bax.set_ylabel(r'\textbf{Temperatur} ($^\circ$C)')  
    bax.legend(loc=1, ncol=4) 
    plt.title(title+' '+welche_Kalibrierung(daten))

reset_daten(Kalibrierung='self', Datenlogger=1)
effizienz()
effizienz_bax('Effizienz der WRG')

Datenquelle: Testo - Kalibrierung: self

Datenquelle: Testo Kalibrierung: self

Suche nach dem Druck

Tests

# reset_daten()
# effizienz()


fig, ax = plt.subplots(figsize=(6,2))  
ax.axhline(y=73, linewidth=0.4,   color=colo('black',1), xmin=0.0001, xmax=1)
ax.axhline(y=82, linewidth=0.4,   color=colo('black',1), xmin=0.0001, xmax=1)


daten['EÜG_Außenluft_vorl'].plot(ax=ax,color=colo('rot',1),    linewidth=.5, label = 'EÜG_Außenluft')    
daten['RWZ_Außenluft_vorl'].plot(ax=ax,color=colo('grün',1),   linewidth=.5, label = 'RWZ_Außenluft')   

daten['EÜG_Außenluft'].plot(ax=ax,color=colo('rot',1),    linewidth=.8, label = '__nolabel__')    
daten['RWZ_Außenluft'].plot(ax=ax,color=colo('grün',1),   linewidth=.8, label = '__nolabel__')   

daten['L_Zuluft_Druck'].plot(ax=ax,color=colo('grau',.8),   linewidth=.8, label = 'Druck')   

ax.set(ylim=[40,150])  
ax.set_xlabel('')
plt.setp(ax.get_xticklabels(), rotation=0, ha="center", rotation_mode="anchor")
ax.get_xaxis().set_major_formatter(mdates.DateFormatter("%d.%m."))
ax.set(xlim=[pd.to_datetime("2018-01-31 00:00:00"),pd.to_datetime("2018-02-22 00:00:00")])
h0, l0 = ax.get_legend_handles_labels() 
legend = plt.legend(h0, l0, ncol=3, loc=1) 
set_legend_linewidth(legend) 

print(f'RWZ außen: {int(daten.RWZ_Außenluft_mean.mean())}%')
print(f'EÜG außen: {int(daten.EÜG_Außenluft_mean.mean())}%')
RWZ außen: 76%
EÜG außen: 95%

Luftdruck

## Luftdruck der Wetterstation KAssel Mitte

fig, ax = plt.subplots(figsize=(6,2)) 
# ax2 = ax.twinx()  
# ax2.axhline(y=0, linewidth=0.4,   color=colo('black',1), xmin=0.0001, xmax=1) 
daten['W_Luftdruck'].plot(ax=ax,color=colo('blau',1),  linewidth=.8, label = 'W_Luftdruck')  
# ax.set(ylim=[40,150]) 
# ax2.set(ylim=[-.025,.05]) 
ax.set_xlabel('')
plt.setp(ax.get_xticklabels(), rotation=0, ha="center", rotation_mode="anchor")
ax.get_xaxis().set_major_formatter(mdates.DateFormatter("%d.%m."))
ax.set(xlim=[pd.to_datetime(von),pd.to_datetime(bis)])
h0, l0 = ax.get_legend_handles_labels() 
legend = plt.legend(h0, l0, ncol=3, loc=1) 
set_legend_linewidth(legend) 

Druck Histogramm

daten_std = daten.loc[eins : sechs]
# daten_std.dropna(inplace= True)

fig, ax = plt.subplots(figsize=(6,5))
bins = 1000
# .dropna()].isna().sum()
## Histogramme mit Rahmen
plt.hist(daten_std['L_Zuluft_Druck'], bins=bins, orientation="horizontal", color=colo('grün',1),  linewidth=0.5, edgecolor='black', label = 'Druck Zuluft',     histtype='stepfilled')     

ax.axhline(y=93, linewidth=0.3,   color=colo('black',1), xmin=0.0001, xmax=1)
ax.axhline(y=87, linewidth=0.3,   color=colo('black',1), xmin=0.0001, xmax=1)
ax.axhline(y=81, linewidth=0.3,   color=colo('black',1), xmin=0.0001, xmax=1)
ax.axhline(y=72, linewidth=0.3,   color=colo('black',1), xmin=0.0001, xmax=1)
ax.axhline(y=65, linewidth=0.3,   color=colo('black',1), xmin=0.0001, xmax=1)

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

ax.set_ylabel(r'\textbf{Druck} (Pa)')     
ax.set_xlabel(r'\textbf{Zeit} (h)')    
ax.set_yticks([93,87,81,72,65]) 
ax.set(xlim=[0,2000])  
ax.set(ylim=[70,100])  

plt.tick_params(axis='x', which='minor', bottom=False)

# plt.savefig(output_folder + '/' + file_name + '_Luftdruck_Histogramm.pdf') 

Druck Volumenstrom Linenplots

def axformat():
    ax.axhline(y=93, linewidth=0.4,   color=colo('black',1), xmin=0.0001, xmax=1)
    ax.axhline(y=87, linewidth=0.4,   color=colo('black',1), xmin=0.0001, xmax=1)
    ax.axhline(y=81, linewidth=0.4,   color=colo('black',1), xmin=0.0001, xmax=1)
    ax.axhline(y=72, linewidth=0.4,   color=colo('black',1), xmin=0.0001, xmax=1)
    ax.axhline(y=65, linewidth=0.4,   color=colo('black',1), xmin=0.0001, xmax=1)
    ax.set_xlabel('')  
    ax.set(ylim=[60,100]) 
    ax.set_yticks([93,87,81,72,65]) 
    h0, l0 = ax.get_legend_handles_labels()
    h2, l2 = ax2.get_legend_handles_labels()
    legend = plt.legend(h0+h2, l0+l2, ncol=2, loc=1) 
    set_legend_linewidth(legend) 
    ax.legend(loc=1, ncol=4)  
    plt.setp(ax.get_xticklabels(), rotation=0, ha="center", rotation_mode="anchor")

fig = plt.figure(constrained_layout=False, figsize=(6,2))
bax = brokenaxes(xlims=((eins, zwei), (drei, vier), (fünf,sechs)),  hspace=1.2) 
bax.plot(daten.index, daten['L_Zuluft_Druck'],    color=colo('grün',1),   linewidth=0.5, label = r'Zuluft_Druck')  
fig.axes[0].get_xaxis().set_major_formatter(mdates.DateFormatter("%d.%m."))
fig.axes[1].get_xaxis().set_major_formatter(mdates.DateFormatter("%d.%m."))
fig.axes[2].get_xaxis().set_major_formatter(mdates.DateFormatter("%d.%m."))
bax.axhline(y=93, linewidth=0.4,   color=colo('black',1), xmin=0.0001, xmax=1)
bax.axhline(y=87, linewidth=0.4,   color=colo('black',1), xmin=0.0001, xmax=1)
bax.axhline(y=81, linewidth=0.4,   color=colo('black',1), xmin=0.0001, xmax=1)
bax.axhline(y=72, linewidth=0.4,   color=colo('black',1), xmin=0.0001, xmax=1)
plt.title('gesamter Zeitraum')
# bax.set_xlabel('')  
# bax.set(ylim=[60,100])
# bax.set_yticks([18.5,19,19.5])  
# bax.set_ylabel(r'\textbf{Temperatur} ($^\circ$C)')  
bax.legend(loc=1, ncol=4)  

## 12 Tage
fig, ax = plt.subplots(figsize=(6,2))  
daten['L_Zuluft_Druck'].plot(ax=ax,color=colo('grün',1),   linewidth=.5, label = 'Druck')
ax2 = ax.twinx()
daten['L_Zuluft_VPunkt'].plot(ax=ax2,color=colo('rot',1),   linewidth=.5, label = 'Volumenstrom')
axformat()
plt.title('12 Tage')
ax.get_xaxis().set_major_formatter(mdates.DateFormatter("%d.%m.")) 
ax.set(xlim=[pd.to_datetime("2018-02-01 00:00:00"),pd.to_datetime("2018-02-12 00:00:00")])


## 3.2
fig, ax = plt.subplots(figsize=(6,2))  
daten['L_Zuluft_Druck'].plot(ax=ax,color=colo('grün',1),   linewidth=.5, label = 'L_Zuluft_Druck')
ax2 = ax.twinx()
daten['L_Zuluft_VPunkt'].plot(ax=ax2,color=colo('rot',1),   linewidth=.5, label = 'Volumenstrom')
axformat()
plt.title('3.2.')
ax.get_xaxis().set_major_formatter(mdates.DateFormatter("%H:%M")) 
ax.set(xlim=[pd.to_datetime("2018-02-03 00:00:00"),pd.to_datetime("2018-02-03 23:59:00")])


## 7.2.
fig, ax = plt.subplots(figsize=(6,2))  
daten['L_Zuluft_Druck'].plot(ax=ax,color=colo('grün',1),   linewidth=.5, label = 'L_Zuluft_Druck')
ax2 = ax.twinx()
daten['L_Zuluft_VPunkt'].plot(ax=ax2,color=colo('rot',1),   linewidth=.5, label = 'Volumenstrom')
axformat()
plt.title('7.2.')
ax.get_xaxis().set_major_formatter(mdates.DateFormatter("%H:%M")) 
ax.set(xlim=[pd.to_datetime("2018-02-07 00:00:00"),pd.to_datetime("2018-02-07 23:59:00")])


## 10.2.
fig, ax = plt.subplots(figsize=(6,2))  
daten['L_Zuluft_Druck'].plot(ax=ax,color=colo('grün',1),   linewidth=.5, label = 'L_Zuluft_Druck')
ax2 = ax.twinx()
daten['L_Zuluft_VPunkt'].plot(ax=ax2,color=colo('rot',1),   linewidth=.5, label = 'Volumenstrom')
axformat()
plt.title('10.2.')
ax.get_xaxis().set_major_formatter(mdates.DateFormatter("%H:%M")) 
ax.set(xlim=[pd.to_datetime("2018-02-10 00:00:00"),pd.to_datetime("2018-02-10 23:59:00")])
[(736735.0, 736735.9993055556)]

Wärmefluss

Berechnungen

def wärmefluss(title='Wärmefluss'):
    global daten

    ## Gas
    daten['S_Gas_Energie']          = daten['S_Gas_Vpunkt'].div(1000).mul(11.276)
    ## Hydraulik
    daten['S_FriWa_Energie_Sek']    = energie(daten['S_FriWa_VL_Sek'],  daten['S_FriWa_RL_Sek'],  daten['S_FriWa_Vpunkt_Sek'])
    daten['S_FriWa_Energie_Prim']   = energie(daten['S_FriWa_VL_Prim'], daten['S_FriWa_RL_Prim'], daten['S_FriWa_Vpunkt_Prim'])
    daten['S_Solar_Energie']        = energie(daten['S_Solar_VL'],      daten['S_Solar_RL'],      daten['S_Solar_Vpunkt'])
    daten['S_Heizung_Energie']      = energie(daten['S_Heizung_VL'],    daten['S_Heizung_RL'],    daten['S_Heizung_Vpunkt'])
    daten['S_Kessel_Energie']       = energie(daten['S_Kessel_VL'],     daten['S_Kessel_RL'],     daten['S_Kessel_Vpunkt'])

    ## Transmissionswärmeverluste
    daten['TMWV']                   = -110 * (daten['Abluft_C'] - daten['Außenluft_C'])/1000 ## H_T Wert: gemessen: ~110 W/K, berechnet: 207 W/K
    ## Wärmegewinne durch el Strom
    daten['Strom']                  = .4

#     ## Wärmespeicherkapazität des Gebäudes
#     ## Umweg über einen eigenen DataFrame
#     df                                  = pd.DataFrame()
#     df['Abluft_C']                      = daten['Abluft_C'] 
#     df['Wärmespeicherkap']              = daten['Abluft_C'].groupby(daten.index.date).apply(lambda x: x.iloc[-1] -x.iloc[0]) * 8.837 / 24 # Stunden pro Tag
#     df['Wärmespeicherkap'].fillna(method='ffill', inplace =True) 

#     daten['Wärmespeicherkap']       = df['Wärmespeicherkap']
#     daten['gesp_Wärme_neg']         = np.where(daten['Wärmespeicherkap'] < 0,  daten['Wärmespeicherkap'].mul(-1), np.NaN)
#     daten['gesp_Wärme_po']          = np.where(daten['Wärmespeicherkap'] > 0,  daten['Wärmespeicherkap'].mul( 1), np.NaN) 

    ## Lüftung
    daten['L_Zuluft_VPunkt']        = daten['L_Zuluft_1_VPunkt']  + daten['L_Zuluft_2_VPunkt'] + daten['L_Zuluft_3_VPunkt']  
    daten['Lüftung_rein']           = daten['Außenluft_Energie']    
    daten['Lüftung_raus']           = daten['Fortluft_Energie']       
    daten['Lüftung']                = (daten['Lüftung_rein']      - daten['Lüftung_raus'])   


    ## interne Wärmegewinne durch Meschen (Anzahl über CO2 Konzentration bestimmt)
    ## CO2 Tagesdurchschnittswerte 
    daten_co2                       = daten[['L_Seminarraum_1_CO2','L_Seminarraum_2_CO2']].resample("1D").mean() ## oder median??
    daten_co2                       = daten_co2.resample("15s").fillna(method='ffill').interpolate()

    V_1                             = 330   ## Gesamtnettovolumen Sem1 + Sem2 = 440m³ # Flächen Sem1: 90m² und Sem2: 30m²
    V_2                             = 110   ## Volumen anteilig nach Fläche
    daten['LWR_1']                  = daten['L_Zuluft_1_VPunkt'] / V_1
    daten['LWR_2']                  = daten['L_Zuluft_2_VPunkt'] / V_2 
    daten['1CO2med']                = daten_co2['L_Seminarraum_1_CO2']  #daten['L_Seminarraum_1_CO2'].median() 
    daten['2CO2med']                = daten_co2['L_Seminarraum_2_CO2']  #daten['L_Seminarraum_2_CO2'].median() 
    c02_außenluft                   = (daten['1CO2med'] + daten['2CO2med']) / 2
    co2_abgabe_ruhe                 = 20000 # CO2 Emmisionsrate pro Person in ml/h
    co2_abgabe_sport                = 100000 # CO2 Emmisionsrate pro Person in ml/h
    daten['co2_abgabe_angepasst']   = co2_abgabe_ruhe
    ## Annahme: Abends wird dort Yoga gemacht
    daten['co2_abgabe_angepasst'].loc[(daten.index.hour>=15) & (daten.index.hour<=23)] = co2_abgabe_sport
    wärme_abgabe_ruhe               = .12 # kW
    wärme_abgabe_sport              = .27 # kW
    daten['wärme_abgabe_angepasst'] = wärme_abgabe_ruhe
    daten['wärme_abgabe_angepasst'].loc[(daten.index.hour>=15) & (daten.index.hour<=23)] = wärme_abgabe_sport
    daten['Personen_1']             = (-daten['LWR_1'] * V_1 * c02_außenluft + daten['LWR_1'] * V_1 * daten['L_Seminarraum_1_CO2']) / daten['co2_abgabe_angepasst'] 
    daten['Personen_2']             = (-daten['LWR_2'] * V_2 * c02_außenluft + daten['LWR_2'] * V_2 * daten['L_Seminarraum_2_CO2']) / co2_abgabe_ruhe
    daten['Personen_1']             = np.where(daten['Personen_1'] < 1, 0, daten['Personen_1'])
    daten['Personen_2']             = np.where(daten['Personen_2'] < 1, 0, daten['Personen_2'])
    daten['Wärme_durch_Personen_1'] = daten['Personen_1'] * daten['wärme_abgabe_angepasst'] 
    daten['Wärme_durch_Personen_2'] = daten['Personen_2'] * wärme_abgabe_ruhe 
    daten['Wärme_durch_Personen']   = daten['Wärme_durch_Personen_2'] + daten['Wärme_durch_Personen_1']

    ## wenn Heizung + 2h aus - keine Bilanz erstellen
    daten["S_Heizung_Vpunkt_flag"]                                              = 0
    daten.loc[daten["S_Heizung_Vpunkt"]      > 50,     "S_Heizung_Vpunkt_flag"] = 1
    daten["S_Heizung_Vpunkt_flag"].fillna(value = 1,limit = 480,     inplace = True)
    daten.loc[daten["S_Heizung_Vpunkt_flag"] == 0,     "S_FriWa_Energie_Prim"]  = 0
    daten.loc[daten["S_Heizung_Vpunkt_flag"] == 0,     "Strom"]                 = 0
    daten.loc[daten["S_Heizung_Vpunkt_flag"] == 0,     "Wärme_durch_Personen"]  = 0
    daten.loc[daten["S_Heizung_Vpunkt_flag"] == 0,     "Lüftung"]               = 0
    daten.loc[daten["S_Heizung_Vpunkt_flag"] == 0,     "TMWV"]                  = 0


    ## Bilanzsumme
    daten['Wärmebilanz']            = daten.S_Heizung_Energie + daten.S_FriWa_Energie_Prim + daten.Strom  + daten.Wärme_durch_Personen  + daten.Lüftung + daten.TMWV 
    ## für Balkendiagramm
    daten['Wärmebilanz_po']         = np.where(daten['Wärmebilanz'] < 0,  daten['Wärmebilanz'], 0)
    daten['Wärmebilanz_ne']         = np.where(daten['Wärmebilanz'] > 0,  daten['Wärmebilanz'], 0) 

#     print_md(f'{title} minütlich<br>Wärmebilanz Summe: {int(daten.Wärmebilanz.sum()/240)} kWh<br> positiv: {int(daten.Wärmebilanz_po.sum()/240)} negativ: {int(daten.Wärmebilanz_ne.sum()/240)} ')
wärmefluss()

Wärmespeicherkapazität berechnen

## War wicvhtig, um einen Feher zu Finden
## Ist jetzt aber nicht mehr notwendig

# # erster und letzter Wert am Tag
# res = daten_sub['Abluft_C'].groupby(daten_sub.index.date).apply(lambda x: x.iloc[[0, -1]])
# res.index = res.index.droplevel(0)
# print(res)

# # aus Abluft_delta_C -> Wärmespeicherkap
# df = pd.DataFrame() 
# df['Abluft_delta_C']         = daten_sub['Abluft_C'].groupby(daten_sub.index.date).apply(lambda x: x.iloc[-1] -x.iloc[0]) 
# df['Wärmespeicherkap'] = daten_sub['Abluft_C'].groupby(daten_sub.index.date).apply(lambda x: x.iloc[-1] -x.iloc[0]) * 8.837   
# print(df)

Wärmefluss Plot

## den Daten df auf tägliche Basis sampeln 
## Daten aus der MCA importieren 
## beide zusammenführen und aufräumen

def daten_tgl_resample():
    global daten_tgl
    daten_sub = daten.loc[eins : sechs].resample('D').sum().div(240).copy()    
    daten_sub = daten_sub.replace(0, np.nan)
    daten_sub = daten_sub.dropna(how='all', axis=0)
    daten_sub = daten_sub.replace(np.nan, 0)

    Bilanz_tgl = pd.DataFrame()
    Bilanz_tgl = pd.read_csv("../MCA/Energie_Fehler_tgl.csv")
    Bilanz_tgl['Zeit'] = pd.to_datetime(Bilanz_tgl["Zeit"],dayfirst=True,)
    Bilanz_tgl.set_index(["Zeit"], inplace=True)

    daten_tgl = pd.DataFrame()
    daten_tgl = pd.concat([Bilanz_tgl, daten_sub], axis=1)
    daten_tgl = daten_tgl.dropna(axis=0, subset=['T_Zuluft_rF'])

    daten_tgl['TMWV_Fehler']                 = daten_tgl['TMWV'] * .28
    daten_tgl['Wärme_durch_Personen_Fehler'] = daten_tgl['Wärme_durch_Personen'] * .2
    daten_tgl['Strom_Fehler']                = daten_tgl['Strom'] * .1 
    daten_tgl['Lüftung_Fehler']              = daten_tgl['Lüftung'] * .5

    ## Fehlersumme pro Säule im Diagramm
    daten_tgl['Fehler_G']                    = daten_tgl['S_Gas_Energie'].mul(0.016)
    daten_tgl['Fehler_SK']                   = daten_tgl['Solar_Fehler']      + daten_tgl['Kessel_Fehler']
    daten_tgl['Fehler_PTSH']                 = daten_tgl['FriWa_Prim_Fehler'] + daten_tgl['Heizung_Fehler'] + daten_tgl['Wärme_durch_Personen_Fehler'] + daten_tgl['Strom_Fehler'] 
    daten_tgl['Fehler_LT']                   = daten_tgl['TMWV_Fehler']       + daten_tgl['Lüftung_Fehler'] 



    return daten_tgl




def wärmefluss_plot(title,nr=0): 


   ## ALT 
#     asymmetric_error = []
#     if err == 1:
#         lower_error = minmax['Lüftung'] - minmax['Lüftung_min']
#         upper_error = minmax['Lüftung'] + minmax['Lüftung_max']
#         asymmetric_error = [lower_error, upper_error]


    ## Verluste sind in dieser Darstellung auch positiv
    daten_tgl['Lüftung']         = abs(daten_tgl['Lüftung']) ##.mul(-1)
    daten_tgl['TMWV']            = abs(daten_tgl['TMWV']) ##.mul(-1)

    ## Farben Plot 
    Farben_Gas    = [colo('grau',.7)]
    Farben_KeSo   = [colo('blau',1),   colo('orange',1) ]
    Farben_rein   = [colo('blau',.5),  colo('rot',1.5), colo('gelb',1), colo('violet',1) ] 
    Farben_raus   = [colo('rot',1),    colo('grau',1.2) ]
    Farben_Bilanz = [colo('grün',1)]
    ## Farben und Label für die Legende
    L_Gas         = mpatches.Patch(facecolor=colo('grau',.7),    label='Gas',             edgecolor='black', linewidth=0.3) 
    L_Kessel      = mpatches.Patch(facecolor=colo('blau',1),     label='Kessel',          edgecolor='black', linewidth=0.3) 
    L_Solar       = mpatches.Patch(facecolor=colo('orange',1),   label='Solar',           edgecolor='black', linewidth=0.3) 
    L_Heizung     = mpatches.Patch(facecolor=colo('blau',.5),    label='Heizung',         edgecolor='black', linewidth=0.3) 
    L_FriWa       = mpatches.Patch(facecolor=colo('rot',1.5),    label='FriWa',           edgecolor='black', linewidth=0.3) 
    L_Strom       = mpatches.Patch(facecolor=colo('gelb',1),     label='Strom',           edgecolor='black', linewidth=0.3)  
    L_Personen    = mpatches.Patch(facecolor=colo('violet',1),   label='Personen',        edgecolor='black', linewidth=0.3) 
    L_Lüftung     = mpatches.Patch(facecolor=colo('grau',1),     label='Lüftung',         edgecolor='black', linewidth=0.3) 
    L_Trans       = mpatches.Patch(facecolor=colo('rot',1),      label='Transmission',    edgecolor='black', linewidth=0.3) 
    L_Bilanz      = mpatches.Patch(facecolor=colo('grün',1),     label='Bilanz',          edgecolor='black', linewidth=0.3) 
    L_Dummy       = mpatches.Patch(facecolor=colo('black',1),    label='Dummy',           edgecolor='black', linewidth=0.3) 

    handles       = [L_Gas,L_Dummy,L_Dummy,L_Dummy,
                     L_Solar,L_Kessel,L_Dummy,L_Dummy,
                     L_Personen,L_Strom,L_FriWa,L_Heizung,
                     L_Lüftung,L_Trans,L_Dummy,L_Dummy,
#                      L_Bilanz,L_Dummy,L_Dummy,L_Dummy,
                    ]


    def plot_3(von,bis):
        Gas     = daten_tgl[['S_Gas_Energie']].loc[von:bis] 
        KeSo    = daten_tgl[['Kessel_Wert', 'Solar_Wert']].loc[von:bis] 
        W_rein  = daten_tgl[['Heizung_Wert','FriWa_Prim_Wert', 'Strom','Wärme_durch_Personen']].loc[von:bis] 
        W_raus  = daten_tgl[['TMWV','Lüftung']].loc[von:bis] 
        bilanz  = daten_tgl[['Wärmebilanz']].loc[von:bis] * -1 

        fig, ax = plt.subplots(constrained_layout=True, figsize=(5.9,3)) 

        Gas.plot.bar(position   = 2,     color=(Farben_Gas),    edgecolor='black',linewidth = 0.3, width= 0.2,ax=ax,stacked=True,alpha = 1)
        KeSo.plot.bar(position  = 1,     color=(Farben_KeSo),   edgecolor='black',linewidth = 0.3, width= 0.2,ax=ax,stacked=True,alpha = 1)
        W_rein.plot.bar(position= 0,     color=(Farben_rein),   edgecolor='black',linewidth = 0.3, width= 0.2,ax=ax,stacked=True,alpha = 1)
        W_raus.plot.bar(position=-1,     color=(Farben_raus),   edgecolor='black',linewidth = 0.3, width= 0.2,ax=ax,stacked=True,alpha = 1) 



        ## Fehlerbalken        
        error_kw_rein = dict(lw=0.5, capsize=1, capthick=0.5, ecolor=('black')) 

        Fehler_G_blind     =  daten_tgl['S_Gas_Energie']    
        Fehler_SK_blind    =  daten_tgl['Kessel_Wert']  + daten_tgl['Solar_Wert']  
        Fehler_PTSH_blind  =  daten_tgl['Heizung_Wert']  + daten_tgl['FriWa_Prim_Wert']  + daten_tgl['Strom']  + daten_tgl['Wärme_durch_Personen'] 
        Fehler_LT_blind    =  daten_tgl['TMWV']  + daten_tgl['Lüftung']  

        Fehler_G_blind.plot.bar(   position=  2,  color=colo('grau',1), edgecolor='black',linewidth = 0.3, width= 0.2,ax=ax,stacked=True,alpha = .001, yerr=daten_tgl.Fehler_G,    error_kw=error_kw_rein)  
        Fehler_SK_blind.plot.bar(  position=  1,  color=colo('grau',1), edgecolor='black',linewidth = 0.3, width= 0.2,ax=ax,stacked=True,alpha = .001, yerr=daten_tgl.Fehler_SK,   error_kw=error_kw_rein)  
        Fehler_PTSH_blind.plot.bar(position=  0,  color=colo('grau',1), edgecolor='black',linewidth = 0.3, width= 0.2,ax=ax,stacked=True,alpha = .001, yerr=daten_tgl.Fehler_PTSH, error_kw=error_kw_rein)  
        Fehler_LT_blind.plot.bar(  position= -1,  color=colo('grau',1), edgecolor='black',linewidth = 0.3, width= 0.2,ax=ax,stacked=True,alpha = .001, yerr=daten_tgl.Fehler_LT,   error_kw=error_kw_rein)  



        ### ALT
#         ## Bilanzfehler in grün
#         if err == 0:
#             bilanz.plot.bar(position= -0.5, color=(Farben_Bilanz), edgecolor='black',linewidth = 0.3, width= 0.2,ax=ax,stacked=True,alpha = 1)             
#         ## Fehlerbalken auf Lüftung
#         if err == 1:
#             Lüftung_bottom =  daten_tgl['TMWV']  
#             daten_tgl.Lüftung.plot.bar(position= -1,bottom=Lüftung_bottom,  color=colo('grau',1), edgecolor='black',linewidth = 0.3, width= 0.2,ax=ax,stacked=True,alpha = 1, yerr=asymmetric_error, error_kw=error_kw_rein)  


        ax.axhline(y=0, linewidth=0.4,   color=colo('black',1), xmin=0.0001, xmax=1)
        ticklabels = ['']*len(W_rein.index) 
        ticklabels[::1] = [item.strftime('%d.\n %b') for item in W_rein.index[::1]] 
        ax.set_xlim(-0.5,len(W_rein.index))  
        ax.set_xticklabels(ticklabels, rotation=0)
        ax.set_xticks(np.arange(0.2/2, len(W_rein.index), step = 1))
        ax.set_xlabel('')
        ax.set_yticks([0,50,100,150])  
        ax.set_ylim(0,300)  
        ax.set_ylabel(r'\textbf{Energie} ($kWh$)')   
#         for p in ax.patches:
#             ax.annotate(str(p.get_height()), (p.get_x() * 1.005, p.get_height() * 1.005))

        # Legende 
        legend = plt.legend(handles=handles, loc=1, ncol=4 ) 
        legend.get_frame().set_linewidth(0.3)   
        ## Dummies löschen
        legend.legendHandles[1].set_visible(False) 
        legend.legendHandles[2].set_visible(False) 
        legend.legendHandles[3].set_visible(False) 
        legend.legendHandles[6].set_visible(False) 
        legend.legendHandles[7].set_visible(False) 
        legend.legendHandles[14].set_visible(False) 
        legend.legendHandles[15].set_visible(False) 
#         legend.legendHandles[16].set_visible(False) 
#         legend.legendHandles[17].set_visible(False) 
#         legend.legendHandles[18].set_visible(False) 
#         legend.legendHandles[19].set_visible(False)             
        legend.texts[1].set_visible(False) 
        legend.texts[2].set_visible(False) 
        legend.texts[3].set_visible(False) 
        legend.texts[6].set_visible(False) 
        legend.texts[7].set_visible(False) 
        legend.texts[14].set_visible(False) 
        legend.texts[15].set_visible(False) 
#         legend.texts[16].set_visible(False) 
#         legend.texts[17].set_visible(False) 
#         legend.texts[18].set_visible(False) 
#         legend.texts[19].set_visible(False)  

        ax.set_xlabel('')
        plt.title('('+str(int(daten.Wärmebilanz_po.sum()/-240))+'/'+str(int(daten.Wärmebilanz_ne.sum()/-240))+') | '+title)
#         plt.title(title)
#         plt.savefig(output_folder + '/' + file_name + '_' + title +'.pdf') 

    if nr == 0:
        plot_3(eins,sechs)     

    if nr == 1:
        plot_3(eins,zwei)    

    if nr == 2:   
        plot_3(drei,vier)    

    if nr == 3:  
        plot_3(fünf,sechs)

#     daten_tgl['Wärmebilanz_po']         = np.where(daten_tgl['Wärmebilanz'] < 0,  daten_tgl['Wärmebilanz'], 0)
#     daten_tgl['Wärmebilanz_ne']         = np.where(daten_tgl['Wärmebilanz'] > 0,  daten_tgl['Wärmebilanz'], 0) 
#     print_md(f'{title} täglich<br>Wärmebilanz Summe: {int(daten_tgl.Wärmebilanz.sum())} kWh<br> positiv: {int(daten_tgl.Wärmebilanz_po.sum())} negativ: {int(daten_tgl.Wärmebilanz_ne.sum())} ')







## AUFRUFE

reset_daten(Kalibrierung='self', Datenlogger=1)
effizienz()
wärmefluss()
daten_tgl_resample()
wärmefluss_plot(welche_Kalibrierung(daten),nr=0) 


# for item in daten_tgl.columns:
#     print(item)

Datenquelle: Testo - Kalibrierung: self

Datenquelle: Testo Kalibrierung: self

Varianten

reset_daten(Kalibrierung='self', Datenlogger=1)
effizienz()
wärmefluss()
daten_tgl_resample()
wärmefluss_plot(welche_Kalibrierung(daten),nr=0) 

reset_daten(Kalibrierung='testo', Datenlogger=1)
effizienz()
wärmefluss()
daten_tgl_resample()
wärmefluss_plot(welche_Kalibrierung(daten),nr=0) 

reset_daten(Kalibrierung='self', Datenlogger=0)
effizienz()
wärmefluss()
daten_tgl_resample()
wärmefluss_plot(welche_Kalibrierung(daten),nr=0) 

######################## STACK ########################
reset_daten(Kalibrierung='testo', Datenlogger=0)
effizienz()
wärmefluss()
daten_tgl_resample()
wärmefluss_plot(welche_Kalibrierung(daten),nr=0) 
######################## STACK ########################

Datenquelle: Testo - Kalibrierung: self

Datenquelle: Testo Kalibrierung: self

Datenquelle: Testo - Kalibrierung: testo

Datenquelle: Testo Kalibrierung: testo

Datenquelle: Lüftung - Kalibrierung: self

Datenquelle: Lüftung Kalibrierung: self

Datenquelle: Lüftung - Kalibrierung: testo

Datenquelle: Lüftung Kalibrierung: testo

Plot Energie aus MCA

## reindex with NaN
daten_tgl = daten_tgl.reindex(pd.date_range(start=daten_tgl.index.min(), end=daten_tgl.index.max())).fillna(np.nan)
## remove NaN
#daten_tgl = daten_tgl.dropna(axis=0, subset=['T_Zuluft_rF'])


fig, ax = plt.subplots(figsize=(6,2)) 
# ax2 = ax.twinx()  
# ax2.axhline(y=0, linewidth=0.4,   color=colo('black',1), xmin=0.0001, xmax=1) 
daten_tgl['Solar_Wert'].plot(ax=ax,color=colo('orange',1),  linewidth=.8, label = 'Solar_Wert')  
daten_tgl['Kessel_Wert'].plot(ax=ax,color=colo('blau',1.1),  linewidth=.8, label = 'Kessel_Wert')  
daten_tgl['Heizung_Wert'].plot(ax=ax,color=colo('blau',.7),  linewidth=.8, label = 'Heizung_Wert')  
daten_tgl['FriWa_Prim_Wert'].plot(ax=ax,color=colo('rot',1),  linewidth=.8, label = 'FriWa_Prim_Wert')  
daten_tgl['Speicherverluste_MCA_Wert'].plot(ax=ax,color=colo('grün',1),  linewidth=.8, label = 'Speicherverluste_MCA_Wert')  
daten_tgl['Kessel_Wert_neg'].plot(ax=ax,color=colo('blau',1.5),  linewidth=.8, label = 'Kessel_Wert_neg')  
# ax.set(ylim=[40,150]) 
# ax2.set(ylim=[-.025,.05]) 
ax.set_xlabel('')
plt.setp(ax.get_xticklabels(), rotation=0, ha="center", rotation_mode="anchor")
ax.get_xaxis().set_major_formatter(mdates.DateFormatter("%d.%m."))
ax.set(xlim=[pd.to_datetime(von),pd.to_datetime(bis)])
h0, l0 = ax.get_legend_handles_labels() 
legend = plt.legend(h0, l0, ncol=3, loc=1) 
set_legend_linewidth(legend) 

daten_tgl.info()
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 77 entries, 2017-12-06 to 2018-02-20
Freq: D
Columns: 163 entries, Solar_Wert to Fehler_LT
dtypes: float64(163)
memory usage: 98.7 KB

toggle NaN

## reindex with NaN for Liniplots
# daten_tgl = daten_tgl.reindex(pd.date_range(start=daten_tgl.index.min(), end=daten_tgl.index.max())).fillna(np.nan)
## remove NaN for Barplots
#daten_tgl = daten_tgl.dropna(axis=0, subset=['T_Zuluft_rF'])

Tagesansichten

Tageswerte

def tageswerte(t,m,y):
    tag   = str(t)
    monat = str(m)
    jahr  = str(y)

    daten_zw_feb = daten.loc[str(jahr)+'-'+str(monat)+'-'+str(tag)+' 00:00' : str(jahr)+'-'+str(monat)+'-'+str(tag)+' 23:59'] 
    tagesbilanz = ''#str(round(float(bilanz_tgl[['Wärmebilanz']].loc[ str(jahr)+'-'+str(monat)+'-'+str(tag)+' 00:00' : str(jahr)+'-'+str(monat)+'-'+str(tag)+' 23:59'].values[0]),2))
    fig, axes = plt.subplots(nrows=8, ncols=1, sharex=True , constrained_layout=False,figsize=(5.8,8.05)) 

    axes[0].plot(daten_zw_feb['L_Zuluft_VPunkt'],color=colo('blau',1),  linewidth=0.8,  label='Zuluft')
    axes[0].plot(daten_zw_feb['L_Zuluft_Druck'].mul(10),color=colo('grün',1),  linewidth=0.8,  label='Druck')
    axes[0].axhline(y=820, linewidth=0.4,   color=colo('black',1), xmin=0.0001, xmax=1)    
    axes[0].set(ylabel=r"\textbf{VS} ($m\textsuperscript{3}$)") 
    axes[0].set_ylim(700,1550)  

    axes[1].plot(daten_zw_feb['Lüftung'].div(240),color=colo('rot',1), linewidth=0.8,  label='Lüftung Differenz')
    axes[1].set(ylabel=r"\textbf{Lei} ($kW$)") 
    axes[1].set_ylim(-0.03,0.03)  

    axes[2].plot(daten_zw_feb['L_Seminarraum_1_CO2'],color=colo('grün',1), linewidth=0.8,  label='Seminar 1')
    axes[2].plot(daten_zw_feb['L_Seminarraum_2_CO2'],color=colo('gelb',1), linewidth=0.8,  label='Seminar 2')
    axes[2].set(ylabel=r"\textbf{CO\textsubscript{2}} ($ppm$)") 
    axes[2].set_ylim(400,1000)  

    axes[3].plot(daten_zw_feb['S_FriWa_Vpunkt_Prim'],color=colo('orange',1), linewidth=0.8,  label='FriWa Prim')
    axes[3].plot(daten_zw_feb['S_FriWa_Vpunkt_Sek'],color=colo('rot',1), linewidth=0.8,  label='FriWa Sek')
    axes[3].set(ylabel=r"\textbf{VS} ($m\textsuperscript{3}/h$)") 
    axes[3].set_ylim(0,100)  

    axes[4].plot(daten_zw_feb['Außenluft_WG'],color=colo('orange',1), linewidth=0.8,  label='Außenluft')
    axes[4].plot(daten_zw_feb['Zuluft_WG'],color=colo('rot',1), linewidth=0.8,  label='Zuluft')
    axes[4].plot(daten_zw_feb['Abluft_WG'],color=colo('grün',1), linewidth=0.8,  label='Abluft')
    axes[4].plot(daten_zw_feb['Fortluft_WG'],color=colo('blau',1), linewidth=0.8,  label='Fortluft')
    axes[4].set(ylabel=r"\textbf{WG} ($g/m\textsuperscript{3}$)") 
    axes[4].set_ylim(0.003,0.006)  

    axes[5].plot(daten_zw_feb['S_Solarstrahlung'],color=colo('gelb',1), linewidth=0.8,  label='Solarstrahlung')
    axes[5].set(ylabel=r"\textbf{Lei} ($W/m^{2}$)") 
    axes[5].set_ylim(0,500)  

    axes[6].plot(daten_zw_feb['L_Aussenlufttemperatur_1'],color=colo('blau',1), linewidth=0.8,  label='Aussenluft')
    axes[6].set(ylabel=r"\textbf{Tem}  ($^\circ$C)") 
    axes[6].set_ylim(-5,5)  

    axes[7].plot(daten_zw_feb['Zuluft_C_vor_NE'],color=colo('grün',1), linewidth=0.8,  label='Zuluft')
    axes[7].plot(daten_zw_feb['Abluft_C'],color=colo('rot',1), linewidth=0.8,  label='Abluft')
    axes[7].set(ylabel=r"\textbf{Tem}  ($^\circ$C)")
    axes[7].set_ylim(10,25)  

    axes[0].set_title('Tageswerte: ' +str(tag)+'.'+str(monat)+'.'+str(jahr))
    axes[0].set(xlim=[pd.to_datetime(str(jahr)+'-'+str(monat)+'-'+str(tag)+' 00:00'),pd.to_datetime(str(jahr)+'-'+str(monat)+'-'+str(tag)+' 23:59')])
    axes[0].xaxis.set_major_formatter(mdates.DateFormatter('%H')) 

    fig.autofmt_xdate(rotation=0,ha='center')
    for ax in axes:
        ax.legend( ncol=6, loc=1,  bbox_to_anchor=(1., 1.3)) 
        ax.yaxis.get_label().set_fontsize(8)
    plt.subplots_adjust(hspace=.2) 
#     plt.tight_layout()
    plt.show()
tageswerte(1,2,2018)

Luftwerte

def luftwerte(t,m,y):
    tag   = str(t)
    monat = str(m)
    jahr  = str(y)

    daten_zw_feb = daten.loc[str(jahr)+'-'+str(monat)+'-'+str(tag)+' 00:00' : str(jahr)+'-'+str(monat)+'-'+str(tag)+' 23:59'] 
    tagesbilanz = ''#str(round(float(bilanz_tgl[['Wärmebilanz']].loc[ str(jahr)+'-'+str(monat)+'-'+str(tag)+' 00:00' : str(jahr)+'-'+str(monat)+'-'+str(tag)+' 23:59'].values[0]),2))
    fig, axes = plt.subplots(nrows=9, ncols=1, sharex=True , constrained_layout=False,figsize=(5.8,8.05)) 

    axes[0].plot(daten_zw_feb['L_Zuluft_VPunkt'],color=colo('blau',1),  linewidth=0.8,  label='Zuluft')
    axes[0].plot(daten_zw_feb['L_Zuluft_Druck'].mul(10),color=colo('grün',1),  linewidth=0.8,  label='Druck')
    axes[0].axhline(y=820, linewidth=0.4,   color=colo('black',1), xmin=0.0001, xmax=1)
    axes[0].set(ylabel=r"\textbf{VS} ($m\textsuperscript{3}$)") 
    axes[0].set_ylim(700,1550)  

    axes[1].plot(daten_zw_feb['Lüftung'].div(240),color=colo('rot',1), linewidth=0.8,  label='Lüftung Differenz')
    axes[1].plot(daten_zw_feb['Lüftung_rein'].div(240),color=colo('blau',1), linewidth=0.8,  label='Lüftung rein')
    axes[1].plot(daten_zw_feb['Lüftung_raus'].div(240),color=colo('grün',1), linewidth=0.8,  label='Lüftung raus')
    axes[1].set(ylabel=r"\textbf{Lei} ($kW$)") 
    axes[1].set_ylim(-0.05,0.15)  

    axes[2].plot(daten_zw_feb['EÜG_Außenluft'],color=colo('grün',1), linewidth=0.8,  label='EÜG_Außenluft')
    axes[2].plot(daten_zw_feb['RWZ_Außenluft'],color=colo('gelb',1), linewidth=0.8,  label='RWZ_Außenluft')
    axes[2].set(ylabel=r"\textbf{Wirk} ($\%$)") 
    axes[2].set_ylim(0,100)  

    axes[3].plot(daten_zw_feb['Außenluft_Energie'],color=colo('blau',1), linewidth=0.8,  label='Außenluft')
    axes[3].plot(daten_zw_feb['Zuluft_Energie'],color=colo('orange',1), linewidth=0.8,  label='Zuluft')
    axes[3].plot(daten_zw_feb['Abluft_Energie'],color=colo('rot',1), linewidth=0.8,  label='Abluft')
    axes[3].plot(daten_zw_feb['Fortluft_Energie'],color=colo('grün',1), linewidth=0.8,  label='Fortluft')
    axes[3].set(ylabel=r"\textbf{En} ($kW/h$)") 
    axes[3].set_ylim(0,20)  

    axes[4].plot(daten_zw_feb['Außenluft_WG'],color=colo('blau',1), linewidth=0.8,  label='Außenluft')
    axes[4].plot(daten_zw_feb['Zuluft_WG'],color=colo('orange',1), linewidth=0.8,  label='Zuluft')
    axes[4].plot(daten_zw_feb['Abluft_WG'],color=colo('rot',1), linewidth=0.8,  label='Abluft')
    axes[4].plot(daten_zw_feb['Fortluft_WG'],color=colo('grün',1), linewidth=0.8,  label='Fortluft')
    axes[4].set(ylabel=r"\textbf{WG} ($g/m\textsuperscript{3}$)") 
    axes[4].set_ylim(0.002,0.006)  

    axes[5].plot(daten_zw_feb['Außenluft_C'],color=colo('blau',1), linewidth=0.8,  label='Außenluft')
    axes[5].plot(daten_zw_feb['Zuluft_C_vor_NE'],color=colo('orange',1), linewidth=0.8,  label='Zuluft')
    axes[5].plot(daten_zw_feb['Abluft_C'],color=colo('rot',1), linewidth=0.8,  label='Abluft')
    axes[5].plot(daten_zw_feb['Fortluft_C'],color=colo('grün',1), linewidth=0.8,  label='Fortluft')
    axes[5].set(ylabel=r"\textbf{Tem}  ($^\circ$C)")
    axes[5].set_ylim(-10,27)  

    axes[6].plot(daten_zw_feb['Außenluft_rF'],color=colo('blau',1), linewidth=0.8,  label='Außenluft')
    axes[6].plot(daten_zw_feb['Zuluft_rF_vor_NE'],color=colo('orange',1), linewidth=0.8,  label='Zuluft')
    axes[6].plot(daten_zw_feb['Abluft_rF'],color=colo('rot',1), linewidth=0.8,  label='Abluft')
    axes[6].plot(daten_zw_feb['Fortluft_rF'],color=colo('grün',1), linewidth=0.8,  label='Fortluft')
    axes[6].set(ylabel=r"\textbf{LF} ($\%$)") 
    axes[6].set_ylim(20,100)  

    axes[7].plot(daten_zw_feb['Wärmebilanz'],color=colo('grün',1), linewidth=0.8,  label='Wärmebilanz') 
    axes[7].set(ylabel=r"\textbf{En} ($kW/h$)") 
    axes[7].axhline(y=0, linewidth=0.4,   color=colo('black',1), xmin=0.0001, xmax=1)
    axes[7].set_ylim(-5,5)      

    axes[8].plot(daten_zw_feb['S_Heizung_Energie'],color=colo('grau',1), linewidth=0.8,  label='Heizung') 
    axes[8].plot(daten_zw_feb['Strom'],color=colo('gelb',1), linewidth=0.8,  label='Strom') 
    axes[8].plot(daten_zw_feb['Lüftung'],color=colo('grün',1), linewidth=0.8,  label='Lüftung') 
#     axes[8].plot(daten_zw_feb['Wärmespeicherkap'],color=colo('orange',1), linewidth=0.8,  label='Kap') 
    axes[8].plot(daten_zw_feb['Wärme_durch_Personen'],color=colo('violet',1), linewidth=0.8,  label='Pers') 
    axes[8].plot(daten_zw_feb['TMWV'],color=colo('rot',1), linewidth=0.8,  label='TMWV') 
    axes[8].set(ylabel=r"\textbf{En} ($kW/h$)") 
    axes[8].axhline(y=0, linewidth=0.4,   color=colo('black',1), xmin=0.0001, xmax=1)
#     axes[8].set_ylim(-5,5)  

    axes[0].set_title('Luftwerte: ' +str(tag)+'.'+str(monat)+'.'+str(jahr))
    axes[0].set(xlim=[pd.to_datetime(str(jahr)+'-'+str(monat)+'-'+str(tag)+' 00:00'),pd.to_datetime(str(jahr)+'-'+str(monat)+'-'+str(tag)+' 23:59')])
    axes[0].xaxis.set_major_formatter(mdates.DateFormatter('%H')) 


    fig.autofmt_xdate(rotation=0,ha='center')
    for ax in axes:
        ax.legend( ncol=6, loc=1,  bbox_to_anchor=(1., 1.3)) 
        ax.yaxis.get_label().set_fontsize(8)
    plt.subplots_adjust(hspace=.2) 
#     plt.tight_layout()
    plt.show()

luftwerte(1,2,2018)

Bilanzen

def bilanz(t,m,y):
    tag   = str(t)
    monat = str(m)
    jahr  = str(y)

    daten_zw_feb = daten.loc[str(jahr)+'-'+str(monat)+'-'+str(tag)+' 00:00' : str(jahr)+'-'+str(monat)+'-'+str(tag)+' 23:59']  
    fig, axes = plt.subplots(nrows=4, ncols=1, sharex=True , constrained_layout=False,figsize=(5.8,8.05))     
    tagesbilanz = ''#str(round(float(bilanz_tgl[['Wärmebilanz']].loc[ str(jahr)+'-'+str(monat)+'-'+str(tag)+' 00:00' : str(jahr)+'-'+str(monat)+'-'+str(tag)+' 23:59'].values[0]),2))

#     axes[0].plot(daten_zw_feb['Wärmebilanz'],color=colo('black',1), linewidth=0.8,  label='Wärmebilanz') 
    axes[0].plot(daten_zw_feb['S_Heizung_Energie'],color=colo('grau',1), linewidth=0.8,  label='Heizung') 
#     axes[0].plot(daten_zw_feb['Strom'],color=colo('gelb',1), linewidth=0.8,  label='Strom') 
    axes[0].plot(daten_zw_feb['Lüftung'].mul(-1),color=colo('grün',1), linewidth=0.8,  label='Lüftung') 
#     axes[0].plot(daten_zw_feb['Wärmespeicherkap'],color=colo('orange',1), linewidth=0.8,  label='Kap') 
    axes[0].plot(daten_zw_feb['Wärme_durch_Personen'],color=colo('violet',1), linewidth=0.8,  label='Pers') 
    axes[0].plot(daten_zw_feb['TMWV'].mul(-1),color=colo('rot',1), linewidth=0.8,  label='TMWV') 
    axes[0].set(ylabel=r"\textbf{En} ($kW/h$)") 
    axes[0].axhline(y=0, linewidth=0.4,   color=colo('black',1), xmin=0.0001, xmax=1)
    axes[0].set_ylim(-5,10)  

    axes[1].plot(daten_zw_feb['L_Zuluft_Druck'],color=colo('grün',1), linewidth=0.8,  label='L_Zuluft_Druck') 
    axes[1].axhline(y=83, linewidth=0.4,   color=colo('black',1), xmin=0.0001, xmax=1)
    axes[1].axhline(y=76, linewidth=0.4,   color=colo('black',1), xmin=0.0001, xmax=1)
    axes[1].set(ylabel=r"\textbf{En} ($kW/h$)") 
    axes[1].axhline(y=0, linewidth=0.4,   color=colo('black',1), xmin=0.0001, xmax=1)
#     axes[1].set_ylim(-5,5)   

    axes[2].plot(daten_zw_feb['Außenluft_Energie'],color=colo('blau',1), linewidth=0.8,  label='Außenluft') 
    axes[2].plot(daten_zw_feb['Zuluft_Energie'],color=colo('orange',1), linewidth=0.8,  label='Zuluft') 
    axes[2].plot(daten_zw_feb['Abluft_Energie'],color=colo('rot',1), linewidth=0.8,  label='Abluft') 
    axes[2].plot(daten_zw_feb['Fortluft_Energie'],color=colo('grün',1), linewidth=0.8,  label='Fortluft') 
    axes[2].set(ylabel=r"\textbf{En} ($kW/h$)") 
    axes[2].axhline(y=0, linewidth=0.4,   color=colo('black',1), xmin=0.0001, xmax=1)
#     axes[2].set_ylim(-5,5)  

    axes[3].plot(daten_zw_feb['L_Zuluft_VPunkt'],color=colo('blau',1), linewidth=0.8,  label='L_Zuluft_Vpunkt') 
    axes[3].plot(daten_zw_feb['Vpunkt_extern'],color=colo('grün',1), linewidth=0.8,  label='Vpunkt_extern') 
    axes[3].set(ylabel=r"\textbf{En} ($kW/h$)") 
    axes[3].axhline(y=0, linewidth=0.4,   color=colo('black',1), xmin=0.0001, xmax=1)
#     axes[3].set_ylim(-5,5)  

    axes[0].set_title('Bilanzen: ' +str(tag)+'.'+str(monat)+'.'+str(jahr))
    axes[0].set(xlim=[pd.to_datetime(str(jahr)+'-'+str(monat)+'-'+str(tag)+' 00:00'),pd.to_datetime(str(jahr)+'-'+str(monat)+'-'+str(tag)+' 23:59')])
    axes[0].xaxis.set_major_formatter(mdates.DateFormatter('%H')) 
    fig.autofmt_xdate(rotation=0,ha='center')
    for ax in axes:
        ax.legend( ncol=6, loc=1,  bbox_to_anchor=(1., 1.1)) 
        ax.yaxis.get_label().set_fontsize(8)
    plt.subplots_adjust(hspace=.1) 
#     plt.tight_layout()
    plt.show()     
bilanz(1,2,2018)

MinMax

Miniplot für MINMAX

## nur für den ersten Aufruf
nr = 0
def plot_bilanzfehler():
    bilanzsumme_po = daten['Wärmebilanz_po'].sum()/240
    bilanzsumme_ne = daten['Wärmebilanz_ne'].sum()/240

    fig, ax = plt.subplots(constrained_layout=True, figsize=(4,1.5))   
    plot_data = daten['Wärmebilanz'].resample("D").sum().div(240)
    plot_data = plot_data.replace({ 0:np.nan})
    plot_data.plot(ax=ax,color=colo('grün',1), linewidth=1, label = 'Nr: ' +str(nr)+' ('+str(int(bilanzsumme_ne))+'/'+str(int(bilanzsumme_po))+')', style='.-')  
    ax.axhline(y=0, linewidth=0.4,   color=colo('black',.7), xmin=0.0001, xmax=1)
    ax.set_ylabel(r'$kWh$')    
    ax.set_ylim(-150,150)
    ax.set_yticks([-100,-50,50,100])  

    ax.set_xlabel('')
    h0, l0 = ax.get_legend_handles_labels() 
    legend = plt.legend(h0, l0, ncol=1, loc=2)
    set_legend_linewidth(legend)   

    ## GANZ ALT
#     date_form = DateFormatter("%d.")
#     ax.xaxis.set_major_formatter(date_form)
#     plt.xticks(rotation=0, ha='center')
#     x_axis = ax.axes.get_xaxis()
#     x_axis.set_visible(False)

    ## RESTE
    ax.xaxis.set_minor_locator(plt.NullLocator())
#     ax.yaxis.set_major_locator(plt.NullLocator())
    ax.xaxis.set_major_formatter(plt.NullFormatter())

    ## Formatierung X-Achse
#     ax = plt.gca()
#     ax.xaxis.set_minor_locator(AutoMinorLocator(14))
#     ax.xaxis.set_major_locator(mdates.DayLocator(interval=14))
#     ax.xaxis.set_major_formatter(mdates.DateFormatter('%d.%m.'))  
#     x_ticks = ax.xaxis.get_major_ticks() 
#     x_ticks[0].label.set_visible(False)  
#     plt.setp(ax.get_xticklabels(), rotation=0, ha="center", rotation_mode="anchor")

#     ax.set_title('Nr: ' +str(nr)+' '+str(int(bilanzsumme))+'kWh')
#     ax.set(xlim=[pd.to_datetime("31.01.18 00:00:00"),pd.to_datetime("20.02.18 23:00:00")])
    ax.set(xlim=[eins,sechs])
    plt.show()
#     print(plot_data)



plot_bilanzfehler()

Berechnungen

außen_C  = 0 
zu_C     = 0 
ab_C     = 0 
fort_C   = 0  
außen_rF = 0 
zu_rf    = 0 
ab_rF    = 0 
fort_rf  = 0
by       = 0  # Anteil der Luft, die durch den Bypass geht verändern in %, gemessen sind 45%
zu_Vp    = 0  # Gesamtluftstrom verändern in % 
# Temp
low_C    = -1
high_C   =  1.1
step_C   =  2/1
# rel LF
low_rF   = -5
high_rF  =  6
step_rF  =  10/1
# bypass & Vp
low_by   = -10
high_by  =  11
step_by  =  20/1
# index
nr        = 0
first_one = 0
grenzen   = 1000 ## Betrag des Blanzfehlers ab wann die Variante "gut" ist

## einmal mit Standardwerten durchrechnen um ein Ausgangspunkt für Min und Max zu haben
title = ' außen_C='+str(außen_C)  +    ',  fort_C='+str(fort_C)  +  ', außen_rF='+str(außen_rF)  +  ', fort_rf='+str(fort_rf)  +  ', by='+str(by)  +  ', zu_Vp='+str(zu_Vp) +')'

######################## STACK ########################
reset_daten(Kalibrierung='self', Datenlogger=1)
effizienz(außen_C=außen_C,                 fort_C=fort_C,              außen_rF=außen_rF,              fort_rf=fort_rf,              by=by,              zu_Vp=zu_Vp)
wärmefluss() 
# daten_tgl_resample()
# wärmefluss_plot(welche_Kalibrierung(daten),nr=0) 
######################## STACK ########################



nr = 0 
print_md(f'<br>**{str(nr)}** | Wärmebilanz Summe: {int(daten.Wärmebilanz.sum()/240)} kWh | positiv: {int(daten.Wärmebilanz_po.sum()/240)} negativ: {int(daten.Wärmebilanz_ne.sum()/240)} | {title}')
plot_bilanzfehler()


## minmax ist für die Fehlerbalken in Lüftung (und Bilanz)
## Ausgangspubnkte für Min und Max anlegen
minmax                    = pd.DataFrame(columns=["Wärmebilanz"])
minmax['Wärmebilanz_org'] = daten.loc[eins : sechs]['Wärmebilanz'].resample("D").sum()/240
minmax['Wärmebilanz_min'] = 0  
minmax['Wärmebilanz_max'] = 0  
# minmax['Lüftung']         = daten['Lüftung'].resample("D").sum()/240
# minmax['Lüftung_min']     = 0  
# minmax['Lüftung_max']     = 0 


## bf speichert alle Varianten um die besten zu finden
bf = pd.DataFrame(columns=["Wärmebilanz_sum","Wärmebilanz_std","Wärmebilanz_po","Wärmebilanz_ne", "Lüftung_rein", "Lüftung_raus", "Lüftung", "titel"])
for außen_C in np.arange(low_C, high_C, step_C):
    for fort_C in np.arange(low_C, high_C, step_C):
        for außen_rF in np.arange(low_rF, high_rF, step_rF):
            for fort_rf in np.arange(low_rF, high_rF, step_rF):
                for by in np.arange(low_by, high_by, step_by):
                    for zu_Vp in np.arange(low_by, high_by, step_by):

                        ## Berechnung
                        nr    = nr +1
                        title = ' (außen_C='+str(außen_C)  +    ',  fort_C='+str(fort_C)  +  ', außen_rF='+str(außen_rF)  +  ', fort_rf='+str(fort_rf)  +  ', by='+str(by)  +  ', zu_Vp='+str(zu_Vp)+')' 
                        effizienz(außen_C=außen_C,                 fort_C=fort_C,              außen_rF=außen_rF,              fort_rf=fort_rf,              by=by,              zu_Vp=zu_Vp)
                        wärmefluss() 

                        ## Varianten in bf
                        bf.loc[nr] = [(int(daten['Wärmebilanz'].sum()/240)),  daten['Wärmebilanz'].std(),  int(daten['Wärmebilanz_po'].sum()/240),  int(daten['Wärmebilanz_ne'].sum()/240),  daten['Lüftung_rein'].mean(),  daten['Lüftung_raus'].mean(), daten['Lüftung'].sum()/240,          title] 


                        ## MinMax df
                        Wärmebilanz_sum                   = daten['Wärmebilanz'].sum()/240

                        if (Wärmebilanz_sum > -grenzen) & (Wärmebilanz_sum < grenzen):
                            ## ersten Datensatz in min und max Felder setzen
                            if first_one == 0:
                                minmax['Wärmebilanz_min'] = daten.loc[eins : sechs]['Wärmebilanz'].resample("D").sum()/240
                                minmax['Wärmebilanz_max'] = daten.loc[eins : sechs]['Wärmebilanz'].resample("D").sum()/240
#                                 minmax['Lüftung_min']     = daten.loc[eins : sechs]['Lüftung'].resample("D").sum()/240
#                                 minmax['Lüftung_max']     = daten.loc[eins : sechs]['Lüftung'].resample("D").sum()/240
                                first_one = 1

                            ## minmax für Wärmebilanz
                            minmax['Wärmebilanz']             = daten.loc[eins : sechs]['Wärmebilanz'].resample("D").sum()/240
                            minmax['Wärmebilanz_'+str(nr)]    = minmax['Wärmebilanz'] 
                            minmax['Wärmebilanz_min']         = np.where( minmax['Wärmebilanz'] < minmax['Wärmebilanz_min'],  minmax['Wärmebilanz'], minmax['Wärmebilanz_min'])
                            minmax['Wärmebilanz_max']         = np.where( minmax['Wärmebilanz'] > minmax['Wärmebilanz_max'],  minmax['Wärmebilanz'], minmax['Wärmebilanz_max'])


                            # minmax für Lüftung
#                             Lüftung_tgl                       = daten.loc[eins : sechs]['Lüftung'].resample("D").sum()/240
#                             minmax['Lüftung_'+str(nr)]        = Lüftung_tgl
#                             minmax['Lüftung_min']             = np.where(Lüftung_tgl < minmax['Lüftung_min'], Lüftung_tgl, minmax['Lüftung_min'])         
#                             minmax['Lüftung_max']             = np.where(Lüftung_tgl > minmax['Lüftung_max'], Lüftung_tgl, minmax['Lüftung_max'])

#                         display(minmax.loc['2017-12-06'][['Wärmebilanz','Wärmebilanz_max','Wärmebilanz_min']])



                        # Ausgabe während der Berechnung
#                         print_md(str(nr) + ' ' +title+' Wärmebilanz: '+str(int(daten['Wärmebilanz'].sum()/240)))
                        print_md(f' <br> <br>**{str(nr)}** | Wärmebilanz Summe: {int(daten.Wärmebilanz.sum()/240)} kWh | positiv: {int(daten.Wärmebilanz_po.sum()/240)} negativ: {int(daten.Wärmebilanz_ne.sum()/240)} | {title}')
                        plot_bilanzfehler()


## leeren Zeilen rauswerfen
minmax = minmax.replace(0, np.nan)
minmax = minmax.dropna(how='all', axis=0)
minmax = minmax.replace(np.nan, 0)    
# display(minmax)
#display(round(bf,4)) 
# round(bf,4).to_csv('Lueftung_kalibrieren_Varianten.csv')  

Datenquelle: Testo - Kalibrierung: self


| Wärmebilanz Summe: -32 kWh | positiv: -502 negativ: 469 | außen_C=0, fort_C=0, außen_rF=0, fort_rf=0, by=0, zu_Vp=0)



1 | Wärmebilanz Summe: 99 kWh | positiv: -406 negativ: 505 | (außen_C=-1.0, fort_C=-1.0, außen_rF=-5.0, fort_rf=-5.0, by=-10.0, zu_Vp=-10.0)



2 | Wärmebilanz Summe: -325 kWh | positiv: -698 negativ: 372 | (außen_C=-1.0, fort_C=-1.0, außen_rF=-5.0, fort_rf=-5.0, by=-10.0, zu_Vp=10.0)



3 | Wärmebilanz Summe: 295 kWh | positiv: -315 negativ: 611 | (außen_C=-1.0, fort_C=-1.0, außen_rF=-5.0, fort_rf=-5.0, by=10.0, zu_Vp=-10.0)



4 | Wärmebilanz Summe: -82 kWh | positiv: -535 negativ: 452 | (außen_C=-1.0, fort_C=-1.0, außen_rF=-5.0, fort_rf=-5.0, by=10.0, zu_Vp=10.0)



5 | Wärmebilanz Summe: -215 kWh | positiv: -562 negativ: 347 | (außen_C=-1.0, fort_C=-1.0, außen_rF=-5.0, fort_rf=5.0, by=-10.0, zu_Vp=-10.0)



6 | Wärmebilanz Summe: -1004 kWh | positiv: -1192 negativ: 187 | (außen_C=-1.0, fort_C=-1.0, außen_rF=-5.0, fort_rf=5.0, by=-10.0, zu_Vp=10.0)



7 | Wärmebilanz Summe: -506 kWh | positiv: -750 negativ: 244 | (außen_C=-1.0, fort_C=-1.0, außen_rF=-5.0, fort_rf=5.0, by=10.0, zu_Vp=-10.0)



8 | Wärmebilanz Summe: -1244 kWh | positiv: -1369 negativ: 125 | (außen_C=-1.0, fort_C=-1.0, außen_rF=-5.0, fort_rf=5.0, by=10.0, zu_Vp=10.0)



9 | Wärmebilanz Summe: -798 kWh | positiv: -985 negativ: 186 | (außen_C=-1.0, fort_C=-1.0, außen_rF=5.0, fort_rf=-5.0, by=-10.0, zu_Vp=-10.0)



10 | Wärmebilanz Summe: -1147 kWh | positiv: -1328 negativ: 181 | (außen_C=-1.0, fort_C=-1.0, außen_rF=5.0, fort_rf=-5.0, by=-10.0, zu_Vp=10.0)



11 | Wärmebilanz Summe: -342 kWh | positiv: -655 negativ: 312 | (außen_C=-1.0, fort_C=-1.0, außen_rF=5.0, fort_rf=-5.0, by=10.0, zu_Vp=-10.0)



12 | Wärmebilanz Summe: -639 kWh | positiv: -928 negativ: 288 | (außen_C=-1.0, fort_C=-1.0, außen_rF=5.0, fort_rf=-5.0, by=10.0, zu_Vp=10.0)



13 | Wärmebilanz Summe: -556 kWh | positiv: -840 negativ: 284 | (außen_C=-1.0, fort_C=-1.0, außen_rF=5.0, fort_rf=5.0, by=-10.0, zu_Vp=-10.0)



14 | Wärmebilanz Summe: -1084 kWh | positiv: -1320 negativ: 236 | (außen_C=-1.0, fort_C=-1.0, außen_rF=5.0, fort_rf=5.0, by=-10.0, zu_Vp=10.0)



15 | Wärmebilanz Summe: -546 kWh | positiv: -828 negativ: 282 | (außen_C=-1.0, fort_C=-1.0, außen_rF=5.0, fort_rf=5.0, by=10.0, zu_Vp=-10.0)



16 | Wärmebilanz Summe: -1031 kWh | positiv: -1270 negativ: 238 | (außen_C=-1.0, fort_C=-1.0, außen_rF=5.0, fort_rf=5.0, by=10.0, zu_Vp=10.0)



17 | Wärmebilanz Summe: -1439 kWh | positiv: -1606 negativ: 166 | (außen_C=-1.0, fort_C=1.0, außen_rF=-5.0, fort_rf=-5.0, by=-10.0, zu_Vp=-10.0)



18 | Wärmebilanz Summe: -2709 kWh | positiv: -2806 negativ: 97 | (außen_C=-1.0, fort_C=1.0, außen_rF=-5.0, fort_rf=-5.0, by=-10.0, zu_Vp=10.0)



19 | Wärmebilanz Summe: -2255 kWh | positiv: -2340 negativ: 85 | (außen_C=-1.0, fort_C=1.0, außen_rF=-5.0, fort_rf=-5.0, by=10.0, zu_Vp=-10.0)



20 | Wärmebilanz Summe: -3582 kWh | positiv: -3615 negativ: 33 | (außen_C=-1.0, fort_C=1.0, außen_rF=-5.0, fort_rf=-5.0, by=10.0, zu_Vp=10.0)



21 | Wärmebilanz Summe: -3890 kWh | positiv: -3910 negativ: 19 | (außen_C=-1.0, fort_C=1.0, außen_rF=-5.0, fort_rf=5.0, by=-10.0, zu_Vp=-10.0)



22 | Wärmebilanz Summe: -5840 kWh | positiv: -5847 negativ: 7 | (außen_C=-1.0, fort_C=1.0, außen_rF=-5.0, fort_rf=5.0, by=-10.0, zu_Vp=10.0)



23 | Wärmebilanz Summe: -4819 kWh | positiv: -4831 negativ: 11 | (außen_C=-1.0, fort_C=1.0, außen_rF=-5.0, fort_rf=5.0, by=10.0, zu_Vp=-10.0)



24 | Wärmebilanz Summe: -6905 kWh | positiv: -6911 negativ: 6 | (außen_C=-1.0, fort_C=1.0, außen_rF=-5.0, fort_rf=5.0, by=10.0, zu_Vp=10.0)



25 | Wärmebilanz Summe: -6666 kWh | positiv: -6671 negativ: 5 | (außen_C=-1.0, fort_C=1.0, außen_rF=5.0, fort_rf=-5.0, by=-10.0, zu_Vp=-10.0)



26 | Wärmebilanz Summe: -8858 kWh | positiv: -8860 negativ: 2 | (außen_C=-1.0, fort_C=1.0, außen_rF=5.0, fort_rf=-5.0, by=-10.0, zu_Vp=10.0)



27 | Wärmebilanz Summe: -6865 kWh | positiv: -6871 negativ: 6 | (außen_C=-1.0, fort_C=1.0, außen_rF=5.0, fort_rf=-5.0, by=10.0, zu_Vp=-10.0)



28 | Wärmebilanz Summe: -8997 kWh | positiv: -9000 negativ: 3 | (außen_C=-1.0, fort_C=1.0, außen_rF=5.0, fort_rf=-5.0, by=10.0, zu_Vp=10.0)



29 | Wärmebilanz Summe: -8870 kWh | positiv: -8872 negativ: 2 | (außen_C=-1.0, fort_C=1.0, außen_rF=5.0, fort_rf=5.0, by=-10.0, zu_Vp=-10.0)



30 | Wärmebilanz Summe: -11898 kWh | positiv: -11898 negativ: 0 | (außen_C=-1.0, fort_C=1.0, außen_rF=5.0, fort_rf=5.0, by=-10.0, zu_Vp=10.0)



31 | Wärmebilanz Summe: -9527 kWh | positiv: -9530 negativ: 2 | (außen_C=-1.0, fort_C=1.0, außen_rF=5.0, fort_rf=5.0, by=10.0, zu_Vp=-10.0)



32 | Wärmebilanz Summe: -12661 kWh | positiv: -12662 negativ: 1 | (außen_C=-1.0, fort_C=1.0, außen_rF=5.0, fort_rf=5.0, by=10.0, zu_Vp=10.0)



33 | Wärmebilanz Summe: -10530 kWh | positiv: -10531 negativ: 1 | (außen_C=1.0, fort_C=-1.0, außen_rF=-5.0, fort_rf=-5.0, by=-10.0, zu_Vp=-10.0)



34 | Wärmebilanz Summe: -11898 kWh | positiv: -11898 negativ: 0 | (außen_C=1.0, fort_C=-1.0, außen_rF=-5.0, fort_rf=-5.0, by=-10.0, zu_Vp=10.0)



35 | Wärmebilanz Summe: -8007 kWh | positiv: -8011 negativ: 4 | (außen_C=1.0, fort_C=-1.0, außen_rF=-5.0, fort_rf=-5.0, by=10.0, zu_Vp=-10.0)



36 | Wärmebilanz Summe: -8997 kWh | positiv: -9000 negativ: 3 | (außen_C=1.0, fort_C=-1.0, außen_rF=-5.0, fort_rf=-5.0, by=10.0, zu_Vp=10.0)



37 | Wärmebilanz Summe: -7625 kWh | positiv: -7628 negativ: 3 | (außen_C=1.0, fort_C=-1.0, außen_rF=-5.0, fort_rf=5.0, by=-10.0, zu_Vp=-10.0)



38 | Wärmebilanz Summe: -8858 kWh | positiv: -8860 negativ: 2 | (außen_C=1.0, fort_C=-1.0, außen_rF=-5.0, fort_rf=5.0, by=-10.0, zu_Vp=10.0)



39 | Wärmebilanz Summe: -5985 kWh | positiv: -5993 negativ: 7 | (außen_C=1.0, fort_C=-1.0, außen_rF=-5.0, fort_rf=5.0, by=10.0, zu_Vp=-10.0)



40 | Wärmebilanz Summe: -6905 kWh | positiv: -6911 negativ: 6 | (außen_C=1.0, fort_C=-1.0, außen_rF=-5.0, fort_rf=5.0, by=10.0, zu_Vp=10.0)



41 | Wärmebilanz Summe: -5395 kWh | positiv: -5404 negativ: 8 | (außen_C=1.0, fort_C=-1.0, außen_rF=5.0, fort_rf=-5.0, by=-10.0, zu_Vp=-10.0)



42 | Wärmebilanz Summe: -5840 kWh | positiv: -5847 negativ: 7 | (außen_C=1.0, fort_C=-1.0, außen_rF=5.0, fort_rf=-5.0, by=-10.0, zu_Vp=10.0)



43 | Wärmebilanz Summe: -3439 kWh | positiv: -3463 negativ: 24 | (außen_C=1.0, fort_C=-1.0, außen_rF=5.0, fort_rf=-5.0, by=10.0, zu_Vp=-10.0)



44 | Wärmebilanz Summe: -3582 kWh | positiv: -3615 negativ: 33 | (außen_C=1.0, fort_C=-1.0, außen_rF=5.0, fort_rf=-5.0, by=10.0, zu_Vp=10.0)



45 | Wärmebilanz Summe: -2601 kWh | positiv: -2676 negativ: 75 | (außen_C=1.0, fort_C=-1.0, außen_rF=5.0, fort_rf=5.0, by=-10.0, zu_Vp=-10.0)



46 | Wärmebilanz Summe: -2709 kWh | positiv: -2806 negativ: 97 | (außen_C=1.0, fort_C=-1.0, außen_rF=5.0, fort_rf=5.0, by=-10.0, zu_Vp=10.0)



47 | Wärmebilanz Summe: -1188 kWh | positiv: -1371 negativ: 182 | (außen_C=1.0, fort_C=-1.0, außen_rF=5.0, fort_rf=5.0, by=10.0, zu_Vp=-10.0)



48 | Wärmebilanz Summe: -1031 kWh | positiv: -1270 negativ: 238 | (außen_C=1.0, fort_C=-1.0, außen_rF=5.0, fort_rf=5.0, by=10.0, zu_Vp=10.0)



49 | Wärmebilanz Summe: -745 kWh | positiv: -1000 negativ: 254 | (außen_C=1.0, fort_C=1.0, außen_rF=-5.0, fort_rf=-5.0, by=-10.0, zu_Vp=-10.0)



50 | Wärmebilanz Summe: -1084 kWh | positiv: -1320 negativ: 236 | (außen_C=1.0, fort_C=1.0, außen_rF=-5.0, fort_rf=-5.0, by=-10.0, zu_Vp=10.0)



51 | Wärmebilanz Summe: -363 kWh | positiv: -684 negativ: 320 | (außen_C=1.0, fort_C=1.0, außen_rF=-5.0, fort_rf=-5.0, by=10.0, zu_Vp=-10.0)



52 | Wärmebilanz Summe: -639 kWh | positiv: -928 negativ: 288 | (außen_C=1.0, fort_C=1.0, außen_rF=-5.0, fort_rf=-5.0, by=10.0, zu_Vp=10.0)



53 | Wärmebilanz Summe: -544 kWh | positiv: -811 negativ: 267 | (außen_C=1.0, fort_C=1.0, außen_rF=-5.0, fort_rf=5.0, by=-10.0, zu_Vp=-10.0)



54 | Wärmebilanz Summe: -1147 kWh | positiv: -1328 negativ: 181 | (außen_C=1.0, fort_C=1.0, außen_rF=-5.0, fort_rf=5.0, by=-10.0, zu_Vp=10.0)



55 | Wärmebilanz Summe: -565 kWh | positiv: -796 negativ: 231 | (außen_C=1.0, fort_C=1.0, außen_rF=-5.0, fort_rf=5.0, by=10.0, zu_Vp=-10.0)



56 | Wärmebilanz Summe: -1244 kWh | positiv: -1369 negativ: 125 | (außen_C=1.0, fort_C=1.0, außen_rF=-5.0, fort_rf=5.0, by=10.0, zu_Vp=10.0)



57 | Wärmebilanz Summe: -745 kWh | positiv: -934 negativ: 188 | (außen_C=1.0, fort_C=1.0, außen_rF=5.0, fort_rf=-5.0, by=-10.0, zu_Vp=-10.0)



58 | Wärmebilanz Summe: -1004 kWh | positiv: -1192 negativ: 187 | (außen_C=1.0, fort_C=1.0, außen_rF=5.0, fort_rf=-5.0, by=-10.0, zu_Vp=10.0)



59 | Wärmebilanz Summe: -9 kWh | positiv: -446 negativ: 436 | (außen_C=1.0, fort_C=1.0, außen_rF=5.0, fort_rf=-5.0, by=10.0, zu_Vp=-10.0)



60 | Wärmebilanz Summe: -82 kWh | positiv: -535 negativ: 452 | (außen_C=1.0, fort_C=1.0, außen_rF=5.0, fort_rf=-5.0, by=10.0, zu_Vp=10.0)



61 | Wärmebilanz Summe: 105 kWh | positiv: -396 negativ: 502 | (außen_C=1.0, fort_C=1.0, außen_rF=5.0, fort_rf=5.0, by=-10.0, zu_Vp=-10.0)



62 | Wärmebilanz Summe: -325 kWh | positiv: -698 negativ: 372 | (außen_C=1.0, fort_C=1.0, außen_rF=5.0, fort_rf=5.0, by=-10.0, zu_Vp=10.0)



63 | Wärmebilanz Summe: 303 kWh | positiv: -323 negativ: 627 | (außen_C=1.0, fort_C=1.0, außen_rF=5.0, fort_rf=5.0, by=10.0, zu_Vp=-10.0)



64 | Wärmebilanz Summe: -123 kWh | positiv: -598 negativ: 475 | (außen_C=1.0, fort_C=1.0, außen_rF=5.0, fort_rf=5.0, by=10.0, zu_Vp=10.0)



minmax
Wärmebilanz Wärmebilanz_org Wärmebilanz_min Wärmebilanz_max Wärmebilanz_1 Wärmebilanz_2 Wärmebilanz_3 Wärmebilanz_4 Wärmebilanz_5 Wärmebilanz_7 Wärmebilanz_9 Wärmebilanz_11 Wärmebilanz_12 Wärmebilanz_13 Wärmebilanz_15 Wärmebilanz_49 Wärmebilanz_51 Wärmebilanz_52 Wärmebilanz_53 Wärmebilanz_55 Wärmebilanz_57 Wärmebilanz_59 Wärmebilanz_60 Wärmebilanz_61 Wärmebilanz_62 Wärmebilanz_63 Wärmebilanz_64
Zeit
2017-12-06 8.807480 13.932006 -17.050925 26.641518 20.850065 6.076745 26.641518 13.237235 8.359138 -8.988630 -17.050925 0.461791 -8.970999 -4.236533 -7.276015 -12.056956 0.339246 -8.970999 -4.455124 -10.970359 -15.285226 13.435211 13.237235 22.124914 6.076745 25.813735 8.807480
2017-12-07 -9.984975 -5.711661 -31.534487 11.839596 1.427336 -16.477021 11.839596 -4.144415 -8.437374 -19.479844 -31.534487 -12.413484 -25.162863 -20.737796 -20.624410 -28.440229 -13.126906 -25.162863 -20.593129 -21.624329 -29.811075 0.304537 -4.144415 3.713317 -16.477021 10.393106 -9.984975
2017-12-08 -31.181968 -22.420415 -47.404869 -5.685555 -11.329265 -31.201522 -5.685555 -24.487764 -22.181574 -39.622649 -46.672130 -31.745796 -47.404869 -36.193504 -40.642864 -44.530892 -32.481099 -47.404869 -35.683778 -41.897135 -44.539248 -18.180364 -24.487764 -9.276155 -31.201522 -7.389566 -31.181968
2017-12-09 -34.604205 -29.713968 -57.100840 -13.619254 -22.554337 -42.166043 -13.619254 -31.254253 -33.228969 -42.701023 -55.488320 -38.792912 -54.248902 -48.967924 -48.622798 -57.100840 -40.776945 -54.248902 -47.314582 -45.708102 -52.714215 -24.578468 -31.254253 -21.672042 -42.166043 -13.878873 -34.604205
2017-12-10 1.564406 -0.680251 -37.431973 13.494330 -1.158480 -16.221425 11.610651 -0.514245 -12.832390 -12.380135 -32.990602 -12.854944 -23.388789 -29.927198 -22.848879 -37.431973 -15.838995 -23.388789 -27.548087 -16.017404 -29.776082 2.056658 -0.514245 -2.108075 -16.221425 13.494330 1.564406
2017-12-11 -15.709988 -14.511855 -43.538466 1.073298 -10.690650 -26.610673 1.073298 -12.609161 -21.281865 -27.806923 -43.538466 -22.637371 -33.208822 -33.700655 -30.660932 -40.934939 -23.702549 -33.208822 -33.458817 -30.258373 -41.644086 -9.821734 -12.609161 -9.351727 -26.610673 0.761368 -15.709988
2018-01-31 -1.060245 3.386679 -31.523828 13.618956 9.141111 -3.758334 13.618956 1.941569 -5.179634 -24.718261 -31.523828 -13.094006 -19.815740 -16.525014 -19.783182 -24.065041 -12.442122 -19.815740 -17.443661 -26.186583 -30.215601 -0.787742 1.941569 9.749779 -3.758334 13.372534 -1.060245
2018-02-01 -20.093513 -16.592177 -45.019270 -1.769745 -10.797520 -26.989294 -1.769745 -16.120787 -21.847260 -33.451281 -45.019270 -26.402579 -37.304009 -34.381616 -34.319695 -41.879506 -27.030381 -37.304009 -34.239995 -35.655565 -43.166083 -13.597820 -16.120787 -9.415949 -26.989294 -2.416884 -20.093513
2018-02-02 -2.097789 3.925448 -24.897170 17.969547 11.809422 -5.263330 17.969547 2.194604 -0.239134 -16.205221 -24.897170 -8.836249 -21.290542 -14.533637 -17.235252 -22.517240 -9.446908 -21.290542 -14.178461 -18.627159 -22.639761 5.172236 2.194604 13.027373 -5.263330 17.170653 -2.097789
2018-02-03 11.986634 9.467466 -27.833627 21.192878 8.398781 -3.655686 19.269722 9.640984 -3.805244 -5.655317 -24.975830 -5.685335 -13.405465 -20.477868 -15.172351 -27.833627 -8.306531 -13.405465 -18.648081 -9.323236 -21.787370 9.370520 9.640984 7.492613 -3.655686 21.192878 11.986634
2018-02-04 -2.621757 -6.362753 -41.589928 11.113740 -7.654784 -25.024043 9.484712 -4.061006 -18.584329 -13.792211 -38.001585 -13.794721 -25.625340 -34.245579 -23.521768 -41.589928 -16.660093 -25.625340 -32.099587 -17.116080 -35.268111 0.257393 -4.061006 -8.173661 -25.024043 11.113740 -2.621757
2018-02-06 -21.379334 -15.285274 -46.474135 1.411520 -7.518790 -30.308931 1.209631 -19.428222 -18.744565 -27.826321 -40.973952 -25.900610 -45.441357 -37.672991 -37.532721 -46.474135 -28.983260 -45.441357 -34.740832 -31.356514 -37.594384 -9.869202 -19.428222 -7.280791 -30.308931 1.411520 -21.379334
2018-02-07 -27.027422 -20.131664 -49.762462 -4.671834 -11.623248 -32.964205 -4.671834 -24.279827 -23.332804 -35.821579 -46.736994 -31.904443 -49.762462 -41.005478 -42.791114 -49.747792 -34.287319 -49.762462 -38.802609 -39.009691 -43.679226 -16.438756 -24.279827 -11.132397 -32.964205 -4.776926 -27.027422
2018-02-08 -21.582404 -17.452160 -45.359603 2.852483 -10.724288 -34.899578 2.852483 -18.305221 -20.280575 -24.110968 -41.046836 -21.724096 -41.548143 -36.976501 -32.614950 -45.359603 -24.543560 -41.548143 -34.443253 -27.107116 -38.352551 -7.291914 -18.305221 -9.641961 -34.899578 2.497745 -21.582404
2018-02-09 -22.579961 -15.383491 -44.360353 2.891811 -6.164854 -30.613204 2.891811 -19.349473 -17.104718 -26.980551 -39.493831 -23.614360 -44.360353 -34.756076 -34.723728 -43.468772 -26.237844 -44.360353 -32.269124 -30.136522 -36.477261 -8.398267 -19.349473 -5.486615 -30.613204 2.632650 -22.579961
2018-02-10 2.430944 0.200447 -36.921809 15.927765 -0.036576 -16.647786 14.264396 0.777548 -12.137629 -11.187552 -33.269321 -10.892714 -22.664676 -29.183637 -20.953933 -36.921809 -13.732149 -22.664676 -26.989358 -14.752094 -30.158373 4.160143 0.777548 -0.750368 -16.647786 15.927765 2.430944
2018-02-11 2.684115 1.096798 -35.452533 15.183286 1.364683 -13.598600 13.568464 1.181800 -11.172135 -12.994406 -32.991731 -12.002556 -22.345568 -27.816683 -21.658572 -35.452533 -14.497001 -22.345568 -26.011561 -16.544000 -29.872095 3.029797 1.181800 0.671693 -13.598600 15.183286 2.684115
2018-02-16 -18.894474 -11.094405 -40.784139 3.297380 -1.546430 -20.224579 3.297380 -14.247392 -14.525038 -33.632167 -40.784139 -24.945289 -39.158397 -29.593309 -34.138374 -38.258992 -25.647521 -39.158397 -29.040577 -36.045969 -38.457707 -10.473169 -14.247392 -0.383750 -20.224579 2.416992 -18.894474
2018-02-17 -35.174996 -28.132072 -58.292879 -13.771488 -19.729091 -40.408931 -13.926380 -33.144308 -30.952924 -42.630026 -53.186016 -40.428214 -58.292879 -49.194965 -51.544353 -57.734851 -43.274479 -58.292879 -46.597395 -45.979193 -49.984126 -24.829467 -33.144308 -19.465429 -40.408931 -13.771488 -35.174996
2018-02-18 -27.891772 -22.532604 -53.011154 -5.398917 -15.143183 -36.880063 -5.398917 -24.890997 -27.278271 -38.266163 -51.470622 -33.121310 -50.469362 -44.244455 -43.583445 -53.011154 -35.074544 -50.469362 -42.486166 -41.203305 -48.729087 -17.816108 -24.890997 -14.425999 -36.880063 -5.629857 -27.891772
2018-02-19 -44.869652 -35.145304 -59.534463 -14.958590 -22.886359 -47.303814 -14.958590 -37.631784 -32.546124 -47.137768 -55.629139 -39.529762 -59.534463 -46.184093 -48.924173 -54.556411 -40.702154 -59.534463 -45.248145 -49.086554 -53.867232 -26.643732 -37.631784 -20.517600 -47.303814 -16.928011 -44.869652
2018-02-20 -43.509022 -32.448044 -59.015952 -13.698647 -19.109033 -42.668500 -13.698647 -36.031039 -29.215616 -47.140815 -52.995823 -39.321485 -59.015952 -43.645263 -48.989763 -52.253435 -40.484389 -59.015952 -42.607982 -49.244300 -50.982179 -25.866397 -36.031039 -16.840772 -42.668500 -15.731114 -43.509022

Plot Min_Max

# reindex with NaN for Liniplots
minmax = minmax.reindex(pd.date_range(start=minmax.index.min(), end=minmax.index.max())).fillna(np.nan)


minmax['Date1'] = minmax.index 

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

ax.fill_between(minmax['Date1'], minmax['Wärmebilanz_min'], minmax['Wärmebilanz_max'],edgecolor=colo('black',.1), facecolor=colo('grün',1.5), alpha=1, label = 'min - max')
ax.plot(minmax['Date1'], minmax['Wärmebilanz'],color=colo('grün',1),   linewidth=0.5, label = 'Wärmebilanz')
ax.plot(minmax['Date1'], minmax['Wärmebilanz_org'],color=colo('blau',1),   linewidth=0.5, label = 'Wärmebilanz')

# ax2 = ax.twinx() 
# ax2.fill_between(minmax['Date1'], minmax['Lüftung_min'], minmax['Lüftung_max'],edgecolor='black', facecolor=colo('grey',1.5), alpha=1, label = 'min - max')
# ax2.plot(minmax['Date1'], minmax['Lüftung'],color=colo('grau',.7),   linewidth=0.5, label = 'Lüftung')



## Achsen & Legende
ax.set_ylabel(r'\textbf{Bilanzfehler} ($kWh$)')    
# ax.set(ylim=0) 
# ax.set_yticks([0,100, 500, 1000,1500])  
ax.set_xlabel('')
# ax.get_yaxis().set_major_formatter(mpl.ticker.FuncFormatter(lambda x, loc: locale.format_string('%d', x, 1))) ## dot as thousand separator
h0, l0 = ax.get_legend_handles_labels() 
h2, l2 = ax2.get_legend_handles_labels() 
legend = plt.legend(h0, l0, ncol=1, loc=1)
set_legend_linewidth(legend)   
ax.axhline(y=0, linewidth=0.4,   color=colo('black',.7), xmin=0.0001, xmax=1)

# plt.gcf().autofmt_xdate()
date_form = DateFormatter("%d.\n%m.")
ax.xaxis.set_major_formatter(date_form)
plt.xticks(rotation=0, ha='center')
ax.set(xlim=[eins,sechs])
# ax.set(xlim=[pd.to_datetime("2018-01-31"),pd.to_datetime("2018-02-20")]) 
# plt.savefig(output_folder + '/' + file_name + '_MINMAX_Übersicht.pdf')
plt.show()


# remove NaN for Barplots
minmax = minmax.dropna(axis=0, subset=['Wärmebilanz_max'])



Wärmebilanz_lower_error      = minmax['Wärmebilanz_min'] #- minmax['Wärmebilanz']
Wärmebilanz_upper_error      = minmax['Wärmebilanz_max'] #+ minmax['Wärmebilanz']
Wärmebilanz_error            = [Wärmebilanz_lower_error, Wärmebilanz_upper_error]

# Lüftung_lower_error          = minmax['Lüftung_min'] - minmax['Lüftung']
# Lüftung_upper_error          = minmax['Lüftung_max'] + minmax['Lüftung']
# Lüftung_error                = [Lüftung_lower_error, Lüftung_upper_error]

error_kw = dict(lw=0.5, capsize=1, capthick=0.5, ecolor=('black')) 


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


minmax['Wärmebilanz'].plot.bar(position= 0,      yerr=Wärmebilanz_error, error_kw=error_kw, color=colo('grün',1), edgecolor='black',linewidth = 0.3, width=0.3,ax=ax,stacked=True,alpha = 1) 
# abs(minmax['Lüftung']).plot.bar(position= 1.5,     yerr=Lüftung_error,     error_kw=error_kw, color=colo('grau',1), edgecolor='black',linewidth = 0.3, width=0.3,ax=ax,stacked=True,alpha = 1) 


count = len(minmax.index) -3 ## Tage der Kalibrierung abziehen
ax.axhline(y=0, linewidth=0.4,   color=colo('black',1), xmin=0.0001, xmax=1)
ticklabels = ['']*count 
ticklabels[::1] = [item.strftime('%d.\n %b') for item in minmax.index[::1]] 
ax.set_xlim(-0.5,count)  
ax.set_xticklabels(ticklabels, rotation=0)
ax.set_xticks(np.arange(0.2/2, count, step = 1))
ax.set_xlabel('')
Text(0.5, 0, '')

Plot Varianten

# def minmax_varianten():
fig, ax = plt.subplots(constrained_layout=False) 
ax2 = ax.twinx()
ax2.spines['right'].set_position(('axes', 1.0))
ax3 = ax.twinx()
ax3.spines['right'].set_position(('axes', 1.15))
bf['Wärmebilanz_sum'].plot(ax=ax,color=colo('grün',1), linewidth=1, label = 'Wärmebilanz_sum',style='-')  
bf['Wärmebilanz_std'].plot(ax=ax2,color=colo('rot',1), linewidth=.6, label = 'Wärmebilanz_std')    
bf['Wärmebilanz_ne'].plot(ax=ax3,color=colo('blau',1), linewidth=1, label = 'Summe positiv')   
bf['Wärmebilanz_po'].plot(ax=ax3,color=colo('orange',1), linewidth=1, label = 'Summe negativ')   
ax.axhline(y=-150, linewidth=0.4,   color=colo('grau',.7), xmin=0.0001, xmax=1)
ax.axhline(y=150, linewidth=0.4,   color=colo('grau',.7), xmin=0.0001, xmax=1)
ax.axhline(y=0, linewidth=0.4,   color=colo('black',.7), xmin=0.0001, xmax=1)
ax.set_ylabel(r'\textbf{Energie}')  
ax2.set_ylabel(r'\textbf{Standardabweichung}')  
ax3.set_ylabel(r'\textbf{Summe po / ne}')  
ax.set_xlabel('Durchlauf Nr.')   
ax.set_ylim(-1500,2000)
ax2.set_ylim(1.7,3.7)  
ax3.set_ylim(-1000,3000)  
h0, l0 = ax.get_legend_handles_labels() 
h2, l2 = ax2.get_legend_handles_labels() 
h4, l4 = ax3.get_legend_handles_labels() 
legend = plt.legend(h0+h2+h4, l0+l2+l4, ncol=2, loc=1)
set_legend_linewidth(legend) 
ax.set_xlim(1,nr)  
## nur die Besten der Besten
display(bf[bf['Wärmebilanz_sum'].between(-150,150)].sort_values(by=['Wärmebilanz_std'])[['Wärmebilanz_sum', 'Wärmebilanz_std', 'Wärmebilanz_po', 'Wärmebilanz_ne', 'titel']].style.set_properties(subset=['titel'], **{'width': '600px'}))
 Bilanz Aufbereitung