Seite 1 von 1

Daten aus DataFrame bearbeiten und plotten

Verfasst: Samstag 11. April 2020, 18:44
von shades.sb
Moin

Schonmal voraus, ich bin Neuling und habe mein erstes eigenes Projekt begonnen.
Ich möchte in meinem Projekt ausgewertete Daten in einer Grafik darstellen. Dies Funktioniert mit allen geplotteten Werten ausgenommen von "pCleanBoiler". Da stehe ich ein wenig auf dem Schlauch vielleicht kann da jemand nachhelfen.

Die Grafik soll folgende Datenausgeben:
pVb: Gesamtverbrauch
pWP: Verbrach Wärmepumpe
pCleanWP: Verbrauch ohne Wärmepumpe
pCleanBoiler: Verbrauch ohne WP und Boiler******** Hier ist das Problem

*****Der Wert muss zuerst ermittelt werden mit folgenden Abhängigkeiten:

- pCleanWP = pVb - pWP
- pBoiler= 4000

wenn pCleanWP > pBoiler soll pCleanBoiler = pCleanBoiler + pCleanWP - pBoiler
sonst soll:
pCleanBoiler = pCleanWP


Ich hoffe dies ist einigermassen verständlich :geek:
Besten Dank im Voraus für die Hilfe..

Hier meine Code:

Code: Alles auswählen


## Daten importieren
import datetime as dt
import numpy as np

import matplotlib.pyplot as plt
import pandas as pd

pd.plotting.register_matplotlib_converters() ## Pandas wird das Datum direkt in einem "Timeseries"-Format importieren, 
# weshalb die Defaulteinstellungen von Matplotlib mit diesem Befehl angepasst werden.

df = pd.read_csv("Monat.csv", delimiter=';', header = 0)
df = df.set_index(pd.DatetimeIndex(df['Time'])) 





##############################################################################
# Spalten zuweisen

pPV  = df["Pac PV (W)"].values    # [W] Produktion PV
wPV = df["Ertrag PV (Wh)"].values
pVb  = df["Pac Vb (W)"].values    # [W] Gesamtverbrauch
wVb = df["Ertrag Vb (Wh)"].values
pWP  = df["Pac WP (W)"].values   # [W] Heizung
wWP = df["Ertrag WP (Wh)"].values
zapf = df["Zapfung"].values

tutc = df.index


lfStd = np.zeros(tutc.size)
for t in range(tutc.size):
    # berechnet laufender Tag im Jahr
    noDay = (tutc[t] - dt.datetime(tutc[0].year, 1, 1, 1)).days 
    # [h] berechnet laufende Stunde im Tag
    noHou = tutc[t].hour + (tutc[t].minute)/60 + (tutc[t].second)/3600
    lfStd[t] = noDay*24 + noHou
    
deltaT = lfStd[1] - lfStd[0] # [h]

# zum Dateframe  Uhrzeit als Text
df = df.resample('5T').mean()
tutc    = df.index 

a=int(8*24/deltaT)           # Anfangstag
e=int(a+1*24/deltaT) # Endtag

t = tutc[a:e]



pCleanBoiler = 0
pBoiler= 4000
pCleanBoiler = np.zeros(tutc.size)# [W] Array Leistung Heizstab

pCleanWP = pVb - pWP

for c in range(pPV.size):
    if pCleanWP[c] > pBoiler:
        pCleanBoiler = pCleanBoiler + pCleanWP[c] - pBoiler
    else:
        pCleanBoiler = pCleanWP[c]
    


plt.figure(1, figsize=(16,8))		# Grösse des Plots (figsize) in Zoll
plt.plot(t,pPV[a:e]/1000,'y', label ='Ertrag PV')
plt.plot(t,pVb[a:e]/1000,'r', label ='Verbrauch')
plt.plot(t,pCleanWP[a:e]/1000,'b', label ='Verbrauch Clean WP')
plt.plot(t,pCleanBoiler[a:e]/100000,'g', label ='Verbrauch Clean WP, Boiler')


plt.xlabel('Zeit [h]')
plt.ylabel('Leistung [W]')
plt.legend(loc="best")
#plt.savefig("C:\PythonAnaconda\Anaconda3 (64-bit)\Python38\Python38\Projekt/TagesbeispielLeistung.png")
plt.show()



Re: Daten aus DataFrame bearbeiten und plotten

Verfasst: Samstag 11. April 2020, 19:48
von Sirius3
Als erstes mal sollten die Variablen besser benannt werden, dann braucht man sie auch nicht lange erklären. Was noHou heißt oder tutc kann niemand entschlüsseln.

`pCleanBoiler` überschreibst Du immer wieder mit neuen Werten, so dass Du zum Schluß keinen Vektor sondern nur einen einzelnen Wert hast.

Auch wenn Du mit pandas bzw. numpy Schleifen benutzt, machst Du irgendetwas falsch.
Wenn ich das richtig sehen, ist das einfach nur:

Code: Alles auswählen

gesamt_verbrauch = df["Pac Vb (W)"].values
verbrauch_waerme_pumpe  = df["Pac WP (W)"].values
verbrauch_boiler = 8000
verbrauch_ohne_waermepumpe_und_boiler = (gesamt_verbrauch - verbrauch_waerme_pumpe - verbrauch_boiler).clip(0)

Re: Daten aus DataFrame bearbeiten und plotten

