Daten aus DataFrame bearbeiten und plotten

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
shades.sb
User
Beiträge: 7
Registriert: Samstag 11. April 2020, 17:01

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()


Sirius3
User
Beiträge: 18218
Registriert: Sonntag 21. Oktober 2012, 17:20

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)
shades.sb
User
Beiträge: 7
Registriert: Samstag 11. April 2020, 17:01

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.
Sirius3
User
Beiträge: 18218
Registriert: Sonntag 21. Oktober 2012, 17:20

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
shades.sb
User
Beiträge: 7
Registriert: Samstag 11. April 2020, 17:01

Besten Dank für deine Antwort.

Ich schau mir das morgen mal an und melde mich wieder.
shades.sb
User
Beiträge: 7
Registriert: Samstag 11. April 2020, 17:01

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 ;)
Sirius3
User
Beiträge: 18218
Registriert: Sonntag 21. Oktober 2012, 17:20

Natürlich geht das auch, wenn entweder tutc tatsächlich solche Strings enthält, oder Du statt dessen die richtigen Time-Objekte benutzt.
shades.sb
User
Beiträge: 7
Registriert: Samstag 11. April 2020, 17:01

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.
Sirius3
User
Beiträge: 18218
Registriert: Sonntag 21. Oktober 2012, 17:20

Dann zeigt doch erstmal was Du versucht hast, und was daran nicht funktioniert hat.
Benutzeravatar
__blackjack__
User
Beiträge: 13925
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
shades.sb
User
Beiträge: 7
Registriert: Samstag 11. April 2020, 17:01

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
Sirius3
User
Beiträge: 18218
Registriert: Sonntag 21. Oktober 2012, 17:20

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
shades.sb
User
Beiträge: 7
Registriert: Samstag 11. April 2020, 17:01

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..
Benutzeravatar
snafu
User
Beiträge: 6831
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Schau dir mal between_time() an:
https://pandas.pydata.org/pandas-docs/s ... _time.html

Hilft dir das weiter?
Antworten