Aggregationsregel und Raster
In bestimmten Fällen liegen Daten in einer anderen Auflösung vor, als die Zielzeitreihe es vorsieht. Das ist der Fall zum Beispiel, wenn für eine Zeitreihe im Stunden-Intervall Daten im Tages-Intervall oder Daten im Viertelstunden-Intervall übermittelt werden. In beiden Fällen werden Aggregationsregel, um zwischen unterschiedlichen Intervallen zu konvertieren aktiv, welche bestimmen wie ein Wert von einer Auflösung in eine andere Auflösung konvertiert werden soll.
Aggregationsregel
In HAKOM TSM werden folgende Aggregationsregeln unterstützt:
- Sum
- Average
- Min
- Max
- MostFrequently
- AtTheMoment
- AbsMin
- AbsMax
Anwendung von Aggregationsregeln
Welche Aggregationsregel verwendet wird, kann im Berechnungsprozess an mehreren Stellen definiert werden.
Einheit
Im System sind eine Reihe von Einheiten hinterlegt, die an Zeitreihen ausgewählt werden können. Pro Einheit wird eine Aggregationsregel definiert, welche für alle Zeitreihen, die diese Einheit verwenden - wenn an einer anderen Stelle (siehe Unten) nichts anderes definiert - angewendet wird.
So zum Beispiel wird für eine Arbeits-Einheit (wie KWh) die Aggregationsregel "Sum" verwendet. D.h. es werden Mengen auf größere Raster aufsummiert, auf kleinere Raster anteilig dividiert. Im Gegensatz dazu wird für eine Leistungs-Einheit (wie KW) die Aggregationsregel "Average" verwendet. Diese ermittelt den Durchschnitt aller Werte in einem höheren Raster oder wiederholt den Wert in einem geringeren Raster.
Zeitreihe
Soll für eine Zeitreihe eine von der jeweiligen Einheit abweichende Aggregationsregel verwendet werden, so kann diese auch an der Zeitreihe definiert werden. Bei jeder Operation mit der betroffenen Zeitreihe wird dann diese Aggregationsregel, anstelle der an der Einheit definierten, verwendet.
Anmerkung
In der TSM Plugin ist das derzeit nur über Stammdaten-Export und Import einstellbar: Stammdatenimport & -exportBerechnung
Es ist auch möglich in einer Berechnung oder Formelreferenz eine spezielle Aggregationsregel mitzugeben, welche alle vorangehende Regel (Einheit bzw. Zeitreihe) überstimmt.
In WebTSM Services API kann bei jeder Datenabruf oder Berechnung (siehe /repositories/:repository/timeseries/:id|:name/data
, sowie /repositories/:repository/timeseriescollections/data
und repositories/.../calculations Pfade) die Aggregationsregel mitgegeben werden. In TSM App kann die Anwendung einer Aggregationsregel anhand einer Abfrage-Einheit (sofern die Zeitreihe einen Konversionspfad zur gewünschten Einheit besitzt) angefordert werden. Zusätzlich kann in Formelfunktionen in der Zeitreihenreferenz die Aggregationsregel mitgegeben werden.
Rasterkonvertierungen
In den nachfolgenden Kapiteln werden unterschiedliche Rasterkonvertierungen (Aggregation und Hochskalierung) anhand von Beispielen im REST Service demonstriert. Als Beispiel wird eine Zeitreihe mit 3 Tages-Intervall verwendet.
REST Beispiel
POST {{baseUrl}}\repositories\ZAMS\timeseries
{
"Name": "TimeSeries_3Days",
"Type": 2,
"Interval": {
"Value": 4,
"Multiplier": 3
},
"Unit": "KWh"
}
Aggregation (Auflösung < Intervall) bei Lesen
Werden Zeitreihendaten in einer niedrigeren Auflösung angefordert als sie vorliegen, reden wir von Aggregation. In diesem Fall werden Daten mehrerer Raster in ein Raster aggregiert. Bei nicht vollständiger Überlappung von Abrufraster und Zeitreihenraster (zum Beispiel Zeitreihe in 3 Tagesraster, Aggregation auf Wochenraster), werden Bereiche, die in mehrere Raster einfließen anteilsmäßig aufgeteilt.
Das Mechanismus des Aufteilens bzw. Aufsummierens ist bei der Aggregationsregel "Sum" am einfachsten nachvollziehbar, daher werden wir in weiterer Folge uns auf diese Regel beschränken.
Wir speichern auf die oben beschriebene Zeitreihe 3 konsekutive Rastereinträge mit einem Wert.
Zeitstempel | Gültigkeit | Wert |
---|---|---|
01.01.2020 00:00 | 04.01.2020 00:00 | 100 |
04.01.2020 00:00 | 07.01.2020 00:00 | 200 |
07.01.2020 00:00 | 10.01.2020 00:00 | 300 |
WebTSM Services API Beispiel
POST {{baseUrl}}/repositories/ZAMS/timeseries/TimeSeries_3Days/data
{
"Interval": {
"Value": 4,
"Multiplier": 3
},
"Unit": "kWh",
"Data": [
{
"From": "2019-12-31T23:00:00Z",
"Value": 100,
"Flag": 9
},
{
"From": "2020-01-03T23:00:00Z",
"Value": 200,
"Flag": 9
},
{
"From": "2020-01-06T23:00:00Z",
"Value": 300,
"Flag": 9
}
]
}
Vollständige Überlappung
Sehen wir uns an, wie die Daten aggregiert werden bei vollständiger Überlappung zwischen Datenzeitbereich und Abfragezeitbereich.
Hierzu aggregieren wir 4 x 3-Tages Rasterpunkte mithilfe einer Intervalllänge von 6 Tagen über einen Abfragezeitbereich von 12 Tagen.
Zeitstempel | Gültigkeit | Wert | Aggregationsweg |
---|---|---|---|
01.01.2020 00:00 | 07.01.2020 00:00 | 300 | Raster 1 (100) + Raster 2 (200) = 300 - Valid |
07.01.2020 00:00 | 13.01.2020 00:00 | 300 | Raster 3 (300) + Raster 4 (0 Missing) = 300 - Missing |
WebTSM Services API Beispiel
GET {{baseUrl}}/repositories/ZAMS/timeseries/TimeSeries_3Days/data?from=2019-12-31T23:00:00Z&to=2020-01-12T23:00:00Z&interval=Day&intervalMultiplier=6
{
"Interval": {
"Value": 4,
"Multiplier": 6
},
"Unit": "KWh",
"Data": [
{
"From": "2019-12-31T23:00:00Z",
"Value": 300.0,
"Flag": 9
},
{
"From": "2020-01-06T23:00:00Z",
"Value": 300.0,
"Flag": 19
}
]
}
Teil-Überlappung
Sehen wir uns an, wie die Daten aggregiert werden bei einer Teil-Überlappung zwischen Datenzeitbereich und Abfragezeitbereich.
Hierzu aggregieren wir 4 x 3-Tages Rasterpunkte mithilfe einer Intervalllänge von 7 Tagen über einen Abfragezeitbereich von 14 Tagen.
Zeitstempel | Gültigkeit | Wert | Aggregationsweg |
---|---|---|---|
01.01.2020 00:00 | 08.01.2020 00:00 | 400 | Raster 1 (100) + Raster 2 (200) + Raster 3 (300) / 3 (da nur 1 Tag aus 3 benötigt wird) = 400 - Valid |
08.01.2020 00:00 | 15.01.2020 00:00 | 200 | Raster 3 (300) * 2 / 3 (da nur 2 aus 3 Tagen benötigt wird) + Raster 4 (0 Missing) + Raster 5 (0 Missing) * 2 / 3 = 200 - Missing |
WebTSM Services API Beispiel
GET {{baseUrl}}/repositories/ZAMS/timeseries/TimeSeries_3Days/data?from=2019-12-31T23:00:00Z&to=2020-01-14T23:00:00Z&interval=Day&intervalMultiplier=7
{
"Interval": {
"Value": 4,
"Multiplier": 7
},
"Unit": "KWh",
"Data": [
{
"From": "2019-12-31T23:00:00Z",
"Value": 400.0,
"Flag": 9
},
{
"From": "2020-01-07T23:00:00Z",
"Value": 200.0,
"Flag": 19
}
]
}
Hochskalierung (Auflösung > Intervall) bei Lesen
Werden Daten in einer höheren Auflösung verarbeitet als das unterliegende Zeitreihen-Intervall, so reden wir von Hochskalierung.
Vollständige Überlappung
Wir rufen dieselben 3-Tages-Rasterdaten in 1 Tagesraster ab, um zu sehen wie eine Hochskalierung bei einer Summenaggregation funktioniert.
Zeitstempel | Gültigkeit | Wert | Aggregationsweg |
---|---|---|---|
01.01.2020 00:00 | 02.01.2020 00:00 | 33.33 | Raster 1 (100) / 3 |
02.01.2020 00:00 | 03.01.2020 00:00 | 33.33 | Raster 1 (100) / 3 |
03.01.2020 00:00 | 04.01.2020 00:00 | 33.33 | Raster 1 (100) / 3 |
04.01.2020 00:00 | 05.01.2020 00:00 | 66.66 | Raster 2 (200) / 3 |
05.01.2020 00:00 | 06.01.2020 00:00 | 66.66 | Raster 2 (200) / 3 |
06.01.2020 00:00 | 07.01.2020 00:00 | 66.66 | Raster 2 (200) / 3 |
07.01.2020 00:00 | 08.01.2020 00:00 | 100 | Raster 3 (300) / 3 |
08.01.2020 00:00 | 09.01.2020 00:00 | 100 | Raster 3 (300) / 3 |
09.01.2020 00:00 | 10.01.2020 00:00 | 100 | Raster 3 (300) / 3 |
WebTSM Services API Beispiel
GET {{baseUrl}}/repositories/ZAMS/timeseries/TimeSeries_3Days/data?from=2019-12-31T23:00:00Z&to=2020-01-09T23:00:00Z&interval=Day&intervalMultiplier=1
{
"Interval": {
"Value": 4,
"Multiplier": 1
},
"Unit": "KWh",
"Data": [
{
"From": "2019-12-31T23:00:00Z",
"Value": 33.333333333333336,
"Flag": 9
},
{
"From": "2020-01-01T23:00:00Z",
"Value": 33.333333333333336,
"Flag": 9
},
{
"From": "2020-01-02T23:00:00Z",
"Value": 33.333333333333336,
"Flag": 9
},
{
"From": "2020-01-03T23:00:00Z",
"Value": 66.666666666666671,
"Flag": 9
},
{
"From": "2020-01-04T23:00:00Z",
"Value": 66.666666666666671,
"Flag": 9
},
{
"From": "2020-01-05T23:00:00Z",
"Value": 66.666666666666671,
"Flag": 9
},
{
"From": "2020-01-06T23:00:00Z",
"Value": 100.0,
"Flag": 9
},
{
"From": "2020-01-07T23:00:00Z",
"Value": 100.0,
"Flag": 9
},
{
"From": "2020-01-08T23:00:00Z",
"Value": 100.0,
"Flag": 9
}
]
}
Teil-Überlappung
Wir rufen dieselben 3-Tages-Rasterdaten in 2 Tagesraster ab um zu sehen wie die Aggregation sich bei Teil-Überlappung sich verhält:
Zeitstempel | Gültigkeit | Wert | Aggregationsweg |
---|---|---|---|
01.01.2020 00:00 | 03.01.2020 00:00 | 66.66 | Raster 1 (100) * 2 / 3 |
03.01.2020 00:00 | 05.01.2020 00:00 | 100 | Raster 1 (100) / 3 + Raster 2 (200) / 3 |
05.01.2020 00:00 | 07.01.2020 00:00 | 133.33 | Raster 2 (200) * 2 / 3 |
07.01.2020 00:00 | 09.01.2020 00:00 | 200 | Raster 3 (200) * 2 / 3 |
09.01.2020 00:00 | 10.01.2020 00:00 | 100 | Raster 1 (300) / 3 |
WebTSM Services API Beispiel
GET {{baseUrl}}/repositories/ZAMS/timeseries/TimeSeries_3Days/data?from=2019-12-31T23:00:00Z&to=2020-01-09T23:00:00Z&interval=Day&intervalMultiplier=2
{
"Interval": {
"Value": 4,
"Multiplier": 2
},
"Unit": "KWh",
"Data": [
{
"From": "2019-12-31T23:00:00Z",
"Value": 66.666666666666671,
"Flag": 9
},
{
"From": "2020-01-02T23:00:00Z",
"Value": 100.0,
"Flag": 9
},
{
"From": "2020-01-04T23:00:00Z",
"Value": 133.33333333333334,
"Flag": 9
},
{
"From": "2020-01-06T23:00:00Z",
"Value": 200.0,
"Flag": 9
},
{
"From": "2020-01-08T23:00:00Z",
"Value": 100.0,
"Flag": 9
}
]
}
Speichern in niedrigere Auflösung
Wird in niedrigere Auflösung gespeichert, als das Intervall der Zeitreihe so werden im Prinzip mit derselben Wert mehrere Intervalle beschrieben.
Vollständige Überlappung
Es wird ein Wert für ein Zeitbereich (9 Tage) gespeichert, welche mehrere Rasterpunkte (3) vollständig überlappt.
Zeitstempel | Gültigkeit | Wert |
---|---|---|
01.01.2020 00:00 | 10.01.2020 00:00 | 900 |
WebTSM Services API Beispiel
POST {{baseUrl}}/repositories/ZAMS/timeseries/TimeSeries_3Days/data
{
"Interval": {
"Value": 4,
"Multiplier": 9
},
"Unit": "kWh",
"Data": [
{
"From": "2019-12-31T23:00:00Z",
"Value": 900,
"Flag": 9
}
]
}
Ergebnis:
Zeitstempel | Gültigkeit | Wert | Aggregationsweg |
---|---|---|---|
01.01.2020 00:00 | 04.01.2020 00:00 | 300 | 900 / 3 Raster |
04.01.2020 00:00 | 07.01.2020 00:00 | 300 | 900 / 3 Raster |
07.01.2020 00:00 | 10.01.2020 00:00 | 300 | 900 / 3 Raster |
WebTSM Services API Beispiel
GET {{baseUrl}}/repositories/ZAMS/timeseries/TimeSeries_3Days/data?from=2019-12-31T23:00:00Z&to=2020-01-09T23:00:00Z
{
"Interval": {
"Value": 4,
"Multiplier": 3
},
"Unit": "KWh",
"Data": [
{
"From": "2019-12-31T23:00:00Z",
"Value": 300.0,
"Flag": 9
},
{
"From": "2020-01-03T23:00:00Z",
"Value": 300.0,
"Flag": 9
},
{
"From": "2020-01-06T23:00:00Z",
"Value": 300.0,
"Flag": 9
}
]
}
Teil-Überlappung
Es wird ein Wert für ein Zeitbereich (7 Tage) gespeichert, welche mehrere Rasterpunkte (3) nur teilweise überlappt.
Zeitstempel | Gültigkeit | Wert |
---|---|---|
01.01.2020 00:00 | 08.01.2020 00:00 | 700 |
WebTSM Services API Beispiel
POST {{baseUrl}}/repositories/ZAMS/timeseries/TimeSeries_3Days/data
{
"Interval": {
"Value": 4,
"Multiplier": 7
},
"Unit": "kWh",
"Data": [
{
"From": "2019-12-31T23:00:00Z",
"Value": 700,
"Flag": 9
}
]
}
Ergebnis:
Zeitstempel | Gültigkeit | Wert | Aggregationsweg |
---|---|---|---|
01.01.2020 00:00 | 04.01.2020 00:00 | 300 | 700 * 3 / 7 |
04.01.2020 00:00 | 07.01.2020 00:00 | 300 | 700 * 3 / 7 |
07.01.2020 00:00 | 10.01.2020 00:00 | 100 | 700 * 1 / 7 |
WebTSM Services API Beispiel
GET {{baseUrl}}/repositories/ZAMS/timeseries/TimeSeries_3Days/data?from=2019-12-31T23:00:00Z&to=2020-01-09T23:00:00Z
{
"Interval": {
"Value": 4,
"Multiplier": 3
},
"Unit": "KWh",
"Data": [
{
"From": "2019-12-31T23:00:00Z",
"Value": 300.0,
"Flag": 9
},
{
"From": "2020-01-03T23:00:00Z",
"Value": 300.0,
"Flag": 9
},
{
"From": "2020-01-06T23:00:00Z",
"Value": 100.0,
"Flag": 9
}
]
}
Speichern in höhere Auflösung
Vollständige Überlappung
Wir speichern nun Daten in einem kleineren Raster, so dass diese den ursprünglichen Raster der Zeitreihe vollständig ausfüllen:
Zeitstempel | Gültigkeit | Wert |
---|---|---|
01.01.2020 00:00 | 02.01.2020 00:00 | 100 |
02.01.2020 00:00 | 03.01.2020 00:00 | 200 |
03.01.2020 00:00 | 04.01.2020 00:00 | 300 |
WebTSM Services API Beispiel
POST {{baseUrl}}/repositories/ZAMS/timeseries/TimeSeries_3Days/data
{
"Interval": {
"Value": 4,
"Multiplier": 1
},
"Unit": "kWh",
"Data": [
{
"From": "2019-12-31T23:00:00Z",
"Value": 100,
"Flag": 9
},
{
"From": "2020-01-01T23:00:00Z",
"Value": 200,
"Flag": 9
},
{
"From": "2020-01-02T23:00:00Z",
"Value": 300,
"Flag": 9
}
]
}
Ergebnis:
Zeitstempel | Gültigkeit | Wert | Aggregationsweg |
---|---|---|---|
01.01.2020 00:00 | 04.01.2020 00:00 | 600 | 100 + 200 + 300 |
WebTSM Services API Beispiel
GET {{baseUrl}}/repositories/ZAMS/timeseries/TimeSeries_3Days/data?from=2019-12-31T23:00:00Z&to=2020-01-03T23:00:00Z
{
"Interval": {
"Value": 4,
"Multiplier": 3
},
"Unit": "KWh",
"Data": [
{
"From": "2019-12-31T23:00:00Z",
"Value": 600.0,
"Flag": 9
}
]
}
Teil-Überlappung
Wir speichern nun Daten in einem kleineren Raster, so dass diese den ursprünglichen Raster der Zeitreihe nicht vollständig ausfüllen:
Zeitstempel | Gültigkeit | Wert |
---|---|---|
01.01.2020 00:00 | 02.01.2020 00:00 | 100 |
WebTSM Services API Beispiel
POST {{baseUrl}}/repositories/ZAMS/timeseries/TimeSeries_3Days/data
{
"Interval": {
"Value": 4,
"Multiplier": 1
},
"Unit": "kWh",
"Data": [
{
"From": "2019-12-31T23:00:00Z",
"Value": 100,
"Flag": 9
}
]
}
Ergebnis: es erfolgt keine Gewichtung bei einer Summenaggregat, daher wird der komplette Wert übernommen.
Zeitstempel | Gültigkeit | Wert | Aggregationsweg |
---|---|---|---|
01.01.2020 00:00 | 04.01.2020 00:00 | 100 | 100 - Anmerkung: es erfolgt keine Gewichtung |
WebTSM Services API Beispiel
GET {{baseUrl}}/repositories/ZAMS/timeseries/TimeSeries_3Days/data?from=2019-12-31T23:00:00Z&to=2020-01-03T23:00:00Z
{
"Interval": {
"Value": 4,
"Multiplier": 3
},
"Unit": "KWh",
"Data": [
{
"From": "2019-12-31T23:00:00Z",
"Value": 100.0,
"Flag": 9
}
]
}
Teil-Überlappung mit Aggregationsregel "Average"
Achtung: bei einer Teil-Überlappung mit nur einen Teil des gesamten Rasters kommt es bei Aggregationsregel "Average" vielleicht wider erwarten ebenfalls zu keine Gewichtung über nicht übermittelten Anteile des selben Rasters. Hierzu weiter unten mehr.
Legen wir dazu eine neue Zeitreihe mit Aggregationsregel "Average" an:
WebTSM Services API Beispiel
POST {{baseUrl}}\repositories\ZAMS\timeseries
{
"Name": "TimeSeries_3Days_Average",
"Type": 2,
"Interval": {
"Value": 4,
"Multiplier": 3
},
"Unit": "KW"
}
Wir speichern nun Daten in einem kleineren Raster, so dass diese den ursprünglichen Raster der Zeitreihe nicht vollständig ausfüllen:
Zeitstempel | Gültigkeit | Wert |
---|---|---|
01.01.2020 00:00 | 02.01.2020 00:00 | 100 |
02.01.2020 00:00 | 03.01.2020 00:00 | 200 |
WebTSM Services API Beispiel
POST {{baseUrl}}/repositories/ZAMS/timeseries/TimeSeries_3Days_Average/data
{
"Interval": {
"Value": 4,
"Multiplier": 1
},
"Unit": "kW",
"Data": [
{
"From": "2019-12-31T23:00:00Z",
"Value": 100,
"Flag": 9
},
{
"From": "2020-01-01T23:00:00Z",
"Value": 200,
"Flag": 9
}
]
}
Ergebnis: es erfolgt eine Gewichtung gemäß Aggregationsregel, aber nur über die übermittelten Wertebereiche. Teilbereiche, die nicht übermittelt wurden (also der dritte Tag) werden in der Gewichtung nicht berücksichtigt (als NoValue, d.h. als NA angenommen).
Zeitstempel | Gültigkeit | Wert | Aggregationsweg |
---|---|---|---|
01.01.2020 00:00 | 04.01.2020 00:00 | 150 | (100 + 200) / 2 |
WebTSM Services API Beispiel
GET {{baseUrl}}/repositories/ZAMS/timeseries/TimeSeries_3Days_Average/data?from=2019-12-31T23:00:00Z&to=2020-01-03T23:00:00Z
{
"Interval": {
"Value": 4,
"Multiplier": 3
},
"Unit": "KW",
"Data": [
{
"From": "2019-12-31T23:00:00Z",
"Value": 150.0,
"Flag": 9
}
]
}
Möchte ich, dass die übermittelten Werte des Teilbereichs und die fehlende Werte mit 0 in die Gewichtung einfließen, so muss ich die Lücken als 0 Missing (oder Valid) mit übermitteln:
Zeitstempel | Gültigkeit | Wert |
---|---|---|
01.01.2020 00:00 | 02.01.2020 00:00 | 100 - Valid |
02.01.2020 00:00 | 03.01.2020 00:00 | 200 - Valid |
03.01.2020 00:00 | 04.01.2020 00:00 | 0 - Missing |
WebTSM Services API Beispiel
POST {{baseUrl}}/repositories/ZAMS/timeseries/TimeSeries_3Days_Average/data
{
"Interval": {
"Value": 4,
"Multiplier": 1
},
"Unit": "kW",
"Data": [
{
"From": "2019-12-31T23:00:00Z",
"Value": 100,
"Flag": 9
},
{
"From": "2020-01-01T23:00:00Z",
"Value": 200,
"Flag": 9
},
{
"From": "2020-01-02T23:00:00Z",
"Value": 0,
"Flag": 19
}
]
}
Ergebnis: es erfolgt eine Gewichtung gemäß Aggregationsregel, aber nur über die übermittelten Wertebereiche. Teilbereiche, die nicht übermittelt wurden (also der dritte Tag) werden in der Gewichtung nicht berücksichtigt (als NoValue, d.h. als NA angenommen).
Zeitstempel | Gültigkeit | Wert | Aggregationsweg |
---|---|---|---|
01.01.2020 00:00 | 04.01.2020 00:00 | 100 | (100.Valid + 200.Valid + 0.Missing) / 3 = 100.Missing |
Anmerkung: wenn ich die Lücke (0 Wert) als Missing übermittelt habe, wird auch mein Ergebnis Missing sein. Möchte ich einen Valid Flag, so müsste ich die Lücke mit 0.Valid übermitteln.
WebTSM Services API Beispiel
GET {{baseUrl}}/repositories/ZAMS/timeseries/TimeSeries_3Days_Average/data?from=2019-12-31T23:00:00Z&to=2020-01-03T23:00:00Z
{
"Interval": {
"Value": 4,
"Multiplier": 3
},
"Unit": "KW",
"Data": [
{
"From": "2019-12-31T23:00:00Z",
"Value": 100.0,
"Flag": 19
}
]
}
Wir empfehlen folgende Videos unter Video Tutorials:
- Aggregation
- Behaviour of Flags During Data Aggregation