Verfasst: Samstag 11. April 2020, 20:07
von shades.sb
den Verbrauch des Boilers muss ich mit der Schleife berechnen.
Das heisst, wenn die Gesamtlesitung nach Abzug von der Leistung der Wärmepume immer noch über 4000 liegt. Sollen die 4000 vom Wert abgezogen werden.

Re: Daten aus DataFrame bearbeiten und plotten

Verfasst: Samstag 11. April 2020, 20:48
von Sirius3
Dazu brauchst Du auch keine Schleife, das geht mit Maskierung.

Code: Alles auswählen

verbrauch_ohne_waermepumpe = gesamt_verbrauch - verbrauch_waerme_pumpe
mask = verbrauch_ohne_waermepumpe > verbrauch_boiler
verbrauch_ohne_waermepumpe_und_boiler = verbrauch_ohne_waermepumpe.copy()
verbrauch_ohne_waermepumpe_und_boiler[mask] -= verbrauch_boiler

Re: Daten aus DataFrame bearbeiten und plotten

Verfasst: Samstag 11. April 2020, 23:30
von shades.sb
Besten Dank für deine Antwort.

Ich schau mir das morgen mal an und melde mich wieder.

Re: Daten aus DataFrame bearbeiten und plotten

Verfasst: Sonntag 12. April 2020, 13:10
von shades.sb
super das Ganze hat so geklappt.. Danke Dir!

kann mann auch eine Maske für die Zeit setzten,
dass die Bedingung nur in folgendem Zeitfenster gilt?

Code: Alles auswählen

mask1 = (tutc >= '00:00:00') & (tutc <= '06:00:00')
Ich hab schon verschieden Ansätze versucht und suche natürlich weiter.
Falls aber jemand einen hilfreichen Tipp hat, bin ich natürlich nicht böse ;)

Re: Daten aus DataFrame bearbeiten und plotten

Verfasst: Sonntag 12. April 2020, 13:16
von Sirius3
Natürlich geht das auch, wenn entweder tutc tatsächlich solche Strings enthält, oder Du statt dessen die richtigen Time-Objekte benutzt.

Re: Daten aus DataFrame bearbeiten und plotten

Verfasst: Sonntag 19. April 2020, 08:52
von shades.sb
Ich meld mich nochmals:
hab in der Zwischenzeit ein wenig rum gespielt und verschiedene Ansätze ausprobiert.
Leider nicht mit dem gewünschten Ergebnis.

Problematik ist immer noch, dass ich versuch die gesetzte Maske mit einer gewissen Uhrzeit zu koppeln:

Code: Alles auswählen

mask = pCleanWP > pBoiler 
pCleanBoiler = pCleanWP.copy()
pCleanBoiler[mask] -= pBoiler
dies soll nur geschehen in der Zeitspanne von 00:00:00 - 06:00:00. Dies wiederum an jedem Tag.

Hab das ganze mit einer If - Schleife versucht, glaube aber das ist der falsche Ansatz.

Re: Daten aus DataFrame bearbeiten und plotten

Verfasst: Sonntag 19. April 2020, 09:09
von Sirius3
Dann zeigt doch erstmal was Du versucht hast, und was daran nicht funktioniert hat.

Re: Daten aus DataFrame bearbeiten und plotten

Verfasst: Sonntag 19. April 2020, 09:28
von __blackjack__

Re: Daten aus DataFrame bearbeiten und plotten

Verfasst: Sonntag 19. April 2020, 10:17
von shades.sb

Code: Alles auswählen

maskTime = (tutc >= '00:00:00') & (tutc <= '06:00:00')
print(maskTime)

if maskTime in tutc == True:     
    mask = pCleanWP > pBoiler 
    pCleanBoiler = pCleanWP.copy()
    pCleanBoiler[mask] -= pBoiler
die Zeiten werden erkannt, aber im Plot wird das Ganze nicht dargestellt

Re: Daten aus DataFrame bearbeiten und plotten

Verfasst: Sonntag 19. April 2020, 10:31
von Sirius3
Was denkst Du bedeutet diese Bedingung: maskTime in tutc == True?
Was ist tutc? Ist das wirklich eine Array in dem nur Zeiten als Strings stehen?
Ich kann das nicht verstehen, weil ich unter der kryptischen Zeichenfolge tutc mir nichts vorstellen kann?

Du mußt Die eine Maske mit der anderen kombinieren: mask_time & mask

Re: Daten aus DataFrame bearbeiten und plotten

Verfasst: Sonntag 19. April 2020, 10:53
von shades.sb
du hast recht, das war grosser Mist

Code: Alles auswählen

pBoiler= 4000
pAusgleich = 1000
pCleanWP = pVb - pWP

mask_time = (tutc >= '2020-09-01 00:00:00') & (tutc <= '2020-09-01 06:10:00')
print(mask_time)
  
mask = pCleanWP > pAusgleich 
pCleanBoiler = pCleanWP.copy()
pCleanBoiler[mask&mask_time] -= pBoiler
pCleanBoiler[pCleanBoiler<0]=0
so funktioniert's mit dem ausgewählten Tag.

wie ich das ganze nun für jeden Tag im Jahr von 00 Uhr bis 6 Uhr machen kann ist mir noch nicht ganz klar.

tutc bedeutet Time UTC : Ich schreibe meine ganzes Script nochmals um - das mit den Abkürzungen ist wirklich nicht sehr praktisch..

Re: Daten aus DataFrame bearbeiten und plotten

Verfasst: Sonntag 19. April 2020, 11:50
von snafu
Schau dir mal between_time() an:
https://pandas.pydata.org/pandas-docs/s ... _time.html

Hilft dir das weiter?