From cb22fabb7d67729c598ced7e24847bfc6aea9571 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Fri, 9 Aug 2024 14:41:27 +0200 Subject: [PATCH 01/23] Adding BDEW standard load profiles. --- CHANGELOG.md | 1 + .../io/source/LoadProfileSource.java | 106 ++++++++++++++++++ .../models/profile/LoadProfileKey.java | 101 +++++++++++++++++ .../repetitive/BDEWLoadProfileEntry.java | 56 +++++++++ .../repetitive/BDEWLoadProfileInput.java | 87 ++++++++++++++ .../repetitive/LoadProfileInput.java | 17 +-- .../repetitive/RepetitiveTimeSeries.java | 10 ++ .../resources/load/standard_load_profiles.csv | 97 ++++++++++++++++ 8 files changed, 462 insertions(+), 13 deletions(-) create mode 100644 src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java create mode 100644 src/main/java/edu/ie3/datamodel/models/profile/LoadProfileKey.java create mode 100644 src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileEntry.java create mode 100644 src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileInput.java create mode 100644 src/main/resources/load/standard_load_profiles.csv diff --git a/CHANGELOG.md b/CHANGELOG.md index 083590698..7ba455188 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased/Snapshot] ### Added +- BDEW standard load profiles [#1106](https://github.com/ie3-institute/PowerSystemDataModel/issues/1106) ### Fixed diff --git a/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java new file mode 100644 index 000000000..a13845c2d --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java @@ -0,0 +1,106 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.io.source; + +import static edu.ie3.util.quantities.PowerSystemUnits.KILOWATT; + +import edu.ie3.datamodel.exceptions.ParsingException; +import edu.ie3.datamodel.exceptions.SourceException; +import edu.ie3.datamodel.exceptions.ValidationException; +import edu.ie3.datamodel.io.connectors.CsvFileConnector; +import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; +import edu.ie3.datamodel.models.profile.LoadProfileKey; +import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileEntry; +import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileInput; +import edu.ie3.datamodel.models.value.PValue; +import java.io.BufferedReader; +import java.io.IOException; +import java.nio.file.Path; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import org.apache.commons.lang3.tuple.Pair; +import tech.units.indriya.quantity.Quantities; + +public class LoadProfileSource extends EntitySource { + + private final Path bdewLoadProfilePath = Path.of("src", "main", "resources", "load"); + + @Override + public void validate() throws ValidationException { + /* Nothing to do here */ + } + + public Map getBDEWLoadProfiles() + throws SourceException { + CsvFileConnector connector = new CsvFileConnector(bdewLoadProfilePath); + + try (BufferedReader reader = connector.initReader(Path.of("standard_load_profiles"))) { + return parseBDEWStandardProfiles(reader); + } catch (IOException | ParsingException e) { + throw new SourceException("The bdew standard load profiles could not be loaded!", e); + } + } + + protected Map parseBDEWStandardProfiles( + BufferedReader reader) throws IOException, ParsingException { + String[] headline = reader.readLine().split(","); + + Map positionToKey = new HashMap<>(); + for (int i = 0; i < headline.length - 1; i++) { + String header = headline[i]; + positionToKey.put(i, LoadProfileKey.parseBDEWProfile(header)); + } + + Map> values = + reader + .lines() + .map( + row -> { + String[] arr = row.split(","); + + int quarterHour = Integer.parseInt(arr[arr.length - 1]); + + return IntStream.range(0, arr.length - 1) + .boxed() + .map( + i -> { + LoadProfileKey key = positionToKey.get(i); + + return Pair.of( + key, + new BDEWLoadProfileEntry( + new PValue( + Quantities.getQuantity( + Double.parseDouble(arr[i]), KILOWATT)), + key.season(), + key.dayOfWeek(), + quarterHour)); + }) + .toList(); + }) + .flatMap(Collection::stream) + .collect(Collectors.groupingBy(Pair::getLeft)) + .entrySet() + .stream() + .map(e -> Map.entry(e.getKey(), e.getValue().stream().map(Pair::getValue).toList())) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + + return Arrays.stream(BdewStandardLoadProfile.values()) + .map( + profile -> + Map.entry( + profile, + new BDEWLoadProfileInput( + profile, + values.keySet().stream() + .filter(key -> key.profile() == profile) + .map(values::get) + .flatMap(Collection::stream) + .collect(Collectors.toSet())))) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + } +} diff --git a/src/main/java/edu/ie3/datamodel/models/profile/LoadProfileKey.java b/src/main/java/edu/ie3/datamodel/models/profile/LoadProfileKey.java new file mode 100644 index 000000000..37fde7362 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/models/profile/LoadProfileKey.java @@ -0,0 +1,101 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.models.profile; + +import edu.ie3.datamodel.exceptions.ParsingException; +import java.time.DayOfWeek; +import java.time.ZonedDateTime; + +public record LoadProfileKey(LoadProfile profile, Season season, DayOfWeek dayOfWeek) { + + public static LoadProfileKey parseBDEWProfile(String key) throws ParsingException { + String profile = key.substring(0, 2); + String season = key.substring(2, 4); + String dayString = key.substring(4, 6); + + DayOfWeek day = + switch (dayString) { + case "Sa" -> DayOfWeek.SATURDAY; + case "Su" -> DayOfWeek.SUNDAY; + default -> DayOfWeek.MONDAY; + }; + + return new LoadProfileKey(BdewStandardLoadProfile.get(profile), Season.parse(season), day); + } + + public enum Season { + WINTER("Wi"), + SUMMER("Su"), + TRANSITION("Tr"); + + private final String key; + + Season(String key) { + this.key = key.toLowerCase(); + } + + public static Season parse(String key) throws ParsingException { + return switch (key) { + case "Wi" -> WINTER; + case "Su" -> SUMMER; + case "Tr" -> TRANSITION; + default -> throw new ParsingException("There is no season for key:" + key); + }; + } + + /** + * Creates a season from given time + * + * @param time the time + * @return a season + */ + public static Season get(ZonedDateTime time) { + int day = time.getDayOfMonth(); + + // winter: 1.11.-20.03. + // summer: 15.05.-14.09. + // transition: 21.03.-14.05. and + // 15.09.-31.10. + // (VDEW handbook) + + return switch (time.getMonth()) { + case NOVEMBER, DECEMBER, JANUARY, FEBRUARY -> WINTER; + case MARCH -> { + if (day <= 20) { + yield WINTER; + } else { + yield TRANSITION; + } + } + case MAY -> { + if (day >= 15) { + yield SUMMER; + } else { + yield TRANSITION; + } + } + case JUNE, JULY, AUGUST -> SUMMER; + case SEPTEMBER -> { + if (day <= 14) { + yield SUMMER; + } else { + yield TRANSITION; + } + } + default -> TRANSITION; + }; + } + + public String getKey() { + return key; + } + + @Override + public String toString() { + return "Season{" + "key='" + key + '\'' + '}'; + } + } +} diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileEntry.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileEntry.java new file mode 100644 index 000000000..556323071 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileEntry.java @@ -0,0 +1,56 @@ +/* + * © 2021. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.models.timeseries.repetitive; + +import edu.ie3.datamodel.models.profile.LoadProfileKey; +import edu.ie3.datamodel.models.value.PValue; +import java.time.DayOfWeek; +import java.util.Objects; + +/** Unique entry to a {@link BDEWLoadProfileInput} */ +public class BDEWLoadProfileEntry extends LoadProfileEntry { + private final LoadProfileKey.Season season; + + public BDEWLoadProfileEntry( + PValue value, LoadProfileKey.Season season, DayOfWeek dayOfWeek, int quarterHourOfDay) { + super(value, dayOfWeek, quarterHourOfDay); + this.season = season; + } + + public LoadProfileKey.Season getSeason() { + return season; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + BDEWLoadProfileEntry that = (BDEWLoadProfileEntry) o; + return getQuarterHourOfDay() == that.getQuarterHourOfDay() + && season == that.season + && getDayOfWeek() == that.getDayOfWeek(); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), season); + } + + @Override + public String toString() { + return "BDEWLoadProfileEntry{" + + "dayOfWeek=" + + getDayOfWeek() + + "season=" + + season + + ", quarterHourOfDay=" + + getQuarterHourOfDay() + + ", value=" + + value + + '}'; + } +} diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileInput.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileInput.java new file mode 100644 index 000000000..fc2c170f5 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileInput.java @@ -0,0 +1,87 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.models.timeseries.repetitive; + +import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; +import edu.ie3.datamodel.models.profile.LoadProfileKey; +import edu.ie3.datamodel.models.value.PValue; +import java.time.DayOfWeek; +import java.time.ZonedDateTime; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.UUID; +import java.util.stream.Collectors; + +public class BDEWLoadProfileInput extends RepetitiveTimeSeries { + private final BdewStandardLoadProfile loadProfile; + private final Map> valueMapping; + + public BDEWLoadProfileInput( + BdewStandardLoadProfile loadProfile, Set values) { + super(UUID.randomUUID(), values); + this.loadProfile = loadProfile; + + this.valueMapping = + values.stream() + .collect( + Collectors.groupingBy( + e -> new Key(e.getSeason(), e.getDayOfWeek()), + Collectors.toMap( + LoadProfileEntry::getQuarterHourOfDay, LoadProfileEntry::getValue))); + } + + @Override + public PValue calc(ZonedDateTime time) { + Key key = fromTime(time); + int quarterHour = time.getHour() * 4 + time.getMinute() / 15; + + return valueMapping.get(key).get(quarterHour); + } + + public BdewStandardLoadProfile getLoadProfile() { + return loadProfile; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + BDEWLoadProfileInput that = (BDEWLoadProfileInput) o; + return loadProfile.equals(that.loadProfile) && valueMapping.equals(that.valueMapping); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), loadProfile, valueMapping); + } + + @Override + public String toString() { + return "BDEWLoadProfileInput{" + + "loadProfile=" + + loadProfile + + ", valueMapping=" + + valueMapping + + '}'; + } + + private Key fromTime(ZonedDateTime time) { + LoadProfileKey.Season season = LoadProfileKey.Season.get(time); + + DayOfWeek day = + switch (time.getDayOfWeek()) { + case SATURDAY -> DayOfWeek.SATURDAY; + case SUNDAY -> DayOfWeek.SUNDAY; + default -> DayOfWeek.MONDAY; + }; + + return new Key(season, day); + } + + private record Key(LoadProfileKey.Season season, DayOfWeek dayOfWeek) {} +} diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileInput.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileInput.java index add926f95..93b6b3a6b 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileInput.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileInput.java @@ -5,13 +5,14 @@ */ package edu.ie3.datamodel.models.timeseries.repetitive; -import static java.time.temporal.ChronoUnit.HOURS; - import edu.ie3.datamodel.models.profile.StandardLoadProfile; import edu.ie3.datamodel.models.value.PValue; import java.time.DayOfWeek; import java.time.ZonedDateTime; -import java.util.*; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.UUID; import java.util.stream.Collectors; // TODO This is a sample implementation, please implement a real scenario @@ -40,16 +41,6 @@ public PValue calc(ZonedDateTime time) { return dayOfWeekToHourlyValues.get(time.getDayOfWeek()).get(time.getHour()); } - @Override - protected Optional getPreviousDateTime(ZonedDateTime time) { - return Optional.of(time.minus(1, HOURS)); - } - - @Override - protected Optional getNextDateTime(ZonedDateTime time) { - return Optional.of(time.plus(1, HOURS)); - } - public StandardLoadProfile getType() { return type; } diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RepetitiveTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RepetitiveTimeSeries.java index 672ee5589..c488098ab 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RepetitiveTimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RepetitiveTimeSeries.java @@ -36,4 +36,14 @@ protected RepetitiveTimeSeries(UUID uuid, Set entries) { public Optional getValue(ZonedDateTime time) { return Optional.of(calc(time)); } + + @Override + protected Optional getPreviousDateTime(ZonedDateTime time) { + return Optional.of(time.minusHours(1)); + } + + @Override + protected Optional getNextDateTime(ZonedDateTime time) { + return Optional.of(time.plusHours(1)); + } } diff --git a/src/main/resources/load/standard_load_profiles.csv b/src/main/resources/load/standard_load_profiles.csv new file mode 100644 index 000000000..64780bf40 --- /dev/null +++ b/src/main/resources/load/standard_load_profiles.csv @@ -0,0 +1,97 @@ +g0SuSa,g0SuSu,g0SuWd,g0TrSa,g0TrSu,g0TrWd,g0WiSa,g0WiSu,g0WiWd,h0SuSa,h0SuSu,h0SuWd,h0TrSa,h0TrSu,h0TrWd,h0WiSa,h0WiSu,h0WiWd,l0SuSa,l0SuSu,l0SuWd,l0TrSa,l0TrSu,l0TrWd,l0WiSa,l0WiSu,l0WiWd,quarterHour +74.6,68.8,71.5,75.8,68.3,73.0,70.0,63.2,65.5,89.8,100.1,86.3,80.2,93.4,77.8,70.8,87.5,67.6,67.2,62.6,66.1,71.4,64.8,70.3,73.9,68.3,72.4,0 +76.2,67.4,69.0,76.7,66.5,70.1,73.0,61.0,62.6,84.9,92.5,76.9,75.1,86.8,69.6,68.2,81.1,60.8,65.6,60.6,63.1,69.4,62.7,67.1,73.0,66.0,69.4,1 +77.7,65.7,66.3,77.7,64.6,67.1,75.9,58.9,59.6,80.7,85.9,68.8,70.7,81.2,62.4,65.9,75.0,54.9,64.3,58.9,60.5,68.0,61.3,64.3,72.6,64.3,66.9,2 +78.5,63.5,63.5,78.5,62.6,64.5,77.6,57.0,57.0,76.6,79.9,62.4,66.6,75.7,56.6,63.3,69.1,49.9,63.0,57.4,58.4,66.7,60.2,62.1,72.3,63.0,64.8,3 +77.9,60.9,60.9,78.5,60.3,62.3,77.1,55.3,54.8,71.7,74.1,58.0,62.3,70.1,52.5,59.5,63.4,46.2,61.4,56.2,56.7,65.3,59.2,60.3,71.5,62.1,63.2,4 +76.3,58.0,58.6,77.8,57.9,60.6,75.0,53.7,53.1,66.6,68.7,55.3,58.0,64.5,49.7,55.0,58.2,43.6,59.7,55.2,55.4,63.9,58.2,59.1,70.4,61.4,61.9,5 +74.1,55.4,56.6,76.6,55.5,59.2,72.1,52.1,51.7,61.6,63.9,53.6,54.1,59.3,47.9,50.5,53.6,41.9,58.0,54.4,54.4,62.4,57.3,58.1,69.1,60.8,61.0,6 +71.9,53.3,55.1,74.7,53.3,57.9,69.1,50.5,50.5,57.4,59.9,52.4,50.8,54.9,46.6,46.6,49.9,40.8,56.5,53.7,53.7,61.1,56.5,57.4,67.6,60.2,60.2,7 +70.2,52.0,54.2,72.6,51.2,56.7,66.8,48.7,49.4,54.5,57.0,51.3,48.4,51.7,45.5,43.9,47.3,40.1,55.2,53.2,53.2,60.0,55.8,56.9,66.2,59.5,59.6,8 +68.9,51.4,53.7,70.4,49.5,55.6,65.1,46.9,48.5,52.6,55.0,50.3,46.8,49.4,44.5,42.3,45.5,39.6,54.2,52.7,52.7,59.1,55.3,56.4,64.8,58.8,59.2,9 +67.9,51.0,53.4,68.5,48.0,54.7,64.1,45.2,47.9,51.4,53.5,49.2,45.7,47.8,43.8,41.4,44.2,39.4,53.4,52.3,52.3,58.3,54.9,56.0,63.4,58.0,58.8,10 +67.3,50.5,53.3,67.3,46.7,54.2,63.5,43.9,47.7,50.8,52.4,48.3,44.9,46.6,43.3,40.8,43.3,39.1,52.8,51.9,51.9,57.4,54.7,55.6,62.1,57.4,58.4,11 +66.9,49.6,53.1,67.0,45.7,54.1,63.4,43.0,47.9,50.3,51.5,47.5,44.4,45.5,43.0,40.3,42.4,38.8,52.3,51.4,51.4,56.6,54.6,55.1,60.7,57.0,57.9,12 +66.7,48.5,53.2,67.5,44.9,54.6,63.6,42.5,48.7,50.0,50.8,46.9,43.9,44.5,43.0,39.9,41.5,38.6,51.8,50.9,51.0,55.7,54.6,54.5,59.4,56.7,57.4,13 +66.8,47.5,54.1,68.3,44.3,55.8,64.0,42.2,50.2,49.9,50.2,46.5,43.5,43.8,43.1,39.5,40.7,38.3,51.4,50.5,50.5,55.1,54.7,54.1,58.3,56.6,56.9,14 +67.3,46.7,56.1,69.1,43.9,57.9,64.5,42.0,52.3,49.9,49.9,46.6,43.3,43.3,43.3,39.1,40.0,38.3,50.9,50.0,50.0,54.7,54.7,53.7,57.4,56.5,56.5,15 +68.0,46.4,59.4,69.7,43.6,60.9,65.0,41.9,55.1,50.1,49.9,47.1,43.1,43.1,43.4,38.8,39.3,38.4,50.5,49.6,49.6,54.6,54.5,53.6,56.9,56.4,56.3,16 +69.0,46.5,63.3,70.1,43.5,64.4,65.6,41.8,58.2,50.4,50.0,48.0,43.1,43.1,43.7,38.5,38.8,38.8,50.2,49.4,49.4,54.7,54.3,53.7,56.8,56.5,56.3,17 +70.0,46.6,67.2,70.5,43.6,68.0,66.3,41.8,61.2,50.7,50.1,49.3,43.1,43.2,44.2,38.3,38.5,39.3,50.0,49.5,49.5,55.1,54.3,54.0,57.0,56.8,56.6,18 +71.0,46.7,70.1,71.0,43.9,71.0,67.3,42.0,63.5,50.8,49.9,50.8,43.3,43.3,44.9,38.3,38.3,40.0,50.0,50.0,50.0,55.6,54.7,54.7,57.4,57.4,57.4,19 +71.8,46.6,71.4,71.8,44.5,73.2,68.5,42.6,65.0,50.8,49.5,52.7,43.6,43.3,46.3,38.5,38.3,40.9,50.3,51.2,51.2,56.1,55.5,55.6,58.2,58.5,58.8,20 +72.4,46.3,71.6,72.5,45.1,74.7,69.9,43.4,66.0,50.9,48.9,55.6,44.2,43.3,48.9,39.1,38.4,43.1,50.9,53.1,52.9,56.6,57.3,57.2,59.2,60.5,60.9,21 +72.8,46.0,71.2,73.0,45.6,75.7,71.4,44.4,67.1,51.6,48.4,60.5,45.4,43.2,53.7,40.3,38.7,47.7,51.7,56.0,55.3,57.4,60.3,59.8,60.5,63.7,63.8,22 +72.9,45.8,71.0,72.9,45.8,76.6,72.9,45.8,69.1,53.3,48.3,68.2,47.4,43.3,61.6,42.4,39.1,55.8,52.8,60.2,58.4,58.4,64.8,63.9,62.1,68.5,67.6,23 +73.0,45.9,71.5,72.2,45.6,77.7,74.4,47.4,72.5,56.2,48.7,79.2,50.5,43.5,72.9,45.6,39.7,68.0,54.4,65.8,62.2,59.9,71.3,69.8,64.1,75.3,72.5,24 +73.9,46.3,73.1,72.2,45.3,79.3,76.8,49.0,77.1,60.4,49.8,92.0,54.9,44.3,86.3,49.9,40.4,82.8,57.2,73.2,67.4,62.9,79.8,77.6,67.4,84.1,79.0,25 +77.0,47.2,75.9,74.4,45.2,81.9,81.0,50.4,82.9,65.8,51.9,104.7,60.7,46.0,100.1,55.3,41.3,98.0,62.2,82.6,74.8,68.8,90.6,87.6,72.9,94.8,87.7,26 +83.2,48.6,80.4,80.4,45.8,86.0,87.8,51.4,89.7,72.4,54.9,115.7,68.2,49.1,112.4,61.6,42.4,111.5,70.4,94.5,85.2,78.7,103.7,100.0,81.5,107.4,99.1,27 +93.3,50.5,86.6,91.0,47.2,91.9,98.0,51.8,97.6,80.0,59.2,123.5,77.5,53.9,121.8,68.9,44.0,121.6,82.4,108.8,98.9,93.4,119.3,114.8,93.9,121.9,113.6,28 +106.2,52.6,95.1,105.2,49.1,100.4,110.7,51.7,107.3,88.5,64.9,128.6,87.9,60.4,128.5,77.1,46.6,128.5,97.4,124.7,114.9,111.6,136.3,131.3,109.4,137.8,130.5,29 +120.5,54.3,106.3,121.2,51.0,111.9,124.8,51.2,119.9,97.4,72.3,132.0,98.6,68.8,132.9,86.1,51.1,132.7,114.2,141.0,131.8,131.4,153.8,148.6,126.9,155.0,148.9,30 +134.5,55.1,120.5,137.4,52.3,127.1,139.2,50.5,136.4,106.5,81.6,134.8,109.0,79.1,135.7,95.7,58.3,134.8,131.5,156.5,148.2,151.0,170.4,165.8,145.4,173.2,167.7,31 +147.2,54.8,137.8,152.1,52.8,145.9,153.0,49.6,157.1,115.6,92.9,137.8,118.4,91.1,137.2,105.8,68.6,135.4,148.2,170.1,162.6,168.6,185.3,181.9,163.8,191.7,185.8,32 +157.8,53.9,156.3,164.9,52.9,166.2,165.4,49.0,179.5,124.4,105.6,140.7,126.7,104.3,137.7,115.8,81.3,134.8,162.8,180.5,173.9,183.2,197.0,195.1,181.0,208.6,201.7,33 +166.2,53.2,173.4,175.1,53.1,185.2,175.9,48.8,200.5,132.8,119.0,143.2,133.8,118.0,137.7,124.9,95.2,133.1,173.8,186.6,180.6,193.7,204.6,203.4,195.6,221.4,213.6,34 +171.9,53.3,186.9,182.2,54.2,200.0,184.1,49.5,216.8,140.7,132.3,144.8,139.8,131.5,137.3,132.3,109.0,130.7,179.7,187.1,181.6,199.2,206.6,204.7,206.6,227.9,219.5,35 +175.0,54.7,195.0,186.1,56.4,208.5,189.5,51.3,226.2,147.8,144.8,145.3,144.7,144.2,136.9,137.6,121.9,127.7,179.6,181.6,176.1,198.9,202.4,198.0,212.9,226.4,218.5,36 +176.1,57.2,198.7,187.5,59.5,212.1,192.8,53.8,230.0,154.0,156.2,144.9,148.8,155.5,136.4,141.1,133.7,124.6,174.9,171.8,166.1,194.1,193.4,185.5,214.6,218.6,211.6,37 +176.3,60.0,199.8,187.7,62.7,212.6,195.1,56.8,230.4,158.9,166.0,143.8,152.4,165.3,135.7,143.3,144.4,121.5,167.2,160.1,154.1,186.2,181.5,170.6,212.1,206.6,200.8,38 +176.6,62.6,200.0,187.8,65.4,212.1,197.1,59.8,229.9,162.3,174.0,142.3,155.6,173.1,134.8,144.8,154.0,119.0,158.4,149.1,142.6,176.9,168.6,156.5,205.6,192.7,188.0,39 +177.7,64.5,200.6,188.7,67.2,212.2,199.8,62.6,230.0,164.1,180.0,140.8,158.9,178.8,133.7,146.0,162.6,117.3,150.1,140.8,133.8,167.6,156.5,145.9,195.9,178.9,175.0,40 +179.4,65.9,201.9,190.1,68.5,213.1,202.7,65.1,231.2,164.7,184.6,139.5,162.0,183.1,132.4,147.2,170.5,116.2,143.4,135.6,128.2,159.6,146.4,139.0,185.0,167.0,163.4,41 +181.3,67.0,203.6,191.9,69.6,214.6,205.4,67.2,233.0,165.0,188.7,138.5,164.9,187.0,131.4,148.4,178.0,115.7,139.1,133.7,125.8,154.0,139.6,135.5,175.4,158.1,154.5,42 +183.1,68.2,205.6,193.4,71.0,216.8,207.4,69.1,235.5,165.6,193.1,138.2,167.3,191.4,130.7,149.8,185.6,115.7,138.0,135.2,126.9,151.9,137.1,135.2,169.5,153.8,150.1,43 +184.4,69.7,207.6,194.5,73.1,219.2,208.4,70.8,238.1,167.1,198.3,138.6,169.2,197.0,130.6,151.5,193.3,116.1,140.4,139.9,131.2,153.9,139.4,137.5,168.9,154.6,150.7,44 +185.2,71.4,209.1,195.1,75.6,221.2,208.3,72.2,240.0,169.4,203.7,140.1,170.8,203.0,131.5,153.5,200.6,117.0,144.4,145.6,136.6,157.9,144.3,140.7,171.3,158.2,154.1,45 +185.3,73.2,209.6,195.3,78.2,222.0,207.4,73.5,240.4,172.4,208.7,142.6,172.5,208.5,133.6,156.0,206.6,118.7,147.5,149.8,140.9,161.3,148.8,143.1,173.5,161.5,157.4,46 +185.0,74.7,208.4,195.3,80.4,220.5,205.6,74.7,238.3,175.6,212.2,146.5,174.8,212.2,137.3,159.0,210.6,121.5,147.3,150.1,141.7,161.2,150.1,142.6,172.3,161.2,157.5,47 +184.1,76.0,205.1,194.9,81.9,216.3,203.0,76.0,233.0,179.0,213.7,151.5,177.7,213.5,142.6,162.4,211.8,125.4,142.0,144.6,137.4,155.8,146.0,138.2,165.4,155.2,152.2,48 +182.4,77.0,200.0,193.9,82.8,209.8,199.7,77.3,225.1,181.9,212.8,156.7,180.8,211.8,148.2,165.8,210.2,129.6,133.1,135.3,129.4,146.7,138.1,130.9,154.5,145.4,143.2,49 +179.7,77.8,193.8,191.7,83.2,201.9,195.6,78.4,215.7,183.7,209.0,160.7,183.1,207.0,152.8,168.4,205.9,133.0,122.7,124.5,119.9,135.9,128.5,122.5,142.0,134.4,132.7,50 +175.7,78.5,186.9,187.8,83.2,193.4,190.6,79.4,205.6,183.9,202.3,162.3,183.9,198.9,154.8,169.8,198.9,134.8,113.0,114.9,111.2,126.0,119.5,114.9,130.6,125.0,123.2,51 +170.1,79.1,179.9,181.9,82.8,185.0,184.6,80.1,195.7,182.1,192.4,160.5,182.7,187.6,153.2,169.4,189.6,134.2,105.7,108.4,104.8,118.5,112.9,109.4,122.1,119.4,116.5,52 +163.1,79.5,173.4,174.1,82.1,177.4,177.5,80.5,186.7,178.7,180.9,156.1,179.8,174.6,148.9,167.6,178.7,131.7,100.6,104.7,100.8,113.1,108.6,105.9,116.1,116.9,112.5,53 +154.6,79.3,168.1,164.8,80.9,170.9,168.9,80.3,179.2,174.1,169.2,150.2,175.8,161.7,143.2,164.8,167.3,128.0,96.8,102.8,98.5,108.8,105.7,103.9,111.6,116.1,110.3,54 +144.8,78.5,164.4,154.2,79.4,166.3,158.8,79.4,173.8,169.0,159.0,144.0,171.5,150.6,137.3,161.5,156.5,124.0,93.6,101.9,97.3,104.7,103.7,102.8,107.4,115.8,109.3,55 +133.9,76.8,163.0,142.6,77.5,163.9,147.2,77.8,171.0,163.7,151.4,138.4,167.2,142.8,132.4,158.1,147.0,120.2,90.3,101.1,96.5,100.0,102.0,102.1,102.9,114.8,108.8,56 +122.7,74.4,163.5,130.9,75.3,163.6,134.8,75.7,170.7,158.9,146.0,133.6,163.1,137.6,128.4,154.9,138.9,116.8,87.1,100.4,96.2,95.3,100.5,101.7,98.2,113.2,108.5,57 +112.0,71.8,165.4,119.8,73.1,165.1,122.7,73.4,172.7,154.6,141.6,129.4,159.2,133.9,124.8,151.8,132.1,113.7,84.4,99.7,96.2,91.1,99.2,101.4,94.0,111.3,108.4,58 +102.8,69.1,168.2,110.3,71.0,168.2,112.1,71.0,176.6,151.5,137.3,125.7,155.6,130.7,121.5,149.0,126.5,110.7,82.4,99.1,96.3,88.0,98.2,101.0,90.8,109.3,108.4,59 +95.7,66.8,171.5,102.7,69.2,172.5,103.8,68.9,182.1,149.6,132.4,122.4,152.3,127.1,118.1,146.5,122.0,107.9,81.5,98.6,96.7,86.6,97.4,100.4,88.9,107.5,108.3,60 +90.4,64.8,174.6,96.9,67.6,177.3,97.4,67.0,188.2,148.6,127.0,119.6,149.5,123.1,114.8,144.4,118.1,105.5,81.3,98.1,97.0,86.3,96.7,99.9,88.2,106.1,108.3,61 +86.4,63.1,177.2,92.1,66.1,181.4,92.6,65.2,193.9,148.0,121.6,117.4,147.2,119.0,111.7,142.7,114.8,103.5,81.4,97.7,97.2,86.7,96.1,99.4,88.0,105.4,108.6,62 +83.2,61.7,178.5,87.8,64.5,184.1,88.8,63.5,198.1,147.3,116.5,115.7,145.7,114.9,109.0,141.5,111.5,102.4,81.5,97.3,97.3,87.1,95.4,99.1,88.0,105.6,109.3,63 +80.3,60.4,178.2,83.6,62.8,184.5,85.6,62.0,200.1,146.2,112.2,114.6,145.0,111.0,106.9,140.9,108.3,102.2,81.3,96.9,97.0,87.1,94.7,99.2,87.9,106.9,110.6,64 +77.8,59.7,176.8,79.7,61.5,183.6,83.3,61.2,200.7,145.0,108.9,114.2,145.4,107.7,105.7,141.7,105.9,103.2,81.3,96.9,96.8,87.3,94.5,99.9,88.5,109.8,113.1,65 +75.9,59.7,175.1,76.9,61.2,182.1,82.4,61.8,200.9,144.1,106.7,114.6,146.7,105.6,105.5,144.9,105.2,105.6,81.8,97.5,97.1,88.5,95.8,101.6,90.9,114.4,117.4,66 +74.7,60.7,173.8,75.7,62.6,181.3,83.2,64.5,201.8,144.0,105.7,115.7,149.0,104.9,106.5,151.5,107.4,109.9,83.4,99.1,98.2,91.7,99.1,104.7,96.3,121.3,124.1,67 +74.4,63.0,173.2,76.5,65.9,181.5,85.8,69.5,204.0,144.9,106.1,117.6,152.3,106.0,109.1,161.9,112.9,116.0,86.6,102.1,100.6,97.4,105.2,109.4,105.5,130.7,133.7,68 +74.8,66.0,172.4,78.6,70.4,181.7,89.5,76.0,205.8,146.9,107.7,120.3,156.4,108.8,113.1,174.6,120.9,123.7,91.7,106.8,104.8,105.7,114.0,116.2,117.8,142.4,146.0,69 +75.6,69.2,170.2,81.1,75.0,180.0,93.4,82.6,205.5,150.0,110.4,123.9,161.5,113.2,118.3,187.4,130.0,132.6,99.2,113.7,111.5,116.2,125.3,125.6,132.7,156.1,160.5,70 +76.6,71.9,165.4,83.2,78.5,174.7,96.2,87.8,200.9,154.0,114.0,128.2,167.3,119.0,124.8,198.1,139.0,142.3,109.3,123.2,121.3,128.8,138.9,138.0,149.1,171.4,176.9,71 +77.6,73.9,157.1,84.1,80.1,164.8,97.4,90.8,190.7,158.8,118.3,133.2,173.7,126.0,132.4,205.2,146.8,152.4,122.1,135.4,134.4,142.9,154.5,153.5,166.4,187.8,194.5,72 +78.5,75.1,146.1,84.3,80.4,151.5,97.4,92.1,176.6,164.0,123.4,138.9,180.4,133.7,140.6,209.1,153.5,162.2,135.8,148.9,148.9,157.3,170.3,170.2,183.4,204.1,211.5,73 +79.1,76.0,133.8,84.1,80.2,137.0,96.8,92.3,160.5,169.2,129.2,145.1,186.7,141.5,149.1,211.1,159.7,171.2,148.6,161.8,162.6,170.7,184.6,185.8,199.0,218.5,226.1,74 +79.4,76.6,121.5,84.1,80.4,123.3,96.2,92.5,144.8,174.0,135.7,151.5,192.3,149.0,157.3,212.2,165.6,178.9,158.4,172.3,173.2,181.6,195.4,198.2,212.1,229.7,236.2,75 +79.4,77.3,110.1,84.7,81.4,112.1,96.3,93.1,131.3,177.8,142.8,157.9,196.5,155.5,164.9,213.2,171.5,184.7,163.6,178.8,178.9,188.7,201.4,205.5,221.5,236.2,240.4,76 +79.4,78.2,100.5,85.8,83.1,103.4,96.8,94.0,120.1,180.5,149.8,163.8,199.0,160.6,171.1,213.0,176.4,188.2,164.4,181.1,179.8,191.7,202.7,207.5,226.2,237.4,238.7,77 +79.6,79.2,93.2,87.3,85.1,97.3,97.2,94.6,111.3,181.8,155.7,168.3,199.4,163.6,175.2,210.4,179.1,188.9,161.5,179.2,176.5,190.6,199.9,204.7,224.9,232.9,231.5,78 +80.4,80.4,88.8,88.8,86.9,93.4,97.2,94.4,104.6,181.4,159.8,170.6,197.3,164.0,176.5,203.9,178.1,186.4,155.6,173.2,169.5,185.3,193.6,197.3,216.8,222.3,219.5,79 +81.9,81.6,87.4,90.1,88.1,91.6,96.3,93.0,100.0,179.3,161.4,170.4,192.4,161.5,174.5,192.9,172.9,180.7,147.4,163.4,159.6,175.8,184.4,185.9,201.3,205.7,203.4,80 +83.9,82.9,88.1,91.2,88.7,91.1,94.8,90.8,96.7,175.7,160.8,168.3,185.2,157.1,170.5,179.0,164.7,172.7,137.8,151.4,148.1,163.7,173.4,172.1,181.3,185.5,184.9,81 +85.7,83.8,89.6,91.7,88.6,91.1,92.8,88.0,94.1,171.0,159.0,165.3,176.6,152.2,165.7,164.4,155.6,163.9,127.9,138.9,136.4,150.5,161.6,157.7,160.3,164.7,166.1,82 +86.9,84.1,90.6,91.6,87.8,90.6,90.6,85.0,91.6,165.6,156.5,162.3,167.3,148.2,161.5,151.5,147.3,155.6,118.6,127.8,126.0,138.0,150.1,144.5,141.7,146.4,149.1,83 +87.0,83.7,90.2,90.6,86.4,89.2,88.5,82.1,88.5,160.1,153.9,160.1,157.9,145.9,158.9,141.9,141.4,148.9,110.7,119.5,117.9,127.4,139.6,133.8,128.3,132.6,135.6,84 +86.3,82.7,88.5,89.0,84.4,87.2,86.4,79.4,85.2,155.1,151.5,158.4,149.5,144.7,157.2,135.3,137.2,143.4,104.1,113.5,111.9,118.8,130.3,125.5,119.3,123.0,125.2,85 +84.9,81.2,86.3,87.1,82.0,85.0,84.3,76.9,82.1,151.1,149.3,156.8,142.9,143.6,155.4,131.0,133.7,138.4,98.5,108.8,107.1,111.6,122.1,118.8,113.2,116.3,117.3,86 +83.2,79.4,84.1,85.0,79.4,83.2,82.2,74.7,79.4,149.0,147.3,154.8,139.0,141.5,152.3,128.2,129.8,133.2,93.6,104.7,102.8,105.6,114.9,113.0,108.4,111.2,111.2,87 +81.3,77.5,82.4,83.1,76.7,82.1,80.1,72.8,77.6,148.9,145.4,151.9,138.3,137.5,147.2,126.1,124.8,127.2,88.9,100.2,98.5,100.3,108.4,107.7,103.7,106.6,106.1,88 +79.3,75.5,81.2,81.2,74.1,81.7,78.0,71.1,76.4,149.6,143.0,147.9,139.2,131.8,140.3,124.1,118.6,120.5,84.6,95.4,94.1,95.5,102.5,102.5,98.8,102.1,101.7,89 +77.4,73.3,80.3,79.4,71.5,81.6,75.9,69.3,75.6,149.4,139.2,142.5,139.5,124.7,132.1,121.6,111.6,113.3,80.6,90.4,89.6,90.9,97.0,97.6,93.9,97.6,97.7,90 +75.7,71.0,79.4,77.6,69.1,81.3,73.8,67.3,74.7,146.5,133.2,135.7,137.3,116.5,123.2,118.2,104.0,105.7,76.9,85.2,85.2,86.1,91.7,92.6,88.9,92.6,93.6,91 +74.1,68.6,78.4,75.7,67.0,80.6,71.7,65.0,73.7,139.8,124.4,127.2,131.1,107.6,114.0,113.4,96.2,98.0,73.4,80.0,81.0,81.1,86.4,87.7,84.0,87.2,89.1,92 +72.7,66.4,77.2,73.8,65.3,79.5,69.7,62.6,72.3,130.3,113.8,117.5,121.9,98.4,104.8,107.4,88.4,90.2,70.3,75.0,76.9,76.1,81.2,82.9,79.3,81.6,84.6,93 +71.3,64.6,75.7,71.9,64.1,77.9,67.6,60.4,70.5,119.5,102.5,107.1,111.5,89.2,95.6,100.8,80.7,82.5,67.4,70.5,73.1,71.5,76.4,78.3,75.0,76.5,80.1,94 +70.1,63.5,73.8,70.1,63.5,75.7,65.4,58.9,68.2,109.0,91.6,96.5,101.5,80.7,86.6,94.1,73.2,74.9,64.8,66.7,69.5,67.6,72.3,74.1,71.3,72.3,76.0,95 From 77d4d4b70510bcff00f04fc4605d20b804ed13fc Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Fri, 9 Aug 2024 17:31:43 +0200 Subject: [PATCH 02/23] Adding BDEW standard load profiles. --- .../io/source/LoadProfileSource.java | 125 ++++++++++-------- .../models/profile/LoadProfileKey.java | 11 +- 2 files changed, 80 insertions(+), 56 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java index a13845c2d..dc0b1d790 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java @@ -13,16 +13,17 @@ import edu.ie3.datamodel.io.connectors.CsvFileConnector; import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; import edu.ie3.datamodel.models.profile.LoadProfileKey; +import edu.ie3.datamodel.models.profile.LoadProfileKey.BDEWLoadProfileKey; import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileEntry; import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileInput; import edu.ie3.datamodel.models.value.PValue; +import edu.ie3.datamodel.utils.Try; import java.io.BufferedReader; import java.io.IOException; import java.nio.file.Path; import java.util.*; +import java.util.function.Function; import java.util.stream.Collectors; -import java.util.stream.IntStream; -import org.apache.commons.lang3.tuple.Pair; import tech.units.indriya.quantity.Quantities; public class LoadProfileSource extends EntitySource { @@ -46,61 +47,81 @@ public Map getBDEWLoadProfiles() } protected Map parseBDEWStandardProfiles( - BufferedReader reader) throws IOException, ParsingException { - String[] headline = reader.readLine().split(","); + BufferedReader reader) throws IOException, ParsingException, SourceException { - Map positionToKey = new HashMap<>(); - for (int i = 0; i < headline.length - 1; i++) { - String header = headline[i]; - positionToKey.put(i, LoadProfileKey.parseBDEWProfile(header)); - } + Map>> dataMap = + readLoadProfile( + reader, + ",", + str -> Try.of(() -> LoadProfileKey.parseBDEWProfile(str), ParsingException.class)); - Map> values = - reader - .lines() - .map( - row -> { - String[] arr = row.split(","); + return Arrays.stream(BdewStandardLoadProfile.values()) + .map( + profile -> { + Set entries = + dataMap.keySet().stream() + .filter(e -> e.profile() == profile) + .map(dataMap::get) + .flatMap(Collection::stream) + .map( + d -> + new BDEWLoadProfileEntry( + d.value, + d.profileKey.season(), + d.profileKey.dayOfWeek(), + d.quarterHour)) + .collect(Collectors.toSet()); - int quarterHour = Integer.parseInt(arr[arr.length - 1]); + return Map.entry(profile, new BDEWLoadProfileInput(profile, entries)); + }) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + } - return IntStream.range(0, arr.length - 1) - .boxed() - .map( - i -> { - LoadProfileKey key = positionToKey.get(i); - - return Pair.of( - key, - new BDEWLoadProfileEntry( - new PValue( - Quantities.getQuantity( - Double.parseDouble(arr[i]), KILOWATT)), - key.season(), - key.dayOfWeek(), - quarterHour)); - }) - .toList(); - }) - .flatMap(Collection::stream) - .collect(Collectors.groupingBy(Pair::getLeft)) - .entrySet() - .stream() - .map(e -> Map.entry(e.getKey(), e.getValue().stream().map(Pair::getValue).toList())) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + private Map>> readLoadProfile( + BufferedReader reader, String csvSep, Function> keyExtractor) + throws IOException, SourceException, ParsingException { + List headline = Arrays.asList(reader.readLine().split(csvSep)); - return Arrays.stream(BdewStandardLoadProfile.values()) + int quarterHourColumn = headline.indexOf("quarterHour"); + + if (quarterHourColumn < 0) { + throw new SourceException("There is no column for quarter hour values."); + } + + Map profileKeys = new HashMap<>(); + + for (int i = 0; i < headline.size(); i++) { + if (i != quarterHourColumn) { + profileKeys.put(i, keyExtractor.apply(headline.get(i)).getOrThrow()); + } + } + + return reader + .lines() .map( - profile -> - Map.entry( - profile, - new BDEWLoadProfileInput( - profile, - values.keySet().stream() - .filter(key -> key.profile() == profile) - .map(values::get) - .flatMap(Collection::stream) - .collect(Collectors.toSet())))) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + csvRow -> { + List elements = Arrays.asList(csvRow.split(csvSep)); + int quarterHour = Integer.parseInt(elements.get(quarterHourColumn)); + + List> loadProfileToValue = new ArrayList<>(); + + for (int i = 0; i < elements.size(); i++) { + if (i != quarterHourColumn) { + loadProfileToValue.add( + new LoadProfileData<>( + profileKeys.get(i), + quarterHour, + new PValue( + Quantities.getQuantity( + Double.parseDouble(elements.get(i)), KILOWATT)))); + } + } + return loadProfileToValue; + }) + .flatMap(Collection::stream) + .collect(Collectors.groupingBy(LoadProfileData::profileKey)); } + + public record LoadProfileData( + T profileKey, int quarterHour, PValue value) {} } diff --git a/src/main/java/edu/ie3/datamodel/models/profile/LoadProfileKey.java b/src/main/java/edu/ie3/datamodel/models/profile/LoadProfileKey.java index 37fde7362..b11157eca 100644 --- a/src/main/java/edu/ie3/datamodel/models/profile/LoadProfileKey.java +++ b/src/main/java/edu/ie3/datamodel/models/profile/LoadProfileKey.java @@ -9,9 +9,9 @@ import java.time.DayOfWeek; import java.time.ZonedDateTime; -public record LoadProfileKey(LoadProfile profile, Season season, DayOfWeek dayOfWeek) { +public interface LoadProfileKey { - public static LoadProfileKey parseBDEWProfile(String key) throws ParsingException { + static BDEWLoadProfileKey parseBDEWProfile(String key) throws ParsingException { String profile = key.substring(0, 2); String season = key.substring(2, 4); String dayString = key.substring(4, 6); @@ -23,10 +23,13 @@ public static LoadProfileKey parseBDEWProfile(String key) throws ParsingExceptio default -> DayOfWeek.MONDAY; }; - return new LoadProfileKey(BdewStandardLoadProfile.get(profile), Season.parse(season), day); + return new BDEWLoadProfileKey(BdewStandardLoadProfile.get(profile), Season.parse(season), day); } - public enum Season { + record BDEWLoadProfileKey(LoadProfile profile, Season season, DayOfWeek dayOfWeek) + implements LoadProfileKey {} + + enum Season { WINTER("Wi"), SUMMER("Su"), TRANSITION("Tr"); From e2c8564a509d986969f02ecde1796593b9c9642e Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Fri, 23 Aug 2024 12:50:01 +0200 Subject: [PATCH 03/23] Adding more bdew standard load profiles. --- .../io/csv/CsvLoadProfileMetaInformation.java | 56 ++++++ .../timeseries/BDEWLoadProfileFactory.java | 126 ++++++++++++ .../factory/timeseries/LoadProfileData.java | 16 ++ .../timeseries/LoadProfileFactory.java | 25 +++ .../EntityPersistenceNamingStrategy.java | 6 +- .../io/naming/FileNamingStrategy.java | 11 +- .../io/source/LoadProfileSource.java | 182 ++++++++---------- .../io/source/csv/CsvDataSource.java | 55 ++++-- .../io/source/csv/CsvLoadProfileSource.java | 105 ++++++++++ .../io/source/csv/CsvTimeSeriesSource.java | 2 +- .../java/edu/ie3/datamodel/models/Season.java | 82 ++++++++ .../models/profile/LoadProfileKey.java | 104 ---------- .../repetitive/BDEWLoadProfileEntry.java | 10 +- .../repetitive/BDEWLoadProfileInput.java | 87 --------- .../repetitive/BDEWLoadProfileTimeSeries.java | 80 ++++++++ .../repetitive/LoadProfileEntry.java | 2 +- .../repetitive/LoadProfileInput.java | 60 ++---- .../repetitive/LoadProfileTimeSeries.java | 88 +++++++++ .../repetitive/RepetitiveTimeSeries.java | 13 +- ...0_fa3894c1-25af-479c-8a40-1323bb9150a9.csv | 97 ++++++++++ ...1_177ebd2f-7174-4a14-b627-71a43fea1d20.csv | 97 ++++++++++ ...2_b0ad5ba2-0d5e-4c9b-b818-4079cebf59cc.csv | 97 ++++++++++ ...3_9b880468-309c-43c1-a3f4-26dd26266216.csv | 97 ++++++++++ ...4_b7682f84-d317-4f7d-a888-0a9502abd763.csv | 97 ++++++++++ ...5_ec51ae43-3849-4f14-8330-b2eea9414101.csv | 97 ++++++++++ ...6_d0606284-5f9e-4950-a579-e02b31fa9d1a.csv | 97 ++++++++++ ...0_de021c4d-bb57-4310-8f21-298e6af8b245.csv | 97 ++++++++++ ...0_42f31f05-8c3b-4949-87e4-3611cf485a82.csv | 97 ++++++++++ ...1_aa65260e-efd5-49af-961b-b0daf04fdeee.csv | 97 ++++++++++ ...2_9029deec-5f70-4647-96db-086f463d0e0d.csv | 97 ++++++++++ .../resources/load/standard_load_profiles.csv | 97 ---------- 31 files changed, 1803 insertions(+), 471 deletions(-) create mode 100644 src/main/java/edu/ie3/datamodel/io/csv/CsvLoadProfileMetaInformation.java create mode 100644 src/main/java/edu/ie3/datamodel/io/factory/timeseries/BDEWLoadProfileFactory.java create mode 100644 src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileData.java create mode 100644 src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java create mode 100644 src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java create mode 100644 src/main/java/edu/ie3/datamodel/models/Season.java delete mode 100644 src/main/java/edu/ie3/datamodel/models/profile/LoadProfileKey.java delete mode 100644 src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileInput.java create mode 100644 src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileTimeSeries.java create mode 100644 src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java create mode 100644 src/main/resources/load/lpts_g0_fa3894c1-25af-479c-8a40-1323bb9150a9.csv create mode 100644 src/main/resources/load/lpts_g1_177ebd2f-7174-4a14-b627-71a43fea1d20.csv create mode 100644 src/main/resources/load/lpts_g2_b0ad5ba2-0d5e-4c9b-b818-4079cebf59cc.csv create mode 100644 src/main/resources/load/lpts_g3_9b880468-309c-43c1-a3f4-26dd26266216.csv create mode 100644 src/main/resources/load/lpts_g4_b7682f84-d317-4f7d-a888-0a9502abd763.csv create mode 100644 src/main/resources/load/lpts_g5_ec51ae43-3849-4f14-8330-b2eea9414101.csv create mode 100644 src/main/resources/load/lpts_g6_d0606284-5f9e-4950-a579-e02b31fa9d1a.csv create mode 100644 src/main/resources/load/lpts_h0_de021c4d-bb57-4310-8f21-298e6af8b245.csv create mode 100644 src/main/resources/load/lpts_l0_42f31f05-8c3b-4949-87e4-3611cf485a82.csv create mode 100644 src/main/resources/load/lpts_l1_aa65260e-efd5-49af-961b-b0daf04fdeee.csv create mode 100644 src/main/resources/load/lpts_l2_9029deec-5f70-4647-96db-086f463d0e0d.csv delete mode 100644 src/main/resources/load/standard_load_profiles.csv diff --git a/src/main/java/edu/ie3/datamodel/io/csv/CsvLoadProfileMetaInformation.java b/src/main/java/edu/ie3/datamodel/io/csv/CsvLoadProfileMetaInformation.java new file mode 100644 index 000000000..8db0ef7fe --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/csv/CsvLoadProfileMetaInformation.java @@ -0,0 +1,56 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.io.csv; + +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; +import java.nio.file.Path; +import java.util.Objects; +import java.util.UUID; + +public class CsvLoadProfileMetaInformation extends LoadProfileTimeSeriesMetaInformation { + private final Path fullFilePath; + + public CsvLoadProfileMetaInformation(UUID uuid, String profile, Path fullFilePath) { + super(uuid, profile); + this.fullFilePath = fullFilePath; + } + + public CsvLoadProfileMetaInformation( + LoadProfileTimeSeriesMetaInformation metaInformation, Path fullFilePath) { + this(metaInformation.getUuid(), metaInformation.getProfile(), fullFilePath); + } + + public Path getFullFilePath() { + return fullFilePath; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof CsvLoadProfileMetaInformation that)) return false; + if (!super.equals(o)) return false; + return fullFilePath.equals(that.fullFilePath); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), fullFilePath); + } + + @Override + public String toString() { + return "CsvLoadProfileMetaInformation{" + + "uuid='" + + getUuid() + + '\'' + + ", profile='" + + getProfile() + + '\'' + + "fullFilePath=" + + fullFilePath + + '}'; + } +} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BDEWLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BDEWLoadProfileFactory.java new file mode 100644 index 000000000..8d767c8c3 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BDEWLoadProfileFactory.java @@ -0,0 +1,126 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.io.factory.timeseries; + +import static edu.ie3.util.quantities.PowerSystemUnits.KILOWATT; +import static java.time.DayOfWeek.*; + +import edu.ie3.datamodel.models.Season; +import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; +import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileEntry; +import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileTimeSeries; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; +import edu.ie3.datamodel.models.value.PValue; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.UUID; + +public class BDEWLoadProfileFactory + extends LoadProfileFactory { + public static final String SUMMER_WEEKDAY = "SuWd"; + public static final String SUMMER_SATURDAY = "SuSa"; + public static final String SUMMER_SUNDAY = "SuSu"; + public static final String WINTER_WEEKDAY = "WiWd"; + public static final String WINTER_SATURDAY = "WiSa"; + public static final String WINTER_SUNDAY = "WiSu"; + public static final String TRANSITION_WEEKDAY = "TrWd"; + public static final String TRANSITION_SATURDAY = "TrSa"; + public static final String TRANSITION_SUNDAY = "TrSu"; + + public BDEWLoadProfileFactory(Class valueClass) { + super(valueClass); + } + + @Override + protected List buildModel(LoadProfileData data) { + List entries = new ArrayList<>(); + int quarterHour = data.getInt(QUARTER_HOUR); + + /* summer */ + entries.add( + new BDEWLoadProfileEntry( + new PValue(data.getQuantity(SUMMER_WEEKDAY, KILOWATT)), + Season.SUMMER, + MONDAY, + quarterHour)); + entries.add( + new BDEWLoadProfileEntry( + new PValue(data.getQuantity(SUMMER_SATURDAY, KILOWATT)), + Season.SUMMER, + SATURDAY, + quarterHour)); + entries.add( + new BDEWLoadProfileEntry( + new PValue(data.getQuantity(SUMMER_SUNDAY, KILOWATT)), + Season.SUMMER, + SUNDAY, + quarterHour)); + + /* winter */ + entries.add( + new BDEWLoadProfileEntry( + new PValue(data.getQuantity(WINTER_WEEKDAY, KILOWATT)), + Season.WINTER, + MONDAY, + quarterHour)); + entries.add( + new BDEWLoadProfileEntry( + new PValue(data.getQuantity(WINTER_SATURDAY, KILOWATT)), + Season.WINTER, + SATURDAY, + quarterHour)); + entries.add( + new BDEWLoadProfileEntry( + new PValue(data.getQuantity(WINTER_SUNDAY, KILOWATT)), + Season.WINTER, + SUNDAY, + quarterHour)); + + /* transition */ + entries.add( + new BDEWLoadProfileEntry( + new PValue(data.getQuantity(TRANSITION_WEEKDAY, KILOWATT)), + Season.TRANSITION, + MONDAY, + quarterHour)); + entries.add( + new BDEWLoadProfileEntry( + new PValue(data.getQuantity(TRANSITION_SATURDAY, KILOWATT)), + Season.TRANSITION, + SATURDAY, + quarterHour)); + entries.add( + new BDEWLoadProfileEntry( + new PValue(data.getQuantity(TRANSITION_SUNDAY, KILOWATT)), + Season.TRANSITION, + SUNDAY, + quarterHour)); + + return entries; + } + + @Override + protected List> getFields(Class entityClass) { + return List.of( + newSet( + SUMMER_WEEKDAY, + SUMMER_SATURDAY, + SUMMER_SUNDAY, + WINTER_WEEKDAY, + WINTER_SATURDAY, + WINTER_SUNDAY, + TRANSITION_WEEKDAY, + TRANSITION_SATURDAY, + TRANSITION_SUNDAY)); + } + + @Override + public LoadProfileTimeSeries build( + UUID uuid, BdewStandardLoadProfile loadProfile, Set entries) { + return new BDEWLoadProfileTimeSeries(uuid, loadProfile, entries); + } +} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileData.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileData.java new file mode 100644 index 000000000..5e6c0c904 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileData.java @@ -0,0 +1,16 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.io.factory.timeseries; + +import edu.ie3.datamodel.io.factory.FactoryData; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; +import java.util.Map; + +public class LoadProfileData extends FactoryData { + public LoadProfileData(Map fieldsToAttributes, Class targetClass) { + super(fieldsToAttributes, targetClass); + } +} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java new file mode 100644 index 000000000..5b2a5e1ce --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java @@ -0,0 +1,25 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.io.factory.timeseries; + +import edu.ie3.datamodel.io.factory.Factory; +import edu.ie3.datamodel.models.profile.LoadProfile; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; +import java.util.List; +import java.util.Set; +import java.util.UUID; + +public abstract class LoadProfileFactory

+ extends Factory, List> { + public static final String QUARTER_HOUR = "quarterHour"; + + public LoadProfileFactory(Class valueClass) { + super(valueClass); + } + + public abstract LoadProfileTimeSeries build(UUID uuid, P loadProfile, Set entries); +} diff --git a/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java b/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java index 208fa0b81..a13ffdc03 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java @@ -17,7 +17,7 @@ import edu.ie3.datamodel.models.timeseries.TimeSeries; import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries; -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileInput; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; import edu.ie3.datamodel.models.value.*; import edu.ie3.util.StringUtils; import java.util.Optional; @@ -383,12 +383,12 @@ Optional getEntityName(T timeSeries) { logger.error("Unable to determine content of time series {}", timeSeries); return Optional.empty(); } - } else if (timeSeries instanceof LoadProfileInput loadProfileInput) { + } else if (timeSeries instanceof LoadProfileTimeSeries loadProfileInput) { return Optional.of( prefix .concat("lpts") .concat("_") - .concat(loadProfileInput.getType().getKey()) + .concat(loadProfileInput.getLoadProfile().getKey()) .concat("_") .concat(loadProfileInput.getUuid().toString()) .concat(suffix)); diff --git a/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java b/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java index 8aadbc0be..84a18283e 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java @@ -7,11 +7,12 @@ import edu.ie3.datamodel.io.IoUtil; import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; import edu.ie3.datamodel.models.Entity; import edu.ie3.datamodel.models.timeseries.TimeSeries; import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries; -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileInput; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; import edu.ie3.datamodel.models.value.Value; import edu.ie3.datamodel.utils.FileUtils; import java.nio.file.Path; @@ -180,7 +181,7 @@ public Pattern getIndividualTimeSeriesPattern() { * @return A load profile time series pattern */ public Pattern getLoadProfileTimeSeriesPattern() { - Optional subDirectory = fileHierarchy.getSubDirectory(LoadProfileInput.class); + Optional subDirectory = fileHierarchy.getSubDirectory(LoadProfileTimeSeries.class); if (subDirectory.isEmpty()) { return entityPersistenceNamingStrategy.getLoadProfileTimeSeriesPattern(); @@ -237,6 +238,12 @@ public IndividualTimeSeriesMetaInformation individualTimeSeriesMetaInformation(S removeFileNameEnding(fileName)); } + public LoadProfileTimeSeriesMetaInformation loadProfileTimeSeriesMetaInformation( + String fileName) { + return entityPersistenceNamingStrategy.loadProfileTimesSeriesMetaInformation( + removeFileNameEnding(fileName)); + } + public static String removeFileNameEnding(String fileName) { return fileName.replaceAll("(?:\\.[^.\\\\/\\s]{1,255}){1,2}$", ""); } diff --git a/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java index dc0b1d790..c4c0b5312 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java @@ -5,123 +5,99 @@ */ package edu.ie3.datamodel.io.source; -import static edu.ie3.util.quantities.PowerSystemUnits.KILOWATT; - +import edu.ie3.datamodel.exceptions.FactoryException; import edu.ie3.datamodel.exceptions.ParsingException; import edu.ie3.datamodel.exceptions.SourceException; -import edu.ie3.datamodel.exceptions.ValidationException; -import edu.ie3.datamodel.io.connectors.CsvFileConnector; +import edu.ie3.datamodel.io.csv.CsvLoadProfileMetaInformation; +import edu.ie3.datamodel.io.factory.timeseries.BDEWLoadProfileFactory; +import edu.ie3.datamodel.io.factory.timeseries.LoadProfileData; +import edu.ie3.datamodel.io.factory.timeseries.LoadProfileFactory; +import edu.ie3.datamodel.io.naming.FileNamingStrategy; +import edu.ie3.datamodel.io.source.csv.CsvDataSource; +import edu.ie3.datamodel.io.source.csv.CsvLoadProfileSource; import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; -import edu.ie3.datamodel.models.profile.LoadProfileKey; -import edu.ie3.datamodel.models.profile.LoadProfileKey.BDEWLoadProfileKey; +import edu.ie3.datamodel.models.profile.LoadProfile; import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileEntry; -import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileInput; -import edu.ie3.datamodel.models.value.PValue; +import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileTimeSeries; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; +import edu.ie3.datamodel.models.value.Value; import edu.ie3.datamodel.utils.Try; -import java.io.BufferedReader; -import java.io.IOException; import java.nio.file.Path; -import java.util.*; -import java.util.function.Function; -import java.util.stream.Collectors; -import tech.units.indriya.quantity.Quantities; +import java.time.ZonedDateTime; +import java.util.HashMap; +import java.util.List; +import java.util.Map; -public class LoadProfileSource extends EntitySource { +public abstract class LoadProfileSource

+ extends EntitySource { - private final Path bdewLoadProfilePath = Path.of("src", "main", "resources", "load"); + protected final Class entryClass; + protected final LoadProfileFactory entryFactory; - @Override - public void validate() throws ValidationException { - /* Nothing to do here */ + protected LoadProfileSource(Class entryClass, LoadProfileFactory entryFactory) { + this.entryClass = entryClass; + this.entryFactory = entryFactory; } - public Map getBDEWLoadProfiles() - throws SourceException { - CsvFileConnector connector = new CsvFileConnector(bdewLoadProfilePath); - - try (BufferedReader reader = connector.initReader(Path.of("standard_load_profiles"))) { - return parseBDEWStandardProfiles(reader); - } catch (IOException | ParsingException e) { - throw new SourceException("The bdew standard load profiles could not be loaded!", e); - } + /** + * Build a list of type {@code E}, whereas the underlying {@link Value} does not need any + * additional information. + * + * @param fieldToValues Mapping from field id to values + * @return {@link Try} of simple time based value + */ + protected Try, FactoryException> createEntries(Map fieldToValues) { + LoadProfileData factoryData = new LoadProfileData<>(fieldToValues, entryClass); + return entryFactory.get(factoryData); } - protected Map parseBDEWStandardProfiles( - BufferedReader reader) throws IOException, ParsingException, SourceException { - - Map>> dataMap = - readLoadProfile( - reader, - ",", - str -> Try.of(() -> LoadProfileKey.parseBDEWProfile(str), ParsingException.class)); - - return Arrays.stream(BdewStandardLoadProfile.values()) - .map( - profile -> { - Set entries = - dataMap.keySet().stream() - .filter(e -> e.profile() == profile) - .map(dataMap::get) - .flatMap(Collection::stream) - .map( - d -> - new BDEWLoadProfileEntry( - d.value, - d.profileKey.season(), - d.profileKey.dayOfWeek(), - d.quarterHour)) - .collect(Collectors.toSet()); - - return Map.entry(profile, new BDEWLoadProfileInput(profile, entries)); - }) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); - } - - private Map>> readLoadProfile( - BufferedReader reader, String csvSep, Function> keyExtractor) - throws IOException, SourceException, ParsingException { - List headline = Arrays.asList(reader.readLine().split(csvSep)); - - int quarterHourColumn = headline.indexOf("quarterHour"); - - if (quarterHourColumn < 0) { - throw new SourceException("There is no column for quarter hour values."); - } - - Map profileKeys = new HashMap<>(); - - for (int i = 0; i < headline.size(); i++) { - if (i != quarterHourColumn) { - profileKeys.put(i, keyExtractor.apply(headline.get(i)).getOrThrow()); + public abstract LoadProfileTimeSeries getTimeSeries(); + + /** + * Method to return all time keys after a given timestamp. + * + * @param time given time + * @return a list of time keys + */ + public abstract List getTimeKeysAfter(ZonedDateTime time); + + /** + * Method to read in the build-in {@link BdewStandardLoadProfile}s. + * + * @return a map: load profile to time series + * @throws SourceException if an exception occurred + */ + public static Map + readBDEWStandardLoadProfiles() throws SourceException { + Path bdewLoadProfilePath = Path.of("src", "main", "resources", "load"); + CsvDataSource dataSource = + new CsvDataSource(",", bdewLoadProfilePath, new FileNamingStrategy()); + + BdewStandardLoadProfile[] implemented = BdewStandardLoadProfile.values(); + Map loadProfileInputs = new HashMap<>(); + + try { + for (CsvLoadProfileMetaInformation metaInformation : + dataSource.getCsvLoadProfileMetaInformation(implemented).values()) { + BdewStandardLoadProfile profile = BdewStandardLoadProfile.get(metaInformation.getProfile()); + + Class entryClass = BDEWLoadProfileEntry.class; + + CsvLoadProfileSource source = + new CsvLoadProfileSource<>( + dataSource, + metaInformation, + entryClass, + profile, + new BDEWLoadProfileFactory(entryClass)); + + loadProfileInputs.put(profile, (BDEWLoadProfileTimeSeries) source.getTimeSeries()); } - } - return reader - .lines() - .map( - csvRow -> { - List elements = Arrays.asList(csvRow.split(csvSep)); - int quarterHour = Integer.parseInt(elements.get(quarterHourColumn)); - - List> loadProfileToValue = new ArrayList<>(); - - for (int i = 0; i < elements.size(); i++) { - if (i != quarterHourColumn) { - loadProfileToValue.add( - new LoadProfileData<>( - profileKeys.get(i), - quarterHour, - new PValue( - Quantities.getQuantity( - Double.parseDouble(elements.get(i)), KILOWATT)))); - } - } - return loadProfileToValue; - }) - .flatMap(Collection::stream) - .collect(Collectors.groupingBy(LoadProfileData::profileKey)); + return loadProfileInputs; + } catch (ParsingException e) { + throw new SourceException("Unable to read standard load profiles due to: ", e); + } } - - public record LoadProfileData( - T profileKey, int quarterHour, PValue value) {} } diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java index 3232f2a24..ef77cbf69 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java @@ -8,12 +8,15 @@ import edu.ie3.datamodel.exceptions.SourceException; import edu.ie3.datamodel.io.connectors.CsvFileConnector; import edu.ie3.datamodel.io.csv.CsvIndividualTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.csv.CsvLoadProfileMetaInformation; import edu.ie3.datamodel.io.naming.FileNamingStrategy; import edu.ie3.datamodel.io.naming.TimeSeriesMetaInformation; import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme; import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; import edu.ie3.datamodel.io.source.DataSource; import edu.ie3.datamodel.models.Entity; +import edu.ie3.datamodel.models.profile.LoadProfile; import edu.ie3.datamodel.utils.Try; import edu.ie3.datamodel.utils.Try.Failure; import edu.ie3.datamodel.utils.Try.Success; @@ -25,6 +28,7 @@ import java.nio.file.Path; import java.util.*; import java.util.function.Function; +import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.IntStream; import java.util.stream.Stream; @@ -102,7 +106,8 @@ public FileNamingStrategy getNamingStrategy() { */ public Map getCsvIndividualTimeSeriesMetaInformation(final ColumnScheme... columnSchemes) { - return getIndividualTimeSeriesFilePaths().parallelStream() + return getTimeSeriesFilePaths(fileNamingStrategy.getIndividualTimeSeriesPattern()) + .parallelStream() .map( filePath -> { /* Extract meta information from file path and enhance it with the file path itself */ @@ -120,13 +125,41 @@ public FileNamingStrategy getNamingStrategy() { .collect(Collectors.toMap(TimeSeriesMetaInformation::getUuid, Function.identity())); } + /** + * Receive the information for specific load profile time series. They are given back mapped to + * their uuid. + * + * @return A mapping from uuid to the load profile time series meta information + */ + public Map getCsvLoadProfileMetaInformation( + LoadProfile... profiles) { + return getTimeSeriesFilePaths(fileNamingStrategy.getLoadProfileTimeSeriesPattern()) + .parallelStream() + .map( + filePath -> { + /* Extract meta information from file path and enhance it with the file path itself */ + LoadProfileTimeSeriesMetaInformation metaInformation = + fileNamingStrategy.loadProfileTimeSeriesMetaInformation(filePath.toString()); + return new CsvLoadProfileMetaInformation( + metaInformation, FileNamingStrategy.removeFileNameEnding(filePath.getFileName())); + }) + .filter( + metaInformation -> + profiles == null + || profiles.length == 0 + || Stream.of(profiles) + .anyMatch(profile -> profile.getKey().equals(metaInformation.getProfile()))) + .collect(Collectors.toMap(TimeSeriesMetaInformation::getUuid, Function.identity())); + } + /** * Returns a set of relative paths strings to time series files, with respect to the base folder * path * + * @param pattern for matching the time series * @return A set of relative paths to time series files, with respect to the base folder path */ - protected Set getIndividualTimeSeriesFilePaths() { + protected Set getTimeSeriesFilePaths(Pattern pattern) { Path baseDirectory = connector.getBaseDirectory(); try (Stream pathStream = Files.walk(baseDirectory)) { return pathStream @@ -135,10 +168,7 @@ protected Set getIndividualTimeSeriesFilePaths() { path -> { Path withoutEnding = Path.of(FileNamingStrategy.removeFileNameEnding(path.toString())); - return fileNamingStrategy - .getIndividualTimeSeriesPattern() - .matcher(withoutEnding.toString()) - .matches(); + return pattern.matcher(withoutEnding.toString()).matches(); }) .collect(Collectors.toSet()); } catch (IOException e) { @@ -228,8 +258,7 @@ protected String[] parseCsvRow(String csvRow, String csvSep) { protected Try>, SourceException> buildStreamWithFieldsToAttributesMap( Class entityClass, boolean allowFileNotExisting) { return getFilePath(entityClass) - .flatMap( - path -> buildStreamWithFieldsToAttributesMap(entityClass, path, allowFileNotExisting)); + .flatMap(path -> buildStreamWithFieldsToAttributesMap(path, allowFileNotExisting)); } /** @@ -237,14 +266,12 @@ protected Try>, SourceException> buildStreamWithField * of (fieldName to fieldValue) mapping where each map represents one row of the .csv file. Since * the returning stream is a parallel stream, the order of the elements cannot be guaranteed. * - * @param entityClass the entity class that should be build * @param filePath the path of the file to read * @return a try containing either a parallel stream of maps, where each map represents one row of * the csv file with the mapping (fieldName to fieldValue) or an exception */ - protected - Try>, SourceException> buildStreamWithFieldsToAttributesMap( - Class entityClass, Path filePath, boolean allowFileNotExisting) { + protected Try>, SourceException> buildStreamWithFieldsToAttributesMap( + Path filePath, boolean allowFileNotExisting) { try (BufferedReader reader = connector.initReader(filePath)) { final String[] headline = parseCsvRow(reader.readLine(), csvSep); @@ -261,9 +288,7 @@ Try>, SourceException> buildStreamWithFieldsToAttribu return Failure.of(new SourceException("Unable to find file '" + filePath + "'.", e)); } } catch (IOException e) { - return Failure.of( - new SourceException( - "Cannot read file to build entity '" + entityClass.getSimpleName() + "'", e)); + return Failure.of(new SourceException("Cannot read file '" + filePath + "'.", e)); } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java new file mode 100644 index 000000000..9ef9ff656 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java @@ -0,0 +1,105 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.io.source.csv; + +import edu.ie3.datamodel.exceptions.FactoryException; +import edu.ie3.datamodel.exceptions.SourceException; +import edu.ie3.datamodel.exceptions.ValidationException; +import edu.ie3.datamodel.io.csv.CsvLoadProfileMetaInformation; +import edu.ie3.datamodel.io.factory.timeseries.LoadProfileFactory; +import edu.ie3.datamodel.io.source.LoadProfileSource; +import edu.ie3.datamodel.models.profile.LoadProfile; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; +import edu.ie3.datamodel.utils.Try; +import java.nio.file.Path; +import java.time.ZonedDateTime; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * Source that is capable of providing information around load profile time series from csv files. + */ +public class CsvLoadProfileSource

+ extends LoadProfileSource { + private final LoadProfileTimeSeries loadProfileTimeSeries; + private final CsvDataSource dataSource; + private final Path filePath; + + public CsvLoadProfileSource( + CsvDataSource source, + CsvLoadProfileMetaInformation metaInformation, + Class entryClass, + P loadProfile, + LoadProfileFactory entryFactory) { + super(entryClass, entryFactory); + this.dataSource = source; + this.filePath = metaInformation.getFullFilePath(); + + /* Read in the full time series */ + try { + this.loadProfileTimeSeries = + buildLoadProfileTimeSeries( + metaInformation.getUuid(), filePath, loadProfile, this::createEntries); + } catch (SourceException e) { + throw new IllegalArgumentException( + "Unable to obtain time series with UUID '" + + metaInformation.getUuid() + + "'. Please check arguments!", + e); + } + } + + @Override + public void validate() throws ValidationException { + validate(entryClass, () -> dataSource.getSourceFields(filePath), entryFactory); + } + + @Override + public LoadProfileTimeSeries getTimeSeries() { + return loadProfileTimeSeries; + } + + @Override + public List getTimeKeysAfter(ZonedDateTime time) { + return loadProfileTimeSeries.getTimeKeysAfter(time); + } + + // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- + + /** + * Attempts to read a load profile time series with given unique identifier and file path. Single + * entries are obtained entries with the help of {@code fieldToValueFunction}. If the file does + * not exist, an empty Stream is returned. + * + * @param timeSeriesUuid unique identifier of the time series + * @param filePath path to the file to read + * @param fieldToValueFunction function, that is able to transfer a mapping (from field to value) + * onto a specific instance of the targeted entry class + * @throws SourceException If the file cannot be read properly + * @return an individual time series + */ + protected LoadProfileTimeSeries buildLoadProfileTimeSeries( + UUID timeSeriesUuid, + Path filePath, + P loadProfile, + Function, Try, FactoryException>> fieldToValueFunction) + throws SourceException { + Set entries = + dataSource + .buildStreamWithFieldsToAttributesMap(filePath, false) + .flatMap( + stream -> + Try.scanStream(stream.map(fieldToValueFunction), "LoadProfileEntry") + .transformF(SourceException::new)) + .getOrThrow() + .flatMap(Collection::stream) + .collect(Collectors.toSet()); + + return entryFactory.build(timeSeriesUuid, loadProfile, entries); + } +} diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesSource.java index 1bbab427a..8a8b5e341 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesSource.java @@ -154,7 +154,7 @@ protected IndividualTimeSeries buildIndividualTimeSeries( throws SourceException { Try>, SourceException> timeBasedValues = dataSource - .buildStreamWithFieldsToAttributesMap(TimeBasedValue.class, filePath, false) + .buildStreamWithFieldsToAttributesMap(filePath, false) .flatMap( stream -> Try.scanStream(stream.map(fieldToValueFunction), "TimeBasedValue") diff --git a/src/main/java/edu/ie3/datamodel/models/Season.java b/src/main/java/edu/ie3/datamodel/models/Season.java new file mode 100644 index 000000000..286dcf6af --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/models/Season.java @@ -0,0 +1,82 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.models; + +import edu.ie3.datamodel.exceptions.ParsingException; +import java.time.ZonedDateTime; + +public enum Season { + WINTER("Wi"), + SUMMER("Su"), + TRANSITION("Tr"); + + private final String key; + + Season(String key) { + this.key = key.toLowerCase(); + } + + public static Season parse(String key) throws ParsingException { + return switch (key) { + case "Wi" -> WINTER; + case "Su" -> SUMMER; + case "Tr" -> TRANSITION; + default -> throw new ParsingException("There is no season for key:" + key); + }; + } + + /** + * Creates a season from given time + * + * @param time the time + * @return a season + */ + public static Season get(ZonedDateTime time) { + int day = time.getDayOfMonth(); + + // winter: 1.11.-20.03. + // summer: 15.05.-14.09. + // transition: 21.03.-14.05. and + // 15.09.-31.10. + // (VDEW handbook) + + return switch (time.getMonth()) { + case NOVEMBER, DECEMBER, JANUARY, FEBRUARY -> WINTER; + case MARCH -> { + if (day <= 20) { + yield WINTER; + } else { + yield TRANSITION; + } + } + case MAY -> { + if (day >= 15) { + yield SUMMER; + } else { + yield TRANSITION; + } + } + case JUNE, JULY, AUGUST -> SUMMER; + case SEPTEMBER -> { + if (day <= 14) { + yield SUMMER; + } else { + yield TRANSITION; + } + } + default -> TRANSITION; + }; + } + + public String getKey() { + return key; + } + + @Override + public String toString() { + return "Season{" + "key='" + key + '\'' + '}'; + } +} diff --git a/src/main/java/edu/ie3/datamodel/models/profile/LoadProfileKey.java b/src/main/java/edu/ie3/datamodel/models/profile/LoadProfileKey.java deleted file mode 100644 index b11157eca..000000000 --- a/src/main/java/edu/ie3/datamodel/models/profile/LoadProfileKey.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * © 2024. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.models.profile; - -import edu.ie3.datamodel.exceptions.ParsingException; -import java.time.DayOfWeek; -import java.time.ZonedDateTime; - -public interface LoadProfileKey { - - static BDEWLoadProfileKey parseBDEWProfile(String key) throws ParsingException { - String profile = key.substring(0, 2); - String season = key.substring(2, 4); - String dayString = key.substring(4, 6); - - DayOfWeek day = - switch (dayString) { - case "Sa" -> DayOfWeek.SATURDAY; - case "Su" -> DayOfWeek.SUNDAY; - default -> DayOfWeek.MONDAY; - }; - - return new BDEWLoadProfileKey(BdewStandardLoadProfile.get(profile), Season.parse(season), day); - } - - record BDEWLoadProfileKey(LoadProfile profile, Season season, DayOfWeek dayOfWeek) - implements LoadProfileKey {} - - enum Season { - WINTER("Wi"), - SUMMER("Su"), - TRANSITION("Tr"); - - private final String key; - - Season(String key) { - this.key = key.toLowerCase(); - } - - public static Season parse(String key) throws ParsingException { - return switch (key) { - case "Wi" -> WINTER; - case "Su" -> SUMMER; - case "Tr" -> TRANSITION; - default -> throw new ParsingException("There is no season for key:" + key); - }; - } - - /** - * Creates a season from given time - * - * @param time the time - * @return a season - */ - public static Season get(ZonedDateTime time) { - int day = time.getDayOfMonth(); - - // winter: 1.11.-20.03. - // summer: 15.05.-14.09. - // transition: 21.03.-14.05. and - // 15.09.-31.10. - // (VDEW handbook) - - return switch (time.getMonth()) { - case NOVEMBER, DECEMBER, JANUARY, FEBRUARY -> WINTER; - case MARCH -> { - if (day <= 20) { - yield WINTER; - } else { - yield TRANSITION; - } - } - case MAY -> { - if (day >= 15) { - yield SUMMER; - } else { - yield TRANSITION; - } - } - case JUNE, JULY, AUGUST -> SUMMER; - case SEPTEMBER -> { - if (day <= 14) { - yield SUMMER; - } else { - yield TRANSITION; - } - } - default -> TRANSITION; - }; - } - - public String getKey() { - return key; - } - - @Override - public String toString() { - return "Season{" + "key='" + key + '\'' + '}'; - } - } -} diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileEntry.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileEntry.java index 556323071..049c30e97 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileEntry.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileEntry.java @@ -5,22 +5,22 @@ */ package edu.ie3.datamodel.models.timeseries.repetitive; -import edu.ie3.datamodel.models.profile.LoadProfileKey; +import edu.ie3.datamodel.models.Season; import edu.ie3.datamodel.models.value.PValue; import java.time.DayOfWeek; import java.util.Objects; -/** Unique entry to a {@link BDEWLoadProfileInput} */ +/** Unique entry to a {@link BDEWLoadProfileTimeSeries} */ public class BDEWLoadProfileEntry extends LoadProfileEntry { - private final LoadProfileKey.Season season; + private final Season season; public BDEWLoadProfileEntry( - PValue value, LoadProfileKey.Season season, DayOfWeek dayOfWeek, int quarterHourOfDay) { + PValue value, Season season, DayOfWeek dayOfWeek, int quarterHourOfDay) { super(value, dayOfWeek, quarterHourOfDay); this.season = season; } - public LoadProfileKey.Season getSeason() { + public Season getSeason() { return season; } diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileInput.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileInput.java deleted file mode 100644 index fc2c170f5..000000000 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileInput.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * © 2024. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.models.timeseries.repetitive; - -import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; -import edu.ie3.datamodel.models.profile.LoadProfileKey; -import edu.ie3.datamodel.models.value.PValue; -import java.time.DayOfWeek; -import java.time.ZonedDateTime; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.UUID; -import java.util.stream.Collectors; - -public class BDEWLoadProfileInput extends RepetitiveTimeSeries { - private final BdewStandardLoadProfile loadProfile; - private final Map> valueMapping; - - public BDEWLoadProfileInput( - BdewStandardLoadProfile loadProfile, Set values) { - super(UUID.randomUUID(), values); - this.loadProfile = loadProfile; - - this.valueMapping = - values.stream() - .collect( - Collectors.groupingBy( - e -> new Key(e.getSeason(), e.getDayOfWeek()), - Collectors.toMap( - LoadProfileEntry::getQuarterHourOfDay, LoadProfileEntry::getValue))); - } - - @Override - public PValue calc(ZonedDateTime time) { - Key key = fromTime(time); - int quarterHour = time.getHour() * 4 + time.getMinute() / 15; - - return valueMapping.get(key).get(quarterHour); - } - - public BdewStandardLoadProfile getLoadProfile() { - return loadProfile; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; - BDEWLoadProfileInput that = (BDEWLoadProfileInput) o; - return loadProfile.equals(that.loadProfile) && valueMapping.equals(that.valueMapping); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), loadProfile, valueMapping); - } - - @Override - public String toString() { - return "BDEWLoadProfileInput{" - + "loadProfile=" - + loadProfile - + ", valueMapping=" - + valueMapping - + '}'; - } - - private Key fromTime(ZonedDateTime time) { - LoadProfileKey.Season season = LoadProfileKey.Season.get(time); - - DayOfWeek day = - switch (time.getDayOfWeek()) { - case SATURDAY -> DayOfWeek.SATURDAY; - case SUNDAY -> DayOfWeek.SUNDAY; - default -> DayOfWeek.MONDAY; - }; - - return new Key(season, day); - } - - private record Key(LoadProfileKey.Season season, DayOfWeek dayOfWeek) {} -} diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileTimeSeries.java new file mode 100644 index 000000000..6df6a92f0 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileTimeSeries.java @@ -0,0 +1,80 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.models.timeseries.repetitive; + +import edu.ie3.datamodel.models.Season; +import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; +import edu.ie3.datamodel.models.value.PValue; +import java.time.DayOfWeek; +import java.time.ZonedDateTime; +import java.util.Objects; +import java.util.Set; +import java.util.UUID; + +/** + * Describes a bdew load profile time series with repetitive values that can be calculated from a + * pattern + */ +public class BDEWLoadProfileTimeSeries extends LoadProfileTimeSeries { + + public BDEWLoadProfileTimeSeries( + UUID uuid, BdewStandardLoadProfile loadProfile, Set values) { + super(uuid, values, loadProfile, e -> new BdewKey(e.getSeason(), e.getDayOfWeek())); + } + + @Override + public PValue calc(ZonedDateTime time) { + if (getLoadProfile() == BdewStandardLoadProfile.H0) { + PValue value = super.calc(time); + + // TODO: Add factor calculation + + return value; + } else { + return super.calc(time); + } + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + return super.equals(o); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode()); + } + + @Override + public String toString() { + return "BDEWLoadProfileInput{" + + "uuid=" + + getUuid() + + "loadProfile=" + + getLoadProfile() + + ", valueMapping=" + + getValueMapping() + + '}'; + } + + @Override + protected LoadProfileKey fromTime(ZonedDateTime time) { + Season season = Season.get(time); + + DayOfWeek day = + switch (time.getDayOfWeek()) { + case SATURDAY -> DayOfWeek.SATURDAY; + case SUNDAY -> DayOfWeek.SUNDAY; + default -> DayOfWeek.MONDAY; + }; + + return new BdewKey(season, day); + } + + private record BdewKey(Season season, DayOfWeek dayOfWeek) implements LoadProfileKey {} +} diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileEntry.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileEntry.java index 2e0359967..29a62684c 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileEntry.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileEntry.java @@ -10,7 +10,7 @@ import java.time.DayOfWeek; import java.util.Objects; -/** Unique entry to a {@link LoadProfileInput} */ +/** Unique entry to a {@link LoadProfileTimeSeries} */ public class LoadProfileEntry extends TimeSeriesEntry { private final DayOfWeek dayOfWeek; private final int quarterHourOfDay; diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileInput.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileInput.java index 43f228967..e08f69195 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileInput.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileInput.java @@ -6,30 +6,17 @@ package edu.ie3.datamodel.models.timeseries.repetitive; import edu.ie3.datamodel.models.profile.StandardLoadProfile; -import edu.ie3.datamodel.models.value.PValue; import java.time.DayOfWeek; import java.time.ZonedDateTime; -import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.UUID; -import java.util.stream.Collectors; // TODO This is a sample implementation, please implement a real scenario -public class LoadProfileInput extends RepetitiveTimeSeries { - private final StandardLoadProfile type; - private final Map> dayOfWeekToHourlyValues; - +@Deprecated +public class LoadProfileInput extends LoadProfileTimeSeries { public LoadProfileInput(UUID uuid, StandardLoadProfile type, Set values) { - super(uuid, values); - this.type = type; - this.dayOfWeekToHourlyValues = - getEntries().stream() - .collect( - Collectors.groupingBy( - LoadProfileEntry::getDayOfWeek, - Collectors.toMap( - LoadProfileEntry::getQuarterHourOfDay, LoadProfileEntry::getValue))); + super(uuid, values, type, e -> new Key(e.getDayOfWeek())); } public LoadProfileInput(StandardLoadProfile type, Set values) { @@ -37,54 +24,33 @@ public LoadProfileInput(StandardLoadProfile type, Set values) } @Override - public PValue calc(ZonedDateTime time) { - // dummy value - return dayOfWeekToHourlyValues.get(time.getDayOfWeek()).get(time.getHour()); - } - - @Override - protected Optional getPreviousDateTime(ZonedDateTime time) { - // dummy value - return Optional.of(time.minusHours(1)); - } - - @Override - protected Optional getNextDateTime(ZonedDateTime time) { - // dummy value - return Optional.of(time.plusHours(1)); - } - - @Override - public List getTimeKeysAfter(ZonedDateTime time) { - // dummy value - return List.of(time.plusHours(1)); - } - - public StandardLoadProfile getType() { - return type; + protected LoadProfileKey fromTime(ZonedDateTime time) { + return new Key(time.getDayOfWeek()); } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; - LoadProfileInput that = (LoadProfileInput) o; - return type.equals(that.type) && dayOfWeekToHourlyValues.equals(that.dayOfWeekToHourlyValues); + return super.equals(o); } @Override public int hashCode() { - return Objects.hash(super.hashCode(), type, dayOfWeekToHourlyValues); + return Objects.hash(super.hashCode()); } @Override public String toString() { return "LoadProfileInput{" + + "uuid=" + + getUuid() + "type=" - + type + + getLoadProfile() + ", dayOfWeekToHourlyValues=" - + dayOfWeekToHourlyValues + + getValueMapping() + '}'; } + + private record Key(DayOfWeek dayOfWeek) implements LoadProfileKey {} } diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java new file mode 100644 index 000000000..d6344fd0b --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java @@ -0,0 +1,88 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.models.timeseries.repetitive; + +import edu.ie3.datamodel.models.profile.LoadProfile; +import edu.ie3.datamodel.models.value.PValue; +import java.time.ZonedDateTime; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.UUID; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * Describes a load profile time series with repetitive values that can be calculated from a pattern + */ +public abstract class LoadProfileTimeSeries + extends RepetitiveTimeSeries { + private final LoadProfile loadProfile; + private final Map> valueMapping; + + public LoadProfileTimeSeries( + UUID uuid, Set entries, LoadProfile loadProfile, Function extractor) { + super(uuid, entries); + this.loadProfile = loadProfile; + + this.valueMapping = + entries.stream() + .collect( + Collectors.groupingBy( + extractor, + Collectors.toMap( + LoadProfileEntry::getQuarterHourOfDay, LoadProfileEntry::getValue))); + } + + /** Returns the {@link LoadProfile}. */ + public LoadProfile getLoadProfile() { + return loadProfile; + } + + /** Returns the value mapping. */ + protected Map> getValueMapping() { + return valueMapping; + } + + @Override + protected PValue calc(ZonedDateTime time) { + LoadProfileKey key = fromTime(time); + int quarterHour = time.getHour() * 4 + time.getMinute() / 15; + + return valueMapping.get(key).get(quarterHour); + } + + protected abstract LoadProfileKey fromTime(ZonedDateTime time); + + public interface LoadProfileKey {} + + @Override + @SuppressWarnings("unchecked") + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + LoadProfileTimeSeries that = (LoadProfileTimeSeries) o; + return loadProfile.equals(that.loadProfile) && valueMapping.equals(that.valueMapping); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode()); + } + + @Override + public String toString() { + return "LoadProfileTimeSeries{" + + "uuid=" + + getUuid() + + "loadProfile=" + + getLoadProfile() + + ", valueMapping=" + + getValueMapping() + + '}'; + } +} diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RepetitiveTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RepetitiveTimeSeries.java index c488098ab..3a5c01209 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RepetitiveTimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RepetitiveTimeSeries.java @@ -9,16 +9,11 @@ import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; import edu.ie3.datamodel.models.value.Value; import java.time.ZonedDateTime; -import java.util.Optional; -import java.util.Set; -import java.util.UUID; +import java.util.*; /** Describes a TimeSeries with repetitive values that can be calculated from a pattern */ public abstract class RepetitiveTimeSeries, V extends Value> extends TimeSeries { - protected RepetitiveTimeSeries(Set entries) { - super(entries); - } protected RepetitiveTimeSeries(UUID uuid, Set entries) { super(uuid, entries); @@ -46,4 +41,10 @@ protected Optional getPreviousDateTime(ZonedDateTime time) { protected Optional getNextDateTime(ZonedDateTime time) { return Optional.of(time.plusHours(1)); } + + @Override + public List getTimeKeysAfter(ZonedDateTime time) { + // dummy value + return getNextDateTime(time).map(List::of).orElseGet(Collections::emptyList); + } } diff --git a/src/main/resources/load/lpts_g0_fa3894c1-25af-479c-8a40-1323bb9150a9.csv b/src/main/resources/load/lpts_g0_fa3894c1-25af-479c-8a40-1323bb9150a9.csv new file mode 100644 index 000000000..386b6012c --- /dev/null +++ b/src/main/resources/load/lpts_g0_fa3894c1-25af-479c-8a40-1323bb9150a9.csv @@ -0,0 +1,97 @@ +SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour +74.6,68.8,71.5,75.8,68.3,73.0,70.0,63.2,65.5,0 +76.2,67.4,69.0,76.7,66.5,70.1,73.0,61.0,62.6,1 +77.7,65.7,66.3,77.7,64.6,67.1,75.9,58.9,59.6,2 +78.5,63.5,63.5,78.5,62.6,64.5,77.6,57.0,57.0,3 +77.9,60.9,60.9,78.5,60.3,62.3,77.1,55.3,54.8,4 +76.3,58.0,58.6,77.8,57.9,60.6,75.0,53.7,53.1,5 +74.1,55.4,56.6,76.6,55.5,59.2,72.1,52.1,51.7,6 +71.9,53.3,55.1,74.7,53.3,57.9,69.1,50.5,50.5,7 +70.2,52.0,54.2,72.6,51.2,56.7,66.8,48.7,49.4,8 +68.9,51.4,53.7,70.4,49.5,55.6,65.1,46.9,48.5,9 +67.9,51.0,53.4,68.5,48.0,54.7,64.1,45.2,47.9,10 +67.3,50.5,53.3,67.3,46.7,54.2,63.5,43.9,47.7,11 +66.9,49.6,53.1,67.0,45.7,54.1,63.4,43.0,47.9,12 +66.7,48.5,53.2,67.5,44.9,54.6,63.6,42.5,48.7,13 +66.8,47.5,54.1,68.3,44.3,55.8,64.0,42.2,50.2,14 +67.3,46.7,56.1,69.1,43.9,57.9,64.5,42.0,52.3,15 +68.0,46.4,59.4,69.7,43.6,60.9,65.0,41.9,55.1,16 +69.0,46.5,63.3,70.1,43.5,64.4,65.6,41.8,58.2,17 +70.0,46.6,67.2,70.5,43.6,68.0,66.3,41.8,61.2,18 +71.0,46.7,70.1,71.0,43.9,71.0,67.3,42.0,63.5,19 +71.8,46.6,71.4,71.8,44.5,73.2,68.5,42.6,65.0,20 +72.4,46.3,71.6,72.5,45.1,74.7,69.9,43.4,66.0,21 +72.8,46.0,71.2,73.0,45.6,75.7,71.4,44.4,67.1,22 +72.9,45.8,71.0,72.9,45.8,76.6,72.9,45.8,69.1,23 +73.0,45.9,71.5,72.2,45.6,77.7,74.4,47.4,72.5,24 +73.9,46.3,73.1,72.2,45.3,79.3,76.8,49.0,77.1,25 +77.0,47.2,75.9,74.4,45.2,81.9,81.0,50.4,82.9,26 +83.2,48.6,80.4,80.4,45.8,86.0,87.8,51.4,89.7,27 +93.3,50.5,86.6,91.0,47.2,91.9,98.0,51.8,97.6,28 +106.2,52.6,95.1,105.2,49.1,100.4,110.7,51.7,107.3,29 +120.5,54.3,106.3,121.2,51.0,111.9,124.8,51.2,119.9,30 +134.5,55.1,120.5,137.4,52.3,127.1,139.2,50.5,136.4,31 +147.2,54.8,137.8,152.1,52.8,145.9,153.0,49.6,157.1,32 +157.8,53.9,156.3,164.9,52.9,166.2,165.4,49.0,179.5,33 +166.2,53.2,173.4,175.1,53.1,185.2,175.9,48.8,200.5,34 +171.9,53.3,186.9,182.2,54.2,200.0,184.1,49.5,216.8,35 +175.0,54.7,195.0,186.1,56.4,208.5,189.5,51.3,226.2,36 +176.1,57.2,198.7,187.5,59.5,212.1,192.8,53.8,230.0,37 +176.3,60.0,199.8,187.7,62.7,212.6,195.1,56.8,230.4,38 +176.6,62.6,200.0,187.8,65.4,212.1,197.1,59.8,229.9,39 +177.7,64.5,200.6,188.7,67.2,212.2,199.8,62.6,230.0,40 +179.4,65.9,201.9,190.1,68.5,213.1,202.7,65.1,231.2,41 +181.3,67.0,203.6,191.9,69.6,214.6,205.4,67.2,233.0,42 +183.1,68.2,205.6,193.4,71.0,216.8,207.4,69.1,235.5,43 +184.4,69.7,207.6,194.5,73.1,219.2,208.4,70.8,238.1,44 +185.2,71.4,209.1,195.1,75.6,221.2,208.3,72.2,240.0,45 +185.3,73.2,209.6,195.3,78.2,222.0,207.4,73.5,240.4,46 +185.0,74.7,208.4,195.3,80.4,220.5,205.6,74.7,238.3,47 +184.1,76.0,205.1,194.9,81.9,216.3,203.0,76.0,233.0,48 +182.4,77.0,200.0,193.9,82.8,209.8,199.7,77.3,225.1,49 +179.7,77.8,193.8,191.7,83.2,201.9,195.6,78.4,215.7,50 +175.7,78.5,186.9,187.8,83.2,193.4,190.6,79.4,205.6,51 +170.1,79.1,179.9,181.9,82.8,185.0,184.6,80.1,195.7,52 +163.1,79.5,173.4,174.1,82.1,177.4,177.5,80.5,186.7,53 +154.6,79.3,168.1,164.8,80.9,170.9,168.9,80.3,179.2,54 +144.8,78.5,164.4,154.2,79.4,166.3,158.8,79.4,173.8,55 +133.9,76.8,163.0,142.6,77.5,163.9,147.2,77.8,171.0,56 +122.7,74.4,163.5,130.9,75.3,163.6,134.8,75.7,170.7,57 +112.0,71.8,165.4,119.8,73.1,165.1,122.7,73.4,172.7,58 +102.8,69.1,168.2,110.3,71.0,168.2,112.1,71.0,176.6,59 +95.7,66.8,171.5,102.7,69.2,172.5,103.8,68.9,182.1,60 +90.4,64.8,174.6,96.9,67.6,177.3,97.4,67.0,188.2,61 +86.4,63.1,177.2,92.1,66.1,181.4,92.6,65.2,193.9,62 +83.2,61.7,178.5,87.8,64.5,184.1,88.8,63.5,198.1,63 +80.3,60.4,178.2,83.6,62.8,184.5,85.6,62.0,200.1,64 +77.8,59.7,176.8,79.7,61.5,183.6,83.3,61.2,200.7,65 +75.9,59.7,175.1,76.9,61.2,182.1,82.4,61.8,200.9,66 +74.7,60.7,173.8,75.7,62.6,181.3,83.2,64.5,201.8,67 +74.4,63.0,173.2,76.5,65.9,181.5,85.8,69.5,204.0,68 +74.8,66.0,172.4,78.6,70.4,181.7,89.5,76.0,205.8,69 +75.6,69.2,170.2,81.1,75.0,180.0,93.4,82.6,205.5,70 +76.6,71.9,165.4,83.2,78.5,174.7,96.2,87.8,200.9,71 +77.6,73.9,157.1,84.1,80.1,164.8,97.4,90.8,190.7,72 +78.5,75.1,146.1,84.3,80.4,151.5,97.4,92.1,176.6,73 +79.1,76.0,133.8,84.1,80.2,137.0,96.8,92.3,160.5,74 +79.4,76.6,121.5,84.1,80.4,123.3,96.2,92.5,144.8,75 +79.4,77.3,110.1,84.7,81.4,112.1,96.3,93.1,131.3,76 +79.4,78.2,100.5,85.8,83.1,103.4,96.8,94.0,120.1,77 +79.6,79.2,93.2,87.3,85.1,97.3,97.2,94.6,111.3,78 +80.4,80.4,88.8,88.8,86.9,93.4,97.2,94.4,104.6,79 +81.9,81.6,87.4,90.1,88.1,91.6,96.3,93.0,100.0,80 +83.9,82.9,88.1,91.2,88.7,91.1,94.8,90.8,96.7,81 +85.7,83.8,89.6,91.7,88.6,91.1,92.8,88.0,94.1,82 +86.9,84.1,90.6,91.6,87.8,90.6,90.6,85.0,91.6,83 +87.0,83.7,90.2,90.6,86.4,89.2,88.5,82.1,88.5,84 +86.3,82.7,88.5,89.0,84.4,87.2,86.4,79.4,85.2,85 +84.9,81.2,86.3,87.1,82.0,85.0,84.3,76.9,82.1,86 +83.2,79.4,84.1,85.0,79.4,83.2,82.2,74.7,79.4,87 +81.3,77.5,82.4,83.1,76.7,82.1,80.1,72.8,77.6,88 +79.3,75.5,81.2,81.2,74.1,81.7,78.0,71.1,76.4,89 +77.4,73.3,80.3,79.4,71.5,81.6,75.9,69.3,75.6,90 +75.7,71.0,79.4,77.6,69.1,81.3,73.8,67.3,74.7,91 +74.1,68.6,78.4,75.7,67.0,80.6,71.7,65.0,73.7,92 +72.7,66.4,77.2,73.8,65.3,79.5,69.7,62.6,72.3,93 +71.3,64.6,75.7,71.9,64.1,77.9,67.6,60.4,70.5,94 +70.1,63.5,73.8,70.1,63.5,75.7,65.4,58.9,68.2,95 diff --git a/src/main/resources/load/lpts_g1_177ebd2f-7174-4a14-b627-71a43fea1d20.csv b/src/main/resources/load/lpts_g1_177ebd2f-7174-4a14-b627-71a43fea1d20.csv new file mode 100644 index 000000000..4348e6322 --- /dev/null +++ b/src/main/resources/load/lpts_g1_177ebd2f-7174-4a14-b627-71a43fea1d20.csv @@ -0,0 +1,97 @@ +SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour +23.6,22.4,23.6,20.7,22.4,20.2,25.8,25.7,26.4,1 +22.5,21.8,22.5,20.8,21.9,19.7,25.2,25.0,26.4,2 +21.5,21.3,21.5,20.9,21.4,19.2,24.7,24.6,26.4,3 +20.8,20.8,20.8,20.8,20.8,18.9,24.6,24.6,26.5,4 +20.5,20.6,20.5,20.5,20.2,18.8,25.0,25.0,26.5,5 +20.5,20.6,20.5,20.0,19.5,18.8,25.6,25.6,26.5,6 +20.7,20.7,20.6,19.4,19.1,18.9,26.2,26.2,26.5,7 +20.8,20.8,20.8,18.9,18.9,18.9,26.5,26.5,26.5,8 +20.9,20.9,21.0,18.6,19.2,18.9,26.3,26.3,26.6,9 +20.9,20.9,21.0,18.5,19.7,18.9,25.8,25.7,26.6,10 +20.9,20.8,21.0,18.6,20.3,18.9,25.1,25.1,26.6,11 +20.8,20.8,20.8,18.9,20.8,18.9,24.6,24.6,26.5,12 +20.8,20.8,20.6,19.5,21.2,19.0,24.4,24.4,26.2,13 +20.8,20.8,20.4,20.2,21.3,19.1,24.5,24.5,25.8,14 +20.8,20.9,20.5,20.7,21.2,19.1,24.6,24.6,25.3,15 +20.8,20.8,20.8,20.8,20.8,18.9,24.6,24.6,24.6,16 +20.7,20.7,21.6,20.4,20.3,18.5,24.5,24.5,23.9,17 +20.7,20.7,22.4,19.6,19.6,18.3,24.3,24.3,23.6,18 +20.7,20.7,22.9,19.0,19.1,18.9,24.3,24.3,24.3,19 +20.8,20.8,22.7,18.9,18.9,20.8,24.6,24.6,26.5,20 +21.1,21.2,21.6,19.6,19.1,24.1,25.4,25.4,27.0,21 +21.6,21.7,20.7,20.7,19.6,27.2,26.5,26.5,27.4,22 +22.1,22.2,21.2,21.9,20.3,28.1,27.6,27.6,27.9,23 +22.7,22.7,24.6,22.7,20.8,24.6,28.4,28.4,28.4,24 +23.3,23.1,31.9,22.9,21.1,27.9,28.7,28.8,31.5,25 +23.8,23.3,43.9,22.7,21.2,28.6,28.7,28.8,32.5,26 +24.2,23.2,60.8,22.5,21.1,30.8,28.5,28.6,35.3,27 +24.6,22.7,83.3,22.7,20.8,32.2,28.4,28.4,36.0,28 +24.9,21.9,111.4,23.8,20.4,74.1,28.5,28.2,90.3,29 +25.2,20.8,143.9,25.9,19.8,131.7,29.1,28.1,164.8,30 +25.7,19.8,179.2,29.3,19.3,195.3,30.2,28.2,246.8,31 +26.5,18.9,215.8,34.1,18.9,255.5,32.2,28.4,323.7,32 +27.7,18.5,251.9,40.3,18.8,304.6,35.0,28.8,385.2,33 +29.4,18.4,285.0,47.2,18.7,341.8,38.4,29.3,430.7,34 +31.5,18.5,312.3,53.6,18.8,368.0,42.0,29.9,462.0,35 +34.1,18.9,331.2,58.7,18.9,384.2,45.4,30.3,480.8,36 +37.0,19.4,340.0,61.6,19.0,391.7,48.4,30.5,489.0,37 +40.1,20.0,341.2,62.7,19.0,393.1,50.9,30.5,489.9,38 +43.0,20.5,338.3,62.8,19.0,391.5,53.0,30.4,486.7,39 +45.4,20.8,335.0,62.5,18.9,389.9,54.9,30.3,482.6,40 +47.2,20.9,334.1,62.2,18.8,390.6,56.6,30.1,480.5,41 +48.4,20.9,334.9,62.2,18.7,392.9,57.9,30.0,479.8,42 +49.0,20.8,336.3,62.3,18.8,395.7,58.7,30.0,479.6,43 +49.2,20.8,336.9,62.5,18.9,397.5,58.7,30.3,478.9,44 +49.0,21.1,335.6,62.6,19.3,397.3,57.8,30.8,476.5,45 +48.4,21.5,332.0,62.6,19.8,395.0,56.3,31.4,472.0,46 +47.3,22.0,326.2,62.0,20.4,390.6,54.6,31.9,464.8,47 +45.4,22.7,318.0,60.6,20.8,384.2,53.0,32.2,454.3,48 +42.9,23.4,307.4,58.2,21.1,375.8,51.7,32.1,440.0,49 +39.9,24.1,294.7,55.0,21.2,364.5,50.6,31.6,422.0,50 +36.8,24.5,280.4,51.3,21.2,349.3,49.3,31.0,400.2,51 +34.1,24.6,265.0,47.3,20.8,329.3,47.3,30.3,374.8,52 +31.9,24.3,249.2,43.4,20.3,304.7,44.6,29.6,346.4,53 +30.3,23.8,235.5,39.8,19.6,279.8,41.4,29.0,319.4,54 +29.2,23.2,226.5,36.6,19.1,260.3,38.4,28.5,298.8,55 +28.4,22.7,225.2,34.1,18.9,251.7,36.0,28.4,289.6,56 +27.8,22.5,232.9,32.4,19.1,257.5,34.5,28.6,294.8,57 +27.4,22.5,245.5,31.3,19.7,272.9,33.9,29.0,309.8,58 +27.0,22.6,257.4,30.7,20.3,290.9,33.9,29.6,328.0,59 +26.5,22.7,263.1,30.3,20.8,304.7,34.1,30.3,342.6,60 +25.9,22.8,258.6,29.8,21.1,309.0,34.3,30.9,348.5,61 +25.4,22.8,245.9,29.4,21.2,304.7,34.4,31.4,345.8,62 +24.9,22.8,228.5,28.9,21.1,294.3,34.4,31.9,336.4,63 +24.6,22.7,210.1,28.4,20.8,280.1,34.1,32.2,321.8,64 +24.6,22.6,193.3,27.9,20.4,264.3,33.5,32.4,303.4,65 +24.7,22.4,177.7,27.5,19.9,246.5,32.9,32.4,281.9,66 +24.8,22.5,162.3,27.0,19.4,226.2,32.4,32.4,257.6,67 +24.6,22.7,145.7,26.5,18.9,202.5,32.2,32.2,230.9,68 +24.1,23.3,127.4,26.0,18.6,175.4,32.4,31.9,202.5,69 +23.5,23.9,108.5,25.4,18.4,146.9,33.0,31.7,174.0,70 +22.9,24.5,90.7,24.9,18.5,119.7,33.6,31.7,147.5,71 +22.7,24.6,75.7,24.6,18.9,96.5,34.1,32.2,124.9,72 +23.0,24.2,64.7,24.4,19.8,79.3,34.3,33.2,107.6,73 +23.6,23.6,57.0,24.4,20.9,67.2,34.2,34.5,94.7,74 +24.3,23.0,51.6,24.5,21.9,59.0,34.1,35.5,84.6,75 +24.6,22.7,47.3,24.6,22.7,53.0,34.1,36.0,75.7,76 +24.5,23.0,43.3,24.7,23.0,48.1,34.1,35.5,66.9,77 +24.0,23.7,39.7,24.8,23.0,44.0,34.3,34.3,58.5,78 +23.3,24.3,36.5,24.7,22.9,40.7,34.3,33.1,51.1,79 +22.7,24.6,34.1,24.6,22.7,37.9,34.1,32.2,45.4,80 +22.3,24.3,32.5,24.3,22.7,35.6,33.5,31.9,41.8,81 +22.2,23.7,31.6,24.1,22.8,33.6,32.6,32.1,39.8,82 +22.3,23.0,31.0,24.1,22.8,31.9,31.5,32.3,38.7,83 +22.7,22.7,30.3,24.6,22.7,30.3,30.3,32.2,37.9,84 +23.3,23.0,29.3,25.6,22.3,28.7,29.0,31.5,36.7,85 +23.9,23.6,28.2,26.8,21.8,27.1,27.8,30.4,35.2,86 +24.4,24.3,27.2,27.9,21.3,25.7,26.9,29.2,33.6,87 +24.6,24.6,26.5,28.4,20.8,24.6,26.5,28.4,32.2,88 +24.3,24.4,26.2,28.0,20.6,23.8,26.7,28.1,30.9,89 +23.8,23.9,26.2,27.0,20.6,23.4,27.3,28.2,29.9,90 +23.2,23.2,26.4,25.8,20.7,23.0,28.0,28.4,29.1,91 +22.7,22.7,26.5,24.6,20.8,22.7,28.4,28.4,28.4,92 +22.6,22.6,26.4,23.8,21.0,22.3,28.4,28.1,27.8,93 +22.7,22.6,26.0,23.3,21.1,21.9,28.0,27.6,27.2,94 +22.8,22.8,25.4,23.0,21.0,21.4,27.3,27.0,26.8,95 +22.7,22.7,24.6,22.7,20.8,20.8,26.5,26.5,26.5,96 diff --git a/src/main/resources/load/lpts_g2_b0ad5ba2-0d5e-4c9b-b818-4079cebf59cc.csv b/src/main/resources/load/lpts_g2_b0ad5ba2-0d5e-4c9b-b818-4079cebf59cc.csv new file mode 100644 index 000000000..ef76980b7 --- /dev/null +++ b/src/main/resources/load/lpts_g2_b0ad5ba2-0d5e-4c9b-b818-4079cebf59cc.csv @@ -0,0 +1,97 @@ +SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour +63.1,50.6,60.8,73.1,64.2,70.5,80.6,73.7,77.4,1 +58.0,47.4,53.0,67.6,60.7,61.9,74.6,68.7,67.4,2 +53.5,44.3,46.0,62.8,56.9,54.4,69.2,63.6,58.4,3 +48.9,41.1,40.1,57.7,52.8,47.9,63.6,58.7,50.9,4 +43.6,37.9,35.4,51.6,48.3,42.5,57.1,54.4,44.9,5 +38.1,34.7,31.7,45.0,43.8,38.1,50.4,50.6,40.5,6 +33.2,31.8,29.1,38.9,39.6,34.7,44.1,47.2,37.4,7 +29.3,29.3,27.4,34.2,36.2,32.3,39.1,44.0,35.2,8 +27.2,27.4,26.5,31.6,33.8,30.8,36.0,41.0,33.9,9 +26.4,26.0,26.2,30.6,32.2,29.9,34.4,38.2,33.1,10 +26.3,25.0,26.2,30.4,31.1,29.5,33.7,35.9,32.6,11 +26.4,24.5,26.4,30.3,30.3,29.3,33.3,34.2,32.3,12 +26.3,24.2,26.5,29.8,29.5,29.2,32.7,33.3,31.9,13 +25.8,24.0,26.6,29.0,28.7,29.1,32.0,33.0,31.5,14 +25.2,23.9,26.5,28.1,27.9,29.1,31.5,33.1,31.3,15 +24.5,23.5,26.4,27.4,27.4,29.3,31.3,33.3,31.3,16 +23.8,22.8,26.3,27.0,27.1,29.9,31.5,33.3,31.6,17 +23.3,22.3,26.3,26.7,26.8,30.3,31.7,33.1,31.9,18 +23.5,22.3,26.6,26.3,26.4,30.3,31.5,32.5,31.6,19 +24.5,23.5,27.4,25.4,25.4,29.3,30.3,31.3,30.3,20 +26.5,26.1,28.9,24.1,24.1,27.5,28.1,29.7,28.0,21 +29.5,29.8,31.2,23.4,23.2,26.1,26.4,28.5,26.3,22 +33.5,34.3,34.6,24.7,24.3,26.8,27.1,29.0,27.1,23 +38.1,39.1,39.1,29.3,28.4,31.3,32.3,32.3,32.3,24 +43.3,43.7,44.8,38.0,36.2,40.6,42.9,38.9,43.0,25 +48.1,47.4,50.9,48.5,45.7,52.3,56.2,47.3,56.9,26 +51.6,49.4,56.1,58.3,54.1,63.3,68.5,54.9,70.4,27 +52.8,48.9,59.7,64.6,58.7,70.4,76.3,59.7,80.2,28 +51.2,45.6,60.8,65.4,57.7,71.5,77.0,59.9,84.0,29 +48.2,40.6,60.4,62.5,52.5,68.5,72.9,56.6,83.3,30 +45.5,35.6,59.9,58.1,45.5,64.2,67.3,51.7,80.8,31 +45.0,32.3,60.6,54.8,39.1,61.6,63.6,47.0,79.2,32 +48.0,31.9,63.6,54.5,35.3,62.9,64.5,44.0,80.5,33 +54.2,34.4,68.8,57.3,34.7,67.7,69.5,43.7,84.6,34 +62.6,39.6,75.7,63.1,37.5,75.1,77.4,46.7,90.6,35 +72.4,47.0,84.1,71.4,44.0,84.1,87.1,53.8,97.8,36 +82.8,56.2,93.5,81.9,54.2,93.8,97.4,65.2,105.6,37 +93.1,66.4,103.2,93.7,66.8,103.7,108.4,79.5,114.1,38 +102.9,76.6,112.4,105.9,80.5,113.3,119.9,94.6,123.5,39 +111.5,86.1,120.3,117.4,93.9,122.3,132.1,108.6,134.0,40 +118.6,93.9,126.5,127.4,105.7,130.2,144.7,120.0,145.5,41 +124.2,100.2,131.0,135.7,115.5,137.0,156.7,128.8,156.8,42 +128.3,105.0,134.4,142.2,123.0,142.5,166.9,135.6,166.2,43 +131.1,108.6,136.9,146.7,128.1,146.7,174.1,140.9,172.2,44 +132.7,111.1,139.0,149.3,130.8,149.6,177.4,144.9,173.6,45 +133.4,112.7,140.3,150.3,131.5,151.2,177.7,147.8,171.6,46 +133.4,113.8,140.7,150.2,131.4,151.5,176.2,149.4,167.7,47 +133.0,114.4,139.9,149.7,131.1,150.6,174.1,149.7,163.4,48 +132.5,115.0,137.8,149.0,131.3,148.8,172.6,148.5,159.9,49 +131.8,115.4,134.6,148.7,131.6,146.4,172.0,146.8,157.5,50 +131.3,115.9,131.0,148.8,131.4,143.9,172.4,145.2,155.8,51 +131.1,116.4,127.2,149.7,130.1,141.8,174.1,144.8,154.6,52 +131.1,116.9,123.7,151.4,127.3,140.6,177.1,146.0,153.7,53 +131.4,117.2,120.9,153.6,123.6,140.1,180.4,148.3,153.2,54 +131.8,116.8,119.0,155.5,120.0,140.0,183.0,151.1,153.1,55 +132.1,115.4,118.4,156.5,117.4,139.9,183.9,153.6,153.6,56 +132.1,112.9,119.2,156.3,116.5,139.7,182.4,155.1,154.7,57 +132.2,109.8,121.2,155.1,116.8,139.9,179.5,155.5,156.8,58 +132.4,107.1,124.0,153.7,117.6,141.1,176.6,155.0,160.2,59 +133.0,105.6,127.2,152.6,118.4,143.8,175.1,153.6,165.3,60 +134.2,106.0,130.4,152.3,118.4,148.4,176.0,151.4,172.2,61 +135.9,107.7,133.4,152.9,118.0,153.9,178.9,149.0,180.0,62 +137.8,110.1,136.0,154.4,117.6,159.3,182.8,147.2,187.6,63 +139.9,112.5,137.9,156.5,117.4,163.4,186.8,146.7,193.7,64 +141.9,114.4,139.2,159.3,117.9,165.3,190.3,148.1,197.6,65 +144.0,116.2,140.4,162.9,119.3,166.2,193.8,151.2,200.5,66 +146.6,118.3,142.3,167.1,122.0,167.4,197.9,155.7,203.9,67 +149.7,121.3,145.7,172.2,126.2,170.2,203.5,161.4,209.3,68 +153.5,125.5,151.2,177.8,132.0,175.7,210.8,167.8,217.7,69 +157.4,130.3,157.9,183.6,138.7,183.0,218.8,174.5,227.8,70 +160.9,135.1,164.6,188.8,145.2,190.7,226.3,180.7,237.7,71 +163.4,138.9,170.2,192.7,150.6,197.6,231.8,185.9,245.5,72 +164.2,141.3,173.9,194.9,154.2,202.6,234.4,189.5,249.8,73 +163.7,142.6,176.0,195.6,156.4,206.0,234.5,192.1,251.2,74 +162.3,143.2,177.2,195.4,157.9,208.0,233.0,193.9,250.7,75 +160.4,143.8,178.0,194.7,159.4,209.3,230.9,195.6,249.4,76 +158.4,144.6,179.1,193.9,161.5,210.2,228.7,197.5,248.2,77 +156.5,145.5,180.2,193.2,163.8,210.9,226.9,199.4,247.2,78 +154.8,146.0,181.2,192.5,165.9,211.6,225.3,200.9,246.3,79 +153.6,145.7,181.9,191.7,167.3,212.3,224.0,201.5,245.5,80 +152.8,144.4,182.1,190.9,167.6,213.1,223.0,201.0,244.7,81 +152.1,142.0,181.6,189.7,166.9,213.5,221.5,199.2,243.3,82 +150.9,138.8,180.3,187.8,165.1,213.1,218.9,196.2,240.6,83 +148.7,135.0,178.0,184.9,162.4,211.3,214.2,191.7,235.7,84 +144.9,130.6,174.6,180.5,158.7,207.6,207,185.8,228.3,85 +139.3,125.3,169.9,174.2,153.5,201.8,197,178.1,218.5,86 +131.9,118.8,163.6,165.4,146.1,194.0,184.4,168.1,206.9,87 +122.3,110.5,155.5,153.6,136.0,183.9,169.2,155.5,193.7,88 +110.7,100.5,145.6,138.6,122.8,171.7,151.8,140.2,179.5,89 +98.1,89.4,134.3,122.0,108.1,157.9,133.7,123.7,164.8,90 +85.9,78.4,122.4,105.8,93.6,143.5,116.7,107.7,150.1,91 +75.3,68.5,110.5,91.9,81.2,129.1,102.7,93.9,136,92 +67.3,60.5,99.2,82.0,72.3,115.5,93,83.8,122.8,93 +61.5,54.4,88.7,75.4,66.4,102.7,86.6,76.7,110.6,94 +57.3,50.0,78.7,70.9,62.5,91.0,82.2,71.6,99.1,95 +53.8,47.0,69.5,67.5,59.7,80.2,78.3,67.5,88.0,96 diff --git a/src/main/resources/load/lpts_g3_9b880468-309c-43c1-a3f4-26dd26266216.csv b/src/main/resources/load/lpts_g3_9b880468-309c-43c1-a3f4-26dd26266216.csv new file mode 100644 index 000000000..9d45a55a3 --- /dev/null +++ b/src/main/resources/load/lpts_g3_9b880468-309c-43c1-a3f4-26dd26266216.csv @@ -0,0 +1,97 @@ +SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour +99.0,94.6,98.5,92.5,87.6,91.2,95.3,87.8,94.7,1 +100.0,95.3,99.0,93.0,87.3,90.2,95.5,88.3,94.1,2 +100.9,96.0,99.4,93.7,87.4,89.4,96.2,89.0,94.1,3 +101.0,96.2,99.2,94.3,87.7,88.9,97.4,90.1,95.0,4 +99.8,95.3,98.1,94.5,88.0,88.7,98.9,91.3,96.6,5 +97.9,93.9,96.4,94.5,88.4,88.8,100.3,92.4,98.4,6 +95.8,92.4,94.8,94.3,88.9,89.1,101.0,92.9,99.8,7 +94.3,91.3,93.7,94.3,89.5,89.5,100.4,92.5,99.8,8 +94.0,91.1,93.6,94.7,90.3,90.0,98.2,91.0,98.0,9 +94.3,91.5,94.1,95.0,91.0,90.3,95.1,88.7,95.1,10 +94.8,92.1,94.7,95.0,91.2,90.2,91.9,86.4,91.9,11 +95.0,92.5,95.0,94.3,90.7,89.5,89.5,84.7,89.5,12 +94.3,92.4,94.4,92.7,89.2,88.0,88.6,84.0,88.4,13 +93.1,91.9,93.3,90.6,87.2,86.1,88.6,84.0,88.3,14 +91.7,91.2,92.2,88.3,85.1,84.0,88.7,84.0,88.3,15 +90.7,90.7,91.3,86.5,83.5,82.3,88.3,83.5,87.7,16 +90.3,90.5,91.0,85.4,82.7,81.1,86.8,82.1,86.1,17 +90.2,90.4,91.1,85.1,82.7,80.5,85.1,80.6,84.3,18 +90.1,90.1,91.1,85.1,83.1,80.4,84.2,80.1,83.5,19 +89.5,89.5,90.7,85.3,83.5,80.4,85.3,81.6,84.7,20 +88.2,88.5,89.8,85.4,83.7,80.7,89.0,85.9,88.5,21 +87.0,87.7,89.0,85.8,84.0,81.3,94.1,91.6,94.0,22 +86.7,88.2,89.2,86.9,84.8,82.5,99.3,97.0,99.5,23 +88.3,90.7,91.3,88.9,86.5,84.7,102.8,100.4,103.4,24 +92.2,95.8,95.9,92.1,89.2,87.9,103.7,100.7,104.7,25 +97.3,102.0,101.6,95.7,92.4,91.6,102.6,98.8,104.0,26 +102.2,107.6,106.9,99.0,95.4,95.2,100.7,96.2,102.4,27 +105.2,110.7,110.1,101.0,97.4,98.0,99.2,94.3,101.0,28 +105.5,110.0,110.1,101.3,97.9,99.6,99.1,94.4,100.8,29 +104.6,106.9,108.4,101.1,97.6,100.9,100.8,95.7,102.1,30 +104.6,103.1,107.1,102.3,97.3,102.8,104.4,97.6,105.3,31 +107.7,100.4,108.3,106.4,98.0,106.4,110.1,99.2,110.7,32 +115.0,100.2,113.3,114.6,100.1,112.4,117.7,99.7,118.2,33 +125.0,101.8,120.8,124.9,102.9,119.5,126.1,99.6,126.7,34 +134.9,104.0,128.9,134.7,105.4,126.3,133.9,99.2,134.7,35 +142.1,105.8,135.5,141.5,106.4,131.2,139.7,99.2,140.9,36 +144.9,106.3,139.1,143.4,105.4,133.3,142.4,99.8,144.2,37 +144.1,105.8,140.3,141.8,102.9,133.2,142.9,100.9,145.4,38 +141.8,104.8,140.3,138.6,99.9,132.1,142.4,102.1,145.5,39 +139.7,104.0,140.3,136.1,97.4,131.2,142.1,102.8,145.8,40 +139.2,103.8,141.1,135.7,96.1,131.5,142.9,102.9,147.0,41 +140.0,104.1,142.5,137.1,95.9,132.8,144.5,102.5,149.0,42 +141.4,104.5,144.0,139.3,96.3,134.7,146.3,101.8,151.2,43 +142.7,104.6,145.1,141.5,96.8,136.7,147.6,101.0,153.0,44 +143.4,104.4,145.7,143.0,96.9,138.4,147.9,100.4,154.0,45 +143.7,104.0,145.8,143.6,96.8,139.7,147.5,100.0,154.3,46 +143.7,103.9,145.9,143.7,96.6,140.6,146.8,99.8,154.3,47 +143.9,104.6,146.4,143.3,96.2,140.9,146.4,99.8,154.2,48 +144.5,106.3,147.4,142.7,95.7,140.7,146.3,100.0,154.3,49 +145.0,108.3,148.6,141.8,95.4,140.0,146.5,100.5,154.5,50 +145.0,110.1,149.1,140.8,95.1,139.0,146.2,101.0,154.3,51 +143.9,110.7,148.2,139.7,95.0,137.9,145.1,101.6,153.6,52 +141.5,109.7,145.4,138.4,95.0,136.8,142.8,102.2,152.2,53 +137.8,107.5,141.4,136.8,95.3,135.9,139.3,102.4,149.9,54 +133.3,105.0,137.2,134.5,95.6,135.0,134.6,102.1,147.0,55 +128.2,102.8,133.7,131.2,96.2,134.3,128.8,101.0,143.3,56 +123.0,101.5,131.5,126.9,96.7,133.7,122.3,98.9,139.2,57 +118.2,101.0,130.7,121.9,97.3,133.3,115.5,96.3,135.2,58 +114.1,100.9,130.9,117.1,97.5,133.1,109.4,93.8,132.1,59 +111.3,101.0,131.8,113.1,97.4,133.1,104.6,91.9,130.6,60 +110.0,100.9,133.3,110.4,96.7,133.2,101.8,91.1,131.3,61 +110.0,100.8,135.0,108.6,95.8,133.4,100.5,91.2,133.5,62 +110.6,100.6,136.6,107.5,94.9,133.6,100.2,91.8,136.2,63 +111.3,100.4,137.9,106.4,94.3,133.7,100.4,92.5,138.5,64 +111.7,100.3,138.6,105.2,94.4,133.4,100.6,93.1,139.8,65 +111.9,100.2,139.0,104.1,95.0,133.1,101.0,93.4,140.3,66 +112.1,100.3,139.2,103.5,95.9,132.9,101.9,93.6,140.5,67 +112.5,100.4,139.7,104.0,96.8,133.1,103.4,93.7,140.9,68 +113.2,100.5,140.6,105.8,97.6,133.6,105.8,93.9,142.0,69 +113.9,100.7,141.6,108.1,98.2,134.5,108.7,94.3,143.7,70 +114.2,100.6,142.4,110.2,98.8,135.6,111.5,95.2,145.8,71 +113.7,100.4,142.7,111.3,99.2,136.7,113.7,96.8,148.2,72 +112.1,99.9,142.3,110.7,99.5,137.6,115.0,99.1,150.6,73 +110.2,99.7,141.3,109.0,99.9,138.0,115.7,102.2,152.5,74 +109.0,100.2,139.9,107.1,100.5,137.6,116.3,105.7,153.3,75 +109.5,102.2,138.5,105.8,101.6,136.1,117.3,109.5,152.4,76 +112.2,105.9,137.2,105.9,103.2,133.2,119.0,113.2,149.3,77 +116.2,110.3,135.9,107.0,105.2,129.6,120.6,116.3,144.4,78 +120.2,114.5,134.3,108.7,107.4,126.1,121.4,117.9,138.4,79 +122.8,117.3,132.4,110.7,109.5,123.4,120.4,117.3,131.8,80 +123.0,117.9,130.0,112.4,111.2,122.1,117.0,114.2,125.3,81 +121.2,116.5,127.2,113.5,112.4,121.6,112.1,109.4,119.3,82 +118.3,113.9,124.1,113.9,112.5,121.1,106.8,104.2,114.3,83 +114.9,110.7,121.0,113.1,111.3,119.7,102.2,99.8,110.7,84 +111.7,107.4,117.8,111.1,108.5,117.0,99.2,97.1,108.8,85 +108.9,104.4,114.9,108.3,104.8,113.3,97.4,95.9,108.1,86 +106.5,101.8,112.2,105.1,100.8,109.4,96.4,95.4,108,87 +104.6,99.8,110.1,102.2,97.4,105.8,95.6,95.0,107.7,88 +103.2,98.5,108.5,99.9,95.0,103.2,94.5,94.1,106.6,89 +102.1,97.6,107.2,98.1,93.5,101.3,93.3,92.8,104.9,90 +101.1,96.8,106.0,96.5,92.4,99.9,92.0,91.2,103.0,91 +99.8,95.6,104.6,95.0,91.3,98.6,90.7,89.5,101.0,92 +98.2,93.8,102.9,93.1,89.9,97.1,89.6,87.8,99.3,93 +96.4,91.9,101.1,91.3,88.4,95.6,88.6,86.4,97.8,94 +95.0,90.7,99.5,89.6,87.2,94.0,88.0,85.7,96.6,95 +94.3,90.7,98.6,88.3,86.5,92.5,87.7,85.9,95.6,96 diff --git a/src/main/resources/load/lpts_g4_b7682f84-d317-4f7d-a888-0a9502abd763.csv b/src/main/resources/load/lpts_g4_b7682f84-d317-4f7d-a888-0a9502abd763.csv new file mode 100644 index 000000000..b7f7de240 --- /dev/null +++ b/src/main/resources/load/lpts_g4_b7682f84-d317-4f7d-a888-0a9502abd763.csv @@ -0,0 +1,97 @@ +SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour +75.3,68.7,74.5,67.2,63.1,67.2,62.2,57.7,62.1,1 +75.5,68.3,73.6,65.9,62.2,66.1,61.2,56.4,60.8,2 +75.7,68.0,72.8,64.8,61.3,64.9,60.1,55.0,59.5,3 +75.6,67.5,72.0,63.9,60.3,63.9,59.4,54.0,58.5,4 +74.8,66.6,71.0,63.2,59.4,63.0,59.1,53.6,58.0,5 +73.6,65.6,70.0,62.7,58.6,62.2,59.2,53.6,57.8,6 +72.3,64.6,69.1,62.4,58.0,61.6,59.4,53.8,57.7,7 +71.1,63.9,68.4,62.1,57.6,61.2,59.4,54.0,57.6,8 +70.3,63.7,68.0,61.8,57.4,61.1,59.1,54.0,57.2,9 +69.8,63.7,67.9,61.6,57.4,61.1,58.6,53.7,56.6,10 +69.5,63.9,67.7,61.3,57.5,61.2,58.0,53.4,56.1,11 +69.3,63.9,67.5,61.2,57.6,61.2,57.6,53.1,55.8,12 +69.0,63.6,67.0,61.1,57.7,61.1,57.5,52.9,55.9,13 +68.8,63.0,66.4,61.1,57.7,60.9,57.5,52.7,56.2,14 +68.6,62.5,65.9,61.1,57.7,60.6,57.6,52.5,56.6,15 +68.4,62.1,65.7,61.2,57.6,60.3,57.6,52.2,56.7,16 +68.3,62.0,65.8,61.3,57.4,60.0,57.4,51.8,56.5,17 +68.3,62.0,66.1,61.4,57.3,59.8,57.2,51.6,56.2,18 +68.3,62.1,66.5,61.6,57.3,59.9,57.1,51.6,56.2,19 +68.4,62.1,66.6,62.1,57.6,60.3,57.6,52.2,56.7,20 +68.4,61.8,66.4,62.7,58.2,61.1,58.7,53.4,58.0,21 +68.3,61.5,65.9,63.3,58.9,62.1,60.2,55.2,59.8,22 +68.1,61.2,65.3,63.5,59.4,62.8,62.0,57.2,61.9,23 +67.5,61.2,64.8,63.0,59.4,63.0,63.9,59.4,63.9,24 +66.9,61.6,64.6,61.9,58.7,62.5,65.9,61.5,65.6,25 +67.7,62.5,65.4,62.0,57.7,62.2,69.3,63.3,67.8,26 +71.8,63.8,67.9,65.2,57.2,63.2,75.6,64.8,71.4,27 +81.0,65.7,72.9,73.8,57.6,66.6,86.4,65.7,77.4,28 +96.3,68.0,80.9,88.9,59.4,73.2,102.5,66.0,86.4,29 +115.4,70.4,91.6,108.6,62.0,83.3,121.9,65.7,98.4,30 +135.3,72.2,104.4,129.7,64.6,96.7,142.0,65.0,113.2,31 +153.0,72.9,118.8,149.4,66.6,113.4,160.2,63.9,130.5,32 +165.9,72.2,133.9,165.2,67.3,132.9,174.4,62.5,149.7,33 +174.7,70.5,148.8,177.2,67.0,153.2,185.0,61.1,169.1,34 +180.5,68.4,162.2,185.8,66.0,171.8,193.2,59.7,186.8,35 +184.5,66.6,172.8,191.7,64.8,186.3,199.8,58.5,200.7,36 +187.6,65.5,179.8,195.3,63.7,194.8,205.7,57.7,209.3,37 +190.3,65.1,183.9,197.3,62.8,198.7,210.9,57.3,213.7,38 +192.5,65.2,186.3,198.3,62.3,199.7,215.3,57.3,215.4,39 +194.4,65.7,188.1,198.9,62.1,199.8,218.7,57.6,216.0,40 +196.0,66.4,190.1,199.5,62.3,200.4,220.8,58.2,216.6,41 +197.5,67.3,192.2,200.2,62.9,201.5,222.0,59.2,217.4,42 +198.7,68.3,194.0,200.9,63.8,202.7,222.4,60.5,218.2,43 +199.8,69.3,195.3,201.6,64.8,203.4,222.3,62.1,218.7,44 +200.6,70.2,195.6,202.1,65.8,203.2,221.9,63.9,218.7,45 +201.4,71.1,195.3,202.7,66.7,202.3,221.4,65.7,218.2,46 +202.3,71.7,194.5,203.3,67.3,200.8,220.9,67.0,217.0,47 +203.4,72.0,193.5,204.3,67.5,198.9,220.5,67.5,215.1,48 +204.7,71.9,192.3,205.4,67.1,196.6,220.1,66.9,212.1,49 +205.5,71.6,190.3,206.1,66.2,193.3,219.4,65.4,207.8,50 +205.1,71.0,186.5,205.4,65.1,188.3,217.6,63.7,201.4,51 +202.5,70.2,180.0,202.5,63.9,180.9,214.2,62.1,192.6,52 +197.0,69.3,170.4,196.5,62.8,170.7,208.4,61.0,181.1,53 +188.7,68.5,159.3,187.7,62.0,159.4,200.2,60.3,168.7,54 +177.5,67.8,148.9,176.1,61.4,149.2,189.3,60.1,157.7,55 +163.8,67.5,141.3,162.0,61.2,142.2,175.5,60.3,150.3,56 +147.7,67.6,138.1,145.8,61.4,139.9,158.9,60.7,148.1,57 +131.0,67.9,139.2,129.0,61.9,142.2,141.2,61.4,151.0,58 +115.3,68.2,143.7,113.1,62.5,148.0,124.2,62.1,157.9,59 +102.6,68.4,151.2,99.9,63.0,156.6,109.8,63.0,168.3,60 +94.1,68.2,160.6,90.4,63.3,166.9,99.4,63.8,180.9,61 +89.2,67.8,170.6,84.1,63.4,177.6,92.5,64.6,194.1,62 +86.7,67.5,179.7,80.1,63.3,186.9,88.2,65.2,205.9,63 +85.5,67.5,186.3,77.4,63.0,193.5,85.5,65.7,214.2,64 +84.5,67.9,189.2,75.1,62.6,196.1,83.6,66.0,217.7,65 +83.5,68.5,189.5,73.3,62.3,196.0,82.5,66.5,218.2,66 +82.3,69.0,188.3,72.2,62.4,194.9,82.4,67.7,217.7,67 +81.0,69.3,187.2,72.0,63.0,194.4,83.7,70.2,218.7,68 +79.4,69.1,186.9,72.8,64.3,195.6,86.2,74.1,222.5,69 +77.8,68.7,187.2,74.0,65.9,197.4,89.3,78.8,227.3,70 +76.7,68.6,186.9,75.2,67.5,197.9,92.1,83.2,230.5,71 +76.5,69.3,185.4,75.6,68.4,195.3,93.6,86.4,229.5,72 +77.3,70.9,181.7,74.9,68.4,188.3,93.2,87.6,222.2,73 +78.7,73.0,175.7,73.7,68.0,177.7,91.8,87.5,209.9,74 +80.1,75.1,167.1,72.7,67.8,164.9,90.4,87.1,194.6,75 +81.0,76.5,155.7,72.9,68.4,151.2,90.0,87.3,178.2,76 +80.9,76.8,141.7,74.7,70.2,137.8,91.4,88.8,162.3,77 +80.3,76.5,127.2,77.6,72.8,125.5,93.7,90.9,147.6,78 +80.1,76.5,114.2,80.9,75.7,115.3,95.8,92.6,134.5,79 +81.0,77.4,105.3,83.7,78.3,108.0,96.3,92.7,123.3,80 +83.4,79.7,101.8,85.5,80.2,103.9,94.4,90.6,114.2,81 +86.7,82.7,102.3,86.1,81.3,102.1,90.8,86.8,107.0,82 +89.5,85.3,104.2,85.8,81.5,101.2,86.3,82.4,101.2,83 +90.9,86.4,105.3,84.6,81.0,99.9,81.9,78.3,96.3,84 +90.0,85.4,103.7,82.6,79.6,97.1,78.3,75.1,92.0,85 +87.5,82.7,100.0,80.2,77.7,93.2,75.5,72.7,88.0,86 +84.1,79.5,95.3,77.4,75.4,88.8,72.9,70.6,84.1,87 +81.0,76.5,90.9,74.7,72.9,84.6,70.2,68.4,80.1,88 +78.7,74.5,87.5,72.1,70.4,81.0,67.1,65.8,75.9,89 +77.1,73.2,85.2,69.9,68.1,78.1,64.0,63.0,71.8,90 +75.9,72.2,83.4,68.0,65.9,75.7,61.3,60.4,68.3,91 +74.7,71.1,81.9,66.6,63.9,73.8,59.4,58.5,65.7,92 +73.3,69.6,80.2,65.6,62.2,72.2,58.6,57.4,64.3,93 +71.8,68.0,78.6,65.0,61.0,70.8,58.5,57.1,63.7,94 +70.4,66.8,77.0,64.4,60.3,69.6,58.7,57.2,63.4,95 +69.3,66.6,75.6,63.9,60.3,68.4,58.5,57.6,63.0,96 diff --git a/src/main/resources/load/lpts_g5_ec51ae43-3849-4f14-8330-b2eea9414101.csv b/src/main/resources/load/lpts_g5_ec51ae43-3849-4f14-8330-b2eea9414101.csv new file mode 100644 index 000000000..56ce37f83 --- /dev/null +++ b/src/main/resources/load/lpts_g5_ec51ae43-3849-4f14-8330-b2eea9414101.csv @@ -0,0 +1,97 @@ +SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour +91.8,48.8,67.4,75.6,42.5,56.0,66.6,38.9,50.1,1 +118.3,47.8,61.2,97.6,42.0,51.3,87.3,38.4,47.4,2 +145.6,46.6,54.6,121.4,41.6,46.6,111.7,38.1,44.9,3 +168.3,45.3,49.4,143.1,41.3,43.3,137.0,38.3,43.3,4 +182.2,44.3,46.7,159.4,41.1,42.4,160.7,39.2,43.0,5 +188.4,43.4,46.0,170.6,40.9,42.9,180.8,40.5,43.8,6 +189.4,42.8,45.9,177.6,41.0,43.7,195.6,41.7,45.0,7 +187.4,42.3,45.3,181.4,41.3,43.3,203.5,42.3,46.3,8 +184.6,42.0,43.9,182.9,41.9,41.4,203.7,42.0,47.5,9 +182.2,41.9,44.3,183.1,42.6,40.1,198.9,40.9,49.2,10 +181.2,42.0,50.0,182.9,43.1,42.8,192.6,39.6,52.2,11 +182.4,42.3,64.5,183.4,43.3,52.4,188.4,38.3,57.4,12 +186.5,42.8,89.7,185.2,43.0,71.0,189.1,37.4,65.9,13 +192.6,43.3,121.1,188.7,42.2,95.9,194.0,36.9,78.5,14 +199.7,43.9,152.6,193.7,41.3,123.5,201.6,36.9,96.5,15 +206.5,44.3,178.3,200.5,40.3,150.1,210.6,37.3,120.9,16 +212.3,44.6,193.7,208.8,39.5,172.6,219.6,38.0,151.7,17 +217.0,44.8,200.6,217.5,39.0,190.3,228.2,39.0,184.7,18 +221.0,45.0,202.4,225.2,38.9,203.3,236.0,40.2,214.5,19 +224.7,45.3,202.5,230.7,39.3,211.6,242.8,41.3,235.8,20 +228.3,46.0,203.8,233.1,40.4,215.4,248.4,42.3,244.7,21 +231.5,46.8,206.0,232.9,42.0,216.2,252.5,43.4,244.2,22 +234.1,48.0,208.6,231.4,44.0,215.7,255.0,44.7,238.7,23 +235.8,49.4,210.6,229.7,46.3,215.6,255.9,46.3,232.7,24 +236.2,51.0,211.5,228.7,48.8,217.2,255.1,48.5,229.8,25 +235.8,52.7,211.5,228.4,51.2,220.0,253.2,51.0,229.8,26 +234.8,54.2,211.1,228.8,53.2,223.1,250.5,53.4,231.4,27 +233.8,55.4,210.6,229.7,54.4,225.7,247.9,55.4,233.8,28 +232.6,56.2,210.3,230.9,54.8,227.0,245.4,56.8,235.7,29 +230.4,56.5,210.3,230.9,54.4,226.9,242.0,57.6,237.1,30 +225.9,56.6,210.4,228.0,53.5,225.8,236.2,57.8,237.9,31 +217.6,56.4,210.6,220.7,52.4,223.7,226.7,57.4,237.8,32 +204.9,56.2,210.8,207.9,51.3,220.8,212.7,56.6,236.9,33 +189.4,55.9,210.8,191.8,50.4,217.7,196.2,55.7,235.4,34 +173.1,55.6,210.4,175.3,50.1,214.8,180.2,54.8,233.6,35 +158.2,55.4,209.6,161.2,50.4,212.6,167.3,54.4,231.7,36 +146.4,55.4,208.1,151.7,51.6,211.3,159.5,54.6,230.0,37 +137.7,55.7,205.8,145.9,53.5,210.5,155.5,55.4,228.1,38 +131.7,56.7,202.6,142.2,55.8,209.1,153.4,56.7,225.4,39 +128.0,58.4,198.5,13.09,58.4,206.5,151.1,58.4,221.7,40 +126.0,61.2,193.4,135.1,61.1,202.2,147.0,60.4,216.4,41 +125.3,64.5,187.8,130.6,63.7,196.5,141.5,62.5,210.2,42 +125.2,68.1,182.3,126.0,66.2,190.3,135.6,64.6,203.7,43 +124.9,71.5,177.3,121.9,68.5,184.4,130.0,66.5,197.5,44 +124.1,74.4,173.3,118.8,70.6,179.2,125.6,68.2,192.0,45 +123.2,76.7,169.7,116.9,72.4,174.3,122.7,69.6,186.8,46 +122.6,78.4,165.6,116.5,73.7,168.9,121.4,70.7,181.1,47 +122.9,79.6,160.2,117.9,74.6,162.2,121.9,71.5,174.3,48 +124.4,80.2,153.0,120.8,74.8,153.7,124.1,72.0,165.9,49 +125.9,80.1,144.7,123.8,74.4,144.2,126.4,72.1,156.2,50 +125.9,79.2,136.0,124.8,73.3,134.6,127.0,71.7,146.1,51 +122.9,77.6,128.0,121.9,71.5,125.9,123.9,70.5,136,52 +116.0,75.1,121.3,113.9,69.1,119.1,116.1,68.7,126.7,53 +106.4,72.1,116.6,102.6,66.3,114.2,105,66.3,118.7,54 +96.0,69.1,114.0,90.3,63.7,111.1,93.1,63.8,112.6,55 +86.6,66.5,113.9,79.6,61.5,109.8,82.6,61.5,108.8,56 +79.8,64.6,116.3,72.3,60.0,110.1,75.3,59.5,107.7,57 +75.6,63.5,120.1,68.1,59.3,111.4,70.8,58.0,108.4,58 +73.6,63.1,123.8,66.1,59.2,112.9,68.2,57.0,109.8,59 +73.6,63.5,125.9,65.5,59.4,113.9,66.5,56.4,110.8,60 +75.0,64.4,125.5,65.5,59.9,113.8,64.9,56.3,110.7,61 +77.2,65.7,123.0,65.7,60.4,112.9,63.5,56.5,109.5,62 +79.4,66.8,119.5,65.8,60.6,111.4,62.3,56.9,107.7,63 +80.6,67.5,115.9,65.5,60.5,109.8,61.5,57.4,105.8,64 +80.3,67.4,113.0,64.6,59.7,108.3,61.1,57.9,104.1,65 +78.8,66.8,110.9,63.6,58.9,107.1,61.5,58.6,103.1,66 +76.7,66.0,109.5,63.0,58.3,106.2,62.5,59.7,103.1,67 +74.6,65.5,108.8,63.5,58.4,105.8,64.5,61.5,104.8,68 +72.8,65.4,108.5,65.4,59.7,105.8,67.3,64.1,108.1,69 +71.2,65.5,108.2,68.2,61.5,105.8,70.5,67.1,112.2,70 +69.5,65.3,107.1,71.2,63.3,105.3,73.5,70.1,115.9,71 +67.5,64.5,104.8,73.6,64.5,103.8,75.6,72.5,117.9,72 +65.0,62.7,100.7,74.8,64.6,100.8,76.3,74,117.3,73 +62.3,60.3,95.2,74.8,63.7,96.7,75.9,74.4,114.2,74 +59.9,57.8,89.0,73.7,62.2,91.9,74.6,73.6,109.2,75 +58.4,55.4,82.6,71.5,60.5,86.6,72.5,71.5,102.8,76 +58.1,53.7,76.6,68.6,58.6,81.5,70.1,68.3,95.3,77 +58.5,52.5,71.2,65.3,56.8,76.5,67.5,64.4,87.7,78 +59.2,51.8,66.7,62.0,55.1,72.2,64.9,60.5,80.5,79 +59.4,51.4,63.5,59.4,53.4,68.5,62.5,57.4,74.6,80 +59.0,51.2,61.6,57.8,51.8,65.8,60.4,55.6,70.4,81 +57.8,51.1,60.6,56.9,50.5,63.8,58.6,54.6,67.6,82 +56.2,50.9,60.1,56.3,49.3,62.5,57.0,54.1,65.5,83 +54.4,50.4,59.4,55.4,48.4,61.5,55.4,53.4,63.5,84 +52.6,49.4,58.3,54.1,47.7,60.6,53.9,52.2,61.1,85 +51.0,48.2,57.0,52.4,47.3,59.9,52.2,50.5,58.5,86 +49.5,47.1,55.8,50.7,46.9,59.2,50.4,48.5,56.1,87 +48.4,46.3,55.4,49.4,46.3,58.4,48.4,46.3,54.4,88 +47.6,46.2,56.0,48.6,45.6,57.7,46.1,44.1,53.6,89 +47.1,46.4,57.7,48.1,44.6,57.1,43.8,42.0,53.6,90 +47.1,46.9,60.2,47.8,43.5,56.9,41.8,40.0,53.9,91 +47.4,47.4,63.5,47.4,42.3,57.4,40.3,38.3,54.4,92 +48.0,47.7,67.3,46.5,41.1,58.7,39.6,36.9,54.7,93 +48.7,47.9,70.6,45.5,40.1,60.1,39.4,36.0,54.6,94 +49.3,48.1,72.4,44.3,39.4,60.6,39.4,35.8,53.9,95 +49.4,48.4,71.5,43.3,39.3,59.4,39.3,36.3,52.4,96 diff --git a/src/main/resources/load/lpts_g6_d0606284-5f9e-4950-a579-e02b31fa9d1a.csv b/src/main/resources/load/lpts_g6_d0606284-5f9e-4950-a579-e02b31fa9d1a.csv new file mode 100644 index 000000000..a2d141656 --- /dev/null +++ b/src/main/resources/load/lpts_g6_d0606284-5f9e-4950-a579-e02b31fa9d1a.csv @@ -0,0 +1,97 @@ +SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour +60.0,85.6,56.8,64.7,98.7,61,67.5,100.3,62.1,1 +59.4,79.0,52.0,63.4,91.2,54.9,67.8,91.1,55.6,2 +59.4,73.6,48.0,63.0,84.5,49.9,68.5,83.4,50.1,3 +58.9,69.3,45.0,62.4,78.5,46.2,68.1,77.4,46.2,4 +57.1,65.8,43.0,60.4,73.1,43.7,65.4,73.2,44.0,5 +54.3,63.0,41.8,57.5,68.1,42.1,61.0,70.5,43.0,6 +51.3,60.4,41.0,54.1,63.8,41.1,56.1,68.6,42.8,7 +48.5,57.7,40.4,50.8,60.0,40.4,52.0,67.0,42.7,8 +46.5,54.8,39.7,48.1,57.0,39.7,49.4,65.1,42.3,9 +45.2,51.7,39.1,45.9,54.3,39.0,48.1,63.0,41.7,10 +44.4,48.7,38.5,44.1,52.0,38.5,47.6,60.9,40.9,11 +43.9,46.2,38.1,42.7,49.7,38.1,47.3,58.9,40.4,12 +43.4,44.3,38.0,41.6,47.2,38.0,46.9,57.1,40.2,13 +43.0,42.8,38.1,40.6,44.7,38.1,46.4,55.4,40.2,14 +42.4,41.6,38.2,39.8,42.4,38.2,45.7,53.8,40.3,15 +41.6,40.4,38.1,39.3,40.4,38.1,45.0,52.0,40.4,16 +40.6,39.2,37.7,38.8,38.9,37.8,44.5,50.0,40.3,17 +39.5,38.0,37.2,38.5,37.8,37.4,44.0,48.0,40.2,18 +38.6,37.2,36.9,38.3,37.1,37.0,43.8,46.3,40.2,19 +38.1,37.0,37.0,38.1,37.0,37.0,43.9,45.0,40.4,20 +38.2,37.5,37.6,37.9,37.2,37.3,44.2,44.4,40.9,21 +38.7,38.3,38.6,37.7,37.5,37.9,44.7,44.3,41.6,22 +39.5,39.1,39.6,37.4,37.5,38.6,45.1,44.2,42.3,23 +40.4,39.3,40.4,37.0,37.0,39.3,45.0,43.9,42.7,24 +41.3,38.6,40.8,36.4,35.7,39.8,44.6,43.2,42.9,25 +42.3,37.7,41.0,36.3,34.5,40.4,44.0,42.5,43.0,26 +43.9,37.7,41.5,37.0,34.6,41.2,44.0,42.6,43.6,27 +46.2,39.3,42.7,39.3,37.0,42.7,45.0,43.9,45.0,28 +49.5,43.2,45.0,43.3,42.3,45.0,47.5,46.9,47.7,29 +53.4,49.1,48.3,48.5,49.8,48.1,51.1,51.1,51.7,30 +57.5,56.1,52.6,54.0,58.0,52.0,55.5,55.7,57.0,31 +61.2,63.5,57.7,58.9,65.8,56.6,60.0,60.0,63.5,32 +64.3,70.9,63.6,62.6,72.3,61.8,64.5,63.8,71.1,33 +67.2,78.3,69.6,65.6,78.7,67.5,68.6,68.3,79.2,34 +70.2,86.1,75.2,68.7,86.4,73.1,72.1,75.4,86.9,35 +73.9,94.7,79.7,72.8,97.0,78.5,75.1,86.6,93.5,36 +78.7,104.4,82.8,78.3,111.6,83.4,77.5,103.2,98.6,37 +84.7,115.4,85.2,85.5,129.1,88.1,80.8,123.6,102.6,38 +91.9,127.9,87.7,94.1,147.9,92.9,86.8,145.8,106.4,39 +100.5,142.0,91.2,103.9,166.3,98.2,97.0,167.4,110.9,40 +110.2,157.7,96.5,114.8,183.1,104.3,112.5,186.9,116.8,41 +120.3,173.7,103.5,126.0,198.4,111.6,131.1,203.9,124.4,42 +129.7,188.2,111.8,136.5,213.1,120.6,150.0,218.5,133.9,43 +137.4,199.8,121.3,145.5,227.5,131.6,166.3,231.0,145.5,44 +142.7,207.2,131.4,152.3,242.0,144.7,177.7,241.2,159.0,45 +145.9,211.0,141.2,157.1,255.2,158.3,184.6,249.2,172.7,46 +147.4,212.5,149.8,160.1,265.6,170.4,187.8,254.7,184.3,47 +147.8,212.5,155.9,161.7,271.4,179.0,188.2,257.5,191.7,48 +147.5,212.0,158.9,162.1,271.6,182.7,186.8,257.7,193.5,49 +146.8,211.5,159.2,161.8,267.8,182.6,184.3,256.1,191.1,50 +145.7,211.2,157.5,161.1,262.4,180.1,181.4,253.8,186.7,51 +144.3,211.3,154.7,160.5,257.5,176.7,179.0,251.7,182.5,52 +143.0,211.8,151.3,160.3,254.9,173.6,177.5,250.6,179.8,53 +142.1,211.7,147.2,160.7,253.3,170.1,177.0,249.1,177.6,54 +142.4,209.7,141.9,161.8,250.9,165.3,177.2,245.5,174.1,55 +144.3,204.4,135.1,164.0,246.0,158.2,177.8,237.9,167.4,56 +148.4,195.1,126.7,167.1,237.1,148.2,178.8,225.3,156.5,57 +154.0,183.1,117.8,170.9,225.2,136.6,179.9,209.3,143.2,58 +160.6,170.2,109.4,174.7,211.5,125.1,181.2,192.3,130.2,59 +167.4,158.2,102.8,177.8,197.5,115.5,182.5,176.7,120.1,60 +173.8,148.6,98.9,180.0,184.2,109.0,183.7,164.2,114.8,61 +179.2,141.2,97.3,181.2,171.9,105.2,184.8,154.7,113.5,62 +183.1,135.3,97.3,181.6,160.6,103.4,185.5,147.5,114.2,63 +184.8,130.5,98.2,181.3,150.1,102.8,185.9,142.0,115.5,64 +184.1,126.4,99.3,180.7,140.8,102.7,186.0,137.9,116.0,65 +182.1,123.6,100.8,180.5,133.8,103.7,186.9,136.1,116.6,66 +179.9,123.1,103.0,181.6,130.7,106.2,189.9,138.2,118.7,67 +179.0,125.9,106.2,184.8,132.8,110.9,196.3,145.5,123.6,68 +180.3,132.5,110.6,190.7,141.1,118.1,207.0,158.9,132.1,69 +183.8,142.1,115.8,198.9,154.4,127.2,220.8,176.8,143.0,70 +189.2,153.8,121.4,208.8,170.7,137.4,236.3,196.9,154.6,71 +196.3,166.3,127.0,219.4,188.2,147.8,251.7,217.1,165.1,72 +204.6,178.7,132.3,230.2,205.2,157.6,265.8,235.2,173.3,73 +213.4,190.1,137.1,240.7,220.5,166.3,277.9,249.8,179.3,74 +221.7,199.7,141.5,250.3,232.9,173.6,287.6,259.6,183.7,75 +228.6,206.7,145.5,258.7,241.3,179.0,294.5,263.3,187.1,76 +233.6,210.6,149.1,265.2,245.2,182.4,298.1,260.3,189.8,77 +236.4,212.0,152.2,269.8,245.3,184.2,298.7,252.5,192.1,78 +237.4,211.6,154.5,271.9,242.8,185.1,296.3,242.6,193.9,79 +236.7,210.2,155.9,271.4,239.0,185.9,291.0,233.3,195.2,80 +234.5,208.4,156.3,268.1,234.9,187.0,283.1,226.5,195.9,81 +231.0,206.0,155.8,262.6,230.1,188.0,273.4,221.6,195.8,82 +226.3,202.5,154.8,255.8,224.3,188.2,262.6,217.3,194.5,83 +220.6,197.5,153.6,248.3,217.1,187.1,251.7,212.5,191.7,84 +213.9,190.5,152.2,240.7,208.0,184.0,241.3,205.9,187.0,85 +206.1,182.0,150.0,232.6,197.2,178.9,231.2,197.3,180.2,86 +197.2,172.2,146.1,223.4,184.8,171.4,220.9,186.5,171.4,87 +187.1,161.7,139.7,212.5,170.9,161.7,210.2,173.2,160.5,88 +175.6,150.7,130.3,199.4,155.9,149.6,198.6,157.6,147.6,89 +163.1,139.2,118.7,184.8,140.2,136.0,186.3,140.7,133.5,90 +150.3,127.1,106.4,169.6,124.6,122.0,173.5,123.9,119.4,91 +137.4,114.3,94.7,154.7,109.7,108.5,160.5,108.5,106.2,92 +125.1,100.9,84.5,141.0,96.0,96.4,147.5,95.6,95.0,93 +113.5,87.5,76.0,128.5,83.9,85.8,134.7,84.9,85.4,94 +102.9,75.1,68.7,117.3,73.4,76.4,122.4,76.0,76.9,95 +93.5,64.7,62.4,107.4,64.7,68.1,110.9,68.1,69.3,96 diff --git a/src/main/resources/load/lpts_h0_de021c4d-bb57-4310-8f21-298e6af8b245.csv b/src/main/resources/load/lpts_h0_de021c4d-bb57-4310-8f21-298e6af8b245.csv new file mode 100644 index 000000000..673ac0535 --- /dev/null +++ b/src/main/resources/load/lpts_h0_de021c4d-bb57-4310-8f21-298e6af8b245.csv @@ -0,0 +1,97 @@ +SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour +89.8,100.1,86.3,80.2,93.4,77.8,70.8,87.5,67.6,0 +84.9,92.5,76.9,75.1,86.8,69.6,68.2,81.1,60.8,1 +80.7,85.9,68.8,70.7,81.2,62.4,65.9,75.0,54.9,2 +76.6,79.9,62.4,66.6,75.7,56.6,63.3,69.1,49.9,3 +71.7,74.1,58.0,62.3,70.1,52.5,59.5,63.4,46.2,4 +66.6,68.7,55.3,58.0,64.5,49.7,55.0,58.2,43.6,5 +61.6,63.9,53.6,54.1,59.3,47.9,50.5,53.6,41.9,6 +57.4,59.9,52.4,50.8,54.9,46.6,46.6,49.9,40.8,7 +54.5,57.0,51.3,48.4,51.7,45.5,43.9,47.3,40.1,8 +52.6,55.0,50.3,46.8,49.4,44.5,42.3,45.5,39.6,9 +51.4,53.5,49.2,45.7,47.8,43.8,41.4,44.2,39.4,10 +50.8,52.4,48.3,44.9,46.6,43.3,40.8,43.3,39.1,11 +50.3,51.5,47.5,44.4,45.5,43.0,40.3,42.4,38.8,12 +50.0,50.8,46.9,43.9,44.5,43.0,39.9,41.5,38.6,13 +49.9,50.2,46.5,43.5,43.8,43.1,39.5,40.7,38.3,14 +49.9,49.9,46.6,43.3,43.3,43.3,39.1,40.0,38.3,15 +50.1,49.9,47.1,43.1,43.1,43.4,38.8,39.3,38.4,16 +50.4,50.0,48.0,43.1,43.1,43.7,38.5,38.8,38.8,17 +50.7,50.1,49.3,43.1,43.2,44.2,38.3,38.5,39.3,18 +50.8,49.9,50.8,43.3,43.3,44.9,38.3,38.3,40.0,19 +50.8,49.5,52.7,43.6,43.3,46.3,38.5,38.3,40.9,20 +50.9,48.9,55.6,44.2,43.3,48.9,39.1,38.4,43.1,21 +51.6,48.4,60.5,45.4,43.2,53.7,40.3,38.7,47.7,22 +53.3,48.3,68.2,47.4,43.3,61.6,42.4,39.1,55.8,23 +56.2,48.7,79.2,50.5,43.5,72.9,45.6,39.7,68.0,24 +60.4,49.8,92.0,54.9,44.3,86.3,49.9,40.4,82.8,25 +65.8,51.9,104.7,60.7,46.0,100.1,55.3,41.3,98.0,26 +72.4,54.9,115.7,68.2,49.1,112.4,61.6,42.4,111.5,27 +80.0,59.2,123.5,77.5,53.9,121.8,68.9,44.0,121.6,28 +88.5,64.9,128.6,87.9,60.4,128.5,77.1,46.6,128.5,29 +97.4,72.3,132.0,98.6,68.8,132.9,86.1,51.1,132.7,30 +106.5,81.6,134.8,109.0,79.1,135.7,95.7,58.3,134.8,31 +115.6,92.9,137.8,118.4,91.1,137.2,105.8,68.6,135.4,32 +124.4,105.6,140.7,126.7,104.3,137.7,115.8,81.3,134.8,33 +132.8,119.0,143.2,133.8,118.0,137.7,124.9,95.2,133.1,34 +140.7,132.3,144.8,139.8,131.5,137.3,132.3,109.0,130.7,35 +147.8,144.8,145.3,144.7,144.2,136.9,137.6,121.9,127.7,36 +154.0,156.2,144.9,148.8,155.5,136.4,141.1,133.7,124.6,37 +158.9,166.0,143.8,152.4,165.3,135.7,143.3,144.4,121.5,38 +162.3,174.0,142.3,155.6,173.1,134.8,144.8,154.0,119.0,39 +164.1,180.0,140.8,158.9,178.8,133.7,146.0,162.6,117.3,40 +164.7,184.6,139.5,162.0,183.1,132.4,147.2,170.5,116.2,41 +165.0,188.7,138.5,164.9,187.0,131.4,148.4,178.0,115.7,42 +165.6,193.1,138.2,167.3,191.4,130.7,149.8,185.6,115.7,43 +167.1,198.3,138.6,169.2,197.0,130.6,151.5,193.3,116.1,44 +169.4,203.7,140.1,170.8,203.0,131.5,153.5,200.6,117.0,45 +172.4,208.7,142.6,172.5,208.5,133.6,156.0,206.6,118.7,46 +175.6,212.2,146.5,174.8,212.2,137.3,159.0,210.6,121.5,47 +179.0,213.7,151.5,177.7,213.5,142.6,162.4,211.8,125.4,48 +181.9,212.8,156.7,180.8,211.8,148.2,165.8,210.2,129.6,49 +183.7,209.0,160.7,183.1,207.0,152.8,168.4,205.9,133.0,50 +183.9,202.3,162.3,183.9,198.9,154.8,169.8,198.9,134.8,51 +182.1,192.4,160.5,182.7,187.6,153.2,169.4,189.6,134.2,52 +178.7,180.9,156.1,179.8,174.6,148.9,167.6,178.7,131.7,53 +174.1,169.2,150.2,175.8,161.7,143.2,164.8,167.3,128.0,54 +169.0,159.0,144.0,171.5,150.6,137.3,161.5,156.5,124.0,55 +163.7,151.4,138.4,167.2,142.8,132.4,158.1,147.0,120.2,56 +158.9,146.0,133.6,163.1,137.6,128.4,154.9,138.9,116.8,57 +154.6,141.6,129.4,159.2,133.9,124.8,151.8,132.1,113.7,58 +151.5,137.3,125.7,155.6,130.7,121.5,149.0,126.5,110.7,59 +149.6,132.4,122.4,152.3,127.1,118.1,146.5,122.0,107.9,60 +148.6,127.0,119.6,149.5,123.1,114.8,144.4,118.1,105.5,61 +148.0,121.6,117.4,147.2,119.0,111.7,142.7,114.8,103.5,62 +147.3,116.5,115.7,145.7,114.9,109.0,141.5,111.5,102.4,63 +146.2,112.2,114.6,145.0,111.0,106.9,140.9,108.3,102.2,64 +145.0,108.9,114.2,145.4,107.7,105.7,141.7,105.9,103.2,65 +144.1,106.7,114.6,146.7,105.6,105.5,144.9,105.2,105.6,66 +144.0,105.7,115.7,149.0,104.9,106.5,151.5,107.4,109.9,67 +144.9,106.1,117.6,152.3,106.0,109.1,161.9,112.9,116.0,68 +146.9,107.7,120.3,156.4,108.8,113.1,174.6,120.9,123.7,69 +150.0,110.4,123.9,161.5,113.2,118.3,187.4,130.0,132.6,70 +154.0,114.0,128.2,167.3,119.0,124.8,198.1,139.0,142.3,71 +158.8,118.3,133.2,173.7,126.0,132.4,205.2,146.8,152.4,72 +164.0,123.4,138.9,180.4,133.7,140.6,209.1,153.5,162.2,73 +169.2,129.2,145.1,186.7,141.5,149.1,211.1,159.7,171.2,74 +174.0,135.7,151.5,192.3,149.0,157.3,212.2,165.6,178.9,75 +177.8,142.8,157.9,196.5,155.5,164.9,213.2,171.5,184.7,76 +180.5,149.8,163.8,199.0,160.6,171.1,213.0,176.4,188.2,77 +181.8,155.7,168.3,199.4,163.6,175.2,210.4,179.1,188.9,78 +181.4,159.8,170.6,197.3,164.0,176.5,203.9,178.1,186.4,79 +179.3,161.4,170.4,192.4,161.5,174.5,192.9,172.9,180.7,80 +175.7,160.8,168.3,185.2,157.1,170.5,179.0,164.7,172.7,81 +171.0,159.0,165.3,176.6,152.2,165.7,164.4,155.6,163.9,82 +165.6,156.5,162.3,167.3,148.2,161.5,151.5,147.3,155.6,83 +160.1,153.9,160.1,157.9,145.9,158.9,141.9,141.4,148.9,84 +155.1,151.5,158.4,149.5,144.7,157.2,135.3,137.2,143.4,85 +151.1,149.3,156.8,142.9,143.6,155.4,131.0,133.7,138.4,86 +149.0,147.3,154.8,139.0,141.5,152.3,128.2,129.8,133.2,87 +148.9,145.4,151.9,138.3,137.5,147.2,126.1,124.8,127.2,88 +149.6,143.0,147.9,139.2,131.8,140.3,124.1,118.6,120.5,89 +149.4,139.2,142.5,139.5,124.7,132.1,121.6,111.6,113.3,90 +146.5,133.2,135.7,137.3,116.5,123.2,118.2,104.0,105.7,91 +139.8,124.4,127.2,131.1,107.6,114.0,113.4,96.2,98.0,92 +130.3,113.8,117.5,121.9,98.4,104.8,107.4,88.4,90.2,93 +119.5,102.5,107.1,111.5,89.2,95.6,100.8,80.7,82.5,94 +109.0,91.6,96.5,101.5,80.7,86.6,94.1,73.2,74.9,95 diff --git a/src/main/resources/load/lpts_l0_42f31f05-8c3b-4949-87e4-3611cf485a82.csv b/src/main/resources/load/lpts_l0_42f31f05-8c3b-4949-87e4-3611cf485a82.csv new file mode 100644 index 000000000..0d0fb954a --- /dev/null +++ b/src/main/resources/load/lpts_l0_42f31f05-8c3b-4949-87e4-3611cf485a82.csv @@ -0,0 +1,97 @@ +SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour +67.2,62.6,66.1,71.4,64.8,70.3,73.9,68.3,72.4,0 +65.6,60.6,63.1,69.4,62.7,67.1,73.0,66.0,69.4,1 +64.3,58.9,60.5,68.0,61.3,64.3,72.6,64.3,66.9,2 +63.0,57.4,58.4,66.7,60.2,62.1,72.3,63.0,64.8,3 +61.4,56.2,56.7,65.3,59.2,60.3,71.5,62.1,63.2,4 +59.7,55.2,55.4,63.9,58.2,59.1,70.4,61.4,61.9,5 +58.0,54.4,54.4,62.4,57.3,58.1,69.1,60.8,61.0,6 +56.5,53.7,53.7,61.1,56.5,57.4,67.6,60.2,60.2,7 +55.2,53.2,53.2,60.0,55.8,56.9,66.2,59.5,59.6,8 +54.2,52.7,52.7,59.1,55.3,56.4,64.8,58.8,59.2,9 +53.4,52.3,52.3,58.3,54.9,56.0,63.4,58.0,58.8,10 +52.8,51.9,51.9,57.4,54.7,55.6,62.1,57.4,58.4,11 +52.3,51.4,51.4,56.6,54.6,55.1,60.7,57.0,57.9,12 +51.8,50.9,51.0,55.7,54.6,54.5,59.4,56.7,57.4,13 +51.4,50.5,50.5,55.1,54.7,54.1,58.3,56.6,56.9,14 +50.9,50.0,50.0,54.7,54.7,53.7,57.4,56.5,56.5,15 +50.5,49.6,49.6,54.6,54.5,53.6,56.9,56.4,56.3,16 +50.2,49.4,49.4,54.7,54.3,53.7,56.8,56.5,56.3,17 +50.0,49.5,49.5,55.1,54.3,54.0,57.0,56.8,56.6,18 +50.0,50.0,50.0,55.6,54.7,54.7,57.4,57.4,57.4,19 +50.3,51.2,51.2,56.1,55.5,55.6,58.2,58.5,58.8,20 +50.9,53.1,52.9,56.6,57.3,57.2,59.2,60.5,60.9,21 +51.7,56.0,55.3,57.4,60.3,59.8,60.5,63.7,63.8,22 +52.8,60.2,58.4,58.4,64.8,63.9,62.1,68.5,67.6,23 +54.4,65.8,62.2,59.9,71.3,69.8,64.1,75.3,72.5,24 +57.2,73.2,67.4,62.9,79.8,77.6,67.4,84.1,79.0,25 +62.2,82.6,74.8,68.8,90.6,87.6,72.9,94.8,87.7,26 +70.4,94.5,85.2,78.7,103.7,100.0,81.5,107.4,99.1,27 +82.4,108.8,98.9,93.4,119.3,114.8,93.9,121.9,113.6,28 +97.4,124.7,114.9,111.6,136.3,131.3,109.4,137.8,130.5,29 +114.2,141.0,131.8,131.4,153.8,148.6,126.9,155.0,148.9,30 +131.5,156.5,148.2,151.0,170.4,165.8,145.4,173.2,167.7,31 +148.2,170.1,162.6,168.6,185.3,181.9,163.8,191.7,185.8,32 +162.8,180.5,173.9,183.2,197.0,195.1,181.0,208.6,201.7,33 +173.8,186.6,180.6,193.7,204.6,203.4,195.6,221.4,213.6,34 +179.7,187.1,181.6,199.2,206.6,204.7,206.6,227.9,219.5,35 +179.6,181.6,176.1,198.9,202.4,198.0,212.9,226.4,218.5,36 +174.9,171.8,166.1,194.1,193.4,185.5,214.6,218.6,211.6,37 +167.2,160.1,154.1,186.2,181.5,170.6,212.1,206.6,200.8,38 +158.4,149.1,142.6,176.9,168.6,156.5,205.6,192.7,188.0,39 +150.1,140.8,133.8,167.6,156.5,145.9,195.9,178.9,175.0,40 +143.4,135.6,128.2,159.6,146.4,139.0,185.0,167.0,163.4,41 +139.1,133.7,125.8,154.0,139.6,135.5,175.4,158.1,154.5,42 +138.0,135.2,126.9,151.9,137.1,135.2,169.5,153.8,150.1,43 +140.4,139.9,131.2,153.9,139.4,137.5,168.9,154.6,150.7,44 +144.4,145.6,136.6,157.9,144.3,140.7,171.3,158.2,154.1,45 +147.5,149.8,140.9,161.3,148.8,143.1,173.5,161.5,157.4,46 +147.3,150.1,141.7,161.2,150.1,142.6,172.3,161.2,157.5,47 +142.0,144.6,137.4,155.8,146.0,138.2,165.4,155.2,152.2,48 +133.1,135.3,129.4,146.7,138.1,130.9,154.5,145.4,143.2,49 +122.7,124.5,119.9,135.9,128.5,122.5,142.0,134.4,132.7,50 +113.0,114.9,111.2,126.0,119.5,114.9,130.6,125.0,123.2,51 +105.7,108.4,104.8,118.5,112.9,109.4,122.1,119.4,116.5,52 +100.6,104.7,100.8,113.1,108.6,105.9,116.1,116.9,112.5,53 +96.8,102.8,98.5,108.8,105.7,103.9,111.6,116.1,110.3,54 +93.6,101.9,97.3,104.7,103.7,102.8,107.4,115.8,109.3,55 +90.3,101.1,96.5,100.0,102.0,102.1,102.9,114.8,108.8,56 +87.1,100.4,96.2,95.3,100.5,101.7,98.2,113.2,108.5,57 +84.4,99.7,96.2,91.1,99.2,101.4,94.0,111.3,108.4,58 +82.4,99.1,96.3,88.0,98.2,101.0,90.8,109.3,108.4,59 +81.5,98.6,96.7,86.6,97.4,100.4,88.9,107.5,108.3,60 +81.3,98.1,97.0,86.3,96.7,99.9,88.2,106.1,108.3,61 +81.4,97.7,97.2,86.7,96.1,99.4,88.0,105.4,108.6,62 +81.5,97.3,97.3,87.1,95.4,99.1,88.0,105.6,109.3,63 +81.3,96.9,97.0,87.1,94.7,99.2,87.9,106.9,110.6,64 +81.3,96.9,96.8,87.3,94.5,99.9,88.5,109.8,113.1,65 +81.8,97.5,97.1,88.5,95.8,101.6,90.9,114.4,117.4,66 +83.4,99.1,98.2,91.7,99.1,104.7,96.3,121.3,124.1,67 +86.6,102.1,100.6,97.4,105.2,109.4,105.5,130.7,133.7,68 +91.7,106.8,104.8,105.7,114.0,116.2,117.8,142.4,146.0,69 +99.2,113.7,111.5,116.2,125.3,125.6,132.7,156.1,160.5,70 +109.3,123.2,121.3,128.8,138.9,138.0,149.1,171.4,176.9,71 +122.1,135.4,134.4,142.9,154.5,153.5,166.4,187.8,194.5,72 +135.8,148.9,148.9,157.3,170.3,170.2,183.4,204.1,211.5,73 +148.6,161.8,162.6,170.7,184.6,185.8,199.0,218.5,226.1,74 +158.4,172.3,173.2,181.6,195.4,198.2,212.1,229.7,236.2,75 +163.6,178.8,178.9,188.7,201.4,205.5,221.5,236.2,240.4,76 +164.4,181.1,179.8,191.7,202.7,207.5,226.2,237.4,238.7,77 +161.5,179.2,176.5,190.6,199.9,204.7,224.9,232.9,231.5,78 +155.6,173.2,169.5,185.3,193.6,197.3,216.8,222.3,219.5,79 +147.4,163.4,159.6,175.8,184.4,185.9,201.3,205.7,203.4,80 +137.8,151.4,148.1,163.7,173.4,172.1,181.3,185.5,184.9,81 +127.9,138.9,136.4,150.5,161.6,157.7,160.3,164.7,166.1,82 +118.6,127.8,126.0,138.0,150.1,144.5,141.7,146.4,149.1,83 +110.7,119.5,117.9,127.4,139.6,133.8,128.3,132.6,135.6,84 +104.1,113.5,111.9,118.8,130.3,125.5,119.3,123.0,125.2,85 +98.5,108.8,107.1,111.6,122.1,118.8,113.2,116.3,117.3,86 +93.6,104.7,102.8,105.6,114.9,113.0,108.4,111.2,111.2,87 +88.9,100.2,98.5,100.3,108.4,107.7,103.7,106.6,106.1,88 +84.6,95.4,94.1,95.5,102.5,102.5,98.8,102.1,101.7,89 +80.6,90.4,89.6,90.9,97.0,97.6,93.9,97.6,97.7,90 +76.9,85.2,85.2,86.1,91.7,92.6,88.9,92.6,93.6,91 +73.4,80.0,81.0,81.1,86.4,87.7,84.0,87.2,89.1,92 +70.3,75.0,76.9,76.1,81.2,82.9,79.3,81.6,84.6,93 +67.4,70.5,73.1,71.5,76.4,78.3,75.0,76.5,80.1,94 +64.8,66.7,69.5,67.6,72.3,74.1,71.3,72.3,76.0,95 diff --git a/src/main/resources/load/lpts_l1_aa65260e-efd5-49af-961b-b0daf04fdeee.csv b/src/main/resources/load/lpts_l1_aa65260e-efd5-49af-961b-b0daf04fdeee.csv new file mode 100644 index 000000000..d1a2c5f8f --- /dev/null +++ b/src/main/resources/load/lpts_l1_aa65260e-efd5-49af-961b-b0daf04fdeee.csv @@ -0,0 +1,97 @@ +SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour +58.2,53.8,57.7,64.9,60.4,64.4,67.9,63.5,66.7,1 +57.3,53.3,56.2,63.8,59.6,62.6,67.6,62.2,64.8,2 +56.7,53.0,54.9,62.9,59.1,61.0,67.8,61.4,63.2,3 +56.1,52.6,53.7,61.9,58.4,59.6,67.8,60.8,61.9,4 +55.2,51.7,52.6,60.6,57.3,58.2,67.3,59.9,60.8,5 +54.2,50.6,51.6,59.1,56.1,57.0,66.5,59.0,59.8,6 +53.3,49.6,50.8,57.9,55.1,56.2,65.4,58.1,59.0,7 +52.6,49.1,50.2,57.2,54.9,56.1,64.3,57.2,58.4,8 +52.2,49.1,50.1,57.4,55.7,56.7,63.2,56.7,58.0,9 +52.0,49.6,50.2,58.0,57.0,57.6,62.3,56.3,57.7,10 +51.8,50.1,50.3,58.5,58.1,58.3,61.5,56.1,57.5,11 +51.4,50.2,50.2,58.4,58.4,58.4,60.8,56.1,57.2,12 +50.7,49.8,49.9,57.5,57.4,57.5,60.1,56.2,57.0,13 +49.7,48.9,49.2,55.9,55.5,55.9,59.5,56.3,56.7,14 +48.7,47.8,48.5,54.1,53.3,54.1,59.0,56.3,56.4,15 +47.9,46.7,47.9,52.6,51.4,52.6,58.4,56.1,56.1,16 +47.4,46.0,47.4,51.6,50.4,51.7,57.8,55.5,55.7,17 +47.3,45.6,47.2,51.1,50.3,51.5,57.3,54.9,55.5,18 +47.5,45.8,47.4,51.1,51.0,51.8,57.1,54.6,55.6,19 +47.9,46.7,47.9,51.4,52.6,52.6,57.2,54.9,56.1,20 +48.5,48.5,48.9,52.1,54.9,53.8,58.0,56.1,57.2,21 +49.3,51.1,50.7,53.1,58.1,55.9,59.3,58.6,59.4,22 +50.3,54.8,53.4,54.8,62.4,59.2,61.4,62.8,62.7,23 +51.4,59.6,57.2,57.2,67.8,64.3,64.3,68.9,67.8,24 +53.1,65.8,62.8,60.8,74.7,71.5,68.2,77.5,74.8,25 +57.1,75.1,71.2,67.0,84.4,81.9,74.7,89.2,84.9,26 +66.0,89.1,84.0,77.3,98.3,96.3,85.3,104.8,98.9,27 +81.8,109.8,102.8,93.5,118.0,115.7,101.6,125.0,118.0,28 +105.9,137.8,128.1,116.4,144.0,140.3,124.9,150.1,142.5,29 +135.6,169.2,156.9,144.2,173.6,168.1,153.4,178.5,170.9,30 +167.0,198.9,185.2,174.4,203.1,196.6,185.3,208.2,200.8,31 +196.3,222.0,209.1,204.5,229.0,223.1,218.5,237.2,230.2,32 +220.0,234.3,225.3,231.5,248.0,245.1,250.4,263.0,256.4,33 +235.9,236.2,232.6,252.2,258.5,259.7,276.9,282.1,276.3,34 +241.9,229.0,230.9,262.7,259.2,264.2,293.5,290.8,286.3,35 +236.0,213.8,219.6,259.4,248.9,255.9,295.6,285.1,282.7,36 +217.4,192.5,199.4,240.3,227.3,233.6,280.5,263.1,263.8,37 +190.6,168.3,174.1,210.7,198.8,202.5,252.9,230.4,234.4,38 +161.4,144.9,148.5,177.8,169.1,169.5,219.2,194.8,201.1,39 +135.5,126.2,127.3,148.4,143.7,141.4,185.8,163.6,170.6,40 +117.5,114.8,114.4,128.2,126.8,123.3,158.0,142.8,148.1,41 +107.1,109.9,108.7,116.7,117.8,114.3,137.3,131.8,133.7,42 +102.7,109.6,108.3,112.0,114.7,111.8,123.9,128.2,126.0,43 +102.8,112.2,111.0,112.2,115.7,113.3,118.0,129.7,123.8,44 +105.9,115.9,115.0,115.3,118.7,116.5,119.2,134.0,125.7,45 +109.8,119.3,118.7,119.2,122.2,119.6,124.5,138.9,129.3,46 +112.6,121.2,121.0,122.0,124.5,121.4,130.0,142.1,132.2,47 +112.2,120.3,120.3,121.5,123.8,120.3,132.0,141.4,132.0,48 +107.1,115.9,116.0,116.4,119.2,115.6,127.8,135.2,127.0,49 +98.8,108.9,109.0,108.1,111.8,108.4,119.2,125.4,118.8,50 +89.7,100.9,100.9,98.9,103.4,100.4,109.1,114.6,109.6,51 +81.8,93.5,93.5,91.1,95.8,93.5,100.5,105.1,101.6,52 +76.8,87.9,87.9,86.4,90.5,88.9,95.5,99.2,96.8,53 +74.3,84.2,84.2,84,87.3,86.4,93.4,96.4,94.6,54 +73.2,82.3,82.2,82.9,85.8,85.4,92.8,95.9,94.2,55 +72.4,81.8,81.8,81.8,85.3,85.3,92.3,97,94.6,56 +71.2,82.5,82.5,79.8,85.4,85.5,90.7,98.7,95.1,57 +69.7,84.0,83.9,77.4,85.8,85.9,88.2,100.7,95.5,58 +68.0,85.5,85.5,75.1,86.2,86.3,85.5,102.6,95.7,59 +66.6,86.5,86.5,73.6,86.5,86.5,83.0,104.0,95.8,60 +65.6,86.5,86.5,73.4,86.3,86.3,81.1,104.6,95.8,61 +65.0,85.8,85.9,74.1,85.8,86.0,79.9,104.8,95.8,62 +64.6,84.8,85.0,75.2,85.0,85.6,79.4,104.9,96.1,63 +64.3,84.1,84.1,75.9,84.1,85.3,79.4,105.1,97.0,64 +63.9,83.9,83.7,76.1,83.2,85.2,80.1,106.1,98.5,65 +63.8,84.1,83.5,76.1,82.6,85.4,81.5,107.9,101.2,66 +64.2,84.2,83.3,77.0,82.8,86.2,84.3,111.0,105.2,67 +65.4,84.1,83.0,79.4,84.1,87.6,88.8,115.7,111.0,68 +68.1,84.0,82.8,84.5,87.4,90.3,95.7,122.5,119.1,69 +74.2,86.4,85.7,93.6,94.7,96.6,106.9,133.2,131.1,70 +85.8,94.8,95.1,108.5,108.4,109.2,124.9,149.7,148.8,71 +105.1,112.2,114.5,130.9,130.9,130.9,151.9,174.1,174.1,72 +133.1,140.2,145.3,161.0,162.9,162.7,188.6,206.9,207.3,73 +164.7,173.4,181.1,194.2,198.9,198.8,229.1,242.9,243.1,74 +193.7,205.0,213.8,224.4,231.9,232.0,266.1,275.4,274.4,75 +213.8,227.8,234.8,245.3,254.7,254.7,292.1,297.9,294.4,76 +220.4,236.6,238.4,252.6,262.0,261.4,301.4,305.2,298.0,77 +215.3,232.9,227.6,247.7,256.0,254.4,295.6,298.6,287.5,78 +201.8,219.9,208.2,233.7,240.6,237.9,278.1,280.8,267.1,79 +183.4,201.0,185.8,213.8,219.6,216.1,252.4,254.7,240.7,80 +163.1,179.1,164.9,190.8,196.8,192.7,221.6,223.1,212.2,81 +142.7,156.5,146.5,167.0,173.8,169.6,189.2,189.7,183.8,82 +123.7,135.1,130.5,144.4,152.2,148.1,158.2,158.1,157.6,83 +107.5,116.8,116.8,125.0,133.2,129.7,132,132.0,135.5,84 +95.2,103.2,105.4,110.4,118,115.3,113.0,114.3,118.9,85 +86.4,93.5,96.1,99.9,106.3,104.6,100.3,103.5,107.2,86 +80.2,86.7,88.7,92.7,97.5,96.8,92.4,97.3,99.1,87 +75.9,81.8,83.0,87.6,91.1,91.1,87.6,93.5,93.5,88 +72.7,77.7,78.6,83.8,86.5,86.9,84.6,90.0,89.3,89 +70.2,74.1,75.3,80.6,83.0,83.7,82.4,86.6,86.1,90 +67.9,70.9,72.6,77.8,80.0,80.9,80.5,83.0,83.3,91 +65.4,67.8,70.1,74.8,77.1,78.3,78.3,79.4,80.6,92 +62.6,64.7,67.4,71.3,73.8,75.3,75.3,75.8,77.7,93 +59.6,61.8,64.6,67.8,70.3,72.3,71.8,72.3,74.6,94 +57.0,59.2,61.9,64.5,67.0,69.3,68.3,69.1,71.6,95 +54.9,57.2,59.6,61.9,64.3,66.6,65.4,66.6,68.9,96 diff --git a/src/main/resources/load/lpts_l2_9029deec-5f70-4647-96db-086f463d0e0d.csv b/src/main/resources/load/lpts_l2_9029deec-5f70-4647-96db-086f463d0e0d.csv new file mode 100644 index 000000000..29346ad06 --- /dev/null +++ b/src/main/resources/load/lpts_l2_9029deec-5f70-4647-96db-086f463d0e0d.csv @@ -0,0 +1,97 @@ +SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour +70.9,65.9,69.7,74.5,66.8,73.1,77.1,70.0,75.2,1 +69.3,63.7,66.6,72.3,64.3,69.3,76.3,67.4,71.9,2 +68.0,61.8,63.9,70.7,62.4,66.0,76.1,65.6,69.1,3 +66.8,60.2,61.8,69.2,61.0,63.5,75.8,64.3,66.8,4 +65.1,58.8,60.2,67.8,60.0,61.8,75.0,63.5,64.8,5 +63.1,57.7,58.9,66.2,59.1,60.7,73.7,62.9,63.2,6 +61.2,56.7,57.8,64.8,58.4,60.0,72.0,62.4,61.9,7 +59.4,56.1,56.9,63.5,57.7,59.4,70.1,61.8,61.0,8 +57.9,55.6,56.0,62.4,57.0,58.6,68.1,61.0,60.4,9 +56.8,55.2,55.1,61.4,56.2,57.7,66.2,60.1,59.9,10 +56.0,54.9,54.3,60.4,55.6,56.9,64.3,59.2,59.6,11 +55.2,54.4,53.6,59.4,55.2,56.1,62.7,58.5,59.4,12 +54.5,53.8,53.1,58.1,55.1,55.4,61.2,58.1,59.0,13 +53.9,53.1,52.7,56.9,55.2,54.9,60.0,57.9,58.7,14 +53.3,52.5,52.3,55.8,55.3,54.6,59.1,57.8,58.2,15 +52.8,51.9,51.9,55.2,55.2,54.4,58.5,57.7,57.7,16 +52.4,51.6,51.5,55.2,54.9,54.5,58.3,57.5,57.1,17 +52.1,51.6,51.3,55.6,54.7,54.7,58.3,57.3,56.7,18 +51.9,52.0,51.3,56.2,54.7,55.3,58.7,57.6,56.8,19 +51.9,52.8,51.9,56.9,55.2,56.1,59.4,58.5,57.7,20 +52.1,54.1,53.2,57.4,56.7,57.2,60.3,60.4,59.6,21 +52.6,56.1,55.2,57.9,59.1,59.0,61.3,63.3,62.3,22 +53.3,59.1,57.8,58.5,62.7,61.8,62.4,67.4,65.9,23 +54.4,63.5,61.0,59.4,67.6,65.9,63.5,72.5,70.1,24 +56.0,69.3,64.8,60.7,73.9,71.7,64.5,78.9,74.8,25 +58.4,76.3,69.4,63.2,81.5,78.9,66.2,86.5,80.4,26 +62.2,84.4,75.2,67.7,90.4,87.5,69.1,95.1,87.2,27 +67.6,93.2,82.4,75.0,100.6,97.3,74.2,104.7,95.6,28 +75.1,102.5,91.3,85.7,111.8,108,81.9,115.2,105.8,29 +84.4,112.3,101.6,98.7,123.7,119.3,91.7,126.5,117.4,30 +95.2,122.6,112.8,112.9,135.8,131,103.1,138.4,129.8,31 +107.2,133.5,124.5,127,147.6,142.6,115.4,150.9,142.6,32 +119.9,144.9,136.1,139.9,158.5,153.7,128.1,163.6,155.2,33 +132.7,155.5,146.7,151.3,168.0,163.5,141.0,175.8,167.0,34 +144.4,164.0,155.0,161.4,175.6,170.8,154.1,186.7,177.3,35 +154.2,169.0,159.9,169.8,180.5,174.8,167.3,195.4,185.5,36 +161.2,169.6,160.6,176.6,182.4,174.7,180.5,201.1,191.0,37 +165.5,166.7,157.8,181.3,181.3,171.3,192.1,203.4,193.5,38 +167.0,161.4,152.8,183.3,177.3,165.7,200.6,202.2,192.6,39 +165.7,155.0,146.7,182.2,170.6,159.1,204.4,197.0,188.0,40 +162.0,148.7,140.7,177.9,161.9,152.5,202.7,188.2,179.8,41 +157.3,143.8,135.9,172.1,152.9,146.9,197.5,177.8,170.3,42 +153.6,141.3,133.5,167.3,146.0,143.3,191.6,168.6,161.9,43 +152.5,142.6,134.4,165.7,143.4,142.6,188.0,163.2,157.5,44 +155.2,148.1,139.1,168.6,146.6,145.3,188.4,163.3,158.4,45 +159.6,155.2,145.6,173.9,153.0,149.5,191.0,166.6,162.6,46 +163.2,161.1,151.0,178.4,159.2,152.9,192.6,169.8,166.7,47 +163.2,162.4,152.5,178.9,161.6,153.3,190.4,169.8,167.3,48 +157.8,157.1,148.2,173.3,157.8,149.1,182.3,164.3,162.3,49 +148.5,147.2,139.8,163.2,149.4,141.5,170.0,154.8,153.2,50 +137.4,135.6,129.6,151.2,139.1,132.6,156.2,144.3,142.5,51 +127.0,125.3,120.4,140.1,129.4,124.5,143.4,135.2,132.7,52 +118.8,118.6,113.9,131.9,122.5,118.6,133.8,129.7,125.9,53 +112.8,114.9,109.9,125.9,118.1,114.9,126.8,126.9,121.6,54 +108.0,113.1,107.7,121.1,115.2,112.7,121.3,125.7,119.3,55 +103.9,112.1,106.3,116.2,112.9,111.3,116.2,124.5,117.9,56 +99.7,110.9,105.3,110.5,110.7,110.2,110.8,122.3,116.9,57 +95.8,109.5,104.5,104.5,108.4,109.2,105.3,119.3,116.1,58 +92.4,108.2,104.0,98.9,106.3,108.5,100.3,116.1,115.6,59 +89.9,107.2,103.9,94.8,104.7,108.0,96.5,112.9,115.4,60 +88.5,106.6,104.3,92.7,103.6,107.7,94.1,110.4,115.6,61 +88.0,106.3,104.9,92.0,102.8,107.5,92.9,108.7,116.0,62 +88.1,106.0,105.4,92.2,102.2,107.3,92.5,107.8,116.5,63 +88.2,105.5,105.5,92.3,101.4,107.2,92.3,108.0,117.1,64 +88.2,104.6,105.1,92.0,100.4,107.0,92.2,109.4,117.6,65 +88.3,104.0,104.7,91.9,99.9,107.4,92.8,112.3,119.1,66 +89.0,104.3,104.9,92.8,101.0,108.9,95.3,117.2,122.4,67 +90.7,106.3,106.3,95.6,104.7,112.1,100.6,124.5,128.6,68 +93.7,110.6,109.6,100.9,111.5,117.6,109.4,134.2,138.3,69 +98.0,116.5,114.3,108.2,120.6,124.7,120.6,145.6,150.4,70 +103.3,123.3,120.0,116.6,130.8,133.0,132.7,157.5,163.6,71 +109.6,130.3,126.1,125.3,141.0,141.8,144.3,169.0,176.4,72 +116.7,136.6,132.3,133.7,150.0,150.4,154.1,179.1,187.8,73 +123.8,142.4,138.3,141.6,157.9,158.8,162.7,187.9,197.2,74 +130.5,147.6,144.3,149.0,164.7,166.6,170.7,195.5,204.8,75 +136.0,152.5,150.0,155.8,170.6,173.9,178.9,202.0,210.2,76 +139.9,156.9,155.4,161.9,175.7,180.4,187.5,207.3,213.4,77 +142.0,160.2,159.5,166.6,179.4,185.0,194.8,210.5,213.8,78 +142.3,161.5,161.4,169.0,180.9,186.8,198.7,210.3,211.0,79 +141.0,159.9,159.9,168.2,179.7,184.7,197.0,205.3,204.4,80 +138.0,155.1,154.6,163.6,175.3,178.0,188.4,194.8,193.9,81 +133.7,148.0,146.6,156.2,168.5,168.2,175.1,180.7,180.8,82 +128.5,140.1,137.6,147.4,160.3,157.1,159.9,165.3,166.7,83 +122.8,132.7,129.4,138.5,151.7,146.7,145.9,150.9,153.3,84 +116.9,127.0,123.2,130.5,143.5,138.4,135.4,139.3,142.0,85 +111.0,122.6,118.6,123.4,135.9,131.9,127.9,130.4,132.7,86 +105.2,118.7,114.9,117.1,128.7,126.4,122.1,123.5,125.1,87 +99.7,114.6,111.3,111.3,122.0,121.2,117.1,117.9,118.7,88 +94.7,109.6,107.1,105.8,115.6,115.7,111.7,113.0,113.2,89 +90.0,103.9,102.5,100.4,109.4,109.8,105.9,108.3,108.3,90 +85.6,97.8,97.5,95.2,103.3,103.9,100,103.4,103.7,91 +81.6,91.5,92.3,89.9,97.3,98.1,94.0,98.1,98.9,92 +77.9,85.3,87.2,84.4,91.2,92.5,88.1,92.0,93.9,93 +74.4,79.5,82.3,79.2,85.3,87.2,82.6,85.8,88.7,94 +71.3,74.3,77.6,74.3,79.8,82.2,77.6,79.9,83.7,95 +68.4,70.1,73.4,70.1,75.0,77.5,73.4,75.0,79.1,96 diff --git a/src/main/resources/load/standard_load_profiles.csv b/src/main/resources/load/standard_load_profiles.csv deleted file mode 100644 index 64780bf40..000000000 --- a/src/main/resources/load/standard_load_profiles.csv +++ /dev/null @@ -1,97 +0,0 @@ -g0SuSa,g0SuSu,g0SuWd,g0TrSa,g0TrSu,g0TrWd,g0WiSa,g0WiSu,g0WiWd,h0SuSa,h0SuSu,h0SuWd,h0TrSa,h0TrSu,h0TrWd,h0WiSa,h0WiSu,h0WiWd,l0SuSa,l0SuSu,l0SuWd,l0TrSa,l0TrSu,l0TrWd,l0WiSa,l0WiSu,l0WiWd,quarterHour -74.6,68.8,71.5,75.8,68.3,73.0,70.0,63.2,65.5,89.8,100.1,86.3,80.2,93.4,77.8,70.8,87.5,67.6,67.2,62.6,66.1,71.4,64.8,70.3,73.9,68.3,72.4,0 -76.2,67.4,69.0,76.7,66.5,70.1,73.0,61.0,62.6,84.9,92.5,76.9,75.1,86.8,69.6,68.2,81.1,60.8,65.6,60.6,63.1,69.4,62.7,67.1,73.0,66.0,69.4,1 -77.7,65.7,66.3,77.7,64.6,67.1,75.9,58.9,59.6,80.7,85.9,68.8,70.7,81.2,62.4,65.9,75.0,54.9,64.3,58.9,60.5,68.0,61.3,64.3,72.6,64.3,66.9,2 -78.5,63.5,63.5,78.5,62.6,64.5,77.6,57.0,57.0,76.6,79.9,62.4,66.6,75.7,56.6,63.3,69.1,49.9,63.0,57.4,58.4,66.7,60.2,62.1,72.3,63.0,64.8,3 -77.9,60.9,60.9,78.5,60.3,62.3,77.1,55.3,54.8,71.7,74.1,58.0,62.3,70.1,52.5,59.5,63.4,46.2,61.4,56.2,56.7,65.3,59.2,60.3,71.5,62.1,63.2,4 -76.3,58.0,58.6,77.8,57.9,60.6,75.0,53.7,53.1,66.6,68.7,55.3,58.0,64.5,49.7,55.0,58.2,43.6,59.7,55.2,55.4,63.9,58.2,59.1,70.4,61.4,61.9,5 -74.1,55.4,56.6,76.6,55.5,59.2,72.1,52.1,51.7,61.6,63.9,53.6,54.1,59.3,47.9,50.5,53.6,41.9,58.0,54.4,54.4,62.4,57.3,58.1,69.1,60.8,61.0,6 -71.9,53.3,55.1,74.7,53.3,57.9,69.1,50.5,50.5,57.4,59.9,52.4,50.8,54.9,46.6,46.6,49.9,40.8,56.5,53.7,53.7,61.1,56.5,57.4,67.6,60.2,60.2,7 -70.2,52.0,54.2,72.6,51.2,56.7,66.8,48.7,49.4,54.5,57.0,51.3,48.4,51.7,45.5,43.9,47.3,40.1,55.2,53.2,53.2,60.0,55.8,56.9,66.2,59.5,59.6,8 -68.9,51.4,53.7,70.4,49.5,55.6,65.1,46.9,48.5,52.6,55.0,50.3,46.8,49.4,44.5,42.3,45.5,39.6,54.2,52.7,52.7,59.1,55.3,56.4,64.8,58.8,59.2,9 -67.9,51.0,53.4,68.5,48.0,54.7,64.1,45.2,47.9,51.4,53.5,49.2,45.7,47.8,43.8,41.4,44.2,39.4,53.4,52.3,52.3,58.3,54.9,56.0,63.4,58.0,58.8,10 -67.3,50.5,53.3,67.3,46.7,54.2,63.5,43.9,47.7,50.8,52.4,48.3,44.9,46.6,43.3,40.8,43.3,39.1,52.8,51.9,51.9,57.4,54.7,55.6,62.1,57.4,58.4,11 -66.9,49.6,53.1,67.0,45.7,54.1,63.4,43.0,47.9,50.3,51.5,47.5,44.4,45.5,43.0,40.3,42.4,38.8,52.3,51.4,51.4,56.6,54.6,55.1,60.7,57.0,57.9,12 -66.7,48.5,53.2,67.5,44.9,54.6,63.6,42.5,48.7,50.0,50.8,46.9,43.9,44.5,43.0,39.9,41.5,38.6,51.8,50.9,51.0,55.7,54.6,54.5,59.4,56.7,57.4,13 -66.8,47.5,54.1,68.3,44.3,55.8,64.0,42.2,50.2,49.9,50.2,46.5,43.5,43.8,43.1,39.5,40.7,38.3,51.4,50.5,50.5,55.1,54.7,54.1,58.3,56.6,56.9,14 -67.3,46.7,56.1,69.1,43.9,57.9,64.5,42.0,52.3,49.9,49.9,46.6,43.3,43.3,43.3,39.1,40.0,38.3,50.9,50.0,50.0,54.7,54.7,53.7,57.4,56.5,56.5,15 -68.0,46.4,59.4,69.7,43.6,60.9,65.0,41.9,55.1,50.1,49.9,47.1,43.1,43.1,43.4,38.8,39.3,38.4,50.5,49.6,49.6,54.6,54.5,53.6,56.9,56.4,56.3,16 -69.0,46.5,63.3,70.1,43.5,64.4,65.6,41.8,58.2,50.4,50.0,48.0,43.1,43.1,43.7,38.5,38.8,38.8,50.2,49.4,49.4,54.7,54.3,53.7,56.8,56.5,56.3,17 -70.0,46.6,67.2,70.5,43.6,68.0,66.3,41.8,61.2,50.7,50.1,49.3,43.1,43.2,44.2,38.3,38.5,39.3,50.0,49.5,49.5,55.1,54.3,54.0,57.0,56.8,56.6,18 -71.0,46.7,70.1,71.0,43.9,71.0,67.3,42.0,63.5,50.8,49.9,50.8,43.3,43.3,44.9,38.3,38.3,40.0,50.0,50.0,50.0,55.6,54.7,54.7,57.4,57.4,57.4,19 -71.8,46.6,71.4,71.8,44.5,73.2,68.5,42.6,65.0,50.8,49.5,52.7,43.6,43.3,46.3,38.5,38.3,40.9,50.3,51.2,51.2,56.1,55.5,55.6,58.2,58.5,58.8,20 -72.4,46.3,71.6,72.5,45.1,74.7,69.9,43.4,66.0,50.9,48.9,55.6,44.2,43.3,48.9,39.1,38.4,43.1,50.9,53.1,52.9,56.6,57.3,57.2,59.2,60.5,60.9,21 -72.8,46.0,71.2,73.0,45.6,75.7,71.4,44.4,67.1,51.6,48.4,60.5,45.4,43.2,53.7,40.3,38.7,47.7,51.7,56.0,55.3,57.4,60.3,59.8,60.5,63.7,63.8,22 -72.9,45.8,71.0,72.9,45.8,76.6,72.9,45.8,69.1,53.3,48.3,68.2,47.4,43.3,61.6,42.4,39.1,55.8,52.8,60.2,58.4,58.4,64.8,63.9,62.1,68.5,67.6,23 -73.0,45.9,71.5,72.2,45.6,77.7,74.4,47.4,72.5,56.2,48.7,79.2,50.5,43.5,72.9,45.6,39.7,68.0,54.4,65.8,62.2,59.9,71.3,69.8,64.1,75.3,72.5,24 -73.9,46.3,73.1,72.2,45.3,79.3,76.8,49.0,77.1,60.4,49.8,92.0,54.9,44.3,86.3,49.9,40.4,82.8,57.2,73.2,67.4,62.9,79.8,77.6,67.4,84.1,79.0,25 -77.0,47.2,75.9,74.4,45.2,81.9,81.0,50.4,82.9,65.8,51.9,104.7,60.7,46.0,100.1,55.3,41.3,98.0,62.2,82.6,74.8,68.8,90.6,87.6,72.9,94.8,87.7,26 -83.2,48.6,80.4,80.4,45.8,86.0,87.8,51.4,89.7,72.4,54.9,115.7,68.2,49.1,112.4,61.6,42.4,111.5,70.4,94.5,85.2,78.7,103.7,100.0,81.5,107.4,99.1,27 -93.3,50.5,86.6,91.0,47.2,91.9,98.0,51.8,97.6,80.0,59.2,123.5,77.5,53.9,121.8,68.9,44.0,121.6,82.4,108.8,98.9,93.4,119.3,114.8,93.9,121.9,113.6,28 -106.2,52.6,95.1,105.2,49.1,100.4,110.7,51.7,107.3,88.5,64.9,128.6,87.9,60.4,128.5,77.1,46.6,128.5,97.4,124.7,114.9,111.6,136.3,131.3,109.4,137.8,130.5,29 -120.5,54.3,106.3,121.2,51.0,111.9,124.8,51.2,119.9,97.4,72.3,132.0,98.6,68.8,132.9,86.1,51.1,132.7,114.2,141.0,131.8,131.4,153.8,148.6,126.9,155.0,148.9,30 -134.5,55.1,120.5,137.4,52.3,127.1,139.2,50.5,136.4,106.5,81.6,134.8,109.0,79.1,135.7,95.7,58.3,134.8,131.5,156.5,148.2,151.0,170.4,165.8,145.4,173.2,167.7,31 -147.2,54.8,137.8,152.1,52.8,145.9,153.0,49.6,157.1,115.6,92.9,137.8,118.4,91.1,137.2,105.8,68.6,135.4,148.2,170.1,162.6,168.6,185.3,181.9,163.8,191.7,185.8,32 -157.8,53.9,156.3,164.9,52.9,166.2,165.4,49.0,179.5,124.4,105.6,140.7,126.7,104.3,137.7,115.8,81.3,134.8,162.8,180.5,173.9,183.2,197.0,195.1,181.0,208.6,201.7,33 -166.2,53.2,173.4,175.1,53.1,185.2,175.9,48.8,200.5,132.8,119.0,143.2,133.8,118.0,137.7,124.9,95.2,133.1,173.8,186.6,180.6,193.7,204.6,203.4,195.6,221.4,213.6,34 -171.9,53.3,186.9,182.2,54.2,200.0,184.1,49.5,216.8,140.7,132.3,144.8,139.8,131.5,137.3,132.3,109.0,130.7,179.7,187.1,181.6,199.2,206.6,204.7,206.6,227.9,219.5,35 -175.0,54.7,195.0,186.1,56.4,208.5,189.5,51.3,226.2,147.8,144.8,145.3,144.7,144.2,136.9,137.6,121.9,127.7,179.6,181.6,176.1,198.9,202.4,198.0,212.9,226.4,218.5,36 -176.1,57.2,198.7,187.5,59.5,212.1,192.8,53.8,230.0,154.0,156.2,144.9,148.8,155.5,136.4,141.1,133.7,124.6,174.9,171.8,166.1,194.1,193.4,185.5,214.6,218.6,211.6,37 -176.3,60.0,199.8,187.7,62.7,212.6,195.1,56.8,230.4,158.9,166.0,143.8,152.4,165.3,135.7,143.3,144.4,121.5,167.2,160.1,154.1,186.2,181.5,170.6,212.1,206.6,200.8,38 -176.6,62.6,200.0,187.8,65.4,212.1,197.1,59.8,229.9,162.3,174.0,142.3,155.6,173.1,134.8,144.8,154.0,119.0,158.4,149.1,142.6,176.9,168.6,156.5,205.6,192.7,188.0,39 -177.7,64.5,200.6,188.7,67.2,212.2,199.8,62.6,230.0,164.1,180.0,140.8,158.9,178.8,133.7,146.0,162.6,117.3,150.1,140.8,133.8,167.6,156.5,145.9,195.9,178.9,175.0,40 -179.4,65.9,201.9,190.1,68.5,213.1,202.7,65.1,231.2,164.7,184.6,139.5,162.0,183.1,132.4,147.2,170.5,116.2,143.4,135.6,128.2,159.6,146.4,139.0,185.0,167.0,163.4,41 -181.3,67.0,203.6,191.9,69.6,214.6,205.4,67.2,233.0,165.0,188.7,138.5,164.9,187.0,131.4,148.4,178.0,115.7,139.1,133.7,125.8,154.0,139.6,135.5,175.4,158.1,154.5,42 -183.1,68.2,205.6,193.4,71.0,216.8,207.4,69.1,235.5,165.6,193.1,138.2,167.3,191.4,130.7,149.8,185.6,115.7,138.0,135.2,126.9,151.9,137.1,135.2,169.5,153.8,150.1,43 -184.4,69.7,207.6,194.5,73.1,219.2,208.4,70.8,238.1,167.1,198.3,138.6,169.2,197.0,130.6,151.5,193.3,116.1,140.4,139.9,131.2,153.9,139.4,137.5,168.9,154.6,150.7,44 -185.2,71.4,209.1,195.1,75.6,221.2,208.3,72.2,240.0,169.4,203.7,140.1,170.8,203.0,131.5,153.5,200.6,117.0,144.4,145.6,136.6,157.9,144.3,140.7,171.3,158.2,154.1,45 -185.3,73.2,209.6,195.3,78.2,222.0,207.4,73.5,240.4,172.4,208.7,142.6,172.5,208.5,133.6,156.0,206.6,118.7,147.5,149.8,140.9,161.3,148.8,143.1,173.5,161.5,157.4,46 -185.0,74.7,208.4,195.3,80.4,220.5,205.6,74.7,238.3,175.6,212.2,146.5,174.8,212.2,137.3,159.0,210.6,121.5,147.3,150.1,141.7,161.2,150.1,142.6,172.3,161.2,157.5,47 -184.1,76.0,205.1,194.9,81.9,216.3,203.0,76.0,233.0,179.0,213.7,151.5,177.7,213.5,142.6,162.4,211.8,125.4,142.0,144.6,137.4,155.8,146.0,138.2,165.4,155.2,152.2,48 -182.4,77.0,200.0,193.9,82.8,209.8,199.7,77.3,225.1,181.9,212.8,156.7,180.8,211.8,148.2,165.8,210.2,129.6,133.1,135.3,129.4,146.7,138.1,130.9,154.5,145.4,143.2,49 -179.7,77.8,193.8,191.7,83.2,201.9,195.6,78.4,215.7,183.7,209.0,160.7,183.1,207.0,152.8,168.4,205.9,133.0,122.7,124.5,119.9,135.9,128.5,122.5,142.0,134.4,132.7,50 -175.7,78.5,186.9,187.8,83.2,193.4,190.6,79.4,205.6,183.9,202.3,162.3,183.9,198.9,154.8,169.8,198.9,134.8,113.0,114.9,111.2,126.0,119.5,114.9,130.6,125.0,123.2,51 -170.1,79.1,179.9,181.9,82.8,185.0,184.6,80.1,195.7,182.1,192.4,160.5,182.7,187.6,153.2,169.4,189.6,134.2,105.7,108.4,104.8,118.5,112.9,109.4,122.1,119.4,116.5,52 -163.1,79.5,173.4,174.1,82.1,177.4,177.5,80.5,186.7,178.7,180.9,156.1,179.8,174.6,148.9,167.6,178.7,131.7,100.6,104.7,100.8,113.1,108.6,105.9,116.1,116.9,112.5,53 -154.6,79.3,168.1,164.8,80.9,170.9,168.9,80.3,179.2,174.1,169.2,150.2,175.8,161.7,143.2,164.8,167.3,128.0,96.8,102.8,98.5,108.8,105.7,103.9,111.6,116.1,110.3,54 -144.8,78.5,164.4,154.2,79.4,166.3,158.8,79.4,173.8,169.0,159.0,144.0,171.5,150.6,137.3,161.5,156.5,124.0,93.6,101.9,97.3,104.7,103.7,102.8,107.4,115.8,109.3,55 -133.9,76.8,163.0,142.6,77.5,163.9,147.2,77.8,171.0,163.7,151.4,138.4,167.2,142.8,132.4,158.1,147.0,120.2,90.3,101.1,96.5,100.0,102.0,102.1,102.9,114.8,108.8,56 -122.7,74.4,163.5,130.9,75.3,163.6,134.8,75.7,170.7,158.9,146.0,133.6,163.1,137.6,128.4,154.9,138.9,116.8,87.1,100.4,96.2,95.3,100.5,101.7,98.2,113.2,108.5,57 -112.0,71.8,165.4,119.8,73.1,165.1,122.7,73.4,172.7,154.6,141.6,129.4,159.2,133.9,124.8,151.8,132.1,113.7,84.4,99.7,96.2,91.1,99.2,101.4,94.0,111.3,108.4,58 -102.8,69.1,168.2,110.3,71.0,168.2,112.1,71.0,176.6,151.5,137.3,125.7,155.6,130.7,121.5,149.0,126.5,110.7,82.4,99.1,96.3,88.0,98.2,101.0,90.8,109.3,108.4,59 -95.7,66.8,171.5,102.7,69.2,172.5,103.8,68.9,182.1,149.6,132.4,122.4,152.3,127.1,118.1,146.5,122.0,107.9,81.5,98.6,96.7,86.6,97.4,100.4,88.9,107.5,108.3,60 -90.4,64.8,174.6,96.9,67.6,177.3,97.4,67.0,188.2,148.6,127.0,119.6,149.5,123.1,114.8,144.4,118.1,105.5,81.3,98.1,97.0,86.3,96.7,99.9,88.2,106.1,108.3,61 -86.4,63.1,177.2,92.1,66.1,181.4,92.6,65.2,193.9,148.0,121.6,117.4,147.2,119.0,111.7,142.7,114.8,103.5,81.4,97.7,97.2,86.7,96.1,99.4,88.0,105.4,108.6,62 -83.2,61.7,178.5,87.8,64.5,184.1,88.8,63.5,198.1,147.3,116.5,115.7,145.7,114.9,109.0,141.5,111.5,102.4,81.5,97.3,97.3,87.1,95.4,99.1,88.0,105.6,109.3,63 -80.3,60.4,178.2,83.6,62.8,184.5,85.6,62.0,200.1,146.2,112.2,114.6,145.0,111.0,106.9,140.9,108.3,102.2,81.3,96.9,97.0,87.1,94.7,99.2,87.9,106.9,110.6,64 -77.8,59.7,176.8,79.7,61.5,183.6,83.3,61.2,200.7,145.0,108.9,114.2,145.4,107.7,105.7,141.7,105.9,103.2,81.3,96.9,96.8,87.3,94.5,99.9,88.5,109.8,113.1,65 -75.9,59.7,175.1,76.9,61.2,182.1,82.4,61.8,200.9,144.1,106.7,114.6,146.7,105.6,105.5,144.9,105.2,105.6,81.8,97.5,97.1,88.5,95.8,101.6,90.9,114.4,117.4,66 -74.7,60.7,173.8,75.7,62.6,181.3,83.2,64.5,201.8,144.0,105.7,115.7,149.0,104.9,106.5,151.5,107.4,109.9,83.4,99.1,98.2,91.7,99.1,104.7,96.3,121.3,124.1,67 -74.4,63.0,173.2,76.5,65.9,181.5,85.8,69.5,204.0,144.9,106.1,117.6,152.3,106.0,109.1,161.9,112.9,116.0,86.6,102.1,100.6,97.4,105.2,109.4,105.5,130.7,133.7,68 -74.8,66.0,172.4,78.6,70.4,181.7,89.5,76.0,205.8,146.9,107.7,120.3,156.4,108.8,113.1,174.6,120.9,123.7,91.7,106.8,104.8,105.7,114.0,116.2,117.8,142.4,146.0,69 -75.6,69.2,170.2,81.1,75.0,180.0,93.4,82.6,205.5,150.0,110.4,123.9,161.5,113.2,118.3,187.4,130.0,132.6,99.2,113.7,111.5,116.2,125.3,125.6,132.7,156.1,160.5,70 -76.6,71.9,165.4,83.2,78.5,174.7,96.2,87.8,200.9,154.0,114.0,128.2,167.3,119.0,124.8,198.1,139.0,142.3,109.3,123.2,121.3,128.8,138.9,138.0,149.1,171.4,176.9,71 -77.6,73.9,157.1,84.1,80.1,164.8,97.4,90.8,190.7,158.8,118.3,133.2,173.7,126.0,132.4,205.2,146.8,152.4,122.1,135.4,134.4,142.9,154.5,153.5,166.4,187.8,194.5,72 -78.5,75.1,146.1,84.3,80.4,151.5,97.4,92.1,176.6,164.0,123.4,138.9,180.4,133.7,140.6,209.1,153.5,162.2,135.8,148.9,148.9,157.3,170.3,170.2,183.4,204.1,211.5,73 -79.1,76.0,133.8,84.1,80.2,137.0,96.8,92.3,160.5,169.2,129.2,145.1,186.7,141.5,149.1,211.1,159.7,171.2,148.6,161.8,162.6,170.7,184.6,185.8,199.0,218.5,226.1,74 -79.4,76.6,121.5,84.1,80.4,123.3,96.2,92.5,144.8,174.0,135.7,151.5,192.3,149.0,157.3,212.2,165.6,178.9,158.4,172.3,173.2,181.6,195.4,198.2,212.1,229.7,236.2,75 -79.4,77.3,110.1,84.7,81.4,112.1,96.3,93.1,131.3,177.8,142.8,157.9,196.5,155.5,164.9,213.2,171.5,184.7,163.6,178.8,178.9,188.7,201.4,205.5,221.5,236.2,240.4,76 -79.4,78.2,100.5,85.8,83.1,103.4,96.8,94.0,120.1,180.5,149.8,163.8,199.0,160.6,171.1,213.0,176.4,188.2,164.4,181.1,179.8,191.7,202.7,207.5,226.2,237.4,238.7,77 -79.6,79.2,93.2,87.3,85.1,97.3,97.2,94.6,111.3,181.8,155.7,168.3,199.4,163.6,175.2,210.4,179.1,188.9,161.5,179.2,176.5,190.6,199.9,204.7,224.9,232.9,231.5,78 -80.4,80.4,88.8,88.8,86.9,93.4,97.2,94.4,104.6,181.4,159.8,170.6,197.3,164.0,176.5,203.9,178.1,186.4,155.6,173.2,169.5,185.3,193.6,197.3,216.8,222.3,219.5,79 -81.9,81.6,87.4,90.1,88.1,91.6,96.3,93.0,100.0,179.3,161.4,170.4,192.4,161.5,174.5,192.9,172.9,180.7,147.4,163.4,159.6,175.8,184.4,185.9,201.3,205.7,203.4,80 -83.9,82.9,88.1,91.2,88.7,91.1,94.8,90.8,96.7,175.7,160.8,168.3,185.2,157.1,170.5,179.0,164.7,172.7,137.8,151.4,148.1,163.7,173.4,172.1,181.3,185.5,184.9,81 -85.7,83.8,89.6,91.7,88.6,91.1,92.8,88.0,94.1,171.0,159.0,165.3,176.6,152.2,165.7,164.4,155.6,163.9,127.9,138.9,136.4,150.5,161.6,157.7,160.3,164.7,166.1,82 -86.9,84.1,90.6,91.6,87.8,90.6,90.6,85.0,91.6,165.6,156.5,162.3,167.3,148.2,161.5,151.5,147.3,155.6,118.6,127.8,126.0,138.0,150.1,144.5,141.7,146.4,149.1,83 -87.0,83.7,90.2,90.6,86.4,89.2,88.5,82.1,88.5,160.1,153.9,160.1,157.9,145.9,158.9,141.9,141.4,148.9,110.7,119.5,117.9,127.4,139.6,133.8,128.3,132.6,135.6,84 -86.3,82.7,88.5,89.0,84.4,87.2,86.4,79.4,85.2,155.1,151.5,158.4,149.5,144.7,157.2,135.3,137.2,143.4,104.1,113.5,111.9,118.8,130.3,125.5,119.3,123.0,125.2,85 -84.9,81.2,86.3,87.1,82.0,85.0,84.3,76.9,82.1,151.1,149.3,156.8,142.9,143.6,155.4,131.0,133.7,138.4,98.5,108.8,107.1,111.6,122.1,118.8,113.2,116.3,117.3,86 -83.2,79.4,84.1,85.0,79.4,83.2,82.2,74.7,79.4,149.0,147.3,154.8,139.0,141.5,152.3,128.2,129.8,133.2,93.6,104.7,102.8,105.6,114.9,113.0,108.4,111.2,111.2,87 -81.3,77.5,82.4,83.1,76.7,82.1,80.1,72.8,77.6,148.9,145.4,151.9,138.3,137.5,147.2,126.1,124.8,127.2,88.9,100.2,98.5,100.3,108.4,107.7,103.7,106.6,106.1,88 -79.3,75.5,81.2,81.2,74.1,81.7,78.0,71.1,76.4,149.6,143.0,147.9,139.2,131.8,140.3,124.1,118.6,120.5,84.6,95.4,94.1,95.5,102.5,102.5,98.8,102.1,101.7,89 -77.4,73.3,80.3,79.4,71.5,81.6,75.9,69.3,75.6,149.4,139.2,142.5,139.5,124.7,132.1,121.6,111.6,113.3,80.6,90.4,89.6,90.9,97.0,97.6,93.9,97.6,97.7,90 -75.7,71.0,79.4,77.6,69.1,81.3,73.8,67.3,74.7,146.5,133.2,135.7,137.3,116.5,123.2,118.2,104.0,105.7,76.9,85.2,85.2,86.1,91.7,92.6,88.9,92.6,93.6,91 -74.1,68.6,78.4,75.7,67.0,80.6,71.7,65.0,73.7,139.8,124.4,127.2,131.1,107.6,114.0,113.4,96.2,98.0,73.4,80.0,81.0,81.1,86.4,87.7,84.0,87.2,89.1,92 -72.7,66.4,77.2,73.8,65.3,79.5,69.7,62.6,72.3,130.3,113.8,117.5,121.9,98.4,104.8,107.4,88.4,90.2,70.3,75.0,76.9,76.1,81.2,82.9,79.3,81.6,84.6,93 -71.3,64.6,75.7,71.9,64.1,77.9,67.6,60.4,70.5,119.5,102.5,107.1,111.5,89.2,95.6,100.8,80.7,82.5,67.4,70.5,73.1,71.5,76.4,78.3,75.0,76.5,80.1,94 -70.1,63.5,73.8,70.1,63.5,75.7,65.4,58.9,68.2,109.0,91.6,96.5,101.5,80.7,86.6,94.1,73.2,74.9,64.8,66.7,69.5,67.6,72.3,74.1,71.3,72.3,76.0,95 From 8ecea735efff3ff7f7409a699f11bd0d888b1e3d Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Mon, 26 Aug 2024 20:19:31 +0200 Subject: [PATCH 04/23] Adding random load profile. Adapting some tests. --- build.gradle | 3 + docs/uml/main/TimeSeriesDatamodelConcept.puml | 46 ++++- .../uml/main/input/InputDatamodelConcept.puml | 14 -- .../timeseries/BDEWLoadProfileFactory.java | 60 +++--- .../timeseries/LoadProfileFactory.java | 10 +- .../timeseries/RandomLoadProfileFactory.java | 94 ++++++++++ .../io/naming/DefaultDirectoryHierarchy.java | 5 +- .../EntityPersistenceNamingStrategy.java | 23 +-- .../ie3/datamodel/io/processor/Processor.java | 4 +- .../processor/input/InputEntityProcessor.java | 1 - .../timeseries/TimeSeriesProcessor.java | 8 +- .../ie3/datamodel/io/source/EntitySource.java | 16 ++ .../io/source/LoadProfileSource.java | 74 ++++---- .../io/source/csv/CsvDataSource.java | 4 +- .../io/source/csv/CsvLoadProfileSource.java | 17 +- .../java/edu/ie3/datamodel/models/Season.java | 2 +- .../models/input/RandomLoadParameters.java | 177 ------------------ .../datamodel/models/profile/LoadProfile.java | 22 ++- .../repetitive/BDEWLoadProfileTimeSeries.java | 54 +++++- .../repetitive/LoadProfileInput.java | 56 ------ .../repetitive/LoadProfileTimeSeries.java | 27 ++- .../repetitive/RandomLoadProfileEntry.java | 35 ++++ .../RandomLoadProfileTimeSeries.java | 42 +++++ .../repetitive/RepetitiveTimeSeries.java | 2 +- ...m_34e34adb-a54a-4669-869f-d22c4e9e07cb.csv | 97 ++++++++++ .../DBEWLoadProfileFactoryTest.groovy | 160 ++++++++++++++++ .../RandomLoadProfileFactoryTest.groovy | 153 +++++++++++++++ ...EntityPersistenceNamingStrategyTest.groovy | 57 +----- .../io/naming/FileNamingStrategyTest.groovy | 60 ++---- .../io/processor/ProcessorProviderTest.groovy | 10 +- .../input/InputEntityProcessorTest.groovy | 38 ---- .../timeseries/TimeSeriesProcessorTest.groovy | 12 +- .../datamodel/io/sink/CsvFileSinkTest.groovy | 2 +- .../io/source/LoadProfileSourceTest.groovy | 33 ++++ .../io/source/csv/CsvDataSourceTest.groovy | 49 ++++- .../models/profile/LoadProfileTest.groovy | 147 ++++++++------- .../ie3/test/common/TimeSeriesTestData.groovy | 29 ++- 37 files changed, 1024 insertions(+), 619 deletions(-) create mode 100644 src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java delete mode 100644 src/main/java/edu/ie3/datamodel/models/input/RandomLoadParameters.java delete mode 100644 src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileInput.java create mode 100644 src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileEntry.java create mode 100644 src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java create mode 100644 src/main/resources/load/lpts_random_34e34adb-a54a-4669-869f-d22c4e9e07cb.csv create mode 100644 src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/DBEWLoadProfileFactoryTest.groovy create mode 100644 src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy create mode 100644 src/test/groovy/edu/ie3/datamodel/io/source/LoadProfileSourceTest.groovy diff --git a/build.gradle b/build.gradle index c3105ef23..7751064f1 100644 --- a/build.gradle +++ b/build.gradle @@ -67,6 +67,9 @@ dependencies { // Graphs implementation 'org.jgrapht:jgrapht-core:1.5.2' + // Statistics (for random load model) + implementation 'de.lmu.ifi.dbs.elki:elki:0.7.5' + // testing testImplementation "org.apache.groovy:groovy:$groovyBinaryVersion" diff --git a/docs/uml/main/TimeSeriesDatamodelConcept.puml b/docs/uml/main/TimeSeriesDatamodelConcept.puml index 370f3b2e8..0acc0cf5f 100644 --- a/docs/uml/main/TimeSeriesDatamodelConcept.puml +++ b/docs/uml/main/TimeSeriesDatamodelConcept.puml @@ -22,11 +22,22 @@ package models { childNote .. input childNote .. voltagelevels - interface StandardLoadProfile { + interface LoadProfile { + getKey: String + + {static} parse(String): LoadProfile + + {static} getAllProfiles: LoadProfile[] + + {static} getProfile(T[], String): T + enum DefaultLoadProfiles + + enum RandomLoadProfile + } + + DefaultLoadProfiles --|> LoadProfile + RandomLoadProfile --|> LoadProfile + + interface StandardLoadProfile { + {static} parse(String): StandardLoadProfile } + StandardLoadProfile ..|> LoadProfile enum BdewLoadProfile { - key: String @@ -120,12 +131,22 @@ package models { } RepetitiveTimeSeries --|> TimeSeries - class LoadProfileInput { - - type: StandardLoadProfile - - dayOfWeekToHourlyValues: Map> + abstract class LoadProfileTimeSeries { + - loadProfile: StandardLoadProfile + - valueMapping: Map> + + getLoadProfile(): LoadProfile + # fromTime(ZonedDateTime): Key } - LoadProfileInput --|> RepetitiveTimeSeries - LoadProfileInput *-- StandardLoadProfile + LoadProfileTimeSeries --|> RepetitiveTimeSeries + LoadProfileTimeSeries *-- LoadProfile + + class BDEWLoadProfileTimeSeries {} + BDEWLoadProfileTimeSeries --|> LoadProfileTimeSeries + BDEWLoadProfileTimeSeries *-- BdewLoadProfileEntry + + class RandomLoadProfileTimeSeries {} + RandomLoadProfileTimeSeries --|> LoadProfileTimeSeries + RandomLoadProfileTimeSeries *-- RandomLoadProfileEntry abstract class TimeSeriesEntry { # value: V @@ -142,8 +163,21 @@ package models { class LoadProfileEntry { - dayOfWeek: DayOfWeek - quarterHourOfDay: int + + getDayOfWeek(): DayOfWeek + + getQuarterHourOfDay(): Integer } LoadProfileEntry --|> TimeSeriesEntry: <>:PValue + + class BdewLoadProfileEntry { + - season: Season + + getSeason(): Season + } + BdewLoadProfileEntry --|> LoadProfileEntry + + class RandomLoadProfileEntry { + - gev: GeneralizedExtremeValueDistribution + } + RandomLoadProfileEntry --|> LoadProfileEntry } } diff --git a/docs/uml/main/input/InputDatamodelConcept.puml b/docs/uml/main/input/InputDatamodelConcept.puml index 91f11c107..15badfeb0 100644 --- a/docs/uml/main/input/InputDatamodelConcept.puml +++ b/docs/uml/main/input/InputDatamodelConcept.puml @@ -142,20 +142,6 @@ package models { MeasurementUnitInput --|> AssetInput MeasurementUnitInput ..|> HasNodes - class RandomLoadParameter { - - quarterHour: int - - kWd: Double - - kSa: Double - - kSu: Double - - myWd: Double - - mySa: Double - - mySu: Double - - sigmaWd: Double - - sigmaSa: Double - - sigmaSu: Double - } - RandomLoadParameter --|> InputEntity - abstract class AssetTypeInput { - id: String } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BDEWLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BDEWLoadProfileFactory.java index 8d767c8c3..661046b5c 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BDEWLoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BDEWLoadProfileFactory.java @@ -8,16 +8,17 @@ import static edu.ie3.util.quantities.PowerSystemUnits.KILOWATT; import static java.time.DayOfWeek.*; +import edu.ie3.datamodel.exceptions.FactoryException; +import edu.ie3.datamodel.exceptions.ParsingException; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; import edu.ie3.datamodel.models.Season; import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileEntry; import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileTimeSeries; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; import edu.ie3.datamodel.models.value.PValue; -import java.util.ArrayList; import java.util.List; import java.util.Set; -import java.util.UUID; public class BDEWLoadProfileFactory extends LoadProfileFactory { @@ -31,82 +32,71 @@ public class BDEWLoadProfileFactory public static final String TRANSITION_SATURDAY = "TrSa"; public static final String TRANSITION_SUNDAY = "TrSu"; + public BDEWLoadProfileFactory() { + this(BDEWLoadProfileEntry.class); + } + public BDEWLoadProfileFactory(Class valueClass) { super(valueClass); } @Override - protected List buildModel(LoadProfileData data) { - List entries = new ArrayList<>(); + protected Set buildModel(LoadProfileData data) { int quarterHour = data.getInt(QUARTER_HOUR); - /* summer */ - entries.add( + return Set.of( new BDEWLoadProfileEntry( new PValue(data.getQuantity(SUMMER_WEEKDAY, KILOWATT)), Season.SUMMER, MONDAY, - quarterHour)); - entries.add( + quarterHour), new BDEWLoadProfileEntry( new PValue(data.getQuantity(SUMMER_SATURDAY, KILOWATT)), Season.SUMMER, SATURDAY, - quarterHour)); - entries.add( + quarterHour), new BDEWLoadProfileEntry( new PValue(data.getQuantity(SUMMER_SUNDAY, KILOWATT)), Season.SUMMER, SUNDAY, - quarterHour)); - - /* winter */ - entries.add( + quarterHour), new BDEWLoadProfileEntry( new PValue(data.getQuantity(WINTER_WEEKDAY, KILOWATT)), Season.WINTER, MONDAY, - quarterHour)); - entries.add( + quarterHour), new BDEWLoadProfileEntry( new PValue(data.getQuantity(WINTER_SATURDAY, KILOWATT)), Season.WINTER, SATURDAY, - quarterHour)); - entries.add( + quarterHour), new BDEWLoadProfileEntry( new PValue(data.getQuantity(WINTER_SUNDAY, KILOWATT)), Season.WINTER, SUNDAY, - quarterHour)); - - /* transition */ - entries.add( + quarterHour), new BDEWLoadProfileEntry( new PValue(data.getQuantity(TRANSITION_WEEKDAY, KILOWATT)), Season.TRANSITION, MONDAY, - quarterHour)); - entries.add( + quarterHour), new BDEWLoadProfileEntry( new PValue(data.getQuantity(TRANSITION_SATURDAY, KILOWATT)), Season.TRANSITION, SATURDAY, - quarterHour)); - entries.add( + quarterHour), new BDEWLoadProfileEntry( new PValue(data.getQuantity(TRANSITION_SUNDAY, KILOWATT)), Season.TRANSITION, SUNDAY, quarterHour)); - - return entries; } @Override protected List> getFields(Class entityClass) { return List.of( newSet( + QUARTER_HOUR, SUMMER_WEEKDAY, SUMMER_SATURDAY, SUMMER_SUNDAY, @@ -120,7 +110,17 @@ protected List> getFields(Class entityClass) { @Override public LoadProfileTimeSeries build( - UUID uuid, BdewStandardLoadProfile loadProfile, Set entries) { - return new BDEWLoadProfileTimeSeries(uuid, loadProfile, entries); + LoadProfileTimeSeriesMetaInformation metaInformation, Set entries) { + return new BDEWLoadProfileTimeSeries( + metaInformation.getUuid(), parseProfile(metaInformation.getProfile()), entries); + } + + @Override + public BdewStandardLoadProfile parseProfile(String profile) { + try { + return BdewStandardLoadProfile.get(profile); + } catch (ParsingException e) { + throw new FactoryException("An error occurred while parsing the profile: " + profile, e); + } } } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java index 5b2a5e1ce..98856dd6c 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java @@ -6,20 +6,22 @@ package edu.ie3.datamodel.io.factory.timeseries; import edu.ie3.datamodel.io.factory.Factory; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; import edu.ie3.datamodel.models.profile.LoadProfile; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; -import java.util.List; import java.util.Set; -import java.util.UUID; public abstract class LoadProfileFactory

- extends Factory, List> { + extends Factory, Set> { public static final String QUARTER_HOUR = "quarterHour"; public LoadProfileFactory(Class valueClass) { super(valueClass); } - public abstract LoadProfileTimeSeries build(UUID uuid, P loadProfile, Set entries); + public abstract LoadProfileTimeSeries build( + LoadProfileTimeSeriesMetaInformation metaInformation, Set data); + + public abstract P parseProfile(String profile); } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java new file mode 100644 index 000000000..abb1d839e --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java @@ -0,0 +1,94 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.io.factory.timeseries; + +import static edu.ie3.datamodel.models.profile.LoadProfile.RandomLoadProfile.RANDOM_LOAD_PROFILE; +import static java.time.DayOfWeek.*; + +import de.lmu.ifi.dbs.elki.math.statistics.distribution.GeneralizedExtremeValueDistribution; +import de.lmu.ifi.dbs.elki.utilities.random.RandomFactory; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; +import edu.ie3.datamodel.models.profile.LoadProfile; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; +import edu.ie3.datamodel.models.timeseries.repetitive.RandomLoadProfileEntry; +import edu.ie3.datamodel.models.timeseries.repetitive.RandomLoadProfileTimeSeries; +import java.util.List; +import java.util.Random; +import java.util.Set; + +public class RandomLoadProfileFactory + extends LoadProfileFactory { + public static final String K_WEEKDAY = "kWd"; + public static final String K_SATURDAY = "kSa"; + public static final String K_SUNDAY = "kSu"; + public static final String MY_WEEKDAY = "myWd"; + public static final String MY_SATURDAY = "mySa"; + public static final String MY_SUNDAY = "mySu"; + public static final String SIGMA_WEEKDAY = "sigmaWd"; + public static final String SIGMA_SATURDAY = "sigmaSa"; + public static final String SIGMA_SUNDAY = "sigmaSu"; + + public RandomLoadProfileFactory() { + super(RandomLoadProfileEntry.class); + } + + @Override + protected Set buildModel(LoadProfileData data) { + int quarterHour = data.getInt(QUARTER_HOUR); + return Set.of( + new RandomLoadProfileEntry( + new GeneralizedExtremeValueDistribution( + data.getDouble(MY_WEEKDAY), + data.getDouble(SIGMA_WEEKDAY), + data.getDouble(K_WEEKDAY), + RandomFactory.get(new Random().nextLong())), + MONDAY, + quarterHour), + new RandomLoadProfileEntry( + new GeneralizedExtremeValueDistribution( + data.getDouble(MY_SATURDAY), + data.getDouble(SIGMA_SATURDAY), + data.getDouble(K_SATURDAY), + RandomFactory.get(new Random().nextLong())), + SATURDAY, + quarterHour), + new RandomLoadProfileEntry( + new GeneralizedExtremeValueDistribution( + data.getDouble(MY_SUNDAY), + data.getDouble(SIGMA_SUNDAY), + data.getDouble(K_SUNDAY), + RandomFactory.get(new Random().nextLong())), + SUNDAY, + quarterHour)); + } + + @Override + protected List> getFields(Class entityClass) { + return List.of( + newSet( + QUARTER_HOUR, + K_WEEKDAY, + K_SATURDAY, + K_SUNDAY, + MY_WEEKDAY, + MY_SATURDAY, + MY_SUNDAY, + SIGMA_WEEKDAY, + SIGMA_SATURDAY, + SIGMA_SUNDAY)); + } + + @Override + public LoadProfileTimeSeries build( + LoadProfileTimeSeriesMetaInformation metaInformation, Set entries) { + return new RandomLoadProfileTimeSeries(metaInformation.getUuid(), RANDOM_LOAD_PROFILE, entries); + } + + @Override + public LoadProfile parseProfile(String profile) { + return RANDOM_LOAD_PROFILE; + } +} diff --git a/src/main/java/edu/ie3/datamodel/io/naming/DefaultDirectoryHierarchy.java b/src/main/java/edu/ie3/datamodel/io/naming/DefaultDirectoryHierarchy.java index 5964b2433..fff633bbe 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/DefaultDirectoryHierarchy.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/DefaultDirectoryHierarchy.java @@ -30,7 +30,6 @@ import edu.ie3.datamodel.models.result.system.*; import edu.ie3.datamodel.models.result.thermal.ThermalUnitResult; import edu.ie3.datamodel.models.timeseries.TimeSeries; -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileInput; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -250,9 +249,7 @@ private enum SubDirectories { StorageTypeInput.class, WecTypeInput.class, OperatorInput.class, - WecCharacteristicInput.class, - RandomLoadParameters.class, - LoadProfileInput.class) + WecCharacteristicInput.class) .collect(Collectors.toSet())), PARTICIPANTS_INPUT( Constants.INPUT_SUB_TREE.resolve("participants"), diff --git a/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java b/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java index a13ffdc03..715052d5e 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java @@ -60,7 +60,7 @@ public class EntityPersistenceNamingStrategy { * profile is accessible via the named capturing group "profile", the uuid by the group "uuid" */ private static final String LOAD_PROFILE_TIME_SERIES = - "lpts_(?[a-zA-Z][0-9])_(?" + UUID_STRING + ")"; + "lpts_(?[a-zA-Z]{1,11}[0-9]{0,3})_(?" + UUID_STRING + ")"; /** * Pattern to identify load profile time series in this instance of the naming strategy (takes @@ -215,8 +215,6 @@ public Optional getInputEntityName(Class cls) { return getTypeEntityName(cls.asSubclass(AssetTypeInput.class)); if (AssetInput.class.isAssignableFrom(cls)) return getAssetInputEntityName(cls.asSubclass(AssetInput.class)); - if (RandomLoadParameters.class.isAssignableFrom(cls)) - return getRandomLoadParametersEntityName(cls.asSubclass(RandomLoadParameters.class)); if (GraphicInput.class.isAssignableFrom(cls)) return getGraphicsInputEntityName(cls.asSubclass(GraphicInput.class)); if (OperatorInput.class.isAssignableFrom(cls)) @@ -274,19 +272,6 @@ public Optional getAssetCharacteristicsEntityName( return Optional.of(addPrefixAndSuffix(assetCharString)); } - /** - * Get the entity name for all {@link RandomLoadParameters} - * - * @param randomLoadParamClass the random load parameters class an entity name string should be - * generated from - * @return the entity name string - */ - public Optional getRandomLoadParametersEntityName( - Class randomLoadParamClass) { - String loadParamString = camelCaseToSnakeCase(randomLoadParamClass.getSimpleName()); - return Optional.of(addPrefixAndSuffix(loadParamString.concat("_input"))); - } - /** * Converts a given camel case string to its snake case representation * @@ -383,14 +368,14 @@ Optional getEntityName(T timeSeries) { logger.error("Unable to determine content of time series {}", timeSeries); return Optional.empty(); } - } else if (timeSeries instanceof LoadProfileTimeSeries loadProfileInput) { + } else if (timeSeries instanceof LoadProfileTimeSeries loadProfileTimeSeries) { return Optional.of( prefix .concat("lpts") .concat("_") - .concat(loadProfileInput.getLoadProfile().getKey()) + .concat(loadProfileTimeSeries.getLoadProfile().getKey()) .concat("_") - .concat(loadProfileInput.getUuid().toString()) + .concat(loadProfileTimeSeries.getUuid().toString()) .concat(suffix)); } else { logger.error("There is no naming strategy defined for {}", timeSeries); diff --git a/src/main/java/edu/ie3/datamodel/io/processor/Processor.java b/src/main/java/edu/ie3/datamodel/io/processor/Processor.java index 253ac89da..8859babcc 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/Processor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/Processor.java @@ -224,6 +224,7 @@ protected String processMethodResult(Object methodReturnObject, Method method, S "double", "String", "DayOfWeek", + "Season", "ChargingPointType", "EvcsLocationType" -> resultStringBuilder.append(methodReturnObject.toString()); case "Quantity", "ComparableQuantity" -> resultStringBuilder.append( @@ -260,7 +261,8 @@ protected String processMethodResult(Object methodReturnObject, Method method, S processVoltageLevel((VoltageLevel) methodReturnObject, fieldName)); case "Point", "LineString" -> resultStringBuilder.append( geoJsonWriter.write((Geometry) methodReturnObject)); - case "LoadProfile" -> resultStringBuilder.append(((LoadProfile) methodReturnObject).getKey()); + case "LoadProfile", "BdewStandardLoadProfile", "RandomLoadProfile" -> resultStringBuilder + .append(((LoadProfile) methodReturnObject).getKey()); case "AssetTypeInput", "BmTypeInput", "ChpTypeInput", diff --git a/src/main/java/edu/ie3/datamodel/io/processor/input/InputEntityProcessor.java b/src/main/java/edu/ie3/datamodel/io/processor/input/InputEntityProcessor.java index d21212531..18c6a723f 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/input/InputEntityProcessor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/input/InputEntityProcessor.java @@ -35,7 +35,6 @@ public class InputEntityProcessor extends EntityProcessor { List.of( /* InputEntity */ OperatorInput.class, - RandomLoadParameters.class, TimeSeriesMappingSource.MappingEntry.class, IdCoordinateInput.class, /* - AssetInput */ diff --git a/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java b/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java index 52f1a602a..adb2783a5 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java @@ -13,8 +13,7 @@ import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries; import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue; -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileInput; +import edu.ie3.datamodel.models.timeseries.repetitive.*; import edu.ie3.datamodel.models.value.*; import java.lang.reflect.Method; import java.util.*; @@ -50,7 +49,10 @@ public class TimeSeriesProcessor< IndividualTimeSeries.class, TimeBasedValue.class, SValue.class), new TimeSeriesProcessorKey( IndividualTimeSeries.class, TimeBasedValue.class, HeatAndSValue.class), - new TimeSeriesProcessorKey(LoadProfileInput.class, LoadProfileEntry.class, PValue.class)); + new TimeSeriesProcessorKey( + BDEWLoadProfileTimeSeries.class, BDEWLoadProfileEntry.class, PValue.class), + new TimeSeriesProcessorKey( + RandomLoadProfileTimeSeries.class, RandomLoadProfileEntry.class, PValue.class)); /** * Specific combination of time series class, entry class and value class, this processor is diff --git a/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java b/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java index 95dd1e0dc..ba5e0a11f 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java @@ -11,12 +11,15 @@ import edu.ie3.datamodel.exceptions.ValidationException; import edu.ie3.datamodel.io.factory.EntityData; import edu.ie3.datamodel.io.factory.EntityFactory; +import edu.ie3.datamodel.io.naming.FileNamingStrategy; +import edu.ie3.datamodel.io.source.csv.CsvDataSource; import edu.ie3.datamodel.models.Entity; import edu.ie3.datamodel.models.UniqueEntity; import edu.ie3.datamodel.utils.QuadFunction; import edu.ie3.datamodel.utils.TriFunction; import edu.ie3.datamodel.utils.Try; import edu.ie3.datamodel.utils.Try.Failure; +import java.nio.file.Path; import java.util.*; import java.util.function.BiFunction; import java.util.function.Function; @@ -34,6 +37,9 @@ public abstract class EntitySource { protected static final Logger log = LoggerFactory.getLogger(EntitySource.class); + // path for build-in entities + private static final Path BUILD_INS = Path.of("src", "main", "resources"); + // convenience collectors protected static Collector> toMap() { @@ -94,6 +100,16 @@ protected static Try validate( .orElse(Try.Success.empty())); } + /** + * Method to get a source for the build in entities. + * + * @param subdirectory from the resource folder + * @return a new {@link CsvDataSource} + */ + protected static CsvDataSource getBuildInSource(Path subdirectory) { + return new CsvDataSource(",", BUILD_INS.resolve(subdirectory), new FileNamingStrategy()); + } + /** * Universal method to get a map: uuid to {@link UniqueEntity}. * diff --git a/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java index c4c0b5312..eeac6c210 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java @@ -5,32 +5,32 @@ */ package edu.ie3.datamodel.io.source; +import static edu.ie3.datamodel.models.profile.LoadProfile.RandomLoadProfile.RANDOM_LOAD_PROFILE; + import edu.ie3.datamodel.exceptions.FactoryException; -import edu.ie3.datamodel.exceptions.ParsingException; -import edu.ie3.datamodel.exceptions.SourceException; import edu.ie3.datamodel.io.csv.CsvLoadProfileMetaInformation; import edu.ie3.datamodel.io.factory.timeseries.BDEWLoadProfileFactory; import edu.ie3.datamodel.io.factory.timeseries.LoadProfileData; import edu.ie3.datamodel.io.factory.timeseries.LoadProfileFactory; -import edu.ie3.datamodel.io.naming.FileNamingStrategy; +import edu.ie3.datamodel.io.factory.timeseries.RandomLoadProfileFactory; import edu.ie3.datamodel.io.source.csv.CsvDataSource; import edu.ie3.datamodel.io.source.csv.CsvLoadProfileSource; import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; import edu.ie3.datamodel.models.profile.LoadProfile; -import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileEntry; -import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileTimeSeries; -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; +import edu.ie3.datamodel.models.timeseries.repetitive.*; import edu.ie3.datamodel.models.value.Value; import edu.ie3.datamodel.utils.Try; import java.nio.file.Path; import java.time.ZonedDateTime; -import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; +import java.util.function.Function; +import java.util.stream.Collectors; public abstract class LoadProfileSource

extends EntitySource { + private static final CsvDataSource buildInSource = getBuildInSource(Path.of("load")); protected final Class entryClass; protected final LoadProfileFactory entryFactory; @@ -47,7 +47,7 @@ protected LoadProfileSource(Class entryClass, LoadProfileFactory entryF * @param fieldToValues Mapping from field id to values * @return {@link Try} of simple time based value */ - protected Try, FactoryException> createEntries(Map fieldToValues) { + protected Try, FactoryException> createEntries(Map fieldToValues) { LoadProfileData factoryData = new LoadProfileData<>(fieldToValues, entryClass); return entryFactory.get(factoryData); } @@ -66,38 +66,36 @@ protected Try, FactoryException> createEntries(Map field * Method to read in the build-in {@link BdewStandardLoadProfile}s. * * @return a map: load profile to time series - * @throws SourceException if an exception occurred */ - public static Map - readBDEWStandardLoadProfiles() throws SourceException { - Path bdewLoadProfilePath = Path.of("src", "main", "resources", "load"); - CsvDataSource dataSource = - new CsvDataSource(",", bdewLoadProfilePath, new FileNamingStrategy()); - - BdewStandardLoadProfile[] implemented = BdewStandardLoadProfile.values(); - Map loadProfileInputs = new HashMap<>(); - - try { - for (CsvLoadProfileMetaInformation metaInformation : - dataSource.getCsvLoadProfileMetaInformation(implemented).values()) { - BdewStandardLoadProfile profile = BdewStandardLoadProfile.get(metaInformation.getProfile()); + public static Map getBDEWLoadProfiles() { + BDEWLoadProfileFactory factory = new BDEWLoadProfileFactory(); - Class entryClass = BDEWLoadProfileEntry.class; + return buildInSource.getCsvLoadProfileMetaInformation(BdewStandardLoadProfile.values()).stream() + .map( + metaInformation -> + (BDEWLoadProfileTimeSeries) + new CsvLoadProfileSource<>( + buildInSource, metaInformation, BDEWLoadProfileEntry.class, factory) + .getTimeSeries()) + .collect(Collectors.toMap(BDEWLoadProfileTimeSeries::getLoadProfile, Function.identity())); + } - CsvLoadProfileSource source = - new CsvLoadProfileSource<>( - dataSource, + /** + * Method to read in the build-in {@link RandomLoadProfileTimeSeries}. + * + * @return the random load profile time series + */ + public static RandomLoadProfileTimeSeries getRandomLoadProfile() { + CsvLoadProfileMetaInformation metaInformation = + buildInSource.getCsvLoadProfileMetaInformation(RANDOM_LOAD_PROFILE).stream() + .findAny() + .orElseThrow(); + return (RandomLoadProfileTimeSeries) + new CsvLoadProfileSource<>( + buildInSource, metaInformation, - entryClass, - profile, - new BDEWLoadProfileFactory(entryClass)); - - loadProfileInputs.put(profile, (BDEWLoadProfileTimeSeries) source.getTimeSeries()); - } - - return loadProfileInputs; - } catch (ParsingException e) { - throw new SourceException("Unable to read standard load profiles due to: ", e); - } + RandomLoadProfileEntry.class, + new RandomLoadProfileFactory()) + .getTimeSeries(); } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java index ef77cbf69..322a1c9e6 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java @@ -131,7 +131,7 @@ public FileNamingStrategy getNamingStrategy() { * * @return A mapping from uuid to the load profile time series meta information */ - public Map getCsvLoadProfileMetaInformation( + public Set getCsvLoadProfileMetaInformation( LoadProfile... profiles) { return getTimeSeriesFilePaths(fileNamingStrategy.getLoadProfileTimeSeriesPattern()) .parallelStream() @@ -149,7 +149,7 @@ public Map getCsvLoadProfileMetaInformation || profiles.length == 0 || Stream.of(profiles) .anyMatch(profile -> profile.getKey().equals(metaInformation.getProfile()))) - .collect(Collectors.toMap(TimeSeriesMetaInformation::getUuid, Function.identity())); + .collect(Collectors.toSet()); } /** diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java index 9ef9ff656..e0d4e0e86 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java @@ -34,7 +34,6 @@ public CsvLoadProfileSource( CsvDataSource source, CsvLoadProfileMetaInformation metaInformation, Class entryClass, - P loadProfile, LoadProfileFactory entryFactory) { super(entryClass, entryFactory); this.dataSource = source; @@ -42,9 +41,7 @@ public CsvLoadProfileSource( /* Read in the full time series */ try { - this.loadProfileTimeSeries = - buildLoadProfileTimeSeries( - metaInformation.getUuid(), filePath, loadProfile, this::createEntries); + this.loadProfileTimeSeries = buildLoadProfileTimeSeries(metaInformation, this::createEntries); } catch (SourceException e) { throw new IllegalArgumentException( "Unable to obtain time series with UUID '" @@ -76,18 +73,16 @@ public List getTimeKeysAfter(ZonedDateTime time) { * entries are obtained entries with the help of {@code fieldToValueFunction}. If the file does * not exist, an empty Stream is returned. * - * @param timeSeriesUuid unique identifier of the time series - * @param filePath path to the file to read + * @param metaInformation containing an unique identifier of the time series, a path to the file + * to read as well as the profile * @param fieldToValueFunction function, that is able to transfer a mapping (from field to value) * onto a specific instance of the targeted entry class * @throws SourceException If the file cannot be read properly * @return an individual time series */ protected LoadProfileTimeSeries buildLoadProfileTimeSeries( - UUID timeSeriesUuid, - Path filePath, - P loadProfile, - Function, Try, FactoryException>> fieldToValueFunction) + CsvLoadProfileMetaInformation metaInformation, + Function, Try, FactoryException>> fieldToValueFunction) throws SourceException { Set entries = dataSource @@ -100,6 +95,6 @@ protected LoadProfileTimeSeries buildLoadProfileTimeSeries( .flatMap(Collection::stream) .collect(Collectors.toSet()); - return entryFactory.build(timeSeriesUuid, loadProfile, entries); + return entryFactory.build(metaInformation, entries); } } diff --git a/src/main/java/edu/ie3/datamodel/models/Season.java b/src/main/java/edu/ie3/datamodel/models/Season.java index 286dcf6af..5ba70fcb5 100644 --- a/src/main/java/edu/ie3/datamodel/models/Season.java +++ b/src/main/java/edu/ie3/datamodel/models/Season.java @@ -77,6 +77,6 @@ public String getKey() { @Override public String toString() { - return "Season{" + "key='" + key + '\'' + '}'; + return key; } } diff --git a/src/main/java/edu/ie3/datamodel/models/input/RandomLoadParameters.java b/src/main/java/edu/ie3/datamodel/models/input/RandomLoadParameters.java deleted file mode 100644 index 2233cb144..000000000 --- a/src/main/java/edu/ie3/datamodel/models/input/RandomLoadParameters.java +++ /dev/null @@ -1,177 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.models.input; - -import java.util.Objects; -import java.util.UUID; - -/** - * Data model to describe the parameters of a probability density function to draw random power - * consumptions. This model represents a generalized extreme value distribution (GEV), that has been - * sampled for each quarter hour of a day, subdivided into workdays, Saturdays and Sundays. In - * general the GEV is described by the three parameters "location", "scale" and "shape" - */ -public class RandomLoadParameters extends UniqueInputEntity { - - /** The respective quarter hour of the day */ - private final int quarterHour; - - /** Shape parameter for a working day */ - private final double kWd; - - /** Shape parameter for a Saturday */ - private final double kSa; - - /** Shape parameter for a Sunday */ - private final double kSu; - - /** Location parameter for a working day */ - private final double myWd; - - /** Location parameter for a Saturday */ - private final double mySa; - - /** Location parameter for a Sunday */ - private final double mySu; - - /** Scale parameter for a working day */ - private final double sigmaWd; - - /** Scale parameter for a Saturday */ - private final double sigmaSa; - - /** Scale parameter for a Sunday */ - private final double sigmaSu; - - /** - * @param uuid of the input entity - * @param quarterHour The respective quarter hour of the day - * @param kWd Shape parameter for a working day - * @param kSa Shape parameter for a Saturday - * @param kSu Shape parameter for a Sunday - * @param myWd Location parameter for a working day - * @param mySa Location parameter for a Saturday - * @param mySu Location parameter for a Sunday - * @param sigmaWd Scale parameter for a working day - * @param sigmaSa Scale parameter for a Saturday - * @param sigmaSu Scale parameter for a Sunday - */ - public RandomLoadParameters( - UUID uuid, - int quarterHour, - double kWd, - double kSa, - double kSu, - double myWd, - double mySa, - double mySu, - double sigmaWd, - double sigmaSa, - double sigmaSu) { - super(uuid); - this.quarterHour = quarterHour; - this.kWd = kWd; - this.kSa = kSa; - this.kSu = kSu; - this.myWd = myWd; - this.mySa = mySa; - this.mySu = mySu; - this.sigmaWd = sigmaWd; - this.sigmaSa = sigmaSa; - this.sigmaSu = sigmaSu; - } - - public int getQuarterHour() { - return quarterHour; - } - - public double getMyWd() { - return myWd; - } - - public double getMySa() { - return mySa; - } - - public double getMySu() { - return mySu; - } - - public double getSigmaWd() { - return sigmaWd; - } - - public double getSigmaSa() { - return sigmaSa; - } - - public double getSigmaSu() { - return sigmaSu; - } - - public double getkWd() { - return kWd; - } - - public double getkSa() { - return kSa; - } - - public double getkSu() { - return kSu; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof RandomLoadParameters that)) return false; - if (!super.equals(o)) return false; - return Objects.equals(quarterHour, that.quarterHour) - && Objects.equals(kWd, that.kWd) - && Objects.equals(kSa, that.kSa) - && Objects.equals(kSu, that.kSu) - && Objects.equals(myWd, that.myWd) - && Objects.equals(mySa, that.mySa) - && Objects.equals(mySu, that.mySu) - && Objects.equals(sigmaWd, that.sigmaWd) - && Objects.equals(sigmaSa, that.sigmaSa) - && Objects.equals(sigmaSu, that.sigmaSu); - } - - @Override - public int hashCode() { - return Objects.hash( - super.hashCode(), quarterHour, kWd, kSa, kSu, myWd, mySa, mySu, sigmaWd, sigmaSa, sigmaSu); - } - - @Override - public String toString() { - return "RandomLoadParameters{" - + "uuid=" - + getUuid() - + ", quarterHour=" - + quarterHour - + ", kWd=" - + kWd - + ", kSa=" - + kSa - + ", kSu=" - + kSu - + ", myWd=" - + myWd - + ", mySa=" - + mySa - + ", mySu=" - + mySu - + ", sigmaWd=" - + sigmaWd - + ", sigmaSa=" - + sigmaSa - + ", sigmaSu=" - + sigmaSu - + '}'; - } -} diff --git a/src/main/java/edu/ie3/datamodel/models/profile/LoadProfile.java b/src/main/java/edu/ie3/datamodel/models/profile/LoadProfile.java index 5159c9940..c68ba3435 100644 --- a/src/main/java/edu/ie3/datamodel/models/profile/LoadProfile.java +++ b/src/main/java/edu/ie3/datamodel/models/profile/LoadProfile.java @@ -9,6 +9,7 @@ import java.io.Serializable; import java.util.Arrays; import java.util.stream.Collectors; +import java.util.stream.Stream; public interface LoadProfile extends Serializable { /** @return The identifying String */ @@ -28,12 +29,12 @@ static LoadProfile parse(String key) throws ParsingException { } static LoadProfile[] getAllProfiles() { - final LoadProfile[][] all = - new LoadProfile[][] { - BdewStandardLoadProfile.values(), NbwTemperatureDependantLoadProfile.values() - }; - - return Arrays.stream(all).flatMap(Arrays::stream).toArray(LoadProfile[]::new); + return Stream.of( + BdewStandardLoadProfile.values(), + NbwTemperatureDependantLoadProfile.values(), + (LoadProfile[]) RandomLoadProfile.values()) + .flatMap(Arrays::stream) + .toArray(LoadProfile[]::new); } /** @@ -70,4 +71,13 @@ public String getKey() { return "No load profile assigned"; } } + + enum RandomLoadProfile implements LoadProfile { + RANDOM_LOAD_PROFILE; + + @Override + public String getKey() { + return "random"; + } + } } diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileTimeSeries.java index 6df6a92f0..104a8182d 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileTimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileTimeSeries.java @@ -5,6 +5,10 @@ */ package edu.ie3.datamodel.models.timeseries.repetitive; +import static edu.ie3.util.quantities.PowerSystemUnits.KILOWATT; +import static java.lang.Math.pow; +import static java.lang.Math.round; + import edu.ie3.datamodel.models.Season; import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; import edu.ie3.datamodel.models.value.PValue; @@ -13,6 +17,10 @@ import java.util.Objects; import java.util.Set; import java.util.UUID; +import java.util.function.Function; +import javax.measure.quantity.Power; +import tech.units.indriya.ComparableQuantity; +import tech.units.indriya.quantity.Quantities; /** * Describes a bdew load profile time series with repetitive values that can be calculated from a @@ -22,22 +30,50 @@ public class BDEWLoadProfileTimeSeries extends LoadProfileTimeSeries values) { - super(uuid, values, loadProfile, e -> new BdewKey(e.getSeason(), e.getDayOfWeek())); + super(uuid, loadProfile, values, e -> new BdewKey(e.getSeason(), e.getDayOfWeek())); + } + + @Override + public BdewStandardLoadProfile getLoadProfile() { + return (BdewStandardLoadProfile) super.getLoadProfile(); } @Override public PValue calc(ZonedDateTime time) { if (getLoadProfile() == BdewStandardLoadProfile.H0) { - PValue value = super.calc(time); - - // TODO: Add factor calculation - - return value; + /* For the residential average profile, a dynamization has to be taken into account */ + return dynamization(super.calc(time), time.getDayOfYear()); // leap years are ignored } else { return super.calc(time); } } + /** + * Calculates the dynamization factor for given day of year. Cf. + * Anwendung der repräsentativen Lastprofile - Step by step page 19 + * + * @param load load value + * @param t day of year (1-366) + * @return dynamization factor + */ + private PValue dynamization(PValue load, int t) { + double factor = + (-3.92e-10 * pow(t, 4) + 3.2e-7 * pow(t, 3) - 7.02e-5 * pow(t, 2) + 2.1e-3 * t + 1.24); + double rndFactor = round(factor * 1e4) / 1e4; // round to 4 decimal places + Function round = + l -> round(l * rndFactor * 1e1) / 1e1; // rounded to 1 decimal place + + ComparableQuantity value = + load.getP() + .map(v -> v.getValue().doubleValue()) + .map(round) + .map(v -> Quantities.getQuantity(v, KILOWATT)) + .orElse(null); + + return new PValue(value); + } + @Override public boolean equals(Object o) { if (this == o) return true; @@ -52,7 +88,7 @@ public int hashCode() { @Override public String toString() { - return "BDEWLoadProfileInput{" + return "BDEWLoadProfileTimeSeries{" + "uuid=" + getUuid() + "loadProfile=" @@ -63,7 +99,7 @@ public String toString() { } @Override - protected LoadProfileKey fromTime(ZonedDateTime time) { + protected Key fromTime(ZonedDateTime time) { Season season = Season.get(time); DayOfWeek day = @@ -76,5 +112,5 @@ protected LoadProfileKey fromTime(ZonedDateTime time) { return new BdewKey(season, day); } - private record BdewKey(Season season, DayOfWeek dayOfWeek) implements LoadProfileKey {} + private record BdewKey(Season season, DayOfWeek dayOfWeek) implements Key {} } diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileInput.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileInput.java deleted file mode 100644 index e08f69195..000000000 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileInput.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.models.timeseries.repetitive; - -import edu.ie3.datamodel.models.profile.StandardLoadProfile; -import java.time.DayOfWeek; -import java.time.ZonedDateTime; -import java.util.Objects; -import java.util.Set; -import java.util.UUID; - -// TODO This is a sample implementation, please implement a real scenario -@Deprecated -public class LoadProfileInput extends LoadProfileTimeSeries { - public LoadProfileInput(UUID uuid, StandardLoadProfile type, Set values) { - super(uuid, values, type, e -> new Key(e.getDayOfWeek())); - } - - public LoadProfileInput(StandardLoadProfile type, Set values) { - this(UUID.randomUUID(), type, values); - } - - @Override - protected LoadProfileKey fromTime(ZonedDateTime time) { - return new Key(time.getDayOfWeek()); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - return super.equals(o); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode()); - } - - @Override - public String toString() { - return "LoadProfileInput{" - + "uuid=" - + getUuid() - + "type=" - + getLoadProfile() - + ", dayOfWeekToHourlyValues=" - + getValueMapping() - + '}'; - } - - private record Key(DayOfWeek dayOfWeek) implements LoadProfileKey {} -} diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java index d6344fd0b..ffeeb52f5 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java @@ -5,8 +5,11 @@ */ package edu.ie3.datamodel.models.timeseries.repetitive; +import static java.util.function.Function.identity; + import edu.ie3.datamodel.models.profile.LoadProfile; import edu.ie3.datamodel.models.value.PValue; +import java.time.DayOfWeek; import java.time.ZonedDateTime; import java.util.Map; import java.util.Objects; @@ -21,10 +24,14 @@ public abstract class LoadProfileTimeSeries extends RepetitiveTimeSeries { private final LoadProfile loadProfile; - private final Map> valueMapping; + private final Map> valueMapping; + + public LoadProfileTimeSeries(UUID uuid, LoadProfile loadProfile, Set entries) { + this(uuid, loadProfile, entries, e -> new WeekDayKey(e.getDayOfWeek())); + } public LoadProfileTimeSeries( - UUID uuid, Set entries, LoadProfile loadProfile, Function extractor) { + UUID uuid, LoadProfile loadProfile, Set entries, Function extractor) { super(uuid, entries); this.loadProfile = loadProfile; @@ -33,8 +40,7 @@ public LoadProfileTimeSeries( .collect( Collectors.groupingBy( extractor, - Collectors.toMap( - LoadProfileEntry::getQuarterHourOfDay, LoadProfileEntry::getValue))); + Collectors.toMap(LoadProfileEntry::getQuarterHourOfDay, identity()))); } /** Returns the {@link LoadProfile}. */ @@ -43,21 +49,24 @@ public LoadProfile getLoadProfile() { } /** Returns the value mapping. */ - protected Map> getValueMapping() { + protected Map> getValueMapping() { return valueMapping; } @Override protected PValue calc(ZonedDateTime time) { - LoadProfileKey key = fromTime(time); + Key key = fromTime(time); int quarterHour = time.getHour() * 4 + time.getMinute() / 15; + return valueMapping.get(key).get(quarterHour).getValue(); + } - return valueMapping.get(key).get(quarterHour); + protected Key fromTime(ZonedDateTime time) { + return new WeekDayKey(time.getDayOfWeek()); } - protected abstract LoadProfileKey fromTime(ZonedDateTime time); + public interface Key {} - public interface LoadProfileKey {} + private record WeekDayKey(DayOfWeek dayOfWeek) implements Key {} @Override @SuppressWarnings("unchecked") diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileEntry.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileEntry.java new file mode 100644 index 000000000..aa63a413b --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileEntry.java @@ -0,0 +1,35 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.models.timeseries.repetitive; + +import static edu.ie3.util.quantities.PowerSystemUnits.KILOWATT; + +import de.lmu.ifi.dbs.elki.math.statistics.distribution.GeneralizedExtremeValueDistribution; +import edu.ie3.datamodel.models.value.PValue; +import java.time.DayOfWeek; +import tech.units.indriya.quantity.Quantities; + +/** Unique entry for a {@link RandomLoadProfileTimeSeries}. */ +public class RandomLoadProfileEntry extends LoadProfileEntry { + // distribution for random values + private final GeneralizedExtremeValueDistribution gev; + + public RandomLoadProfileEntry( + GeneralizedExtremeValueDistribution gev, DayOfWeek dayOfWeek, int quarterHourOfDay) { + super(new PValue(null), dayOfWeek, quarterHourOfDay); + this.gev = gev; + } + + @Override + public PValue getValue() { + double randomValue = gev.nextRandom(); + + while (randomValue < 0) { + randomValue = gev.nextRandom(); + } + return new PValue(Quantities.getQuantity(randomValue, KILOWATT)); + } +} diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java new file mode 100644 index 000000000..da340869c --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java @@ -0,0 +1,42 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.models.timeseries.repetitive; + +import edu.ie3.datamodel.models.profile.LoadProfile; +import java.util.Objects; +import java.util.Set; +import java.util.UUID; + +public class RandomLoadProfileTimeSeries extends LoadProfileTimeSeries { + public RandomLoadProfileTimeSeries( + UUID uuid, LoadProfile loadProfile, Set entries) { + super(uuid, loadProfile, entries); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + return super.equals(o); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode()); + } + + @Override + public String toString() { + return "RandomLoadProfileTimeSeries{" + + "uuid=" + + getUuid() + + "loadProfile=" + + getLoadProfile() + + ", valueMapping=" + + getValueMapping() + + '}'; + } +} diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RepetitiveTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RepetitiveTimeSeries.java index 3a5c01209..e1f4e9f10 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RepetitiveTimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RepetitiveTimeSeries.java @@ -29,7 +29,7 @@ protected RepetitiveTimeSeries(UUID uuid, Set entries) { @Override public Optional getValue(ZonedDateTime time) { - return Optional.of(calc(time)); + return Optional.ofNullable(calc(time)); } @Override diff --git a/src/main/resources/load/lpts_random_34e34adb-a54a-4669-869f-d22c4e9e07cb.csv b/src/main/resources/load/lpts_random_34e34adb-a54a-4669-869f-d22c4e9e07cb.csv new file mode 100644 index 000000000..5a90edd42 --- /dev/null +++ b/src/main/resources/load/lpts_random_34e34adb-a54a-4669-869f-d22c4e9e07cb.csv @@ -0,0 +1,97 @@ +kSa,kSu,kWd,mySa,mySu,myWd,sigmaSa,sigmaSu,sigmaWd,quarterHour +0.266806721687317,0.295997023582459,0.279087692499161,0.0610353946685791,0.0630703344941139,0.053140863776207,0.0357091873884201,0.0370676517486572,0.0293692331761122,0 +0.281179457902908,0.299608528614044,0.275292456150055,0.0560021996498108,0.058424074202776,0.0498424917459488,0.0319067053496838,0.0334825366735458,0.0265011098235846,1 +0.275563269853592,0.29670587182045,0.252942383289337,0.0528385005891323,0.0547995530068874,0.0472154095768929,0.0286294519901276,0.0310499873012304,0.0245211906731129,2 +0.268669873476028,0.278122246265411,0.222294941544533,0.0497889705002308,0.0522574931383133,0.0455464050173759,0.0267868731170893,0.0290201343595982,0.0230409931391478,3 +0.254242599010468,0.261944204568863,0.198370113968849,0.0480474047362804,0.0499211102724075,0.0444160588085651,0.025010583922267,0.0268981643021107,0.0216859001666307,4 +0.253653794527054,0.259219467639923,0.183828011155128,0.0465105324983597,0.0482752695679665,0.0433471724390984,0.0237453784793615,0.0254230201244354,0.0208296440541744,5 +0.232547923922539,0.22350800037384,0.151045009493828,0.0453270114958286,0.047629676759243,0.042874664068222,0.0228410512208939,0.0238813851028681,0.0201559588313103,6 +0.203599318861961,0.210258424282074,0.134497836232185,0.0445506721735001,0.0461143814027309,0.0425662696361542,0.0219020489603281,0.0230216048657894,0.0196861978620291,7 +0.161462053656578,0.199696600437164,0.119271591305733,0.0445012860000134,0.0455127842724323,0.0422079116106033,0.0207479763776064,0.0222345236688852,0.019109807908535,8 +0.132398754358292,0.181738555431366,0.0919454470276833,0.0439879409968853,0.0447122938930988,0.0418674796819687,0.0208074823021889,0.0220435112714767,0.0189618747681379,9 +0.141700059175491,0.172467365860939,0.089320495724678,0.0432550236582756,0.044278547167778,0.04146458953619,0.0204773582518101,0.0210072007030249,0.0188128501176834,10 +0.13490092754364,0.168581023812294,0.0863394215703011,0.0434850119054317,0.0437624379992485,0.0414730608463287,0.0204034727066755,0.0206510350108147,0.0187746584415436,11 +0.12891773879528,0.141391009092331,0.0815763771533966,0.0438057892024517,0.0438031405210495,0.0417981892824173,0.0202947575598955,0.020810017362237,0.0187485739588737,12 +0.0865642353892326,0.133543252944946,0.0992388054728508,0.0434134155511856,0.0436179116368294,0.0411902405321598,0.0195998474955559,0.0202769655734301,0.0186050590127707,13 +0.107326254248619,0.131506875157356,0.092495284974575,0.0422008074820042,0.0430818535387516,0.0411793626844883,0.0194479618221521,0.0201587229967117,0.0184435490518808,14 +0.12365210801363,0.138605788350105,0.0902709886431694,0.0423581749200821,0.0430288463830948,0.0415664203464985,0.0197580717504025,0.0195529088377953,0.018659807741642,15 +0.133885741233826,0.116305366158485,0.0866493508219719,0.0421508848667145,0.0430956780910492,0.0417333245277405,0.0191863905638456,0.0196987725794315,0.018691623583436,16 +0.114493139088154,0.109669730067253,0.11562417447567,0.0423808842897415,0.0430857576429844,0.0414095669984818,0.0193791724741459,0.0192934311926365,0.0187153313308954,17 +0.106474287807941,0.107617124915123,0.141828700900078,0.041958749294281,0.0426791086792946,0.0417547412216663,0.0191276986151934,0.0195350497961044,0.0195536445826292,18 +0.111373528838158,0.0949468687176705,0.143573239445686,0.0423438511788845,0.0426821634173393,0.0423176772892475,0.0193268302828074,0.0194729138165712,0.0196764413267374,19 +0.129695281386375,0.111747220158577,0.146539300680161,0.042476549744606,0.0431345589458942,0.0430354326963425,0.0200043357908726,0.0198324266821146,0.0201929099857807,20 +0.124765977263451,0.126777052879333,0.181237012147903,0.0424391217529774,0.0431524105370045,0.0431922376155853,0.0196738373488188,0.0196389146149158,0.0208003968000412,21 +0.166463151574135,0.128424167633057,0.222479611635208,0.0426704697310925,0.0434540957212448,0.0447872504591942,0.020222594961524,0.0205539185553789,0.0225220061838627,22 +0.15489549934864,0.121535487473011,0.279077500104904,0.0428037717938423,0.0438099093735218,0.0461413823068142,0.0201477259397507,0.0211283396929502,0.0241765789687634,23 +0.149270266294479,0.145163252949715,0.314658939838409,0.0454631112515926,0.0458601377904415,0.0499203614890575,0.0224028695374727,0.0220234617590904,0.0277903340756893,24 +0.190895333886147,0.153644308447838,0.411636203527451,0.0459029302000999,0.0457030460238457,0.0538441687822342,0.0229767691344023,0.0218722112476826,0.0328027196228504,25 +0.191453665494919,0.150224968791008,0.423471629619598,0.0472969971597195,0.047640148550272,0.0605787634849548,0.0232080388814211,0.0226516369730234,0.0382906869053841,26 +0.224633768200874,0.169333130121231,0.409934967756271,0.0484098829329014,0.0481277145445347,0.0650452002882957,0.0246889032423496,0.0234444178640842,0.0414291992783546,27 +0.23322768509388,0.195868730545044,0.387721389532089,0.0501904785633087,0.0495214238762856,0.0688034743070602,0.0260085947811604,0.0247648935765028,0.0444995686411858,28 +0.280531793832779,0.242264837026596,0.378016442060471,0.0515176840126514,0.0500866919755936,0.0698312446475029,0.0280240289866924,0.0263900514692068,0.044551245868206,29 +0.332535684108734,0.286791861057281,0.414923667907715,0.0538357272744179,0.0514319129288197,0.0683940351009369,0.0305218864232302,0.0274843797087669,0.0439568608999252,30 +0.356295973062515,0.335564076900482,0.428863227367401,0.055597260594368,0.0545664429664612,0.0673834607005119,0.0327046699821949,0.0305836349725723,0.0435638092458248,31 +0.381627827882767,0.356647431850433,0.41985896229744,0.0583727583289146,0.0575905330479145,0.066506527364254,0.0358871892094612,0.0332306325435638,0.042742770165205,32 +0.427426189184189,0.375110238790512,0.42010372877121,0.0632952600717545,0.0606768690049648,0.0665018707513809,0.0411307103931904,0.0364755131304264,0.0432239063084126,33 +0.418004125356674,0.411366045475006,0.413253307342529,0.0678070187568665,0.0630642250180244,0.0660132020711899,0.0440355911850929,0.0392848961055279,0.0416399873793125,34 +0.480116784572601,0.443256080150604,0.430845767259598,0.0709096193313599,0.0660979822278023,0.0664969906210899,0.0474613010883331,0.0422324053943157,0.0427436977624893,35 +0.492366999387741,0.433596074581146,0.438405454158783,0.0713961571455002,0.0694489479064941,0.0661367774009705,0.0493352487683296,0.0453926883637905,0.0428525730967522,36 +0.488669961690903,0.450059473514557,0.43893027305603,0.0731654316186905,0.0709325894713402,0.0653173625469208,0.050234030932188,0.0470801331102848,0.0422966778278351,37 +0.476427853107452,0.453100442886353,0.445331513881683,0.0735458433628082,0.0721306875348091,0.0635278075933456,0.0500484444200993,0.048948809504509,0.0411276556551456,38 +0.447788894176483,0.462226986885071,0.42346379160881,0.0715678483247757,0.0739922747015953,0.0632445514202118,0.0481005422770977,0.0500194020569324,0.0407665930688381,39 +0.448646247386932,0.481568813323975,0.437915831804276,0.0719510018825531,0.0743175819516182,0.0634156614542007,0.0479790642857552,0.0502395480871201,0.0411010235548019,40 +0.45268851518631,0.463462620973587,0.44245383143425,0.0715559348464012,0.0745281055569649,0.0629907771945,0.0486291088163853,0.0509366057813168,0.0407464392483234,41 +0.472129553556442,0.458590388298035,0.438809961080551,0.0714246481657028,0.0753235965967178,0.0624452345073223,0.0488574244081974,0.0513948574662209,0.0403173267841339,42 +0.465200632810593,0.482033789157867,0.437554955482483,0.07085170596838,0.0747058689594269,0.0618916675448418,0.0474738143384457,0.0496549904346466,0.0399090498685837,43 +0.463072091341019,0.485370546579361,0.430398672819138,0.070897750556469,0.0753868967294693,0.061828400939703,0.0477456152439117,0.0515857115387917,0.039817675948143,44 +0.504301607608795,0.495000720024109,0.421750038862228,0.071284644305706,0.0756229311227798,0.0619377642869949,0.0486843213438988,0.0521590225398541,0.0400484018027782,45 +0.494013756513596,0.502004504203796,0.431962072849274,0.0704603344202042,0.075153686106205,0.0622560419142246,0.04722835496068,0.0514012612402439,0.039880596101284,46 +0.480952113866806,0.475219011306763,0.427944034337997,0.0712133646011353,0.0757130458950996,0.0625443011522293,0.0476561672985554,0.0518420785665512,0.0402946658432484,47 +0.4861159324646,0.516651332378387,0.448401153087616,0.0710133090615273,0.0765742212533951,0.0628931447863579,0.0490181632339954,0.0527153052389622,0.0413180962204933,48 +0.505605041980743,0.523734390735626,0.470708280801773,0.0711066871881485,0.0766011476516724,0.0636289045214653,0.0492411740124226,0.0540735982358456,0.0423084460198879,49 +0.513229548931122,0.550731658935547,0.487264752388,0.0714162662625313,0.0776983126997948,0.0654886662960052,0.0496645383536816,0.0559630356729031,0.0443988926708698,50 +0.523128151893616,0.541519641876221,0.508733510971069,0.0719589814543724,0.0785757303237915,0.0667508617043495,0.0495718084275723,0.0566712841391563,0.0457895845174789,51 +0.505810618400574,0.511520206928253,0.512334108352661,0.0727487280964851,0.078390434384346,0.0674923211336136,0.0494792275130749,0.0563753582537174,0.0470927283167839,52 +0.523990094661713,0.521157741546631,0.502269566059113,0.0725650414824486,0.0767486467957497,0.0678139925003052,0.0510885566473007,0.0540808290243149,0.047186266630888,53 +0.505142688751221,0.510516762733459,0.473371058702469,0.0712223723530769,0.0750300288200378,0.067938931286335,0.0487538911402225,0.0511478036642075,0.0453384555876255,54 +0.49169534444809,0.497860074043274,0.440884381532669,0.0709625855088234,0.0743403211236,0.0676973983645439,0.0484340563416481,0.0499401353299618,0.0442236810922623,55 +0.449224293231964,0.49097341299057,0.43197637796402,0.0712493658065796,0.0736074447631836,0.0669783055782318,0.0481879562139511,0.0487863756716251,0.0432323180139065,56 +0.462083280086517,0.458611458539963,0.420163929462433,0.0710224434733391,0.0725374296307564,0.0672811642289162,0.0468299798667431,0.0484821572899818,0.0426194556057453,57 +0.466422975063324,0.431519895792007,0.411749631166458,0.0716194584965706,0.0718199908733368,0.0670692101120949,0.0491987094283104,0.0477711223065853,0.0421844013035297,58 +0.470720857381821,0.452195525169373,0.402273863554001,0.0716342553496361,0.0719970166683197,0.0668240934610367,0.0485116802155972,0.0467447564005852,0.0414865128695965,59 +0.464846402406693,0.438703387975693,0.404926747083664,0.0720167830586433,0.0727354884147644,0.0666147843003273,0.0477447547018528,0.0472656972706318,0.0414320714771748,60 +0.466590017080307,0.44343689084053,0.405802458524704,0.0720655098557472,0.072361558675766,0.0671483352780342,0.0480720065534115,0.0469786375761032,0.0417016632854939,61 +0.461378246545792,0.444682002067566,0.396851778030396,0.0718182176351547,0.0714400708675385,0.0669265314936638,0.047651831060648,0.0463756546378136,0.0415653325617313,62 +0.461525678634644,0.406780183315277,0.386990875005722,0.0716791599988937,0.0715874135494232,0.0669709593057632,0.0474572516977787,0.0466903038322926,0.0415439382195473,63 +0.447014361619949,0.414845287799835,0.384565651416779,0.0707539543509483,0.071328230202198,0.0670299381017685,0.0461493171751499,0.045212522149086,0.0411532782018185,64 +0.425164729356766,0.408224016427994,0.378880858421326,0.0712318941950798,0.0714204683899879,0.0676426440477371,0.0461742058396339,0.0446786060929298,0.0415577478706837,65 +0.406535506248474,0.39065757393837,0.390029609203339,0.0721957013010979,0.0714574679732323,0.0679289177060127,0.0468821786344051,0.0455186292529106,0.0415354371070862,66 +0.429334431886673,0.421460598707199,0.386443197727203,0.0720773190259933,0.0723162442445755,0.068557009100914,0.0471111163496971,0.0465410239994526,0.0424121767282486,67 +0.408385515213013,0.423402607440948,0.384852766990662,0.0731761381030083,0.0739946663379669,0.0693683549761772,0.0479194596409798,0.0479996241629124,0.043307401239872,68 +0.450928092002869,0.433510303497314,0.387267470359802,0.0732240453362465,0.0757285431027412,0.070844329893589,0.0488691031932831,0.0505488254129887,0.0446740724146366,69 +0.42838642001152,0.458660960197449,0.397508889436722,0.0737349465489388,0.076910100877285,0.0725433081388473,0.0485723651945591,0.0513449050486088,0.0462205372750759,70 +0.457528233528137,0.455272883176804,0.401177316904068,0.0746021792292595,0.0782865285873413,0.0737910494208336,0.0504703745245934,0.0534177497029305,0.0476498752832413,71 +0.477989226579666,0.449814409017563,0.415226876735687,0.0757969841361046,0.0819070339202881,0.0762551799416542,0.0521196164190769,0.0565894842147827,0.0500268675386906,72 +0.471660286188126,0.483049720525742,0.41699144244194,0.0772641450166702,0.0833683088421822,0.0779938697814941,0.0538835860788822,0.0582899935543537,0.0516200289130211,73 +0.462039291858673,0.484837472438812,0.417837411165237,0.0793179050087929,0.0855541229248047,0.0807979106903076,0.0558264814317226,0.0610172972083092,0.0537474788725376,74 +0.494239538908005,0.474657744169235,0.410433322191238,0.080167755484581,0.0883776918053627,0.0834952890872955,0.0563570857048035,0.0627634450793266,0.0555526539683342,75 +0.481115281581879,0.4631627202034,0.405094832181931,0.0810613483190537,0.0898661091923714,0.085809163749218,0.0574533082544804,0.063525564968586,0.0566239841282368,76 +0.481957763433456,0.444837510585785,0.392141699790955,0.0815427601337433,0.0908975899219513,0.0876085460186005,0.0575459823012352,0.0625557452440262,0.0570836253464222,77 +0.46474814414978,0.416785925626755,0.384859055280685,0.0834897756576538,0.0924627110362053,0.0896750018000603,0.0571116954088211,0.0623503513634205,0.0581204779446125,78 +0.446739017963409,0.395158112049103,0.372885912656784,0.0857851952314377,0.0973858460783958,0.0923485606908798,0.0588888488709927,0.0653925687074661,0.0595557168126106,79 +0.425965458154678,0.364043891429901,0.341714292764664,0.0874398797750473,0.102611370384693,0.0957552641630173,0.0598357506096363,0.0677491873502731,0.0603233315050602,80 +0.401139229536056,0.364588558673859,0.329459756612778,0.0885151326656342,0.102042146027088,0.097852848470211,0.0583052486181259,0.0661919564008713,0.0615657567977905,81 +0.386102288961411,0.331744521856308,0.310481607913971,0.088083989918232,0.102688789367676,0.0995604023337364,0.056625984609127,0.064409427344799,0.0617730244994164,82 +0.352426558732986,0.287841856479645,0.287958323955536,0.0899283438920975,0.103480368852615,0.100912734866142,0.0579833500087261,0.0627572685480118,0.0609871000051498,83 +0.356676459312439,0.279404014348984,0.266594916582108,0.0904190465807915,0.104584082961082,0.10176607966423,0.0583710223436356,0.0623739063739777,0.0608399920165539,84 +0.353478521108627,0.253417283296585,0.25350296497345,0.0909158438444138,0.105099938809872,0.103342562913895,0.0577074661850929,0.0616596378386021,0.0614556968212128,85 +0.299452573060989,0.232542738318443,0.223194167017937,0.0930669605731964,0.105844244360924,0.104641474783421,0.0584431923925877,0.0609173066914082,0.0607141107320786,86 +0.257176458835602,0.220698863267899,0.218866571784019,0.0945220738649368,0.107813261449337,0.104784607887268,0.0576106905937195,0.0613766200840473,0.0604684762656689,87 +0.257824391126633,0.227517262101173,0.207409575581551,0.092997707426548,0.104204557836056,0.102655082941055,0.0560135245323181,0.0604200474917889,0.058957364410162,88 +0.238055855035782,0.211737111210823,0.201141089200974,0.0910771638154984,0.0975786820054054,0.0979374051094055,0.0540145039558411,0.0561005882918835,0.0565716363489628,89 +0.238567247986794,0.227371960878372,0.204761475324631,0.0879477933049202,0.0902053341269493,0.0918598845601082,0.0529557727277279,0.0529294200241566,0.0533599480986595,90 +0.216722473502159,0.234640255570412,0.217169404029846,0.0868481546640396,0.0833379998803139,0.0849183723330498,0.0509745627641678,0.0489254035055637,0.0499787591397762,91 +0.231909289956093,0.24814073741436,0.230379953980446,0.0836911797523499,0.0766035988926888,0.0774712786078453,0.0496042557060719,0.0455812141299248,0.0460172258317471,92 +0.223331198096275,0.256241410970688,0.256796300411224,0.0792895033955574,0.070108599960804,0.0709625855088234,0.0472096875309944,0.0411984920501709,0.0422120206058025,93 +0.246469661593437,0.287815362215042,0.283796429634094,0.0738609507679939,0.0632559433579445,0.0643703117966652,0.043757751584053,0.0369679853320122,0.0378340892493725,94 +0.270621925592422,0.283220708370209,0.280689835548401,0.068959467113018,0.0578584857285023,0.0592832416296005,0.0411073453724384,0.032867755740881,0.0339051820337772,95 \ No newline at end of file diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/DBEWLoadProfileFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/DBEWLoadProfileFactoryTest.groovy new file mode 100644 index 000000000..834ca992d --- /dev/null +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/DBEWLoadProfileFactoryTest.groovy @@ -0,0 +1,160 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation + */ +package edu.ie3.datamodel.io.factory.timeseries + +import static java.time.DayOfWeek.* + +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation +import edu.ie3.datamodel.models.Season +import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile +import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileEntry +import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileTimeSeries +import spock.lang.Shared +import spock.lang.Specification + +class DBEWLoadProfileFactoryTest extends Specification { + @Shared + BDEWLoadProfileFactory factory + + @Shared + private Set allEntries + + def setupSpec() { + factory = new BDEWLoadProfileFactory() + + def data0 = new LoadProfileData([ + "SuSa": "74.6", + "SuSu": "68.8", + "SuWd": "71.5", + "TrSa": "75.8", + "TrSu": "68.3", + "TrWd": "73.0", + "WiSa": "70.0", + "WiSu": "63.2", + "WiWd": "65.5", + "quarterHour": "0" + ] as Map, BDEWLoadProfileEntry) + + def data1 = new LoadProfileData([ + "SuSa": "76.2", + "SuSu": "67.4", + "SuWd": "69.0", + "TrSa": "76.7", + "TrSu": "66.5", + "TrWd": "70.1", + "WiSa": "73.0", + "WiSu": "61.0", + "WiWd": "62.6", + "quarterHour": "1" + ] as Map, BDEWLoadProfileEntry) + + def data2 = new LoadProfileData([ + "SuSa": "77.7", + "SuSu": "65.7", + "SuWd": "66.3", + "TrSa": "77.7", + "TrSu": "64.6", + "TrWd": "67.1", + "WiSa": "75.9", + "WiSu": "58.9", + "WiWd": "59.6", + "quarterHour": "2" + ] as Map, BDEWLoadProfileEntry) + + allEntries = [ + factory.buildModel(data0), + factory.buildModel(data1), + factory.buildModel(data2) + ].flatten() as Set + } + + def "A BDEWLoadProfileFactory returns the correct fields"() { + given: + def expectedFields = [ + "SuSa", + "SuSu", + "SuWd", + "TrSa", + "TrSu", + "TrWd", + "WiSa", + "WiSu", + "WiWd", + "quarterHour" + ] as Set + + when: + def actual = factory.getFields(BDEWLoadProfileEntry) + + then: + actual.size() == 1 + actual.head() == expectedFields + } + + def "A BDEWLoadProfileFactory refuses to build from invalid data"() { + given: + def actualFields = factory.newSet("Wd", "Sa", "Su") + + when: + def actual = factory.validate(actualFields, BDEWLoadProfileEntry) + + then: + actual.failure + actual.exception.get().message == "The provided fields [Sa, Su, Wd] are invalid for instance of 'BDEWLoadProfileEntry'. \n" + + "The following fields (without complex objects e.g. nodes, operators, ...) to be passed to a constructor of 'BDEWLoadProfileEntry' are possible (NOT case-sensitive!):\n" + + "0: [quarterHour, SuSa, SuSu, SuWd, TrSa, TrSu, TrWd, WiSa, WiSu, WiWd] or [quarter_hour, su_sa, su_su, su_wd, tr_sa, tr_su, tr_wd, wi_sa, wi_su, wi_wd]\n" + } + + def "A BDEWLoadProfileFactory builds model from valid data"() { + given: + def data = [ + "SuSa": "74.6", + "SuSu": "68.8", + "SuWd": "71.5", + "TrSa": "75.8", + "TrSu": "68.3", + "TrWd": "73.0", + "WiSa": "70.0", + "WiSu": "63.2", + "WiWd": "65.5", + "quarterHour": "0" + ] as Map + + when: + def entries = factory.buildModel(new LoadProfileData<>(data, BDEWLoadProfileEntry)) + + then: + entries.size() == 9 + } + + def "A BDEWLoadProfileFactory builds time series from entries"() { + given: + UUID uuid = UUID.fromString("fa3894c1-25af-479c-8a40-1323bb9150a9") + LoadProfileTimeSeriesMetaInformation metaInformation = new LoadProfileTimeSeriesMetaInformation(uuid, "g0") + + + when: + def lpts = factory.build(metaInformation, allEntries) + + then: + lpts.loadProfile == BdewStandardLoadProfile.G0 + lpts.entries.size() == 27 + + lpts.valueMapping.keySet() == [ + new BDEWLoadProfileTimeSeries.BdewKey(Season.SUMMER, SATURDAY), + new BDEWLoadProfileTimeSeries.BdewKey(Season.SUMMER, SUNDAY), + new BDEWLoadProfileTimeSeries.BdewKey(Season.SUMMER, MONDAY), + new BDEWLoadProfileTimeSeries.BdewKey(Season.TRANSITION, SATURDAY), + new BDEWLoadProfileTimeSeries.BdewKey(Season.TRANSITION, SUNDAY), + new BDEWLoadProfileTimeSeries.BdewKey(Season.TRANSITION, MONDAY), + new BDEWLoadProfileTimeSeries.BdewKey(Season.WINTER, SATURDAY), + new BDEWLoadProfileTimeSeries.BdewKey(Season.WINTER, SUNDAY), + new BDEWLoadProfileTimeSeries.BdewKey(Season.WINTER, MONDAY), + ] as Set + + lpts.valueMapping.values().every { it.size() == 3} + } +} diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy new file mode 100644 index 000000000..7ab6f8247 --- /dev/null +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy @@ -0,0 +1,153 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation + */ +package edu.ie3.datamodel.io.factory.timeseries + +import static java.time.DayOfWeek.* + +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation +import edu.ie3.datamodel.models.profile.LoadProfile +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries +import edu.ie3.datamodel.models.timeseries.repetitive.RandomLoadProfileEntry +import spock.lang.Shared +import spock.lang.Specification + +class RandomLoadProfileFactoryTest extends Specification { + @Shared + RandomLoadProfileFactory factory + + @Shared + private Set allEntries + + def setupSpec() { + factory = new RandomLoadProfileFactory() + + def data0 = new LoadProfileData([ + "kSa": "0.266806721687317", + "kSu": "0.295997023582459", + "kWd": "0.279087692499161", + "mySa": "0.0610353946685791", + "mySu": "0.0630703344941139", + "myWd": "0.053140863776207", + "sigmaSa": "0.0357091873884201", + "sigmaSu": "0.0370676517486572", + "sigmaWd": "0.0293692331761122", + "quarterHour": "0" + ] as Map, RandomLoadProfileEntry) + + def data1 = new LoadProfileData([ + "kSa": "0.281179457902908", + "kSu": "0.299608528614044", + "kWd": "0.275292456150055", + "mySa": "0.0560021996498108", + "mySu": "0.058424074202776", + "myWd": "0.0498424917459488", + "sigmaSa": "0.0319067053496838", + "sigmaSu": "0.0334825366735458", + "sigmaWd": "0.0265011098235846", + "quarterHour": "1" + ] as Map, RandomLoadProfileEntry) + + def data2 = new LoadProfileData([ + "kSa": "0.275563269853592", + "kSu": "0.29670587182045", + "kWd": "0.252942383289337", + "mySa": "0.0528385005891323", + "mySu": "0.0547995530068874", + "myWd": "0.0472154095768929", + "sigmaSa": "0.0286294519901276", + "sigmaSu": "0.0310499873012304", + "sigmaWd": "0.0245211906731129", + "quarterHour": "2" + ] as Map, RandomLoadProfileEntry) + + allEntries = [ + factory.buildModel(data0), + factory.buildModel(data1), + factory.buildModel(data2) + ].flatten() as Set + } + + def "A RandomLoadProfileFactory returns the correct fields"() { + given: + def expectedFields = [ + "kSa", + "kSu", + "kWd", + "mySa", + "mySu", + "myWd", + "sigmaSa", + "sigmaSu", + "sigmaWd", + "quarterHour" + ] as Set + + when: + def actual = factory.getFields(RandomLoadProfileEntry) + + then: + actual.size() == 1 + actual.head() == expectedFields + } + + def "A RandomLoadProfileFactory refuses to build from invalid data"() { + given: + def actualFields = factory.newSet("Wd", "Sa", "Su") + + when: + def actual = factory.validate(actualFields, RandomLoadProfileEntry) + + then: + actual.failure + actual.exception.get().message == "The provided fields [Sa, Su, Wd] are invalid for instance of 'RandomLoadProfileEntry'. \n" + + "The following fields (without complex objects e.g. nodes, operators, ...) to be passed to a constructor of 'RandomLoadProfileEntry' are possible (NOT case-sensitive!):\n" + + "0: [kSa, kSu, kWd, mySa, mySu, myWd, quarterHour, sigmaSa, sigmaSu, sigmaWd] or [k_sa, k_su, k_wd, my_sa, my_su, my_wd, quarter_hour, sigma_sa, sigma_su, sigma_wd]\n" + } + + def "A RandomLoadProfileFactory builds model from valid data"() { + given: + def data = [ + "kSa": "0.266806721687317", + "kSu": "0.295997023582459", + "kWd": "0.279087692499161", + "mySa": "0.0610353946685791", + "mySu": "0.0630703344941139", + "myWd": "0.053140863776207", + "sigmaSa": "0.0357091873884201", + "sigmaSu": "0.0370676517486572", + "sigmaWd": "0.0293692331761122", + "quarterHour": "0" + ] as Map + + when: + def entries = factory.buildModel(new LoadProfileData<>(data, RandomLoadProfileEntry)) + + then: + entries.size() == 3 + } + + def "A RandomLoadProfileFactory builds time series from entries"() { + given: + UUID uuid = UUID.fromString("fa3894c1-25af-479c-8a40-1323bb9150a9") + LoadProfileTimeSeriesMetaInformation metaInformation = new LoadProfileTimeSeriesMetaInformation(uuid, "random") + + + when: + def lpts = factory.build(metaInformation, allEntries) + + then: + lpts.loadProfile == LoadProfile.RandomLoadProfile.RANDOM_LOAD_PROFILE + lpts.entries.size() == 9 + + lpts.valueMapping.keySet() == [ + new LoadProfileTimeSeries.WeekDayKey(SATURDAY), + new LoadProfileTimeSeries.WeekDayKey(SUNDAY), + new LoadProfileTimeSeries.WeekDayKey(MONDAY), + ] as Set + + lpts.valueMapping.values().every { it.size() == 3} + } +} diff --git a/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy index f34873c24..434e3b70a 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy @@ -9,7 +9,6 @@ import edu.ie3.datamodel.io.source.TimeSeriesMappingSource import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.MeasurementUnitInput import edu.ie3.datamodel.models.input.NodeInput -import edu.ie3.datamodel.models.input.RandomLoadParameters import edu.ie3.datamodel.models.input.connector.LineInput import edu.ie3.datamodel.models.input.connector.SwitchInput import edu.ie3.datamodel.models.input.connector.Transformer2WInput @@ -19,22 +18,8 @@ import edu.ie3.datamodel.models.input.connector.type.Transformer2WTypeInput import edu.ie3.datamodel.models.input.connector.type.Transformer3WTypeInput import edu.ie3.datamodel.models.input.graphics.LineGraphicInput import edu.ie3.datamodel.models.input.graphics.NodeGraphicInput -import edu.ie3.datamodel.models.input.system.BmInput -import edu.ie3.datamodel.models.input.system.ChpInput -import edu.ie3.datamodel.models.input.system.EvInput -import edu.ie3.datamodel.models.input.system.EvcsInput -import edu.ie3.datamodel.models.input.system.FixedFeedInInput -import edu.ie3.datamodel.models.input.system.HpInput -import edu.ie3.datamodel.models.input.system.LoadInput -import edu.ie3.datamodel.models.input.system.PvInput -import edu.ie3.datamodel.models.input.system.StorageInput -import edu.ie3.datamodel.models.input.system.WecInput -import edu.ie3.datamodel.models.input.system.type.BmTypeInput -import edu.ie3.datamodel.models.input.system.type.ChpTypeInput -import edu.ie3.datamodel.models.input.system.type.EvTypeInput -import edu.ie3.datamodel.models.input.system.type.HpTypeInput -import edu.ie3.datamodel.models.input.system.type.StorageTypeInput -import edu.ie3.datamodel.models.input.system.type.WecTypeInput +import edu.ie3.datamodel.models.input.system.* +import edu.ie3.datamodel.models.input.system.type.* import edu.ie3.datamodel.models.input.thermal.CylindricalStorageInput import edu.ie3.datamodel.models.input.thermal.ThermalHouseInput import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile @@ -43,23 +28,13 @@ import edu.ie3.datamodel.models.result.connector.LineResult import edu.ie3.datamodel.models.result.connector.SwitchResult import edu.ie3.datamodel.models.result.connector.Transformer2WResult import edu.ie3.datamodel.models.result.connector.Transformer3WResult -import edu.ie3.datamodel.models.result.system.BmResult -import edu.ie3.datamodel.models.result.system.ChpResult -import edu.ie3.datamodel.models.result.system.EmResult -import edu.ie3.datamodel.models.result.system.EvResult -import edu.ie3.datamodel.models.result.system.EvcsResult -import edu.ie3.datamodel.models.result.system.FixedFeedInResult -import edu.ie3.datamodel.models.result.system.FlexOptionsResult -import edu.ie3.datamodel.models.result.system.LoadResult -import edu.ie3.datamodel.models.result.system.PvResult -import edu.ie3.datamodel.models.result.system.StorageResult -import edu.ie3.datamodel.models.result.system.WecResult +import edu.ie3.datamodel.models.result.system.* import edu.ie3.datamodel.models.result.thermal.CylindricalStorageResult import edu.ie3.datamodel.models.result.thermal.ThermalHouseResult import edu.ie3.datamodel.models.timeseries.IntValue import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileInput +import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileTimeSeries import edu.ie3.datamodel.models.timeseries.repetitive.RepetitiveTimeSeries import edu.ie3.datamodel.models.value.EnergyPriceValue import edu.ie3.util.quantities.PowerSystemUnits @@ -344,22 +319,6 @@ class EntityPersistenceNamingStrategyTest extends Specification { WecTypeInput || "wec_type_input" } - def "A EntityPersistenceNamingStrategy without pre- or suffixes should return valid strings for a Load Parameter Model"() { - given: "a naming strategy without pre- or suffixes" - EntityPersistenceNamingStrategy strategy = new EntityPersistenceNamingStrategy() - - when: - Optional res = strategy.getEntityName(modelClass) - - then: - res.present - res.get() == expectedString - - where: - modelClass || expectedString - RandomLoadParameters || "random_load_parameters_input" - } - def "A EntityPersistenceNamingStrategy without pre- or suffixes should return valid strings for a graphic input Model"() { given: "a naming strategy without pre- or suffixes" EntityPersistenceNamingStrategy strategy = new EntityPersistenceNamingStrategy() @@ -452,12 +411,12 @@ class EntityPersistenceNamingStrategyTest extends Specification { IndividualTimeSeries | UUID.fromString("4881fda2-bcee-4f4f-a5bb-6a09bf785276") || "aa_its_c_4881fda2-bcee-4f4f-a5bb-6a09bf785276_zz" } - def "A EntityPersistenceNamingStrategy without pre- or suffix should return valid file name for load profile input" () { + def "A EntityPersistenceNamingStrategy without pre- or suffix should return valid file name for load profile time series" () { given: EntityPersistenceNamingStrategy strategy = new EntityPersistenceNamingStrategy() - LoadProfileInput timeSeries = Mock(LoadProfileInput) + BDEWLoadProfileTimeSeries timeSeries = Mock(BDEWLoadProfileTimeSeries) timeSeries.uuid >> uuid - timeSeries.type >> type + timeSeries.loadProfile >> type when: Optional actual = strategy.getEntityName(timeSeries) @@ -468,7 +427,7 @@ class EntityPersistenceNamingStrategyTest extends Specification { where: clazz | uuid | type || expectedFileName - LoadProfileInput | UUID.fromString("bee0a8b6-4788-4f18-bf72-be52035f7304") | BdewStandardLoadProfile.G3 || "lpts_g3_bee0a8b6-4788-4f18-bf72-be52035f7304" + BDEWLoadProfileTimeSeries | UUID.fromString("9b880468-309c-43c1-a3f4-26dd26266216") | BdewStandardLoadProfile.G3 || "lpts_g3_9b880468-309c-43c1-a3f4-26dd26266216" } def "A EntityPersistenceNamingStrategy returns empty Optional, when there is no naming defined for a given time series class"() { diff --git a/src/test/groovy/edu/ie3/datamodel/io/naming/FileNamingStrategyTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/naming/FileNamingStrategyTest.groovy index fceb34480..4902b03e5 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/naming/FileNamingStrategyTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/naming/FileNamingStrategyTest.groovy @@ -12,7 +12,6 @@ import edu.ie3.datamodel.io.source.TimeSeriesMappingSource import edu.ie3.datamodel.models.UniqueEntity import edu.ie3.datamodel.models.input.MeasurementUnitInput import edu.ie3.datamodel.models.input.NodeInput -import edu.ie3.datamodel.models.input.RandomLoadParameters import edu.ie3.datamodel.models.input.connector.LineInput import edu.ie3.datamodel.models.input.connector.SwitchInput import edu.ie3.datamodel.models.input.connector.Transformer2WInput @@ -61,7 +60,7 @@ import edu.ie3.datamodel.models.result.thermal.CylindricalStorageResult import edu.ie3.datamodel.models.result.thermal.ThermalHouseResult import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileInput +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries import edu.ie3.datamodel.models.value.EnergyPriceValue import edu.ie3.util.quantities.PowerSystemUnits import spock.lang.Shared @@ -199,7 +198,7 @@ class FileNamingStrategyTest extends Specification { def "A FileNamingStrategy with DefaultHierarchy and without pre- or suffix should return valid directory path for load profile time series"() { given: def strategy = new FileNamingStrategy(simpleEntityNaming, defaultHierarchy) - def timeSeries = Mock(LoadProfileInput) + def timeSeries = Mock(LoadProfileTimeSeries) when: def actual = strategy.getDirectoryPath(timeSeries) @@ -210,7 +209,7 @@ class FileNamingStrategyTest extends Specification { where: clazz || expected - LoadProfileInput || Path.of("test_grid", "input", "global") + LoadProfileTimeSeries || Path.of("test_grid", "input", "participants", "time_series") } def "A FileNamingStrategy with DefaultHierarchy and should return valid directory path for individual time series"() { @@ -335,38 +334,6 @@ class FileNamingStrategyTest extends Specification { WecTypeInput || Path.of("test_grid", "input", "global", "wec_type_input") } - def "A FileNamingStrategy with DefaultHierarchy and without pre- or suffixes should return valid directory path for a Load Parameter Model"() { - given: "a file naming strategy without pre- or suffixes" - def strategy = new FileNamingStrategy(simpleEntityNaming, defaultHierarchy) - - when: - def res = strategy.getDirectoryPath(modelClass) - - then: - res.present - res.get() == expectedPath - - where: - modelClass || expectedPath - RandomLoadParameters || Path.of("test_grid", "input", "global") - } - - def "A FileNamingStrategy with DefaultHierarchy and without pre- or suffixes should return valid file path for a Load Parameter Model"() { - given: "a file naming strategy without pre- or suffixes" - def strategy = new FileNamingStrategy(simpleEntityNaming, defaultHierarchy) - - when: - def res = strategy.getFilePath(modelClass) - - then: - res.present - res.get() == expectedPath - - where: - modelClass || expectedPath - RandomLoadParameters || Path.of("test_grid", "input", "global", "random_load_parameters_input") - } - def "A FileNamingStrategy with DefaultHierarchy and without pre- or suffixes should return valid file paths for a graphic input Model"() { given: "a file naming strategy without pre- or suffixes" def strategy = new FileNamingStrategy(simpleEntityNaming, defaultHierarchy) @@ -431,9 +398,9 @@ class FileNamingStrategyTest extends Specification { def "A FileNamingStrategy with DefaultHierarchy and without pre- or suffix should return valid file path for load profile time series"() { given: def strategy = new FileNamingStrategy(simpleEntityNaming, defaultHierarchy) - def timeSeries = Mock(LoadProfileInput) + def timeSeries = Mock(LoadProfileTimeSeries) timeSeries.uuid >> uuid - timeSeries.type >> type + timeSeries.loadProfile >> type when: def actual = strategy.getFilePath(timeSeries) @@ -443,8 +410,8 @@ class FileNamingStrategyTest extends Specification { actual.get() == expectedFileName where: - clazz | uuid | type || expectedFileName - LoadProfileInput | UUID.fromString("bee0a8b6-4788-4f18-bf72-be52035f7304") | BdewStandardLoadProfile.G3 || Path.of("test_grid", "input", "global", "lpts_g3_bee0a8b6-4788-4f18-bf72-be52035f7304") + clazz | uuid | type || expectedFileName + LoadProfileTimeSeries | UUID.fromString("9b880468-309c-43c1-a3f4-26dd26266216") | BdewStandardLoadProfile.G3 || Path.of("test_grid", "input", "participants", "time_series", "lpts_g3_9b880468-309c-43c1-a3f4-26dd26266216") } def "A FileNamingStrategy with DefaultHierarchy and without pre- or suffixes should return valid directory path for time series mapping"() { @@ -601,14 +568,13 @@ class FileNamingStrategyTest extends Specification { where: modelClass || expected - RandomLoadParameters || Optional.empty() TimeSeriesMappingSource.MappingEntry || Optional.empty() } def "A FileNamingStrategy with FlatHierarchy does return empty sub directory path for load profile time series"() { given: "a naming strategy without pre- or suffixes" def strategy = new FileNamingStrategy(simpleEntityNaming, flatHierarchy) - def timeSeries = Mock(LoadProfileInput) + def timeSeries = Mock(LoadProfileTimeSeries) when: def actual = strategy.getDirectoryPath(timeSeries) @@ -739,9 +705,9 @@ class FileNamingStrategyTest extends Specification { def "A FileNamingStrategy with FlatHierarchy does return valid file path for load profile time series"() { given: "a naming strategy without pre- or suffixes" def strategy = new FileNamingStrategy(simpleEntityNaming, flatHierarchy) - def timeSeries = Mock(LoadProfileInput) + def timeSeries = Mock(LoadProfileTimeSeries) timeSeries.uuid >> uuid - timeSeries.type >> type + timeSeries.loadProfile >> type when: def actual = strategy.getFilePath(timeSeries) @@ -752,7 +718,7 @@ class FileNamingStrategyTest extends Specification { where: clazz | uuid | type || expectedFilePath - LoadProfileInput | UUID.fromString("bee0a8b6-4788-4f18-bf72-be52035f7304") | BdewStandardLoadProfile.G3 || Path.of("lpts_g3_bee0a8b6-4788-4f18-bf72-be52035f7304") + LoadProfileTimeSeries | UUID.fromString("9b880468-309c-43c1-a3f4-26dd26266216") | BdewStandardLoadProfile.G3 || Path.of("lpts_g3_9b880468-309c-43c1-a3f4-26dd26266216") } def "A FileNamingStrategy with FlatHierarchy does return valid file path for individual time series"() { @@ -798,7 +764,7 @@ class FileNamingStrategyTest extends Specification { def actual = strategy.loadProfileTimeSeriesPattern.pattern() then: - actual == "test_grid" + escapedFileSeparator + "input" + escapedFileSeparator + "global" + escapedFileSeparator + "lpts_(?[a-zA-Z][0-9])_(?[a-zA-Z0-9]{8}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{12})" + actual == "test_grid" + escapedFileSeparator + "input" + escapedFileSeparator + "participants" + escapedFileSeparator + "time_series" + escapedFileSeparator + "lpts_(?[a-zA-Z]{1,11}[0-9]{0,3})_(?[a-zA-Z0-9]{8}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{12})" } def "A FileNamingStrategy with FlatHierarchy returns correct individual time series file name pattern"() { @@ -820,7 +786,7 @@ class FileNamingStrategyTest extends Specification { def actual = strategy.loadProfileTimeSeriesPattern.pattern() then: - actual == "lpts_(?[a-zA-Z][0-9])_(?[a-zA-Z0-9]{8}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{12})" + actual == "lpts_(?[a-zA-Z]{1,11}[0-9]{0,3})_(?[a-zA-Z0-9]{8}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{12})" } def "Trying to extract time series meta information throws an Exception, if it is provided a malformed string"() { diff --git a/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy index b5e145799..2362ebae8 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy @@ -40,8 +40,12 @@ import edu.ie3.datamodel.models.timeseries.TimeSeries import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue +import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileEntry +import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileTimeSeries import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileInput +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries +import edu.ie3.datamodel.models.timeseries.repetitive.RandomLoadProfileEntry +import edu.ie3.datamodel.models.timeseries.repetitive.RandomLoadProfileTimeSeries import edu.ie3.datamodel.models.value.* import edu.ie3.datamodel.utils.Try import edu.ie3.test.common.TimeSeriesTestData @@ -60,7 +64,6 @@ class ProcessorProviderTest extends Specification implements TimeSeriesTestData List knownEntityProcessors = [ /* InputEntity */ OperatorInput, - RandomLoadParameters, TimeSeriesMappingSource.MappingEntry, IdCoordinateInput, /* - AssetInput */ @@ -142,7 +145,8 @@ class ProcessorProviderTest extends Specification implements TimeSeriesTestData new TimeSeriesProcessorKey(IndividualTimeSeries, TimeBasedValue, HeatAndPValue), new TimeSeriesProcessorKey(IndividualTimeSeries, TimeBasedValue, SValue), new TimeSeriesProcessorKey(IndividualTimeSeries, TimeBasedValue, HeatAndSValue), - new TimeSeriesProcessorKey(LoadProfileInput, LoadProfileEntry, PValue) + new TimeSeriesProcessorKey(BDEWLoadProfileTimeSeries, BDEWLoadProfileEntry, PValue), + new TimeSeriesProcessorKey(RandomLoadProfileTimeSeries, RandomLoadProfileEntry, PValue) ] as Set when: diff --git a/src/test/groovy/edu/ie3/datamodel/io/processor/input/InputEntityProcessorTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/processor/input/InputEntityProcessorTest.groovy index 24b1a8198..051f48036 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/processor/input/InputEntityProcessorTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/processor/input/InputEntityProcessorTest.groovy @@ -13,7 +13,6 @@ import edu.ie3.datamodel.models.StandardUnits import edu.ie3.datamodel.models.UniqueEntity import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput -import edu.ie3.datamodel.models.input.RandomLoadParameters import edu.ie3.datamodel.models.input.connector.LineInput import edu.ie3.datamodel.models.input.connector.SwitchInput import edu.ie3.datamodel.models.input.connector.Transformer2WInput @@ -363,43 +362,6 @@ class InputEntityProcessorTest extends Specification { actual == expected } - def "The InputEntityProcessor should serialize a provided RandomLoadParameters correctly"() { - given: - InputEntityProcessor processor = new InputEntityProcessor(RandomLoadParameters) - RandomLoadParameters parameters = new RandomLoadParameters( - UUID.fromString("a5b0f432-27b5-4b3e-b87a-61867b9edd79"), - 4, - 1.2, - 2.3, - 3.4, - 4.5, - 5.6, - 6.7, - 7.8, - 8.9, - 9.10 - ) - Map expected = [ - "uuid" : "a5b0f432-27b5-4b3e-b87a-61867b9edd79", - "quarterHour": "4", - "kWd" : "1.2", - "kSa" : "2.3", - "kSu" : "3.4", - "myWd" : "4.5", - "mySa" : "5.6", - "mySu" : "6.7", - "sigmaWd" : "7.8", - "sigmaSa" : "8.9", - "sigmaSu" : "9.1" - ] - - when: - Map actual = processor.handleEntity(parameters) - - then: - actual == expected - } - def "The InputEntityProcessor should serialize a provided WecTypeInput correctly"() { given: InputEntityProcessor processor = new InputEntityProcessor(WecTypeInput) diff --git a/src/test/groovy/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessorTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessorTest.groovy index 671482420..4633b1e58 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessorTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessorTest.groovy @@ -10,8 +10,10 @@ import edu.ie3.datamodel.io.processor.Processor import edu.ie3.datamodel.models.timeseries.IntValue import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue +import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileEntry +import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileTimeSeries import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileInput +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries import edu.ie3.datamodel.models.value.* import edu.ie3.test.common.TimeSeriesTestData import spock.lang.Specification @@ -210,14 +212,14 @@ class TimeSeriesProcessorTest extends Specification implements TimeSeriesTestDat actual == individualHeatAndSTimeSeriesProcessed } - def "A TimeSeriesProcessors handles a complete LoadProfileInput correctly"() { + def "A TimeSeriesProcessors handles a complete LoadProfileTimeSeries correctly"() { given: - TimeSeriesProcessor processor = new TimeSeriesProcessor<>(LoadProfileInput, LoadProfileEntry, PValue) + TimeSeriesProcessor processor = new TimeSeriesProcessor<>(BDEWLoadProfileTimeSeries, BDEWLoadProfileEntry, PValue) when: - Set> actual = processor.handleTimeSeries(loadProfileInput) + Set> actual = processor.handleTimeSeries(loadProfileTimeSeries) then: - actual == loadProfileInputProcessed + actual == loadProfileTimeSeriesProcessed } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy index 2914504c4..43c7f65ab 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy @@ -236,7 +236,7 @@ class CsvFileSinkTest extends Specification implements TimeSeriesTestData { testBaseFolderPath.resolve("its_ph_56c20b88-c001-4225-8dac-cd13a75c6b48.csv").toFile().exists() testBaseFolderPath.resolve("its_pqh_83b577cc-06b1-47a1-bfff-ad648a00784b.csv").toFile().exists() testBaseFolderPath.resolve("its_c_a4bbcb77-b9d0-4b88-92be-b9a14a3e332b.csv").toFile().exists() - testBaseFolderPath.resolve("lpts_g2_b56853fe-b800-4c18-b324-db1878b22a28.csv").toFile().exists() + testBaseFolderPath.resolve("lpts_g2_b0ad5ba2-0d5e-4c9b-b818-4079cebf59cc.csv").toFile().exists() testBaseFolderPath.resolve("its_weather_4fcbdfcd-4ff0-46dd-b0df-f3af7ae3ed98.csv").toFile().exists() } diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/LoadProfileSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/LoadProfileSourceTest.groovy new file mode 100644 index 000000000..3f1b5b517 --- /dev/null +++ b/src/test/groovy/edu/ie3/datamodel/io/source/LoadProfileSourceTest.groovy @@ -0,0 +1,33 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation + */ +package edu.ie3.datamodel.io.source + +import static edu.ie3.datamodel.models.profile.LoadProfile.RandomLoadProfile.RANDOM_LOAD_PROFILE + +import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile +import spock.lang.Specification + +class LoadProfileSourceTest extends Specification { + + def "A LoadProfileSourceTest should read in all build-in BDEWStandardLoadProfiles"() { + when: + def profiles = LoadProfileSource.getBDEWLoadProfiles() + + then: + profiles.size() == 11 + BdewStandardLoadProfile.values().every { profiles.keySet().contains(it) } + profiles.values().every { it.entries.size() == 864} + } + + def "A LoadProfileSourceTest should read in the build-in RandomLoadProfile"() { + when: + def random = LoadProfileSource.randomLoadProfile + + then: + random.loadProfile == RANDOM_LOAD_PROFILE + random.entries.size() == 288 + } +} diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvDataSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvDataSourceTest.groovy index 4979f8b77..f0721a805 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvDataSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvDataSourceTest.groovy @@ -6,9 +6,11 @@ package edu.ie3.datamodel.io.source.csv import edu.ie3.datamodel.io.csv.CsvIndividualTimeSeriesMetaInformation +import edu.ie3.datamodel.io.csv.CsvLoadProfileMetaInformation import edu.ie3.datamodel.io.naming.FileNamingStrategy import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme import edu.ie3.datamodel.models.input.system.LoadInput +import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile import spock.lang.Shared import spock.lang.Specification @@ -47,6 +49,8 @@ class CsvDataSourceTest extends Specification implements CsvTestDataMeta { FileNamingStrategy fileNamingStrategy @Shared Set timeSeriesPaths + @Shared + Set loadProfileTimeSeriesPaths @Shared DummyCsvSource dummyCsvSource @@ -66,6 +70,13 @@ class CsvDataSourceTest extends Specification implements CsvTestDataMeta { "its_c_c7b0d9d6-5044-4f51-80b4-f221d8b1f14b.csv" ].stream().map { file -> Path.of(file) }.collect(Collectors.toSet()) timeSeriesPaths.forEach { path -> Files.createFile(testBaseFolderPath.resolve(path)) } + + loadProfileTimeSeriesPaths = [ + "lpts_r1_aac618d5-f707-4000-8871-ea080c24df82.csv", + "lpts_r2_0b5059d9-dbf5-4047-85f7-522a43608448.csv", + "lpts_g0_fa3894c1-25af-479c-8a40-1323bb9150a9.csv" + ].stream().map { file -> Path.of(file) }.collect(Collectors.toSet()) + loadProfileTimeSeriesPaths.forEach { path -> Files.createFile(testBaseFolderPath.resolve(path)) } } def "A DataSource should contain a valid connector after initialization"() { @@ -300,13 +311,17 @@ class CsvDataSourceTest extends Specification implements CsvTestDataMeta { def "The CsvDataSource is able to provide correct paths to time series files"() { when: - def actual = dummyCsvSource.getIndividualTimeSeriesFilePaths() + def actualIndividual = dummyCsvSource.getTimeSeriesFilePaths(fileNamingStrategy.individualTimeSeriesPattern) + def actualLoad = dummyCsvSource.getTimeSeriesFilePaths(fileNamingStrategy.loadProfileTimeSeriesPattern) then: noExceptionThrown() - actual.size() == timeSeriesPaths.size() - actual.containsAll(timeSeriesPaths) + actualIndividual.size() == timeSeriesPaths.size() + actualIndividual.containsAll(timeSeriesPaths) + + actualLoad.size() == loadProfileTimeSeriesPaths.size() + actualLoad.containsAll(loadProfileTimeSeriesPaths) } def "The CsvDataSource is able to build correct uuid to meta information mapping"() { @@ -343,4 +358,32 @@ class CsvDataSourceTest extends Specification implements CsvTestDataMeta { then: actual == expected } + + def "The CsvDataSource is able to build correct load profile meta information"() { + given: + def expected = [ + new CsvLoadProfileMetaInformation(UUID.fromString("aac618d5-f707-4000-8871-ea080c24df82"), "r1", Path.of("lpts_r1_aac618d5-f707-4000-8871-ea080c24df82")), + new CsvLoadProfileMetaInformation(UUID.fromString("0b5059d9-dbf5-4047-85f7-522a43608448"), "r2", Path.of("lpts_r2_0b5059d9-dbf5-4047-85f7-522a43608448")), + new CsvLoadProfileMetaInformation(UUID.fromString("fa3894c1-25af-479c-8a40-1323bb9150a9"), "g0", Path.of("lpts_g0_fa3894c1-25af-479c-8a40-1323bb9150a9")) + ] as Set + + when: + def actual = dummyCsvSource.getCsvLoadProfileMetaInformation() + + then: + actual == expected + } + + def "The CsvDataSource is able to build correct load profile meta information when restricting load profile"() { + given: + def expected = [ + new CsvLoadProfileMetaInformation(UUID.fromString("fa3894c1-25af-479c-8a40-1323bb9150a9"), "g0", Path.of("lpts_g0_fa3894c1-25af-479c-8a40-1323bb9150a9")) + ] as Set + + when: + def actual = dummyCsvSource.getCsvLoadProfileMetaInformation(BdewStandardLoadProfile.G0) + + then: + actual == expected + } } diff --git a/src/test/groovy/edu/ie3/datamodel/models/profile/LoadProfileTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/profile/LoadProfileTest.groovy index 47b5e6fdf..d7fb77e5c 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/profile/LoadProfileTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/profile/LoadProfileTest.groovy @@ -5,6 +5,8 @@ */ package edu.ie3.datamodel.models.profile +import static edu.ie3.datamodel.models.profile.LoadProfile.RandomLoadProfile.RANDOM_LOAD_PROFILE + import edu.ie3.datamodel.exceptions.ParsingException import spock.lang.Specification @@ -17,77 +19,78 @@ class LoadProfileTest extends Specification { actual == expected where: - key || expected - "h0" || BdewStandardLoadProfile.H0 - "h-0" || BdewStandardLoadProfile.H0 - "h_0" || BdewStandardLoadProfile.H0 - "H0" || BdewStandardLoadProfile.H0 - "H-0" || BdewStandardLoadProfile.H0 - "H_0" || BdewStandardLoadProfile.H0 - "l0" || BdewStandardLoadProfile.L0 - "l-0" || BdewStandardLoadProfile.L0 - "l_0" || BdewStandardLoadProfile.L0 - "L0" || BdewStandardLoadProfile.L0 - "L-0" || BdewStandardLoadProfile.L0 - "L_0" || BdewStandardLoadProfile.L0 - "l1" || BdewStandardLoadProfile.L1 - "l-1" || BdewStandardLoadProfile.L1 - "l_1" || BdewStandardLoadProfile.L1 - "L1" || BdewStandardLoadProfile.L1 - "L-1" || BdewStandardLoadProfile.L1 - "L_1" || BdewStandardLoadProfile.L1 - "l2" || BdewStandardLoadProfile.L2 - "l-2" || BdewStandardLoadProfile.L2 - "l_2" || BdewStandardLoadProfile.L2 - "L2" || BdewStandardLoadProfile.L2 - "L-2" || BdewStandardLoadProfile.L2 - "L_2" || BdewStandardLoadProfile.L2 - "g0" || BdewStandardLoadProfile.G0 - "g-0" || BdewStandardLoadProfile.G0 - "g_0" || BdewStandardLoadProfile.G0 - "G0" || BdewStandardLoadProfile.G0 - "G-0" || BdewStandardLoadProfile.G0 - "G_0" || BdewStandardLoadProfile.G0 - "g1" || BdewStandardLoadProfile.G1 - "g-1" || BdewStandardLoadProfile.G1 - "g_1" || BdewStandardLoadProfile.G1 - "G1" || BdewStandardLoadProfile.G1 - "G-1" || BdewStandardLoadProfile.G1 - "G_1" || BdewStandardLoadProfile.G1 - "g2" || BdewStandardLoadProfile.G2 - "g-2" || BdewStandardLoadProfile.G2 - "g_2" || BdewStandardLoadProfile.G2 - "G2" || BdewStandardLoadProfile.G2 - "G-2" || BdewStandardLoadProfile.G2 - "G_2" || BdewStandardLoadProfile.G2 - "g3" || BdewStandardLoadProfile.G3 - "g-3" || BdewStandardLoadProfile.G3 - "g_3" || BdewStandardLoadProfile.G3 - "G3" || BdewStandardLoadProfile.G3 - "G-3" || BdewStandardLoadProfile.G3 - "G_3" || BdewStandardLoadProfile.G3 - "g4" || BdewStandardLoadProfile.G4 - "g-4" || BdewStandardLoadProfile.G4 - "g_4" || BdewStandardLoadProfile.G4 - "G4" || BdewStandardLoadProfile.G4 - "G-4" || BdewStandardLoadProfile.G4 - "G_4" || BdewStandardLoadProfile.G4 - "g5" || BdewStandardLoadProfile.G5 - "g-5" || BdewStandardLoadProfile.G5 - "g_5" || BdewStandardLoadProfile.G5 - "G5" || BdewStandardLoadProfile.G5 - "G-5" || BdewStandardLoadProfile.G5 - "G_5" || BdewStandardLoadProfile.G5 - "g6" || BdewStandardLoadProfile.G6 - "g-6" || BdewStandardLoadProfile.G6 - "g_6" || BdewStandardLoadProfile.G6 - "G6" || BdewStandardLoadProfile.G6 - "G-6" || BdewStandardLoadProfile.G6 - "G_6" || BdewStandardLoadProfile.G6 - "ep1" || NbwTemperatureDependantLoadProfile.EP1 - "ez2" || NbwTemperatureDependantLoadProfile.EZ2 - "" || LoadProfile.DefaultLoadProfiles.NO_LOAD_PROFILE - null || LoadProfile.DefaultLoadProfiles.NO_LOAD_PROFILE + key || expected + "h0" || BdewStandardLoadProfile.H0 + "h-0" || BdewStandardLoadProfile.H0 + "h_0" || BdewStandardLoadProfile.H0 + "H0" || BdewStandardLoadProfile.H0 + "H-0" || BdewStandardLoadProfile.H0 + "H_0" || BdewStandardLoadProfile.H0 + "l0" || BdewStandardLoadProfile.L0 + "l-0" || BdewStandardLoadProfile.L0 + "l_0" || BdewStandardLoadProfile.L0 + "L0" || BdewStandardLoadProfile.L0 + "L-0" || BdewStandardLoadProfile.L0 + "L_0" || BdewStandardLoadProfile.L0 + "l1" || BdewStandardLoadProfile.L1 + "l-1" || BdewStandardLoadProfile.L1 + "l_1" || BdewStandardLoadProfile.L1 + "L1" || BdewStandardLoadProfile.L1 + "L-1" || BdewStandardLoadProfile.L1 + "L_1" || BdewStandardLoadProfile.L1 + "l2" || BdewStandardLoadProfile.L2 + "l-2" || BdewStandardLoadProfile.L2 + "l_2" || BdewStandardLoadProfile.L2 + "L2" || BdewStandardLoadProfile.L2 + "L-2" || BdewStandardLoadProfile.L2 + "L_2" || BdewStandardLoadProfile.L2 + "g0" || BdewStandardLoadProfile.G0 + "g-0" || BdewStandardLoadProfile.G0 + "g_0" || BdewStandardLoadProfile.G0 + "G0" || BdewStandardLoadProfile.G0 + "G-0" || BdewStandardLoadProfile.G0 + "G_0" || BdewStandardLoadProfile.G0 + "g1" || BdewStandardLoadProfile.G1 + "g-1" || BdewStandardLoadProfile.G1 + "g_1" || BdewStandardLoadProfile.G1 + "G1" || BdewStandardLoadProfile.G1 + "G-1" || BdewStandardLoadProfile.G1 + "G_1" || BdewStandardLoadProfile.G1 + "g2" || BdewStandardLoadProfile.G2 + "g-2" || BdewStandardLoadProfile.G2 + "g_2" || BdewStandardLoadProfile.G2 + "G2" || BdewStandardLoadProfile.G2 + "G-2" || BdewStandardLoadProfile.G2 + "G_2" || BdewStandardLoadProfile.G2 + "g3" || BdewStandardLoadProfile.G3 + "g-3" || BdewStandardLoadProfile.G3 + "g_3" || BdewStandardLoadProfile.G3 + "G3" || BdewStandardLoadProfile.G3 + "G-3" || BdewStandardLoadProfile.G3 + "G_3" || BdewStandardLoadProfile.G3 + "g4" || BdewStandardLoadProfile.G4 + "g-4" || BdewStandardLoadProfile.G4 + "g_4" || BdewStandardLoadProfile.G4 + "G4" || BdewStandardLoadProfile.G4 + "G-4" || BdewStandardLoadProfile.G4 + "G_4" || BdewStandardLoadProfile.G4 + "g5" || BdewStandardLoadProfile.G5 + "g-5" || BdewStandardLoadProfile.G5 + "g_5" || BdewStandardLoadProfile.G5 + "G5" || BdewStandardLoadProfile.G5 + "G-5" || BdewStandardLoadProfile.G5 + "G_5" || BdewStandardLoadProfile.G5 + "g6" || BdewStandardLoadProfile.G6 + "g-6" || BdewStandardLoadProfile.G6 + "g_6" || BdewStandardLoadProfile.G6 + "G6" || BdewStandardLoadProfile.G6 + "G-6" || BdewStandardLoadProfile.G6 + "G_6" || BdewStandardLoadProfile.G6 + "ep1" || NbwTemperatureDependantLoadProfile.EP1 + "ez2" || NbwTemperatureDependantLoadProfile.EZ2 + "random" || RANDOM_LOAD_PROFILE + "" || LoadProfile.DefaultLoadProfiles.NO_LOAD_PROFILE + null || LoadProfile.DefaultLoadProfiles.NO_LOAD_PROFILE } def "Standard load profiles can be parsed correctly"() { @@ -184,6 +187,6 @@ class LoadProfileTest extends Specification { then: def e = thrown(ParsingException) - e.message == "No predefined load profile with key 'not_a_key' found. Please provide one of the following keys: h0, l0, l1, l2, g0, g1, g2, g3, g4, g5, g6, ep1, ez2" + e.message == "No predefined load profile with key 'not_a_key' found. Please provide one of the following keys: h0, l0, l1, l2, g0, g1, g2, g3, g4, g5, g6, ep1, ez2, random" } } diff --git a/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy b/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy index 9a27b149c..a0a641cab 100644 --- a/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy +++ b/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy @@ -9,14 +9,16 @@ import static edu.ie3.util.quantities.PowerSystemUnits.* import static tech.units.indriya.unit.Units.CELSIUS import static tech.units.indriya.unit.Units.METRE_PER_SECOND +import edu.ie3.datamodel.models.Season import edu.ie3.datamodel.models.StandardUnits import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile import edu.ie3.datamodel.models.timeseries.IntValue import edu.ie3.datamodel.models.timeseries.TimeSeries import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileInput +import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileEntry +import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileTimeSeries +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries import edu.ie3.datamodel.models.value.* import org.locationtech.jts.geom.Coordinate import org.locationtech.jts.geom.GeometryFactory @@ -394,41 +396,50 @@ trait TimeSeriesTestData { ] as LinkedHashMap ] as Set - LoadProfileInput loadProfileInput = new LoadProfileInput( - UUID.fromString("b56853fe-b800-4c18-b324-db1878b22a28"), + BDEWLoadProfileTimeSeries loadProfileTimeSeries = new BDEWLoadProfileTimeSeries( + UUID.fromString("b0ad5ba2-0d5e-4c9b-b818-4079cebf59cc"), BdewStandardLoadProfile.G2, [ - new LoadProfileEntry( + new BDEWLoadProfileEntry( new PValue(Quantities.getQuantity(5d, KILOWATT)), + Season.SUMMER, DayOfWeek.MONDAY, 0 ), - new LoadProfileEntry( + new BDEWLoadProfileEntry( new PValue(Quantities.getQuantity(15d, KILOWATT)), + Season.SUMMER, DayOfWeek.MONDAY, 1 ), - new LoadProfileEntry( + new BDEWLoadProfileEntry( new PValue(Quantities.getQuantity(10d, KILOWATT)), + Season.SUMMER, DayOfWeek.MONDAY, 2 ) ] as Set ) - Set> loadProfileInputProcessed = [ + Set> loadProfileTimeSeriesProcessed = [ [ "dayOfWeek" : "MONDAY", + "loadProfile": "g2", + "season": "su", "p" : "5.0", "quarterHourOfDay" : "0" ] as LinkedHashMap, [ "dayOfWeek" : "MONDAY", + "loadProfile": "g2", + "season": "su", "p" : "15.0", "quarterHourOfDay" : "1" ] as LinkedHashMap, [ "dayOfWeek" : "MONDAY", + "loadProfile": "g2", + "season": "su", "p" : "10.0", "quarterHourOfDay" : "2" ] as LinkedHashMap @@ -443,6 +454,6 @@ trait TimeSeriesTestData { individualPTimeSeries, individualSTimeSeries, individualWeatherTimeSeries, - loadProfileInput + loadProfileTimeSeries ] } \ No newline at end of file From f059052e03ac73b414a2d717a7c2e2523da322f0 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Wed, 4 Sep 2024 14:44:39 +0200 Subject: [PATCH 05/23] Improving load profile time series. --- .../io/connectors/CsvFileConnector.java | 3 +- .../datamodel/io/csv/CsvFileDefinition.java | 2 +- .../timeseries/BDEWLoadProfileFactory.java | 126 ----------- .../timeseries/BdewLoadProfileFactory.java | 89 ++++++++ .../factory/timeseries/LoadProfileData.java | 6 +- .../timeseries/LoadProfileFactory.java | 11 +- .../timeseries/RandomLoadProfileFactory.java | 57 ++--- .../EntityPersistenceNamingStrategy.java | 2 +- .../io/naming/FileNamingStrategy.java | 4 +- .../io/processor/ProcessorProvider.java | 4 +- .../timeseries/TimeSeriesProcessor.java | 11 +- .../ie3/datamodel/io/sink/CsvFileSink.java | 4 +- .../edu/ie3/datamodel/io/sink/DataSink.java | 2 +- .../ie3/datamodel/io/sink/InfluxDbSink.java | 11 +- .../io/source/LoadProfileSource.java | 33 +-- .../io/source/csv/CsvLoadProfileSource.java | 21 +- .../models/{Season.java => BdewSeason.java} | 8 +- .../models/timeseries/TimeSeries.java | 2 +- .../repetitive/BDEWLoadProfileEntry.java | 56 ----- .../repetitive/BDEWLoadProfileTimeSeries.java | 116 ---------- .../repetitive/BdewLoadProfileTimeSeries.java | 55 +++++ .../repetitive/LoadProfileEntry.java | 38 ++-- .../repetitive/LoadProfileTimeSeries.java | 52 ++--- .../repetitive/RandomLoadProfileEntry.java | 35 --- .../RandomLoadProfileTimeSeries.java | 10 +- .../repetitive/RepetitiveTimeSeries.java | 3 +- .../models/value/load/BdewLoadValues.java | 192 +++++++++++++++++ .../models/value/load/LoadValues.java | 23 ++ .../models/value/load/RandomLoadValues.java | 204 ++++++++++++++++++ ...1_177ebd2f-7174-4a14-b627-71a43fea1d20.csv | 192 ++++++++--------- ...2_b0ad5ba2-0d5e-4c9b-b818-4079cebf59cc.csv | 192 ++++++++--------- ...3_9b880468-309c-43c1-a3f4-26dd26266216.csv | 192 ++++++++--------- ...4_b7682f84-d317-4f7d-a888-0a9502abd763.csv | 192 ++++++++--------- ...5_ec51ae43-3849-4f14-8330-b2eea9414101.csv | 192 ++++++++--------- ...6_d0606284-5f9e-4950-a579-e02b31fa9d1a.csv | 192 ++++++++--------- ...1_aa65260e-efd5-49af-961b-b0daf04fdeee.csv | 192 ++++++++--------- ...2_9029deec-5f70-4647-96db-086f463d0e0d.csv | 192 ++++++++--------- ...oovy => BdewLoadProfileFactoryTest.groovy} | 53 ++--- .../RandomLoadProfileFactoryTest.groovy | 38 ++-- ...EntityPersistenceNamingStrategyTest.groovy | 6 +- .../io/processor/ProcessorProviderTest.groovy | 11 +- .../timeseries/TimeSeriesProcessorTest.groovy | 7 +- .../io/source/LoadProfileSourceTest.groovy | 4 +- .../ie3/test/common/TimeSeriesTestData.groovy | 77 +++---- 44 files changed, 1545 insertions(+), 1367 deletions(-) delete mode 100644 src/main/java/edu/ie3/datamodel/io/factory/timeseries/BDEWLoadProfileFactory.java create mode 100644 src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java rename src/main/java/edu/ie3/datamodel/models/{Season.java => BdewSeason.java} (90%) delete mode 100644 src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileEntry.java delete mode 100644 src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileTimeSeries.java create mode 100644 src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BdewLoadProfileTimeSeries.java delete mode 100644 src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileEntry.java create mode 100644 src/main/java/edu/ie3/datamodel/models/value/load/BdewLoadValues.java create mode 100644 src/main/java/edu/ie3/datamodel/models/value/load/LoadValues.java create mode 100644 src/main/java/edu/ie3/datamodel/models/value/load/RandomLoadValues.java rename src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/{DBEWLoadProfileFactoryTest.groovy => BdewLoadProfileFactoryTest.groovy} (61%) diff --git a/src/main/java/edu/ie3/datamodel/io/connectors/CsvFileConnector.java b/src/main/java/edu/ie3/datamodel/io/connectors/CsvFileConnector.java index 7628bf3b2..358b60739 100644 --- a/src/main/java/edu/ie3/datamodel/io/connectors/CsvFileConnector.java +++ b/src/main/java/edu/ie3/datamodel/io/connectors/CsvFileConnector.java @@ -63,7 +63,8 @@ public synchronized BufferedCsvWriter getOrInitWriter( } } - public synchronized , E extends TimeSeriesEntry, V extends Value> + public synchronized < + T extends TimeSeries, E extends TimeSeriesEntry, V extends Value> BufferedCsvWriter getOrInitWriter(T timeSeries, CsvFileDefinition fileDefinition) throws ConnectorException { /* Try to the right writer */ diff --git a/src/main/java/edu/ie3/datamodel/io/csv/CsvFileDefinition.java b/src/main/java/edu/ie3/datamodel/io/csv/CsvFileDefinition.java index 6afe95a39..f220f537a 100644 --- a/src/main/java/edu/ie3/datamodel/io/csv/CsvFileDefinition.java +++ b/src/main/java/edu/ie3/datamodel/io/csv/CsvFileDefinition.java @@ -68,7 +68,7 @@ public CsvFileDefinition( * @param fileNamingStrategy that should be used * @throws FileException If the definition cannot be determined */ - public , E extends TimeSeriesEntry, V extends Value> + public , E extends TimeSeriesEntry, V extends Value> CsvFileDefinition( T timeSeries, String[] headLineElements, diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BDEWLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BDEWLoadProfileFactory.java deleted file mode 100644 index 661046b5c..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BDEWLoadProfileFactory.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * © 2024. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.timeseries; - -import static edu.ie3.util.quantities.PowerSystemUnits.KILOWATT; -import static java.time.DayOfWeek.*; - -import edu.ie3.datamodel.exceptions.FactoryException; -import edu.ie3.datamodel.exceptions.ParsingException; -import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; -import edu.ie3.datamodel.models.Season; -import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; -import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileEntry; -import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileTimeSeries; -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; -import edu.ie3.datamodel.models.value.PValue; -import java.util.List; -import java.util.Set; - -public class BDEWLoadProfileFactory - extends LoadProfileFactory { - public static final String SUMMER_WEEKDAY = "SuWd"; - public static final String SUMMER_SATURDAY = "SuSa"; - public static final String SUMMER_SUNDAY = "SuSu"; - public static final String WINTER_WEEKDAY = "WiWd"; - public static final String WINTER_SATURDAY = "WiSa"; - public static final String WINTER_SUNDAY = "WiSu"; - public static final String TRANSITION_WEEKDAY = "TrWd"; - public static final String TRANSITION_SATURDAY = "TrSa"; - public static final String TRANSITION_SUNDAY = "TrSu"; - - public BDEWLoadProfileFactory() { - this(BDEWLoadProfileEntry.class); - } - - public BDEWLoadProfileFactory(Class valueClass) { - super(valueClass); - } - - @Override - protected Set buildModel(LoadProfileData data) { - int quarterHour = data.getInt(QUARTER_HOUR); - - return Set.of( - new BDEWLoadProfileEntry( - new PValue(data.getQuantity(SUMMER_WEEKDAY, KILOWATT)), - Season.SUMMER, - MONDAY, - quarterHour), - new BDEWLoadProfileEntry( - new PValue(data.getQuantity(SUMMER_SATURDAY, KILOWATT)), - Season.SUMMER, - SATURDAY, - quarterHour), - new BDEWLoadProfileEntry( - new PValue(data.getQuantity(SUMMER_SUNDAY, KILOWATT)), - Season.SUMMER, - SUNDAY, - quarterHour), - new BDEWLoadProfileEntry( - new PValue(data.getQuantity(WINTER_WEEKDAY, KILOWATT)), - Season.WINTER, - MONDAY, - quarterHour), - new BDEWLoadProfileEntry( - new PValue(data.getQuantity(WINTER_SATURDAY, KILOWATT)), - Season.WINTER, - SATURDAY, - quarterHour), - new BDEWLoadProfileEntry( - new PValue(data.getQuantity(WINTER_SUNDAY, KILOWATT)), - Season.WINTER, - SUNDAY, - quarterHour), - new BDEWLoadProfileEntry( - new PValue(data.getQuantity(TRANSITION_WEEKDAY, KILOWATT)), - Season.TRANSITION, - MONDAY, - quarterHour), - new BDEWLoadProfileEntry( - new PValue(data.getQuantity(TRANSITION_SATURDAY, KILOWATT)), - Season.TRANSITION, - SATURDAY, - quarterHour), - new BDEWLoadProfileEntry( - new PValue(data.getQuantity(TRANSITION_SUNDAY, KILOWATT)), - Season.TRANSITION, - SUNDAY, - quarterHour)); - } - - @Override - protected List> getFields(Class entityClass) { - return List.of( - newSet( - QUARTER_HOUR, - SUMMER_WEEKDAY, - SUMMER_SATURDAY, - SUMMER_SUNDAY, - WINTER_WEEKDAY, - WINTER_SATURDAY, - WINTER_SUNDAY, - TRANSITION_WEEKDAY, - TRANSITION_SATURDAY, - TRANSITION_SUNDAY)); - } - - @Override - public LoadProfileTimeSeries build( - LoadProfileTimeSeriesMetaInformation metaInformation, Set entries) { - return new BDEWLoadProfileTimeSeries( - metaInformation.getUuid(), parseProfile(metaInformation.getProfile()), entries); - } - - @Override - public BdewStandardLoadProfile parseProfile(String profile) { - try { - return BdewStandardLoadProfile.get(profile); - } catch (ParsingException e) { - throw new FactoryException("An error occurred while parsing the profile: " + profile, e); - } - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java new file mode 100644 index 000000000..9c90e1818 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java @@ -0,0 +1,89 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.io.factory.timeseries; + +import edu.ie3.datamodel.exceptions.FactoryException; +import edu.ie3.datamodel.exceptions.ParsingException; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; +import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; +import edu.ie3.datamodel.models.timeseries.repetitive.BdewLoadProfileTimeSeries; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; +import edu.ie3.datamodel.models.value.load.BdewLoadValues; +import java.util.List; +import java.util.Set; + +public class BdewLoadProfileFactory + extends LoadProfileFactory { + public static final String SUMMER_SATURDAY = "SuSa"; + public static final String SUMMER_SUNDAY = "SuSu"; + public static final String SUMMER_WEEKDAY = "SuWd"; + public static final String TRANSITION_SATURDAY = "TrSa"; + public static final String TRANSITION_SUNDAY = "TrSu"; + public static final String TRANSITION_WEEKDAY = "TrWd"; + public static final String WINTER_SATURDAY = "WiSa"; + public static final String WINTER_SUNDAY = "WiSu"; + public static final String WINTER_WEEKDAY = "WiWd"; + + public BdewLoadProfileFactory() { + this(BdewLoadValues.class); + } + + public BdewLoadProfileFactory(Class valueClass) { + super(valueClass); + } + + @Override + protected LoadProfileEntry buildModel(LoadProfileData data) { + int quarterHour = data.getInt(QUARTER_HOUR); + + return new LoadProfileEntry<>( + new BdewLoadValues( + data.getDouble(SUMMER_SATURDAY), + data.getDouble(SUMMER_SUNDAY), + data.getDouble(SUMMER_WEEKDAY), + data.getDouble(TRANSITION_SATURDAY), + data.getDouble(TRANSITION_SUNDAY), + data.getDouble(TRANSITION_WEEKDAY), + data.getDouble(WINTER_SATURDAY), + data.getDouble(WINTER_SUNDAY), + data.getDouble(WINTER_WEEKDAY)), + quarterHour); + } + + @Override + protected List> getFields(Class entityClass) { + return List.of( + newSet( + QUARTER_HOUR, + SUMMER_SATURDAY, + SUMMER_SUNDAY, + SUMMER_WEEKDAY, + TRANSITION_SATURDAY, + TRANSITION_SUNDAY, + TRANSITION_WEEKDAY, + WINTER_SATURDAY, + WINTER_SUNDAY, + WINTER_WEEKDAY)); + } + + @Override + public LoadProfileTimeSeries build( + LoadProfileTimeSeriesMetaInformation metaInformation, + Set> entries) { + return new BdewLoadProfileTimeSeries( + metaInformation.getUuid(), parseProfile(metaInformation.getProfile()), entries); + } + + @Override + public BdewStandardLoadProfile parseProfile(String profile) { + try { + return BdewStandardLoadProfile.get(profile); + } catch (ParsingException e) { + throw new FactoryException("An error occurred while parsing the profile: " + profile, e); + } + } +} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileData.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileData.java index 5e6c0c904..8d432d26a 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileData.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileData.java @@ -6,11 +6,11 @@ package edu.ie3.datamodel.io.factory.timeseries; import edu.ie3.datamodel.io.factory.FactoryData; -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; +import edu.ie3.datamodel.models.value.load.LoadValues; import java.util.Map; -public class LoadProfileData extends FactoryData { - public LoadProfileData(Map fieldsToAttributes, Class targetClass) { +public class LoadProfileData extends FactoryData { + public LoadProfileData(Map fieldsToAttributes, Class targetClass) { super(fieldsToAttributes, targetClass); } } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java index 98856dd6c..a7cb16b13 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java @@ -10,18 +10,19 @@ import edu.ie3.datamodel.models.profile.LoadProfile; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; +import edu.ie3.datamodel.models.value.load.LoadValues; import java.util.Set; -public abstract class LoadProfileFactory

- extends Factory, Set> { +public abstract class LoadProfileFactory

+ extends Factory, LoadProfileEntry> { public static final String QUARTER_HOUR = "quarterHour"; - public LoadProfileFactory(Class valueClass) { + public LoadProfileFactory(Class valueClass) { super(valueClass); } - public abstract LoadProfileTimeSeries build( - LoadProfileTimeSeriesMetaInformation metaInformation, Set data); + public abstract LoadProfileTimeSeries build( + LoadProfileTimeSeriesMetaInformation metaInformation, Set> data); public abstract P parseProfile(String profile); } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java index abb1d839e..8d741bb2a 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java @@ -6,21 +6,17 @@ package edu.ie3.datamodel.io.factory.timeseries; import static edu.ie3.datamodel.models.profile.LoadProfile.RandomLoadProfile.RANDOM_LOAD_PROFILE; -import static java.time.DayOfWeek.*; -import de.lmu.ifi.dbs.elki.math.statistics.distribution.GeneralizedExtremeValueDistribution; -import de.lmu.ifi.dbs.elki.utilities.random.RandomFactory; import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; import edu.ie3.datamodel.models.profile.LoadProfile; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; -import edu.ie3.datamodel.models.timeseries.repetitive.RandomLoadProfileEntry; import edu.ie3.datamodel.models.timeseries.repetitive.RandomLoadProfileTimeSeries; +import edu.ie3.datamodel.models.value.load.RandomLoadValues; import java.util.List; -import java.util.Random; import java.util.Set; -public class RandomLoadProfileFactory - extends LoadProfileFactory { +public class RandomLoadProfileFactory extends LoadProfileFactory { public static final String K_WEEKDAY = "kWd"; public static final String K_SATURDAY = "kSa"; public static final String K_SUNDAY = "kSu"; @@ -32,37 +28,25 @@ public class RandomLoadProfileFactory public static final String SIGMA_SUNDAY = "sigmaSu"; public RandomLoadProfileFactory() { - super(RandomLoadProfileEntry.class); + super(RandomLoadValues.class); } @Override - protected Set buildModel(LoadProfileData data) { + protected LoadProfileEntry buildModel(LoadProfileData data) { int quarterHour = data.getInt(QUARTER_HOUR); - return Set.of( - new RandomLoadProfileEntry( - new GeneralizedExtremeValueDistribution( - data.getDouble(MY_WEEKDAY), - data.getDouble(SIGMA_WEEKDAY), - data.getDouble(K_WEEKDAY), - RandomFactory.get(new Random().nextLong())), - MONDAY, - quarterHour), - new RandomLoadProfileEntry( - new GeneralizedExtremeValueDistribution( - data.getDouble(MY_SATURDAY), - data.getDouble(SIGMA_SATURDAY), - data.getDouble(K_SATURDAY), - RandomFactory.get(new Random().nextLong())), - SATURDAY, - quarterHour), - new RandomLoadProfileEntry( - new GeneralizedExtremeValueDistribution( - data.getDouble(MY_SUNDAY), - data.getDouble(SIGMA_SUNDAY), - data.getDouble(K_SUNDAY), - RandomFactory.get(new Random().nextLong())), - SUNDAY, - quarterHour)); + + return new LoadProfileEntry<>( + new RandomLoadValues( + data.getDouble(K_SATURDAY), + data.getDouble(K_SUNDAY), + data.getDouble(K_WEEKDAY), + data.getDouble(MY_SATURDAY), + data.getDouble(MY_SUNDAY), + data.getDouble(MY_WEEKDAY), + data.getDouble(SIGMA_SATURDAY), + data.getDouble(SIGMA_SUNDAY), + data.getDouble(SIGMA_WEEKDAY)), + quarterHour); } @Override @@ -82,8 +66,9 @@ protected List> getFields(Class entityClass) { } @Override - public LoadProfileTimeSeries build( - LoadProfileTimeSeriesMetaInformation metaInformation, Set entries) { + public LoadProfileTimeSeries build( + LoadProfileTimeSeriesMetaInformation metaInformation, + Set> entries) { return new RandomLoadProfileTimeSeries(metaInformation.getUuid(), RANDOM_LOAD_PROFILE, entries); } diff --git a/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java b/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java index 715052d5e..e328041b3 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java @@ -344,7 +344,7 @@ public Optional getTimeSeriesMappingEntityName() { * @param timeSeries Time series to derive naming information from * @return A file name for this particular time series */ - public , E extends TimeSeriesEntry, V extends Value> + public , E extends TimeSeriesEntry, V extends Value> Optional getEntityName(T timeSeries) { if (timeSeries instanceof IndividualTimeSeries) { Optional maybeFirstElement = timeSeries.getEntries().stream().findFirst(); diff --git a/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java b/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java index 84a18283e..c81520bc3 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java @@ -137,7 +137,7 @@ public Optional getDirectoryPath(Class cls) { * @param timeSeries Time series to derive naming information from * @return An optional sub directory path */ - public , E extends TimeSeriesEntry, V extends Value> + public , E extends TimeSeriesEntry, V extends Value> Optional getDirectoryPath(T timeSeries) { Optional maybeDirectoryName = fileHierarchy.getSubDirectory(timeSeries.getClass()); if (maybeDirectoryName.isEmpty()) { @@ -281,7 +281,7 @@ public Optional getEntityName(Class cls) { * @param timeSeries Time series to derive naming information from * @return A file name for this particular time series */ - public , E extends TimeSeriesEntry, V extends Value> + public , E extends TimeSeriesEntry, V extends Value> Optional getEntityName(T timeSeries) { return entityPersistenceNamingStrategy.getEntityName(timeSeries); } diff --git a/src/main/java/edu/ie3/datamodel/io/processor/ProcessorProvider.java b/src/main/java/edu/ie3/datamodel/io/processor/ProcessorProvider.java index 7db4f0463..cd6850b6c 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/ProcessorProvider.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/ProcessorProvider.java @@ -109,7 +109,7 @@ private EntityProcessor getEntityProcessor(Class Type of the value inside the time series entries * @return A set of mappings from field name to value */ - public , E extends TimeSeriesEntry, V extends Value> + public , E extends TimeSeriesEntry, V extends Value> Set> handleTimeSeries(T timeSeries) throws ProcessorProviderException { TimeSeriesProcessorKey key = new TimeSeriesProcessorKey(timeSeries); @@ -132,7 +132,7 @@ Set> handleTimeSeries(T timeSeries) * @throws ProcessorProviderException If no fitting processor can be found */ @SuppressWarnings("unchecked cast") - private , E extends TimeSeriesEntry, V extends Value> + private , E extends TimeSeriesEntry, V extends Value> TimeSeriesProcessor getTimeSeriesProcessor(TimeSeriesProcessorKey processorKey) throws ProcessorProviderException { TimeSeriesProcessor processor = diff --git a/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java b/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java index adb2783a5..84a597eb8 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java @@ -15,13 +15,15 @@ import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue; import edu.ie3.datamodel.models.timeseries.repetitive.*; import edu.ie3.datamodel.models.value.*; +import edu.ie3.datamodel.models.value.load.BdewLoadValues; +import edu.ie3.datamodel.models.value.load.RandomLoadValues; import java.lang.reflect.Method; import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; public class TimeSeriesProcessor< - T extends TimeSeries, E extends TimeSeriesEntry, V extends Value> + T extends TimeSeries, E extends TimeSeriesEntry, V extends Value> extends EntityProcessor { /** * List of all combinations of time series class, entry class and value class, this processor is @@ -50,9 +52,9 @@ public class TimeSeriesProcessor< new TimeSeriesProcessorKey( IndividualTimeSeries.class, TimeBasedValue.class, HeatAndSValue.class), new TimeSeriesProcessorKey( - BDEWLoadProfileTimeSeries.class, BDEWLoadProfileEntry.class, PValue.class), + BdewLoadProfileTimeSeries.class, LoadProfileEntry.class, BdewLoadValues.class), new TimeSeriesProcessorKey( - RandomLoadProfileTimeSeries.class, RandomLoadProfileEntry.class, PValue.class)); + RandomLoadProfileTimeSeries.class, LoadProfileEntry.class, RandomLoadValues.class)); /** * Specific combination of time series class, entry class and value class, this processor is @@ -112,7 +114,8 @@ private SortedMap buildFieldToSource( throws EntityProcessorException { /* Get the mapping from field name to getter method ignoring the getter for returning all entries */ Map timeSeriesMapping = - mapFieldNameToGetter(timeSeriesClass, Arrays.asList("entries", "uuid", "type")) + mapFieldNameToGetter( + timeSeriesClass, Arrays.asList("entries", "uuid", "type", "loadProfile")) .entrySet() .stream() .collect( diff --git a/src/main/java/edu/ie3/datamodel/io/sink/CsvFileSink.java b/src/main/java/edu/ie3/datamodel/io/sink/CsvFileSink.java index 8635534a7..26f0801ac 100644 --- a/src/main/java/edu/ie3/datamodel/io/sink/CsvFileSink.java +++ b/src/main/java/edu/ie3/datamodel/io/sink/CsvFileSink.java @@ -243,7 +243,7 @@ public void shutdown() { } @Override - public , V extends Value> void persistTimeSeries( + public , V extends Value> void persistTimeSeries( TimeSeries timeSeries) { try { TimeSeriesProcessorKey key = new TimeSeriesProcessorKey(timeSeries); @@ -264,7 +264,7 @@ public , V extends Value> void persistTimeSeries( } } - private , V extends Value> void persistTimeSeries( + private , V extends Value> void persistTimeSeries( TimeSeries timeSeries, BufferedCsvWriter writer) throws ProcessorProviderException { try { Set> entityFieldData = diff --git a/src/main/java/edu/ie3/datamodel/io/sink/DataSink.java b/src/main/java/edu/ie3/datamodel/io/sink/DataSink.java index 1d45320dc..d4dca754e 100644 --- a/src/main/java/edu/ie3/datamodel/io/sink/DataSink.java +++ b/src/main/java/edu/ie3/datamodel/io/sink/DataSink.java @@ -62,6 +62,6 @@ public interface DataSink { * @param Type of entry in the time series * @param Type of actual value, that is inside the entry */ - , V extends Value> void persistTimeSeries( + , V extends Value> void persistTimeSeries( TimeSeries timeSeries) throws ProcessorProviderException; } diff --git a/src/main/java/edu/ie3/datamodel/io/sink/InfluxDbSink.java b/src/main/java/edu/ie3/datamodel/io/sink/InfluxDbSink.java index 5730a1585..85255f916 100644 --- a/src/main/java/edu/ie3/datamodel/io/sink/InfluxDbSink.java +++ b/src/main/java/edu/ie3/datamodel/io/sink/InfluxDbSink.java @@ -85,7 +85,7 @@ public void persistAll(Collection entities) } @Override - public , V extends Value> void persistTimeSeries( + public , V extends Value> void persistTimeSeries( TimeSeries timeSeries) throws ProcessorProviderException { Set points = transformToPoints(timeSeries); writeAll(points); @@ -146,8 +146,8 @@ private Point transformToPoint(ResultEntity entity, String measurementName) * * @param timeSeries the time series to transform */ - private , V extends Value> Set transformToPoints( - TimeSeries timeSeries) throws ProcessorProviderException { + private , V extends Value> + Set transformToPoints(TimeSeries timeSeries) throws ProcessorProviderException { if (timeSeries.getEntries().isEmpty()) return Collections.emptySet(); Optional measurementName = entityPersistenceNamingStrategy.getEntityName(timeSeries); @@ -169,8 +169,9 @@ private , V extends Value> Set transformToPo * @param timeSeries the time series to transform * @param measurementName equivalent to the name of a relational table */ - private , V extends Value> Set transformToPoints( - TimeSeries timeSeries, String measurementName) throws ProcessorProviderException { + private , V extends Value> + Set transformToPoints(TimeSeries timeSeries, String measurementName) + throws ProcessorProviderException { Set points = new HashSet<>(); Set> entityFieldData = processorProvider.handleTimeSeries(timeSeries); diff --git a/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java index eeac6c210..57f4dddb8 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java @@ -9,7 +9,7 @@ import edu.ie3.datamodel.exceptions.FactoryException; import edu.ie3.datamodel.io.csv.CsvLoadProfileMetaInformation; -import edu.ie3.datamodel.io.factory.timeseries.BDEWLoadProfileFactory; +import edu.ie3.datamodel.io.factory.timeseries.BdewLoadProfileFactory; import edu.ie3.datamodel.io.factory.timeseries.LoadProfileData; import edu.ie3.datamodel.io.factory.timeseries.LoadProfileFactory; import edu.ie3.datamodel.io.factory.timeseries.RandomLoadProfileFactory; @@ -19,23 +19,25 @@ import edu.ie3.datamodel.models.profile.LoadProfile; import edu.ie3.datamodel.models.timeseries.repetitive.*; import edu.ie3.datamodel.models.value.Value; +import edu.ie3.datamodel.models.value.load.BdewLoadValues; +import edu.ie3.datamodel.models.value.load.LoadValues; +import edu.ie3.datamodel.models.value.load.RandomLoadValues; import edu.ie3.datamodel.utils.Try; import java.nio.file.Path; import java.time.ZonedDateTime; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; -public abstract class LoadProfileSource

+public abstract class LoadProfileSource

extends EntitySource { private static final CsvDataSource buildInSource = getBuildInSource(Path.of("load")); - protected final Class entryClass; - protected final LoadProfileFactory entryFactory; + protected final Class entryClass; + protected final LoadProfileFactory entryFactory; - protected LoadProfileSource(Class entryClass, LoadProfileFactory entryFactory) { + protected LoadProfileSource(Class entryClass, LoadProfileFactory entryFactory) { this.entryClass = entryClass; this.entryFactory = entryFactory; } @@ -47,12 +49,13 @@ protected LoadProfileSource(Class entryClass, LoadProfileFactory entryF * @param fieldToValues Mapping from field id to values * @return {@link Try} of simple time based value */ - protected Try, FactoryException> createEntries(Map fieldToValues) { - LoadProfileData factoryData = new LoadProfileData<>(fieldToValues, entryClass); + protected Try, FactoryException> createEntries( + Map fieldToValues) { + LoadProfileData factoryData = new LoadProfileData<>(fieldToValues, entryClass); return entryFactory.get(factoryData); } - public abstract LoadProfileTimeSeries getTimeSeries(); + public abstract LoadProfileTimeSeries getTimeSeries(); /** * Method to return all time keys after a given timestamp. @@ -67,17 +70,17 @@ protected Try, FactoryException> createEntries(Map fieldT * * @return a map: load profile to time series */ - public static Map getBDEWLoadProfiles() { - BDEWLoadProfileFactory factory = new BDEWLoadProfileFactory(); + public static Map getBDEWLoadProfiles() { + BdewLoadProfileFactory factory = new BdewLoadProfileFactory(); return buildInSource.getCsvLoadProfileMetaInformation(BdewStandardLoadProfile.values()).stream() .map( metaInformation -> - (BDEWLoadProfileTimeSeries) + (BdewLoadProfileTimeSeries) new CsvLoadProfileSource<>( - buildInSource, metaInformation, BDEWLoadProfileEntry.class, factory) + buildInSource, metaInformation, BdewLoadValues.class, factory) .getTimeSeries()) - .collect(Collectors.toMap(BDEWLoadProfileTimeSeries::getLoadProfile, Function.identity())); + .collect(Collectors.toMap(BdewLoadProfileTimeSeries::getLoadProfile, Function.identity())); } /** @@ -94,7 +97,7 @@ public static RandomLoadProfileTimeSeries getRandomLoadProfile() { new CsvLoadProfileSource<>( buildInSource, metaInformation, - RandomLoadProfileEntry.class, + RandomLoadValues.class, new RandomLoadProfileFactory()) .getTimeSeries(); } diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java index e0d4e0e86..aa742557d 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java @@ -14,6 +14,7 @@ import edu.ie3.datamodel.models.profile.LoadProfile; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; +import edu.ie3.datamodel.models.value.load.LoadValues; import edu.ie3.datamodel.utils.Try; import java.nio.file.Path; import java.time.ZonedDateTime; @@ -24,17 +25,17 @@ /** * Source that is capable of providing information around load profile time series from csv files. */ -public class CsvLoadProfileSource

- extends LoadProfileSource { - private final LoadProfileTimeSeries loadProfileTimeSeries; +public class CsvLoadProfileSource

+ extends LoadProfileSource { + private final LoadProfileTimeSeries loadProfileTimeSeries; private final CsvDataSource dataSource; private final Path filePath; public CsvLoadProfileSource( CsvDataSource source, CsvLoadProfileMetaInformation metaInformation, - Class entryClass, - LoadProfileFactory entryFactory) { + Class entryClass, + LoadProfileFactory entryFactory) { super(entryClass, entryFactory); this.dataSource = source; this.filePath = metaInformation.getFullFilePath(); @@ -57,7 +58,7 @@ public void validate() throws ValidationException { } @Override - public LoadProfileTimeSeries getTimeSeries() { + public LoadProfileTimeSeries getTimeSeries() { return loadProfileTimeSeries; } @@ -80,11 +81,12 @@ public List getTimeKeysAfter(ZonedDateTime time) { * @throws SourceException If the file cannot be read properly * @return an individual time series */ - protected LoadProfileTimeSeries buildLoadProfileTimeSeries( + protected LoadProfileTimeSeries buildLoadProfileTimeSeries( CsvLoadProfileMetaInformation metaInformation, - Function, Try, FactoryException>> fieldToValueFunction) + Function, Try, FactoryException>> + fieldToValueFunction) throws SourceException { - Set entries = + Set> entries = dataSource .buildStreamWithFieldsToAttributesMap(filePath, false) .flatMap( @@ -92,7 +94,6 @@ protected LoadProfileTimeSeries buildLoadProfileTimeSeries( Try.scanStream(stream.map(fieldToValueFunction), "LoadProfileEntry") .transformF(SourceException::new)) .getOrThrow() - .flatMap(Collection::stream) .collect(Collectors.toSet()); return entryFactory.build(metaInformation, entries); diff --git a/src/main/java/edu/ie3/datamodel/models/Season.java b/src/main/java/edu/ie3/datamodel/models/BdewSeason.java similarity index 90% rename from src/main/java/edu/ie3/datamodel/models/Season.java rename to src/main/java/edu/ie3/datamodel/models/BdewSeason.java index 5ba70fcb5..a10acb260 100644 --- a/src/main/java/edu/ie3/datamodel/models/Season.java +++ b/src/main/java/edu/ie3/datamodel/models/BdewSeason.java @@ -8,18 +8,18 @@ import edu.ie3.datamodel.exceptions.ParsingException; import java.time.ZonedDateTime; -public enum Season { +public enum BdewSeason { WINTER("Wi"), SUMMER("Su"), TRANSITION("Tr"); private final String key; - Season(String key) { + BdewSeason(String key) { this.key = key.toLowerCase(); } - public static Season parse(String key) throws ParsingException { + public static BdewSeason parse(String key) throws ParsingException { return switch (key) { case "Wi" -> WINTER; case "Su" -> SUMMER; @@ -34,7 +34,7 @@ public static Season parse(String key) throws ParsingException { * @param time the time * @return a season */ - public static Season get(ZonedDateTime time) { + public static BdewSeason get(ZonedDateTime time) { int day = time.getDayOfMonth(); // winter: 1.11.-20.03. diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/TimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/TimeSeries.java index 279c100d9..62593b0ae 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/TimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/TimeSeries.java @@ -17,7 +17,7 @@ * @param Type of the entries, the time series is foreseen to contain * @param Type of the values, the entries will have */ -public abstract class TimeSeries, V extends Value> +public abstract class TimeSeries, V extends Value> extends UniqueEntity { private final Set entries; diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileEntry.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileEntry.java deleted file mode 100644 index 049c30e97..000000000 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileEntry.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.models.timeseries.repetitive; - -import edu.ie3.datamodel.models.Season; -import edu.ie3.datamodel.models.value.PValue; -import java.time.DayOfWeek; -import java.util.Objects; - -/** Unique entry to a {@link BDEWLoadProfileTimeSeries} */ -public class BDEWLoadProfileEntry extends LoadProfileEntry { - private final Season season; - - public BDEWLoadProfileEntry( - PValue value, Season season, DayOfWeek dayOfWeek, int quarterHourOfDay) { - super(value, dayOfWeek, quarterHourOfDay); - this.season = season; - } - - public Season getSeason() { - return season; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; - BDEWLoadProfileEntry that = (BDEWLoadProfileEntry) o; - return getQuarterHourOfDay() == that.getQuarterHourOfDay() - && season == that.season - && getDayOfWeek() == that.getDayOfWeek(); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), season); - } - - @Override - public String toString() { - return "BDEWLoadProfileEntry{" - + "dayOfWeek=" - + getDayOfWeek() - + "season=" - + season - + ", quarterHourOfDay=" - + getQuarterHourOfDay() - + ", value=" - + value - + '}'; - } -} diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileTimeSeries.java deleted file mode 100644 index 104a8182d..000000000 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileTimeSeries.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * © 2024. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.models.timeseries.repetitive; - -import static edu.ie3.util.quantities.PowerSystemUnits.KILOWATT; -import static java.lang.Math.pow; -import static java.lang.Math.round; - -import edu.ie3.datamodel.models.Season; -import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; -import edu.ie3.datamodel.models.value.PValue; -import java.time.DayOfWeek; -import java.time.ZonedDateTime; -import java.util.Objects; -import java.util.Set; -import java.util.UUID; -import java.util.function.Function; -import javax.measure.quantity.Power; -import tech.units.indriya.ComparableQuantity; -import tech.units.indriya.quantity.Quantities; - -/** - * Describes a bdew load profile time series with repetitive values that can be calculated from a - * pattern - */ -public class BDEWLoadProfileTimeSeries extends LoadProfileTimeSeries { - - public BDEWLoadProfileTimeSeries( - UUID uuid, BdewStandardLoadProfile loadProfile, Set values) { - super(uuid, loadProfile, values, e -> new BdewKey(e.getSeason(), e.getDayOfWeek())); - } - - @Override - public BdewStandardLoadProfile getLoadProfile() { - return (BdewStandardLoadProfile) super.getLoadProfile(); - } - - @Override - public PValue calc(ZonedDateTime time) { - if (getLoadProfile() == BdewStandardLoadProfile.H0) { - /* For the residential average profile, a dynamization has to be taken into account */ - return dynamization(super.calc(time), time.getDayOfYear()); // leap years are ignored - } else { - return super.calc(time); - } - } - - /** - * Calculates the dynamization factor for given day of year. Cf. - * Anwendung der repräsentativen Lastprofile - Step by step page 19 - * - * @param load load value - * @param t day of year (1-366) - * @return dynamization factor - */ - private PValue dynamization(PValue load, int t) { - double factor = - (-3.92e-10 * pow(t, 4) + 3.2e-7 * pow(t, 3) - 7.02e-5 * pow(t, 2) + 2.1e-3 * t + 1.24); - double rndFactor = round(factor * 1e4) / 1e4; // round to 4 decimal places - Function round = - l -> round(l * rndFactor * 1e1) / 1e1; // rounded to 1 decimal place - - ComparableQuantity value = - load.getP() - .map(v -> v.getValue().doubleValue()) - .map(round) - .map(v -> Quantities.getQuantity(v, KILOWATT)) - .orElse(null); - - return new PValue(value); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - return super.equals(o); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode()); - } - - @Override - public String toString() { - return "BDEWLoadProfileTimeSeries{" - + "uuid=" - + getUuid() - + "loadProfile=" - + getLoadProfile() - + ", valueMapping=" - + getValueMapping() - + '}'; - } - - @Override - protected Key fromTime(ZonedDateTime time) { - Season season = Season.get(time); - - DayOfWeek day = - switch (time.getDayOfWeek()) { - case SATURDAY -> DayOfWeek.SATURDAY; - case SUNDAY -> DayOfWeek.SUNDAY; - default -> DayOfWeek.MONDAY; - }; - - return new BdewKey(season, day); - } - - private record BdewKey(Season season, DayOfWeek dayOfWeek) implements Key {} -} diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BdewLoadProfileTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BdewLoadProfileTimeSeries.java new file mode 100644 index 000000000..478a9f3b1 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BdewLoadProfileTimeSeries.java @@ -0,0 +1,55 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.models.timeseries.repetitive; + +import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; +import edu.ie3.datamodel.models.value.load.BdewLoadValues; +import java.util.Objects; +import java.util.Set; +import java.util.UUID; + +/** + * Describes a bdew load profile time series with repetitive values that can be calculated from a + * pattern + */ +public class BdewLoadProfileTimeSeries extends LoadProfileTimeSeries { + + public BdewLoadProfileTimeSeries( + UUID uuid, + BdewStandardLoadProfile loadProfile, + Set> values) { + super(uuid, loadProfile, values); + } + + @Override + public BdewStandardLoadProfile getLoadProfile() { + return (BdewStandardLoadProfile) super.getLoadProfile(); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + return super.equals(o); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode()); + } + + @Override + public String toString() { + return "BDEWLoadProfileTimeSeries{" + + "uuid=" + + getUuid() + + "loadProfile=" + + getLoadProfile() + + ", valueMapping=" + + getValueMapping() + + '}'; + } +} diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileEntry.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileEntry.java index 29a62684c..10f90d632 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileEntry.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileEntry.java @@ -6,27 +6,20 @@ package edu.ie3.datamodel.models.timeseries.repetitive; import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; -import edu.ie3.datamodel.models.value.PValue; -import java.time.DayOfWeek; +import edu.ie3.datamodel.models.value.load.LoadValues; import java.util.Objects; /** Unique entry to a {@link LoadProfileTimeSeries} */ -public class LoadProfileEntry extends TimeSeriesEntry { - private final DayOfWeek dayOfWeek; - private final int quarterHourOfDay; +public class LoadProfileEntry extends TimeSeriesEntry { + private final int quarterHour; - public LoadProfileEntry(PValue value, DayOfWeek dayOfWeek, int quarterHourOfDay) { - super(value); - this.dayOfWeek = dayOfWeek; - this.quarterHourOfDay = quarterHourOfDay; + public LoadProfileEntry(L values, int quarterHour) { + super(values); + this.quarterHour = quarterHour; } - public DayOfWeek getDayOfWeek() { - return dayOfWeek; - } - - public int getQuarterHourOfDay() { - return quarterHourOfDay; + public int getQuarterHour() { + return quarterHour; } @Override @@ -34,24 +27,17 @@ public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; if (!super.equals(o)) return false; - LoadProfileEntry that = (LoadProfileEntry) o; - return quarterHourOfDay == that.quarterHourOfDay && dayOfWeek == that.dayOfWeek; + LoadProfileEntry that = (LoadProfileEntry) o; + return quarterHour == that.quarterHour; } @Override public int hashCode() { - return Objects.hash(super.hashCode(), dayOfWeek, quarterHourOfDay); + return Objects.hash(super.hashCode(), quarterHour); } @Override public String toString() { - return "LoadProfileEntry{" - + "dayOfWeek=" - + dayOfWeek - + ", quarterHourOfDay=" - + quarterHourOfDay - + ", value=" - + value - + '}'; + return "LoadProfileEntry{" + "quarterHour=" + quarterHour + ", value=" + value + '}'; } } diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java index ffeeb52f5..066c65f8a 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java @@ -5,42 +5,29 @@ */ package edu.ie3.datamodel.models.timeseries.repetitive; -import static java.util.function.Function.identity; - import edu.ie3.datamodel.models.profile.LoadProfile; import edu.ie3.datamodel.models.value.PValue; -import java.time.DayOfWeek; +import edu.ie3.datamodel.models.value.load.LoadValues; import java.time.ZonedDateTime; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.UUID; -import java.util.function.Function; +import java.util.*; import java.util.stream.Collectors; /** * Describes a load profile time series with repetitive values that can be calculated from a pattern */ -public abstract class LoadProfileTimeSeries - extends RepetitiveTimeSeries { +public abstract class LoadProfileTimeSeries + extends RepetitiveTimeSeries, PValue> { private final LoadProfile loadProfile; - private final Map> valueMapping; - - public LoadProfileTimeSeries(UUID uuid, LoadProfile loadProfile, Set entries) { - this(uuid, loadProfile, entries, e -> new WeekDayKey(e.getDayOfWeek())); - } + private final Map valueMapping; public LoadProfileTimeSeries( - UUID uuid, LoadProfile loadProfile, Set entries, Function extractor) { + UUID uuid, LoadProfile loadProfile, Set> entries) { super(uuid, entries); this.loadProfile = loadProfile; - this.valueMapping = entries.stream() .collect( - Collectors.groupingBy( - extractor, - Collectors.toMap(LoadProfileEntry::getQuarterHourOfDay, identity()))); + Collectors.toMap(LoadProfileEntry::getQuarterHour, LoadProfileEntry::getValue)); } /** Returns the {@link LoadProfile}. */ @@ -48,33 +35,32 @@ public LoadProfile getLoadProfile() { return loadProfile; } + @Override + public Set> getEntries() { + // to ensure that the entries are ordered by their quarter-hour + TreeSet> set = + new TreeSet<>(Comparator.comparing(LoadProfileEntry::getQuarterHour)); + set.addAll(super.getEntries()); + return set; + } + /** Returns the value mapping. */ - protected Map> getValueMapping() { + protected Map getValueMapping() { return valueMapping; } @Override protected PValue calc(ZonedDateTime time) { - Key key = fromTime(time); int quarterHour = time.getHour() * 4 + time.getMinute() / 15; - return valueMapping.get(key).get(quarterHour).getValue(); - } - - protected Key fromTime(ZonedDateTime time) { - return new WeekDayKey(time.getDayOfWeek()); + return valueMapping.get(quarterHour).getValue(time, loadProfile); } - public interface Key {} - - private record WeekDayKey(DayOfWeek dayOfWeek) implements Key {} - @Override - @SuppressWarnings("unchecked") public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; if (!super.equals(o)) return false; - LoadProfileTimeSeries that = (LoadProfileTimeSeries) o; + LoadProfileTimeSeries that = (LoadProfileTimeSeries) o; return loadProfile.equals(that.loadProfile) && valueMapping.equals(that.valueMapping); } diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileEntry.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileEntry.java deleted file mode 100644 index aa63a413b..000000000 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileEntry.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * © 2024. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.models.timeseries.repetitive; - -import static edu.ie3.util.quantities.PowerSystemUnits.KILOWATT; - -import de.lmu.ifi.dbs.elki.math.statistics.distribution.GeneralizedExtremeValueDistribution; -import edu.ie3.datamodel.models.value.PValue; -import java.time.DayOfWeek; -import tech.units.indriya.quantity.Quantities; - -/** Unique entry for a {@link RandomLoadProfileTimeSeries}. */ -public class RandomLoadProfileEntry extends LoadProfileEntry { - // distribution for random values - private final GeneralizedExtremeValueDistribution gev; - - public RandomLoadProfileEntry( - GeneralizedExtremeValueDistribution gev, DayOfWeek dayOfWeek, int quarterHourOfDay) { - super(new PValue(null), dayOfWeek, quarterHourOfDay); - this.gev = gev; - } - - @Override - public PValue getValue() { - double randomValue = gev.nextRandom(); - - while (randomValue < 0) { - randomValue = gev.nextRandom(); - } - return new PValue(Quantities.getQuantity(randomValue, KILOWATT)); - } -} diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java index da340869c..85e457880 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java @@ -6,16 +6,22 @@ package edu.ie3.datamodel.models.timeseries.repetitive; import edu.ie3.datamodel.models.profile.LoadProfile; +import edu.ie3.datamodel.models.value.load.RandomLoadValues; import java.util.Objects; import java.util.Set; import java.util.UUID; -public class RandomLoadProfileTimeSeries extends LoadProfileTimeSeries { +public class RandomLoadProfileTimeSeries extends LoadProfileTimeSeries { public RandomLoadProfileTimeSeries( - UUID uuid, LoadProfile loadProfile, Set entries) { + UUID uuid, LoadProfile loadProfile, Set> entries) { super(uuid, loadProfile, entries); } + @Override + public LoadProfile.RandomLoadProfile getLoadProfile() { + return (LoadProfile.RandomLoadProfile) super.getLoadProfile(); + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RepetitiveTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RepetitiveTimeSeries.java index e1f4e9f10..c26f951f1 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RepetitiveTimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RepetitiveTimeSeries.java @@ -12,7 +12,8 @@ import java.util.*; /** Describes a TimeSeries with repetitive values that can be calculated from a pattern */ -public abstract class RepetitiveTimeSeries, V extends Value> +public abstract class RepetitiveTimeSeries< + E extends TimeSeriesEntry, V extends Value> extends TimeSeries { protected RepetitiveTimeSeries(UUID uuid, Set entries) { diff --git a/src/main/java/edu/ie3/datamodel/models/value/load/BdewLoadValues.java b/src/main/java/edu/ie3/datamodel/models/value/load/BdewLoadValues.java new file mode 100644 index 000000000..1364efdaf --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/models/value/load/BdewLoadValues.java @@ -0,0 +1,192 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.models.value.load; + +import static edu.ie3.datamodel.models.BdewSeason.*; +import static edu.ie3.util.quantities.PowerSystemUnits.KILOWATT; +import static java.lang.Math.pow; +import static java.lang.Math.round; + +import edu.ie3.datamodel.models.BdewSeason; +import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; +import edu.ie3.datamodel.models.profile.LoadProfile; +import edu.ie3.datamodel.models.value.PValue; +import java.time.ZonedDateTime; +import java.util.Map; +import java.util.Objects; +import java.util.function.Function; +import javax.measure.quantity.Power; +import tech.units.indriya.ComparableQuantity; +import tech.units.indriya.quantity.Quantities; + +/** Load values for a {@link BdewStandardLoadProfile} */ +public class BdewLoadValues implements LoadValues { + private final double SuSa; + private final double SuSu; + private final double SuWd; + private final double TrSa; + private final double TrSu; + private final double TrWd; + private final double WiSa; + private final double WiSu; + private final double WiWd; + + public BdewLoadValues( + double SuSa, + double SuSu, + double SuWd, + double TrSa, + double TrSu, + double TrWd, + double WiSa, + double WiSu, + double WiWd) { + this.SuSa = SuSa; + this.SuSu = SuSu; + this.SuWd = SuWd; + this.TrSa = TrSa; + this.TrSu = TrSu; + this.TrWd = TrWd; + this.WiSa = WiSa; + this.WiSu = WiSu; + this.WiWd = WiWd; + } + + @Override + public PValue getValue(ZonedDateTime time, LoadProfile loadProfile) { + Map mapping = + switch (time.getDayOfWeek()) { + case SATURDAY -> Map.of( + SUMMER, SuSa, + WINTER, WiSa, + TRANSITION, TrSa); + case SUNDAY -> Map.of( + SUMMER, SuSu, + WINTER, WiSu, + TRANSITION, TrSu); + default -> Map.of( + SUMMER, SuWd, + WINTER, WiWd, + TRANSITION, TrWd); + }; + + PValue value = new PValue(Quantities.getQuantity(mapping.get(BdewSeason.get(time)), KILOWATT)); + + if (loadProfile == BdewStandardLoadProfile.H0) { + /* For the residential average profile, a dynamization has to be taken into account */ + return dynamization(value, time.getDayOfYear()); // leap years are ignored + } else { + return value; + } + } + + /** + * Calculates the dynamization factor for given day of year. Cf. + * Anwendung der repräsentativen Lastprofile - Step by step page 19 + * + * @param load load value + * @param t day of year (1-366) + * @return dynamization factor + */ + private PValue dynamization(PValue load, int t) { + double factor = + (-3.92e-10 * pow(t, 4) + 3.2e-7 * pow(t, 3) - 7.02e-5 * pow(t, 2) + 2.1e-3 * t + 1.24); + double rndFactor = round(factor * 1e4) / 1e4; // round to 4 decimal places + Function round = + l -> round(l * rndFactor * 1e1) / 1e1; // rounded to 1 decimal place + + ComparableQuantity value = + load.getP() + .map(v -> v.getValue().doubleValue()) + .map(round) + .map(v -> Quantities.getQuantity(v, KILOWATT)) + .orElse(null); + + return new PValue(value); + } + + public double getSuSa() { + return SuSa; + } + + public double getSuSu() { + return SuSu; + } + + public double getSuWd() { + return SuWd; + } + + public double getTrSa() { + return TrSa; + } + + public double getTrSu() { + return TrSu; + } + + public double getTrWd() { + return TrWd; + } + + public double getWiSa() { + return WiSa; + } + + public double getWiSu() { + return WiSu; + } + + public double getWiWd() { + return WiWd; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + BdewLoadValues that = (BdewLoadValues) o; + return Objects.equals(SuSa, that.SuSa) + && Objects.equals(SuSu, that.SuSu) + && Objects.equals(SuWd, that.SuWd) + && Objects.equals(TrSa, that.TrSa) + && Objects.equals(TrSu, that.TrSu) + && Objects.equals(TrWd, that.TrWd) + && Objects.equals(WiSa, that.WiSa) + && Objects.equals(WiSu, that.WiSu) + && Objects.equals(WiWd, that.WiWd); + } + + @Override + public int hashCode() { + return Objects.hash(SuWd, SuSa, SuSu, WiWd, WiSa, WiSu, TrWd, TrSa, TrSu); + } + + @Override + public String toString() { + return "BDEWLoadValues{" + + "SuWd=" + + SuWd + + ", SuSa=" + + SuSa + + ", SuSu=" + + SuSu + + ", WiWd=" + + WiWd + + ", WiSa=" + + WiSa + + ", WiSu=" + + WiSu + + ", TrWd=" + + TrWd + + ", TrSa=" + + TrSa + + ", TrSu=" + + TrSu + + '}'; + } +} diff --git a/src/main/java/edu/ie3/datamodel/models/value/load/LoadValues.java b/src/main/java/edu/ie3/datamodel/models/value/load/LoadValues.java new file mode 100644 index 000000000..ae7fc4e26 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/models/value/load/LoadValues.java @@ -0,0 +1,23 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.models.value.load; + +import edu.ie3.datamodel.models.profile.LoadProfile; +import edu.ie3.datamodel.models.value.PValue; +import edu.ie3.datamodel.models.value.Value; +import java.time.ZonedDateTime; + +/** Interface for load values. */ +public interface LoadValues extends Value { + + /** + * Method to calculate an actual load power value for the given time. + * + * @param time given time + * @return a new {@link PValue} + */ + PValue getValue(ZonedDateTime time, LoadProfile loadProfile); +} diff --git a/src/main/java/edu/ie3/datamodel/models/value/load/RandomLoadValues.java b/src/main/java/edu/ie3/datamodel/models/value/load/RandomLoadValues.java new file mode 100644 index 000000000..072ca763f --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/models/value/load/RandomLoadValues.java @@ -0,0 +1,204 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.models.value.load; + +import static edu.ie3.util.quantities.PowerSystemUnits.KILOWATT; + +import de.lmu.ifi.dbs.elki.math.statistics.distribution.GeneralizedExtremeValueDistribution; +import de.lmu.ifi.dbs.elki.utilities.random.RandomFactory; +import edu.ie3.datamodel.models.profile.LoadProfile; +import edu.ie3.datamodel.models.value.PValue; +import java.time.DayOfWeek; +import java.time.ZonedDateTime; +import java.util.Objects; +import java.util.Random; +import tech.units.indriya.quantity.Quantities; + +/** + * Data model to describe the parameters of a probability density function to draw random power + * consumptions. This model represents a generalized extreme value distribution (GEV), that has been + * sampled for each quarter hour of a day, subdivided into workdays, Saturdays and Sundays. In + * general the GEV is described by the three parameters "location", "scale" and "shape" + */ +public class RandomLoadValues implements LoadValues { + /** Shape parameter for a Saturday */ + private final double kSa; + + /** Shape parameter for a Sunday */ + private final double kSu; + + /** Shape parameter for a working day */ + private final double kWd; + + /** Location parameter for a Saturday */ + private final double mySa; + + /** Location parameter for a Sunday */ + private final double mySu; + + /** Location parameter for a working day */ + private final double myWd; + + /** Scale parameter for a Saturday */ + private final double sigmaSa; + + /** Scale parameter for a Sunday */ + private final double sigmaSu; + + /** Scale parameter for a working day */ + private final double sigmaWd; + + private final GeneralizedExtremeValueDistribution gevWd; + private final GeneralizedExtremeValueDistribution gevSa; + private final GeneralizedExtremeValueDistribution gevSu; + + /** + * @param kSa Shape parameter for a Saturday + * @param kSu Shape parameter for a Sunday + * @param kWd Shape parameter for a working day + * @param mySa Location parameter for a Saturday + * @param mySu Location parameter for a Sunday + * @param myWd Location parameter for a working day + * @param sigmaSa Scale parameter for a Saturday + * @param sigmaSu Scale parameter for a Sunday + * @param sigmaWd Scale parameter for a working day + */ + public RandomLoadValues( + double kSa, + double kSu, + double kWd, + double mySa, + double mySu, + double myWd, + double sigmaSa, + double sigmaSu, + double sigmaWd) { + this.kWd = kWd; + this.kSa = kSa; + this.kSu = kSu; + this.myWd = myWd; + this.mySa = mySa; + this.mySu = mySu; + this.sigmaWd = sigmaWd; + this.sigmaSa = sigmaSa; + this.sigmaSu = sigmaSu; + + Random random = new Random(); + RandomFactory factory = RandomFactory.get(random.nextLong()); + + this.gevWd = new GeneralizedExtremeValueDistribution(myWd, sigmaWd, kWd, factory.getRandom()); + + this.gevSa = new GeneralizedExtremeValueDistribution(mySa, sigmaSa, kSa, factory.getRandom()); + this.gevSu = new GeneralizedExtremeValueDistribution(mySu, sigmaSu, kSu, factory.getRandom()); + } + + @Override + public PValue getValue(ZonedDateTime time, LoadProfile loadProfile) { + return new PValue(Quantities.getQuantity(getValue(time.getDayOfWeek()), KILOWATT)); + } + + /** + * Method to get the next random double value. + * + * @param day of the week + * @return a suitable random double + */ + private double getValue(DayOfWeek day) { + double randomValue = + switch (day) { + case SATURDAY -> gevSa.nextRandom(); + case SUNDAY -> gevSu.nextRandom(); + default -> gevWd.nextRandom(); + }; + + while (randomValue < 0) { + randomValue = getValue(day); + } + return randomValue; + } + + public double getMyWd() { + return myWd; + } + + public double getMySa() { + return mySa; + } + + public double getMySu() { + return mySu; + } + + public double getSigmaWd() { + return sigmaWd; + } + + public double getSigmaSa() { + return sigmaSa; + } + + public double getSigmaSu() { + return sigmaSu; + } + + public double getkWd() { + return kWd; + } + + public double getkSa() { + return kSa; + } + + public double getkSu() { + return kSu; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof RandomLoadValues that)) return false; + if (!super.equals(o)) return false; + return Objects.equals(kSa, that.kSa) + && Objects.equals(kSu, that.kSu) + && Objects.equals(kWd, that.kWd) + && Objects.equals(mySa, that.mySa) + && Objects.equals(mySu, that.mySu) + && Objects.equals(myWd, that.myWd) + && Objects.equals(sigmaSa, that.sigmaSa) + && Objects.equals(sigmaSu, that.sigmaSu) + && Objects.equals(sigmaWd, that.sigmaWd); + } + + @Override + public int hashCode() { + return Objects.hash( + super.hashCode(), kSa, kSu, kWd, mySa, mySu, myWd, sigmaSa, sigmaSu, sigmaWd); + } + + @Override + public String toString() { + return "RandomLoadValues{" + + "kSa=" + + kSa + + ", kSu=" + + kSu + + ", kWd=" + + kWd + + ", mySa=" + + mySa + + ", mySu=" + + mySu + + ", myWd=" + + myWd + + ", sigmaSa=" + + sigmaSa + + ", sigmaSu=" + + sigmaSu + + ", sigmaWd=" + + sigmaWd + + '}'; + } +} diff --git a/src/main/resources/load/lpts_g1_177ebd2f-7174-4a14-b627-71a43fea1d20.csv b/src/main/resources/load/lpts_g1_177ebd2f-7174-4a14-b627-71a43fea1d20.csv index 4348e6322..a2889f2e5 100644 --- a/src/main/resources/load/lpts_g1_177ebd2f-7174-4a14-b627-71a43fea1d20.csv +++ b/src/main/resources/load/lpts_g1_177ebd2f-7174-4a14-b627-71a43fea1d20.csv @@ -1,97 +1,97 @@ SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour -23.6,22.4,23.6,20.7,22.4,20.2,25.8,25.7,26.4,1 -22.5,21.8,22.5,20.8,21.9,19.7,25.2,25.0,26.4,2 -21.5,21.3,21.5,20.9,21.4,19.2,24.7,24.6,26.4,3 -20.8,20.8,20.8,20.8,20.8,18.9,24.6,24.6,26.5,4 -20.5,20.6,20.5,20.5,20.2,18.8,25.0,25.0,26.5,5 -20.5,20.6,20.5,20.0,19.5,18.8,25.6,25.6,26.5,6 -20.7,20.7,20.6,19.4,19.1,18.9,26.2,26.2,26.5,7 -20.8,20.8,20.8,18.9,18.9,18.9,26.5,26.5,26.5,8 -20.9,20.9,21.0,18.6,19.2,18.9,26.3,26.3,26.6,9 -20.9,20.9,21.0,18.5,19.7,18.9,25.8,25.7,26.6,10 -20.9,20.8,21.0,18.6,20.3,18.9,25.1,25.1,26.6,11 -20.8,20.8,20.8,18.9,20.8,18.9,24.6,24.6,26.5,12 -20.8,20.8,20.6,19.5,21.2,19.0,24.4,24.4,26.2,13 -20.8,20.8,20.4,20.2,21.3,19.1,24.5,24.5,25.8,14 -20.8,20.9,20.5,20.7,21.2,19.1,24.6,24.6,25.3,15 -20.8,20.8,20.8,20.8,20.8,18.9,24.6,24.6,24.6,16 -20.7,20.7,21.6,20.4,20.3,18.5,24.5,24.5,23.9,17 -20.7,20.7,22.4,19.6,19.6,18.3,24.3,24.3,23.6,18 -20.7,20.7,22.9,19.0,19.1,18.9,24.3,24.3,24.3,19 -20.8,20.8,22.7,18.9,18.9,20.8,24.6,24.6,26.5,20 -21.1,21.2,21.6,19.6,19.1,24.1,25.4,25.4,27.0,21 -21.6,21.7,20.7,20.7,19.6,27.2,26.5,26.5,27.4,22 -22.1,22.2,21.2,21.9,20.3,28.1,27.6,27.6,27.9,23 -22.7,22.7,24.6,22.7,20.8,24.6,28.4,28.4,28.4,24 -23.3,23.1,31.9,22.9,21.1,27.9,28.7,28.8,31.5,25 -23.8,23.3,43.9,22.7,21.2,28.6,28.7,28.8,32.5,26 -24.2,23.2,60.8,22.5,21.1,30.8,28.5,28.6,35.3,27 -24.6,22.7,83.3,22.7,20.8,32.2,28.4,28.4,36.0,28 -24.9,21.9,111.4,23.8,20.4,74.1,28.5,28.2,90.3,29 -25.2,20.8,143.9,25.9,19.8,131.7,29.1,28.1,164.8,30 -25.7,19.8,179.2,29.3,19.3,195.3,30.2,28.2,246.8,31 -26.5,18.9,215.8,34.1,18.9,255.5,32.2,28.4,323.7,32 -27.7,18.5,251.9,40.3,18.8,304.6,35.0,28.8,385.2,33 -29.4,18.4,285.0,47.2,18.7,341.8,38.4,29.3,430.7,34 -31.5,18.5,312.3,53.6,18.8,368.0,42.0,29.9,462.0,35 -34.1,18.9,331.2,58.7,18.9,384.2,45.4,30.3,480.8,36 -37.0,19.4,340.0,61.6,19.0,391.7,48.4,30.5,489.0,37 -40.1,20.0,341.2,62.7,19.0,393.1,50.9,30.5,489.9,38 -43.0,20.5,338.3,62.8,19.0,391.5,53.0,30.4,486.7,39 -45.4,20.8,335.0,62.5,18.9,389.9,54.9,30.3,482.6,40 -47.2,20.9,334.1,62.2,18.8,390.6,56.6,30.1,480.5,41 -48.4,20.9,334.9,62.2,18.7,392.9,57.9,30.0,479.8,42 -49.0,20.8,336.3,62.3,18.8,395.7,58.7,30.0,479.6,43 -49.2,20.8,336.9,62.5,18.9,397.5,58.7,30.3,478.9,44 -49.0,21.1,335.6,62.6,19.3,397.3,57.8,30.8,476.5,45 -48.4,21.5,332.0,62.6,19.8,395.0,56.3,31.4,472.0,46 -47.3,22.0,326.2,62.0,20.4,390.6,54.6,31.9,464.8,47 -45.4,22.7,318.0,60.6,20.8,384.2,53.0,32.2,454.3,48 -42.9,23.4,307.4,58.2,21.1,375.8,51.7,32.1,440.0,49 -39.9,24.1,294.7,55.0,21.2,364.5,50.6,31.6,422.0,50 -36.8,24.5,280.4,51.3,21.2,349.3,49.3,31.0,400.2,51 -34.1,24.6,265.0,47.3,20.8,329.3,47.3,30.3,374.8,52 -31.9,24.3,249.2,43.4,20.3,304.7,44.6,29.6,346.4,53 -30.3,23.8,235.5,39.8,19.6,279.8,41.4,29.0,319.4,54 -29.2,23.2,226.5,36.6,19.1,260.3,38.4,28.5,298.8,55 -28.4,22.7,225.2,34.1,18.9,251.7,36.0,28.4,289.6,56 -27.8,22.5,232.9,32.4,19.1,257.5,34.5,28.6,294.8,57 -27.4,22.5,245.5,31.3,19.7,272.9,33.9,29.0,309.8,58 -27.0,22.6,257.4,30.7,20.3,290.9,33.9,29.6,328.0,59 -26.5,22.7,263.1,30.3,20.8,304.7,34.1,30.3,342.6,60 -25.9,22.8,258.6,29.8,21.1,309.0,34.3,30.9,348.5,61 -25.4,22.8,245.9,29.4,21.2,304.7,34.4,31.4,345.8,62 -24.9,22.8,228.5,28.9,21.1,294.3,34.4,31.9,336.4,63 -24.6,22.7,210.1,28.4,20.8,280.1,34.1,32.2,321.8,64 -24.6,22.6,193.3,27.9,20.4,264.3,33.5,32.4,303.4,65 -24.7,22.4,177.7,27.5,19.9,246.5,32.9,32.4,281.9,66 -24.8,22.5,162.3,27.0,19.4,226.2,32.4,32.4,257.6,67 -24.6,22.7,145.7,26.5,18.9,202.5,32.2,32.2,230.9,68 -24.1,23.3,127.4,26.0,18.6,175.4,32.4,31.9,202.5,69 -23.5,23.9,108.5,25.4,18.4,146.9,33.0,31.7,174.0,70 -22.9,24.5,90.7,24.9,18.5,119.7,33.6,31.7,147.5,71 -22.7,24.6,75.7,24.6,18.9,96.5,34.1,32.2,124.9,72 -23.0,24.2,64.7,24.4,19.8,79.3,34.3,33.2,107.6,73 -23.6,23.6,57.0,24.4,20.9,67.2,34.2,34.5,94.7,74 -24.3,23.0,51.6,24.5,21.9,59.0,34.1,35.5,84.6,75 -24.6,22.7,47.3,24.6,22.7,53.0,34.1,36.0,75.7,76 -24.5,23.0,43.3,24.7,23.0,48.1,34.1,35.5,66.9,77 -24.0,23.7,39.7,24.8,23.0,44.0,34.3,34.3,58.5,78 -23.3,24.3,36.5,24.7,22.9,40.7,34.3,33.1,51.1,79 -22.7,24.6,34.1,24.6,22.7,37.9,34.1,32.2,45.4,80 -22.3,24.3,32.5,24.3,22.7,35.6,33.5,31.9,41.8,81 -22.2,23.7,31.6,24.1,22.8,33.6,32.6,32.1,39.8,82 -22.3,23.0,31.0,24.1,22.8,31.9,31.5,32.3,38.7,83 -22.7,22.7,30.3,24.6,22.7,30.3,30.3,32.2,37.9,84 -23.3,23.0,29.3,25.6,22.3,28.7,29.0,31.5,36.7,85 -23.9,23.6,28.2,26.8,21.8,27.1,27.8,30.4,35.2,86 -24.4,24.3,27.2,27.9,21.3,25.7,26.9,29.2,33.6,87 -24.6,24.6,26.5,28.4,20.8,24.6,26.5,28.4,32.2,88 -24.3,24.4,26.2,28.0,20.6,23.8,26.7,28.1,30.9,89 -23.8,23.9,26.2,27.0,20.6,23.4,27.3,28.2,29.9,90 -23.2,23.2,26.4,25.8,20.7,23.0,28.0,28.4,29.1,91 -22.7,22.7,26.5,24.6,20.8,22.7,28.4,28.4,28.4,92 -22.6,22.6,26.4,23.8,21.0,22.3,28.4,28.1,27.8,93 -22.7,22.6,26.0,23.3,21.1,21.9,28.0,27.6,27.2,94 -22.8,22.8,25.4,23.0,21.0,21.4,27.3,27.0,26.8,95 -22.7,22.7,24.6,22.7,20.8,20.8,26.5,26.5,26.5,96 +23.6,22.4,23.6,20.7,22.4,20.2,25.8,25.7,26.4,0 +22.5,21.8,22.5,20.8,21.9,19.7,25.2,25.0,26.4,1 +21.5,21.3,21.5,20.9,21.4,19.2,24.7,24.6,26.4,2 +20.8,20.8,20.8,20.8,20.8,18.9,24.6,24.6,26.5,3 +20.5,20.6,20.5,20.5,20.2,18.8,25.0,25.0,26.5,4 +20.5,20.6,20.5,20.0,19.5,18.8,25.6,25.6,26.5,5 +20.7,20.7,20.6,19.4,19.1,18.9,26.2,26.2,26.5,6 +20.8,20.8,20.8,18.9,18.9,18.9,26.5,26.5,26.5,7 +20.9,20.9,21.0,18.6,19.2,18.9,26.3,26.3,26.6,8 +20.9,20.9,21.0,18.5,19.7,18.9,25.8,25.7,26.6,9 +20.9,20.8,21.0,18.6,20.3,18.9,25.1,25.1,26.6,10 +20.8,20.8,20.8,18.9,20.8,18.9,24.6,24.6,26.5,11 +20.8,20.8,20.6,19.5,21.2,19.0,24.4,24.4,26.2,12 +20.8,20.8,20.4,20.2,21.3,19.1,24.5,24.5,25.8,13 +20.8,20.9,20.5,20.7,21.2,19.1,24.6,24.6,25.3,14 +20.8,20.8,20.8,20.8,20.8,18.9,24.6,24.6,24.6,15 +20.7,20.7,21.6,20.4,20.3,18.5,24.5,24.5,23.9,16 +20.7,20.7,22.4,19.6,19.6,18.3,24.3,24.3,23.6,17 +20.7,20.7,22.9,19.0,19.1,18.9,24.3,24.3,24.3,18 +20.8,20.8,22.7,18.9,18.9,20.8,24.6,24.6,26.5,19 +21.1,21.2,21.6,19.6,19.1,24.1,25.4,25.4,27.0,20 +21.6,21.7,20.7,20.7,19.6,27.2,26.5,26.5,27.4,21 +22.1,22.2,21.2,21.9,20.3,28.1,27.6,27.6,27.9,22 +22.7,22.7,24.6,22.7,20.8,24.6,28.4,28.4,28.4,23 +23.3,23.1,31.9,22.9,21.1,27.9,28.7,28.8,31.5,24 +23.8,23.3,43.9,22.7,21.2,28.6,28.7,28.8,32.5,25 +24.2,23.2,60.8,22.5,21.1,30.8,28.5,28.6,35.3,26 +24.6,22.7,83.3,22.7,20.8,32.2,28.4,28.4,36.0,27 +24.9,21.9,111.4,23.8,20.4,74.1,28.5,28.2,90.3,28 +25.2,20.8,143.9,25.9,19.8,131.7,29.1,28.1,164.8,29 +25.7,19.8,179.2,29.3,19.3,195.3,30.2,28.2,246.8,30 +26.5,18.9,215.8,34.1,18.9,255.5,32.2,28.4,323.7,31 +27.7,18.5,251.9,40.3,18.8,304.6,35.0,28.8,385.2,32 +29.4,18.4,285.0,47.2,18.7,341.8,38.4,29.3,430.7,33 +31.5,18.5,312.3,53.6,18.8,368.0,42.0,29.9,462.0,34 +34.1,18.9,331.2,58.7,18.9,384.2,45.4,30.3,480.8,35 +37.0,19.4,340.0,61.6,19.0,391.7,48.4,30.5,489.0,36 +40.1,20.0,341.2,62.7,19.0,393.1,50.9,30.5,489.9,37 +43.0,20.5,338.3,62.8,19.0,391.5,53.0,30.4,486.7,38 +45.4,20.8,335.0,62.5,18.9,389.9,54.9,30.3,482.6,39 +47.2,20.9,334.1,62.2,18.8,390.6,56.6,30.1,480.5,40 +48.4,20.9,334.9,62.2,18.7,392.9,57.9,30.0,479.8,41 +49.0,20.8,336.3,62.3,18.8,395.7,58.7,30.0,479.6,42 +49.2,20.8,336.9,62.5,18.9,397.5,58.7,30.3,478.9,43 +49.0,21.1,335.6,62.6,19.3,397.3,57.8,30.8,476.5,44 +48.4,21.5,332.0,62.6,19.8,395.0,56.3,31.4,472.0,45 +47.3,22.0,326.2,62.0,20.4,390.6,54.6,31.9,464.8,46 +45.4,22.7,318.0,60.6,20.8,384.2,53.0,32.2,454.3,47 +42.9,23.4,307.4,58.2,21.1,375.8,51.7,32.1,440.0,48 +39.9,24.1,294.7,55.0,21.2,364.5,50.6,31.6,422.0,49 +36.8,24.5,280.4,51.3,21.2,349.3,49.3,31.0,400.2,50 +34.1,24.6,265.0,47.3,20.8,329.3,47.3,30.3,374.8,51 +31.9,24.3,249.2,43.4,20.3,304.7,44.6,29.6,346.4,52 +30.3,23.8,235.5,39.8,19.6,279.8,41.4,29.0,319.4,53 +29.2,23.2,226.5,36.6,19.1,260.3,38.4,28.5,298.8,54 +28.4,22.7,225.2,34.1,18.9,251.7,36.0,28.4,289.6,55 +27.8,22.5,232.9,32.4,19.1,257.5,34.5,28.6,294.8,56 +27.4,22.5,245.5,31.3,19.7,272.9,33.9,29.0,309.8,57 +27.0,22.6,257.4,30.7,20.3,290.9,33.9,29.6,328.0,58 +26.5,22.7,263.1,30.3,20.8,304.7,34.1,30.3,342.6,59 +25.9,22.8,258.6,29.8,21.1,309.0,34.3,30.9,348.5,60 +25.4,22.8,245.9,29.4,21.2,304.7,34.4,31.4,345.8,61 +24.9,22.8,228.5,28.9,21.1,294.3,34.4,31.9,336.4,62 +24.6,22.7,210.1,28.4,20.8,280.1,34.1,32.2,321.8,63 +24.6,22.6,193.3,27.9,20.4,264.3,33.5,32.4,303.4,64 +24.7,22.4,177.7,27.5,19.9,246.5,32.9,32.4,281.9,65 +24.8,22.5,162.3,27.0,19.4,226.2,32.4,32.4,257.6,66 +24.6,22.7,145.7,26.5,18.9,202.5,32.2,32.2,230.9,67 +24.1,23.3,127.4,26.0,18.6,175.4,32.4,31.9,202.5,68 +23.5,23.9,108.5,25.4,18.4,146.9,33.0,31.7,174.0,69 +22.9,24.5,90.7,24.9,18.5,119.7,33.6,31.7,147.5,70 +22.7,24.6,75.7,24.6,18.9,96.5,34.1,32.2,124.9,71 +23.0,24.2,64.7,24.4,19.8,79.3,34.3,33.2,107.6,72 +23.6,23.6,57.0,24.4,20.9,67.2,34.2,34.5,94.7,73 +24.3,23.0,51.6,24.5,21.9,59.0,34.1,35.5,84.6,74 +24.6,22.7,47.3,24.6,22.7,53.0,34.1,36.0,75.7,75 +24.5,23.0,43.3,24.7,23.0,48.1,34.1,35.5,66.9,76 +24.0,23.7,39.7,24.8,23.0,44.0,34.3,34.3,58.5,77 +23.3,24.3,36.5,24.7,22.9,40.7,34.3,33.1,51.1,78 +22.7,24.6,34.1,24.6,22.7,37.9,34.1,32.2,45.4,79 +22.3,24.3,32.5,24.3,22.7,35.6,33.5,31.9,41.8,80 +22.2,23.7,31.6,24.1,22.8,33.6,32.6,32.1,39.8,81 +22.3,23.0,31.0,24.1,22.8,31.9,31.5,32.3,38.7,82 +22.7,22.7,30.3,24.6,22.7,30.3,30.3,32.2,37.9,83 +23.3,23.0,29.3,25.6,22.3,28.7,29.0,31.5,36.7,84 +23.9,23.6,28.2,26.8,21.8,27.1,27.8,30.4,35.2,85 +24.4,24.3,27.2,27.9,21.3,25.7,26.9,29.2,33.6,86 +24.6,24.6,26.5,28.4,20.8,24.6,26.5,28.4,32.2,87 +24.3,24.4,26.2,28.0,20.6,23.8,26.7,28.1,30.9,88 +23.8,23.9,26.2,27.0,20.6,23.4,27.3,28.2,29.9,89 +23.2,23.2,26.4,25.8,20.7,23.0,28.0,28.4,29.1,90 +22.7,22.7,26.5,24.6,20.8,22.7,28.4,28.4,28.4,91 +22.6,22.6,26.4,23.8,21.0,22.3,28.4,28.1,27.8,92 +22.7,22.6,26.0,23.3,21.1,21.9,28.0,27.6,27.2,93 +22.8,22.8,25.4,23.0,21.0,21.4,27.3,27.0,26.8,94 +22.7,22.7,24.6,22.7,20.8,20.8,26.5,26.5,26.5,95 diff --git a/src/main/resources/load/lpts_g2_b0ad5ba2-0d5e-4c9b-b818-4079cebf59cc.csv b/src/main/resources/load/lpts_g2_b0ad5ba2-0d5e-4c9b-b818-4079cebf59cc.csv index ef76980b7..05e1ca97a 100644 --- a/src/main/resources/load/lpts_g2_b0ad5ba2-0d5e-4c9b-b818-4079cebf59cc.csv +++ b/src/main/resources/load/lpts_g2_b0ad5ba2-0d5e-4c9b-b818-4079cebf59cc.csv @@ -1,97 +1,97 @@ SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour -63.1,50.6,60.8,73.1,64.2,70.5,80.6,73.7,77.4,1 -58.0,47.4,53.0,67.6,60.7,61.9,74.6,68.7,67.4,2 -53.5,44.3,46.0,62.8,56.9,54.4,69.2,63.6,58.4,3 -48.9,41.1,40.1,57.7,52.8,47.9,63.6,58.7,50.9,4 -43.6,37.9,35.4,51.6,48.3,42.5,57.1,54.4,44.9,5 -38.1,34.7,31.7,45.0,43.8,38.1,50.4,50.6,40.5,6 -33.2,31.8,29.1,38.9,39.6,34.7,44.1,47.2,37.4,7 -29.3,29.3,27.4,34.2,36.2,32.3,39.1,44.0,35.2,8 -27.2,27.4,26.5,31.6,33.8,30.8,36.0,41.0,33.9,9 -26.4,26.0,26.2,30.6,32.2,29.9,34.4,38.2,33.1,10 -26.3,25.0,26.2,30.4,31.1,29.5,33.7,35.9,32.6,11 -26.4,24.5,26.4,30.3,30.3,29.3,33.3,34.2,32.3,12 -26.3,24.2,26.5,29.8,29.5,29.2,32.7,33.3,31.9,13 -25.8,24.0,26.6,29.0,28.7,29.1,32.0,33.0,31.5,14 -25.2,23.9,26.5,28.1,27.9,29.1,31.5,33.1,31.3,15 -24.5,23.5,26.4,27.4,27.4,29.3,31.3,33.3,31.3,16 -23.8,22.8,26.3,27.0,27.1,29.9,31.5,33.3,31.6,17 -23.3,22.3,26.3,26.7,26.8,30.3,31.7,33.1,31.9,18 -23.5,22.3,26.6,26.3,26.4,30.3,31.5,32.5,31.6,19 -24.5,23.5,27.4,25.4,25.4,29.3,30.3,31.3,30.3,20 -26.5,26.1,28.9,24.1,24.1,27.5,28.1,29.7,28.0,21 -29.5,29.8,31.2,23.4,23.2,26.1,26.4,28.5,26.3,22 -33.5,34.3,34.6,24.7,24.3,26.8,27.1,29.0,27.1,23 -38.1,39.1,39.1,29.3,28.4,31.3,32.3,32.3,32.3,24 -43.3,43.7,44.8,38.0,36.2,40.6,42.9,38.9,43.0,25 -48.1,47.4,50.9,48.5,45.7,52.3,56.2,47.3,56.9,26 -51.6,49.4,56.1,58.3,54.1,63.3,68.5,54.9,70.4,27 -52.8,48.9,59.7,64.6,58.7,70.4,76.3,59.7,80.2,28 -51.2,45.6,60.8,65.4,57.7,71.5,77.0,59.9,84.0,29 -48.2,40.6,60.4,62.5,52.5,68.5,72.9,56.6,83.3,30 -45.5,35.6,59.9,58.1,45.5,64.2,67.3,51.7,80.8,31 -45.0,32.3,60.6,54.8,39.1,61.6,63.6,47.0,79.2,32 -48.0,31.9,63.6,54.5,35.3,62.9,64.5,44.0,80.5,33 -54.2,34.4,68.8,57.3,34.7,67.7,69.5,43.7,84.6,34 -62.6,39.6,75.7,63.1,37.5,75.1,77.4,46.7,90.6,35 -72.4,47.0,84.1,71.4,44.0,84.1,87.1,53.8,97.8,36 -82.8,56.2,93.5,81.9,54.2,93.8,97.4,65.2,105.6,37 -93.1,66.4,103.2,93.7,66.8,103.7,108.4,79.5,114.1,38 -102.9,76.6,112.4,105.9,80.5,113.3,119.9,94.6,123.5,39 -111.5,86.1,120.3,117.4,93.9,122.3,132.1,108.6,134.0,40 -118.6,93.9,126.5,127.4,105.7,130.2,144.7,120.0,145.5,41 -124.2,100.2,131.0,135.7,115.5,137.0,156.7,128.8,156.8,42 -128.3,105.0,134.4,142.2,123.0,142.5,166.9,135.6,166.2,43 -131.1,108.6,136.9,146.7,128.1,146.7,174.1,140.9,172.2,44 -132.7,111.1,139.0,149.3,130.8,149.6,177.4,144.9,173.6,45 -133.4,112.7,140.3,150.3,131.5,151.2,177.7,147.8,171.6,46 -133.4,113.8,140.7,150.2,131.4,151.5,176.2,149.4,167.7,47 -133.0,114.4,139.9,149.7,131.1,150.6,174.1,149.7,163.4,48 -132.5,115.0,137.8,149.0,131.3,148.8,172.6,148.5,159.9,49 -131.8,115.4,134.6,148.7,131.6,146.4,172.0,146.8,157.5,50 -131.3,115.9,131.0,148.8,131.4,143.9,172.4,145.2,155.8,51 -131.1,116.4,127.2,149.7,130.1,141.8,174.1,144.8,154.6,52 -131.1,116.9,123.7,151.4,127.3,140.6,177.1,146.0,153.7,53 -131.4,117.2,120.9,153.6,123.6,140.1,180.4,148.3,153.2,54 -131.8,116.8,119.0,155.5,120.0,140.0,183.0,151.1,153.1,55 -132.1,115.4,118.4,156.5,117.4,139.9,183.9,153.6,153.6,56 -132.1,112.9,119.2,156.3,116.5,139.7,182.4,155.1,154.7,57 -132.2,109.8,121.2,155.1,116.8,139.9,179.5,155.5,156.8,58 -132.4,107.1,124.0,153.7,117.6,141.1,176.6,155.0,160.2,59 -133.0,105.6,127.2,152.6,118.4,143.8,175.1,153.6,165.3,60 -134.2,106.0,130.4,152.3,118.4,148.4,176.0,151.4,172.2,61 -135.9,107.7,133.4,152.9,118.0,153.9,178.9,149.0,180.0,62 -137.8,110.1,136.0,154.4,117.6,159.3,182.8,147.2,187.6,63 -139.9,112.5,137.9,156.5,117.4,163.4,186.8,146.7,193.7,64 -141.9,114.4,139.2,159.3,117.9,165.3,190.3,148.1,197.6,65 -144.0,116.2,140.4,162.9,119.3,166.2,193.8,151.2,200.5,66 -146.6,118.3,142.3,167.1,122.0,167.4,197.9,155.7,203.9,67 -149.7,121.3,145.7,172.2,126.2,170.2,203.5,161.4,209.3,68 -153.5,125.5,151.2,177.8,132.0,175.7,210.8,167.8,217.7,69 -157.4,130.3,157.9,183.6,138.7,183.0,218.8,174.5,227.8,70 -160.9,135.1,164.6,188.8,145.2,190.7,226.3,180.7,237.7,71 -163.4,138.9,170.2,192.7,150.6,197.6,231.8,185.9,245.5,72 -164.2,141.3,173.9,194.9,154.2,202.6,234.4,189.5,249.8,73 -163.7,142.6,176.0,195.6,156.4,206.0,234.5,192.1,251.2,74 -162.3,143.2,177.2,195.4,157.9,208.0,233.0,193.9,250.7,75 -160.4,143.8,178.0,194.7,159.4,209.3,230.9,195.6,249.4,76 -158.4,144.6,179.1,193.9,161.5,210.2,228.7,197.5,248.2,77 -156.5,145.5,180.2,193.2,163.8,210.9,226.9,199.4,247.2,78 -154.8,146.0,181.2,192.5,165.9,211.6,225.3,200.9,246.3,79 -153.6,145.7,181.9,191.7,167.3,212.3,224.0,201.5,245.5,80 -152.8,144.4,182.1,190.9,167.6,213.1,223.0,201.0,244.7,81 -152.1,142.0,181.6,189.7,166.9,213.5,221.5,199.2,243.3,82 -150.9,138.8,180.3,187.8,165.1,213.1,218.9,196.2,240.6,83 -148.7,135.0,178.0,184.9,162.4,211.3,214.2,191.7,235.7,84 -144.9,130.6,174.6,180.5,158.7,207.6,207,185.8,228.3,85 -139.3,125.3,169.9,174.2,153.5,201.8,197,178.1,218.5,86 -131.9,118.8,163.6,165.4,146.1,194.0,184.4,168.1,206.9,87 -122.3,110.5,155.5,153.6,136.0,183.9,169.2,155.5,193.7,88 -110.7,100.5,145.6,138.6,122.8,171.7,151.8,140.2,179.5,89 -98.1,89.4,134.3,122.0,108.1,157.9,133.7,123.7,164.8,90 -85.9,78.4,122.4,105.8,93.6,143.5,116.7,107.7,150.1,91 -75.3,68.5,110.5,91.9,81.2,129.1,102.7,93.9,136,92 -67.3,60.5,99.2,82.0,72.3,115.5,93,83.8,122.8,93 -61.5,54.4,88.7,75.4,66.4,102.7,86.6,76.7,110.6,94 -57.3,50.0,78.7,70.9,62.5,91.0,82.2,71.6,99.1,95 -53.8,47.0,69.5,67.5,59.7,80.2,78.3,67.5,88.0,96 +63.1,50.6,60.8,73.1,64.2,70.5,80.6,73.7,77.4,0 +58.0,47.4,53.0,67.6,60.7,61.9,74.6,68.7,67.4,1 +53.5,44.3,46.0,62.8,56.9,54.4,69.2,63.6,58.4,2 +48.9,41.1,40.1,57.7,52.8,47.9,63.6,58.7,50.9,3 +43.6,37.9,35.4,51.6,48.3,42.5,57.1,54.4,44.9,4 +38.1,34.7,31.7,45.0,43.8,38.1,50.4,50.6,40.5,5 +33.2,31.8,29.1,38.9,39.6,34.7,44.1,47.2,37.4,6 +29.3,29.3,27.4,34.2,36.2,32.3,39.1,44.0,35.2,7 +27.2,27.4,26.5,31.6,33.8,30.8,36.0,41.0,33.9,8 +26.4,26.0,26.2,30.6,32.2,29.9,34.4,38.2,33.1,9 +26.3,25.0,26.2,30.4,31.1,29.5,33.7,35.9,32.6,10 +26.4,24.5,26.4,30.3,30.3,29.3,33.3,34.2,32.3,11 +26.3,24.2,26.5,29.8,29.5,29.2,32.7,33.3,31.9,12 +25.8,24.0,26.6,29.0,28.7,29.1,32.0,33.0,31.5,13 +25.2,23.9,26.5,28.1,27.9,29.1,31.5,33.1,31.3,14 +24.5,23.5,26.4,27.4,27.4,29.3,31.3,33.3,31.3,15 +23.8,22.8,26.3,27.0,27.1,29.9,31.5,33.3,31.6,16 +23.3,22.3,26.3,26.7,26.8,30.3,31.7,33.1,31.9,17 +23.5,22.3,26.6,26.3,26.4,30.3,31.5,32.5,31.6,18 +24.5,23.5,27.4,25.4,25.4,29.3,30.3,31.3,30.3,19 +26.5,26.1,28.9,24.1,24.1,27.5,28.1,29.7,28.0,20 +29.5,29.8,31.2,23.4,23.2,26.1,26.4,28.5,26.3,21 +33.5,34.3,34.6,24.7,24.3,26.8,27.1,29.0,27.1,22 +38.1,39.1,39.1,29.3,28.4,31.3,32.3,32.3,32.3,23 +43.3,43.7,44.8,38.0,36.2,40.6,42.9,38.9,43.0,24 +48.1,47.4,50.9,48.5,45.7,52.3,56.2,47.3,56.9,25 +51.6,49.4,56.1,58.3,54.1,63.3,68.5,54.9,70.4,26 +52.8,48.9,59.7,64.6,58.7,70.4,76.3,59.7,80.2,27 +51.2,45.6,60.8,65.4,57.7,71.5,77.0,59.9,84.0,28 +48.2,40.6,60.4,62.5,52.5,68.5,72.9,56.6,83.3,29 +45.5,35.6,59.9,58.1,45.5,64.2,67.3,51.7,80.8,30 +45.0,32.3,60.6,54.8,39.1,61.6,63.6,47.0,79.2,31 +48.0,31.9,63.6,54.5,35.3,62.9,64.5,44.0,80.5,32 +54.2,34.4,68.8,57.3,34.7,67.7,69.5,43.7,84.6,33 +62.6,39.6,75.7,63.1,37.5,75.1,77.4,46.7,90.6,34 +72.4,47.0,84.1,71.4,44.0,84.1,87.1,53.8,97.8,35 +82.8,56.2,93.5,81.9,54.2,93.8,97.4,65.2,105.6,36 +93.1,66.4,103.2,93.7,66.8,103.7,108.4,79.5,114.1,37 +102.9,76.6,112.4,105.9,80.5,113.3,119.9,94.6,123.5,38 +111.5,86.1,120.3,117.4,93.9,122.3,132.1,108.6,134.0,39 +118.6,93.9,126.5,127.4,105.7,130.2,144.7,120.0,145.5,40 +124.2,100.2,131.0,135.7,115.5,137.0,156.7,128.8,156.8,41 +128.3,105.0,134.4,142.2,123.0,142.5,166.9,135.6,166.2,42 +131.1,108.6,136.9,146.7,128.1,146.7,174.1,140.9,172.2,43 +132.7,111.1,139.0,149.3,130.8,149.6,177.4,144.9,173.6,44 +133.4,112.7,140.3,150.3,131.5,151.2,177.7,147.8,171.6,45 +133.4,113.8,140.7,150.2,131.4,151.5,176.2,149.4,167.7,46 +133.0,114.4,139.9,149.7,131.1,150.6,174.1,149.7,163.4,47 +132.5,115.0,137.8,149.0,131.3,148.8,172.6,148.5,159.9,48 +131.8,115.4,134.6,148.7,131.6,146.4,172.0,146.8,157.5,49 +131.3,115.9,131.0,148.8,131.4,143.9,172.4,145.2,155.8,50 +131.1,116.4,127.2,149.7,130.1,141.8,174.1,144.8,154.6,51 +131.1,116.9,123.7,151.4,127.3,140.6,177.1,146.0,153.7,52 +131.4,117.2,120.9,153.6,123.6,140.1,180.4,148.3,153.2,53 +131.8,116.8,119.0,155.5,120.0,140.0,183.0,151.1,153.1,54 +132.1,115.4,118.4,156.5,117.4,139.9,183.9,153.6,153.6,55 +132.1,112.9,119.2,156.3,116.5,139.7,182.4,155.1,154.7,56 +132.2,109.8,121.2,155.1,116.8,139.9,179.5,155.5,156.8,57 +132.4,107.1,124.0,153.7,117.6,141.1,176.6,155.0,160.2,58 +133.0,105.6,127.2,152.6,118.4,143.8,175.1,153.6,165.3,59 +134.2,106.0,130.4,152.3,118.4,148.4,176.0,151.4,172.2,60 +135.9,107.7,133.4,152.9,118.0,153.9,178.9,149.0,180.0,61 +137.8,110.1,136.0,154.4,117.6,159.3,182.8,147.2,187.6,62 +139.9,112.5,137.9,156.5,117.4,163.4,186.8,146.7,193.7,63 +141.9,114.4,139.2,159.3,117.9,165.3,190.3,148.1,197.6,64 +144.0,116.2,140.4,162.9,119.3,166.2,193.8,151.2,200.5,65 +146.6,118.3,142.3,167.1,122.0,167.4,197.9,155.7,203.9,66 +149.7,121.3,145.7,172.2,126.2,170.2,203.5,161.4,209.3,67 +153.5,125.5,151.2,177.8,132.0,175.7,210.8,167.8,217.7,68 +157.4,130.3,157.9,183.6,138.7,183.0,218.8,174.5,227.8,69 +160.9,135.1,164.6,188.8,145.2,190.7,226.3,180.7,237.7,70 +163.4,138.9,170.2,192.7,150.6,197.6,231.8,185.9,245.5,71 +164.2,141.3,173.9,194.9,154.2,202.6,234.4,189.5,249.8,72 +163.7,142.6,176.0,195.6,156.4,206.0,234.5,192.1,251.2,73 +162.3,143.2,177.2,195.4,157.9,208.0,233.0,193.9,250.7,74 +160.4,143.8,178.0,194.7,159.4,209.3,230.9,195.6,249.4,75 +158.4,144.6,179.1,193.9,161.5,210.2,228.7,197.5,248.2,76 +156.5,145.5,180.2,193.2,163.8,210.9,226.9,199.4,247.2,77 +154.8,146.0,181.2,192.5,165.9,211.6,225.3,200.9,246.3,78 +153.6,145.7,181.9,191.7,167.3,212.3,224.0,201.5,245.5,79 +152.8,144.4,182.1,190.9,167.6,213.1,223.0,201.0,244.7,80 +152.1,142.0,181.6,189.7,166.9,213.5,221.5,199.2,243.3,81 +150.9,138.8,180.3,187.8,165.1,213.1,218.9,196.2,240.6,82 +148.7,135.0,178.0,184.9,162.4,211.3,214.2,191.7,235.7,83 +144.9,130.6,174.6,180.5,158.7,207.6,207,185.8,228.3,84 +139.3,125.3,169.9,174.2,153.5,201.8,197,178.1,218.5,85 +131.9,118.8,163.6,165.4,146.1,194.0,184.4,168.1,206.9,86 +122.3,110.5,155.5,153.6,136.0,183.9,169.2,155.5,193.7,87 +110.7,100.5,145.6,138.6,122.8,171.7,151.8,140.2,179.5,88 +98.1,89.4,134.3,122.0,108.1,157.9,133.7,123.7,164.8,89 +85.9,78.4,122.4,105.8,93.6,143.5,116.7,107.7,150.1,90 +75.3,68.5,110.5,91.9,81.2,129.1,102.7,93.9,136,91 +67.3,60.5,99.2,82.0,72.3,115.5,93,83.8,122.8,92 +61.5,54.4,88.7,75.4,66.4,102.7,86.6,76.7,110.6,93 +57.3,50.0,78.7,70.9,62.5,91.0,82.2,71.6,99.1,94 +53.8,47.0,69.5,67.5,59.7,80.2,78.3,67.5,88.0,95 diff --git a/src/main/resources/load/lpts_g3_9b880468-309c-43c1-a3f4-26dd26266216.csv b/src/main/resources/load/lpts_g3_9b880468-309c-43c1-a3f4-26dd26266216.csv index 9d45a55a3..5a61280e8 100644 --- a/src/main/resources/load/lpts_g3_9b880468-309c-43c1-a3f4-26dd26266216.csv +++ b/src/main/resources/load/lpts_g3_9b880468-309c-43c1-a3f4-26dd26266216.csv @@ -1,97 +1,97 @@ SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour -99.0,94.6,98.5,92.5,87.6,91.2,95.3,87.8,94.7,1 -100.0,95.3,99.0,93.0,87.3,90.2,95.5,88.3,94.1,2 -100.9,96.0,99.4,93.7,87.4,89.4,96.2,89.0,94.1,3 -101.0,96.2,99.2,94.3,87.7,88.9,97.4,90.1,95.0,4 -99.8,95.3,98.1,94.5,88.0,88.7,98.9,91.3,96.6,5 -97.9,93.9,96.4,94.5,88.4,88.8,100.3,92.4,98.4,6 -95.8,92.4,94.8,94.3,88.9,89.1,101.0,92.9,99.8,7 -94.3,91.3,93.7,94.3,89.5,89.5,100.4,92.5,99.8,8 -94.0,91.1,93.6,94.7,90.3,90.0,98.2,91.0,98.0,9 -94.3,91.5,94.1,95.0,91.0,90.3,95.1,88.7,95.1,10 -94.8,92.1,94.7,95.0,91.2,90.2,91.9,86.4,91.9,11 -95.0,92.5,95.0,94.3,90.7,89.5,89.5,84.7,89.5,12 -94.3,92.4,94.4,92.7,89.2,88.0,88.6,84.0,88.4,13 -93.1,91.9,93.3,90.6,87.2,86.1,88.6,84.0,88.3,14 -91.7,91.2,92.2,88.3,85.1,84.0,88.7,84.0,88.3,15 -90.7,90.7,91.3,86.5,83.5,82.3,88.3,83.5,87.7,16 -90.3,90.5,91.0,85.4,82.7,81.1,86.8,82.1,86.1,17 -90.2,90.4,91.1,85.1,82.7,80.5,85.1,80.6,84.3,18 -90.1,90.1,91.1,85.1,83.1,80.4,84.2,80.1,83.5,19 -89.5,89.5,90.7,85.3,83.5,80.4,85.3,81.6,84.7,20 -88.2,88.5,89.8,85.4,83.7,80.7,89.0,85.9,88.5,21 -87.0,87.7,89.0,85.8,84.0,81.3,94.1,91.6,94.0,22 -86.7,88.2,89.2,86.9,84.8,82.5,99.3,97.0,99.5,23 -88.3,90.7,91.3,88.9,86.5,84.7,102.8,100.4,103.4,24 -92.2,95.8,95.9,92.1,89.2,87.9,103.7,100.7,104.7,25 -97.3,102.0,101.6,95.7,92.4,91.6,102.6,98.8,104.0,26 -102.2,107.6,106.9,99.0,95.4,95.2,100.7,96.2,102.4,27 -105.2,110.7,110.1,101.0,97.4,98.0,99.2,94.3,101.0,28 -105.5,110.0,110.1,101.3,97.9,99.6,99.1,94.4,100.8,29 -104.6,106.9,108.4,101.1,97.6,100.9,100.8,95.7,102.1,30 -104.6,103.1,107.1,102.3,97.3,102.8,104.4,97.6,105.3,31 -107.7,100.4,108.3,106.4,98.0,106.4,110.1,99.2,110.7,32 -115.0,100.2,113.3,114.6,100.1,112.4,117.7,99.7,118.2,33 -125.0,101.8,120.8,124.9,102.9,119.5,126.1,99.6,126.7,34 -134.9,104.0,128.9,134.7,105.4,126.3,133.9,99.2,134.7,35 -142.1,105.8,135.5,141.5,106.4,131.2,139.7,99.2,140.9,36 -144.9,106.3,139.1,143.4,105.4,133.3,142.4,99.8,144.2,37 -144.1,105.8,140.3,141.8,102.9,133.2,142.9,100.9,145.4,38 -141.8,104.8,140.3,138.6,99.9,132.1,142.4,102.1,145.5,39 -139.7,104.0,140.3,136.1,97.4,131.2,142.1,102.8,145.8,40 -139.2,103.8,141.1,135.7,96.1,131.5,142.9,102.9,147.0,41 -140.0,104.1,142.5,137.1,95.9,132.8,144.5,102.5,149.0,42 -141.4,104.5,144.0,139.3,96.3,134.7,146.3,101.8,151.2,43 -142.7,104.6,145.1,141.5,96.8,136.7,147.6,101.0,153.0,44 -143.4,104.4,145.7,143.0,96.9,138.4,147.9,100.4,154.0,45 -143.7,104.0,145.8,143.6,96.8,139.7,147.5,100.0,154.3,46 -143.7,103.9,145.9,143.7,96.6,140.6,146.8,99.8,154.3,47 -143.9,104.6,146.4,143.3,96.2,140.9,146.4,99.8,154.2,48 -144.5,106.3,147.4,142.7,95.7,140.7,146.3,100.0,154.3,49 -145.0,108.3,148.6,141.8,95.4,140.0,146.5,100.5,154.5,50 -145.0,110.1,149.1,140.8,95.1,139.0,146.2,101.0,154.3,51 -143.9,110.7,148.2,139.7,95.0,137.9,145.1,101.6,153.6,52 -141.5,109.7,145.4,138.4,95.0,136.8,142.8,102.2,152.2,53 -137.8,107.5,141.4,136.8,95.3,135.9,139.3,102.4,149.9,54 -133.3,105.0,137.2,134.5,95.6,135.0,134.6,102.1,147.0,55 -128.2,102.8,133.7,131.2,96.2,134.3,128.8,101.0,143.3,56 -123.0,101.5,131.5,126.9,96.7,133.7,122.3,98.9,139.2,57 -118.2,101.0,130.7,121.9,97.3,133.3,115.5,96.3,135.2,58 -114.1,100.9,130.9,117.1,97.5,133.1,109.4,93.8,132.1,59 -111.3,101.0,131.8,113.1,97.4,133.1,104.6,91.9,130.6,60 -110.0,100.9,133.3,110.4,96.7,133.2,101.8,91.1,131.3,61 -110.0,100.8,135.0,108.6,95.8,133.4,100.5,91.2,133.5,62 -110.6,100.6,136.6,107.5,94.9,133.6,100.2,91.8,136.2,63 -111.3,100.4,137.9,106.4,94.3,133.7,100.4,92.5,138.5,64 -111.7,100.3,138.6,105.2,94.4,133.4,100.6,93.1,139.8,65 -111.9,100.2,139.0,104.1,95.0,133.1,101.0,93.4,140.3,66 -112.1,100.3,139.2,103.5,95.9,132.9,101.9,93.6,140.5,67 -112.5,100.4,139.7,104.0,96.8,133.1,103.4,93.7,140.9,68 -113.2,100.5,140.6,105.8,97.6,133.6,105.8,93.9,142.0,69 -113.9,100.7,141.6,108.1,98.2,134.5,108.7,94.3,143.7,70 -114.2,100.6,142.4,110.2,98.8,135.6,111.5,95.2,145.8,71 -113.7,100.4,142.7,111.3,99.2,136.7,113.7,96.8,148.2,72 -112.1,99.9,142.3,110.7,99.5,137.6,115.0,99.1,150.6,73 -110.2,99.7,141.3,109.0,99.9,138.0,115.7,102.2,152.5,74 -109.0,100.2,139.9,107.1,100.5,137.6,116.3,105.7,153.3,75 -109.5,102.2,138.5,105.8,101.6,136.1,117.3,109.5,152.4,76 -112.2,105.9,137.2,105.9,103.2,133.2,119.0,113.2,149.3,77 -116.2,110.3,135.9,107.0,105.2,129.6,120.6,116.3,144.4,78 -120.2,114.5,134.3,108.7,107.4,126.1,121.4,117.9,138.4,79 -122.8,117.3,132.4,110.7,109.5,123.4,120.4,117.3,131.8,80 -123.0,117.9,130.0,112.4,111.2,122.1,117.0,114.2,125.3,81 -121.2,116.5,127.2,113.5,112.4,121.6,112.1,109.4,119.3,82 -118.3,113.9,124.1,113.9,112.5,121.1,106.8,104.2,114.3,83 -114.9,110.7,121.0,113.1,111.3,119.7,102.2,99.8,110.7,84 -111.7,107.4,117.8,111.1,108.5,117.0,99.2,97.1,108.8,85 -108.9,104.4,114.9,108.3,104.8,113.3,97.4,95.9,108.1,86 -106.5,101.8,112.2,105.1,100.8,109.4,96.4,95.4,108,87 -104.6,99.8,110.1,102.2,97.4,105.8,95.6,95.0,107.7,88 -103.2,98.5,108.5,99.9,95.0,103.2,94.5,94.1,106.6,89 -102.1,97.6,107.2,98.1,93.5,101.3,93.3,92.8,104.9,90 -101.1,96.8,106.0,96.5,92.4,99.9,92.0,91.2,103.0,91 -99.8,95.6,104.6,95.0,91.3,98.6,90.7,89.5,101.0,92 -98.2,93.8,102.9,93.1,89.9,97.1,89.6,87.8,99.3,93 -96.4,91.9,101.1,91.3,88.4,95.6,88.6,86.4,97.8,94 -95.0,90.7,99.5,89.6,87.2,94.0,88.0,85.7,96.6,95 -94.3,90.7,98.6,88.3,86.5,92.5,87.7,85.9,95.6,96 +99.0,94.6,98.5,92.5,87.6,91.2,95.3,87.8,94.7,0 +100.0,95.3,99.0,93.0,87.3,90.2,95.5,88.3,94.1,1 +100.9,96.0,99.4,93.7,87.4,89.4,96.2,89.0,94.1,2 +101.0,96.2,99.2,94.3,87.7,88.9,97.4,90.1,95.0,3 +99.8,95.3,98.1,94.5,88.0,88.7,98.9,91.3,96.6,4 +97.9,93.9,96.4,94.5,88.4,88.8,100.3,92.4,98.4,5 +95.8,92.4,94.8,94.3,88.9,89.1,101.0,92.9,99.8,6 +94.3,91.3,93.7,94.3,89.5,89.5,100.4,92.5,99.8,7 +94.0,91.1,93.6,94.7,90.3,90.0,98.2,91.0,98.0,8 +94.3,91.5,94.1,95.0,91.0,90.3,95.1,88.7,95.1,9 +94.8,92.1,94.7,95.0,91.2,90.2,91.9,86.4,91.9,10 +95.0,92.5,95.0,94.3,90.7,89.5,89.5,84.7,89.5,11 +94.3,92.4,94.4,92.7,89.2,88.0,88.6,84.0,88.4,12 +93.1,91.9,93.3,90.6,87.2,86.1,88.6,84.0,88.3,13 +91.7,91.2,92.2,88.3,85.1,84.0,88.7,84.0,88.3,14 +90.7,90.7,91.3,86.5,83.5,82.3,88.3,83.5,87.7,15 +90.3,90.5,91.0,85.4,82.7,81.1,86.8,82.1,86.1,16 +90.2,90.4,91.1,85.1,82.7,80.5,85.1,80.6,84.3,17 +90.1,90.1,91.1,85.1,83.1,80.4,84.2,80.1,83.5,18 +89.5,89.5,90.7,85.3,83.5,80.4,85.3,81.6,84.7,19 +88.2,88.5,89.8,85.4,83.7,80.7,89.0,85.9,88.5,20 +87.0,87.7,89.0,85.8,84.0,81.3,94.1,91.6,94.0,21 +86.7,88.2,89.2,86.9,84.8,82.5,99.3,97.0,99.5,22 +88.3,90.7,91.3,88.9,86.5,84.7,102.8,100.4,103.4,23 +92.2,95.8,95.9,92.1,89.2,87.9,103.7,100.7,104.7,24 +97.3,102.0,101.6,95.7,92.4,91.6,102.6,98.8,104.0,25 +102.2,107.6,106.9,99.0,95.4,95.2,100.7,96.2,102.4,26 +105.2,110.7,110.1,101.0,97.4,98.0,99.2,94.3,101.0,27 +105.5,110.0,110.1,101.3,97.9,99.6,99.1,94.4,100.8,28 +104.6,106.9,108.4,101.1,97.6,100.9,100.8,95.7,102.1,29 +104.6,103.1,107.1,102.3,97.3,102.8,104.4,97.6,105.3,30 +107.7,100.4,108.3,106.4,98.0,106.4,110.1,99.2,110.7,31 +115.0,100.2,113.3,114.6,100.1,112.4,117.7,99.7,118.2,32 +125.0,101.8,120.8,124.9,102.9,119.5,126.1,99.6,126.7,33 +134.9,104.0,128.9,134.7,105.4,126.3,133.9,99.2,134.7,34 +142.1,105.8,135.5,141.5,106.4,131.2,139.7,99.2,140.9,35 +144.9,106.3,139.1,143.4,105.4,133.3,142.4,99.8,144.2,36 +144.1,105.8,140.3,141.8,102.9,133.2,142.9,100.9,145.4,37 +141.8,104.8,140.3,138.6,99.9,132.1,142.4,102.1,145.5,38 +139.7,104.0,140.3,136.1,97.4,131.2,142.1,102.8,145.8,39 +139.2,103.8,141.1,135.7,96.1,131.5,142.9,102.9,147.0,40 +140.0,104.1,142.5,137.1,95.9,132.8,144.5,102.5,149.0,41 +141.4,104.5,144.0,139.3,96.3,134.7,146.3,101.8,151.2,42 +142.7,104.6,145.1,141.5,96.8,136.7,147.6,101.0,153.0,43 +143.4,104.4,145.7,143.0,96.9,138.4,147.9,100.4,154.0,44 +143.7,104.0,145.8,143.6,96.8,139.7,147.5,100.0,154.3,45 +143.7,103.9,145.9,143.7,96.6,140.6,146.8,99.8,154.3,46 +143.9,104.6,146.4,143.3,96.2,140.9,146.4,99.8,154.2,47 +144.5,106.3,147.4,142.7,95.7,140.7,146.3,100.0,154.3,48 +145.0,108.3,148.6,141.8,95.4,140.0,146.5,100.5,154.5,49 +145.0,110.1,149.1,140.8,95.1,139.0,146.2,101.0,154.3,50 +143.9,110.7,148.2,139.7,95.0,137.9,145.1,101.6,153.6,51 +141.5,109.7,145.4,138.4,95.0,136.8,142.8,102.2,152.2,52 +137.8,107.5,141.4,136.8,95.3,135.9,139.3,102.4,149.9,53 +133.3,105.0,137.2,134.5,95.6,135.0,134.6,102.1,147.0,54 +128.2,102.8,133.7,131.2,96.2,134.3,128.8,101.0,143.3,55 +123.0,101.5,131.5,126.9,96.7,133.7,122.3,98.9,139.2,56 +118.2,101.0,130.7,121.9,97.3,133.3,115.5,96.3,135.2,57 +114.1,100.9,130.9,117.1,97.5,133.1,109.4,93.8,132.1,58 +111.3,101.0,131.8,113.1,97.4,133.1,104.6,91.9,130.6,59 +110.0,100.9,133.3,110.4,96.7,133.2,101.8,91.1,131.3,60 +110.0,100.8,135.0,108.6,95.8,133.4,100.5,91.2,133.5,61 +110.6,100.6,136.6,107.5,94.9,133.6,100.2,91.8,136.2,62 +111.3,100.4,137.9,106.4,94.3,133.7,100.4,92.5,138.5,63 +111.7,100.3,138.6,105.2,94.4,133.4,100.6,93.1,139.8,64 +111.9,100.2,139.0,104.1,95.0,133.1,101.0,93.4,140.3,65 +112.1,100.3,139.2,103.5,95.9,132.9,101.9,93.6,140.5,66 +112.5,100.4,139.7,104.0,96.8,133.1,103.4,93.7,140.9,67 +113.2,100.5,140.6,105.8,97.6,133.6,105.8,93.9,142.0,68 +113.9,100.7,141.6,108.1,98.2,134.5,108.7,94.3,143.7,69 +114.2,100.6,142.4,110.2,98.8,135.6,111.5,95.2,145.8,70 +113.7,100.4,142.7,111.3,99.2,136.7,113.7,96.8,148.2,71 +112.1,99.9,142.3,110.7,99.5,137.6,115.0,99.1,150.6,72 +110.2,99.7,141.3,109.0,99.9,138.0,115.7,102.2,152.5,73 +109.0,100.2,139.9,107.1,100.5,137.6,116.3,105.7,153.3,74 +109.5,102.2,138.5,105.8,101.6,136.1,117.3,109.5,152.4,75 +112.2,105.9,137.2,105.9,103.2,133.2,119.0,113.2,149.3,76 +116.2,110.3,135.9,107.0,105.2,129.6,120.6,116.3,144.4,77 +120.2,114.5,134.3,108.7,107.4,126.1,121.4,117.9,138.4,78 +122.8,117.3,132.4,110.7,109.5,123.4,120.4,117.3,131.8,79 +123.0,117.9,130.0,112.4,111.2,122.1,117.0,114.2,125.3,80 +121.2,116.5,127.2,113.5,112.4,121.6,112.1,109.4,119.3,81 +118.3,113.9,124.1,113.9,112.5,121.1,106.8,104.2,114.3,82 +114.9,110.7,121.0,113.1,111.3,119.7,102.2,99.8,110.7,83 +111.7,107.4,117.8,111.1,108.5,117.0,99.2,97.1,108.8,84 +108.9,104.4,114.9,108.3,104.8,113.3,97.4,95.9,108.1,85 +106.5,101.8,112.2,105.1,100.8,109.4,96.4,95.4,108,86 +104.6,99.8,110.1,102.2,97.4,105.8,95.6,95.0,107.7,87 +103.2,98.5,108.5,99.9,95.0,103.2,94.5,94.1,106.6,88 +102.1,97.6,107.2,98.1,93.5,101.3,93.3,92.8,104.9,89 +101.1,96.8,106.0,96.5,92.4,99.9,92.0,91.2,103.0,90 +99.8,95.6,104.6,95.0,91.3,98.6,90.7,89.5,101.0,91 +98.2,93.8,102.9,93.1,89.9,97.1,89.6,87.8,99.3,92 +96.4,91.9,101.1,91.3,88.4,95.6,88.6,86.4,97.8,93 +95.0,90.7,99.5,89.6,87.2,94.0,88.0,85.7,96.6,94 +94.3,90.7,98.6,88.3,86.5,92.5,87.7,85.9,95.6,95 diff --git a/src/main/resources/load/lpts_g4_b7682f84-d317-4f7d-a888-0a9502abd763.csv b/src/main/resources/load/lpts_g4_b7682f84-d317-4f7d-a888-0a9502abd763.csv index b7f7de240..665fc3dab 100644 --- a/src/main/resources/load/lpts_g4_b7682f84-d317-4f7d-a888-0a9502abd763.csv +++ b/src/main/resources/load/lpts_g4_b7682f84-d317-4f7d-a888-0a9502abd763.csv @@ -1,97 +1,97 @@ SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour -75.3,68.7,74.5,67.2,63.1,67.2,62.2,57.7,62.1,1 -75.5,68.3,73.6,65.9,62.2,66.1,61.2,56.4,60.8,2 -75.7,68.0,72.8,64.8,61.3,64.9,60.1,55.0,59.5,3 -75.6,67.5,72.0,63.9,60.3,63.9,59.4,54.0,58.5,4 -74.8,66.6,71.0,63.2,59.4,63.0,59.1,53.6,58.0,5 -73.6,65.6,70.0,62.7,58.6,62.2,59.2,53.6,57.8,6 -72.3,64.6,69.1,62.4,58.0,61.6,59.4,53.8,57.7,7 -71.1,63.9,68.4,62.1,57.6,61.2,59.4,54.0,57.6,8 -70.3,63.7,68.0,61.8,57.4,61.1,59.1,54.0,57.2,9 -69.8,63.7,67.9,61.6,57.4,61.1,58.6,53.7,56.6,10 -69.5,63.9,67.7,61.3,57.5,61.2,58.0,53.4,56.1,11 -69.3,63.9,67.5,61.2,57.6,61.2,57.6,53.1,55.8,12 -69.0,63.6,67.0,61.1,57.7,61.1,57.5,52.9,55.9,13 -68.8,63.0,66.4,61.1,57.7,60.9,57.5,52.7,56.2,14 -68.6,62.5,65.9,61.1,57.7,60.6,57.6,52.5,56.6,15 -68.4,62.1,65.7,61.2,57.6,60.3,57.6,52.2,56.7,16 -68.3,62.0,65.8,61.3,57.4,60.0,57.4,51.8,56.5,17 -68.3,62.0,66.1,61.4,57.3,59.8,57.2,51.6,56.2,18 -68.3,62.1,66.5,61.6,57.3,59.9,57.1,51.6,56.2,19 -68.4,62.1,66.6,62.1,57.6,60.3,57.6,52.2,56.7,20 -68.4,61.8,66.4,62.7,58.2,61.1,58.7,53.4,58.0,21 -68.3,61.5,65.9,63.3,58.9,62.1,60.2,55.2,59.8,22 -68.1,61.2,65.3,63.5,59.4,62.8,62.0,57.2,61.9,23 -67.5,61.2,64.8,63.0,59.4,63.0,63.9,59.4,63.9,24 -66.9,61.6,64.6,61.9,58.7,62.5,65.9,61.5,65.6,25 -67.7,62.5,65.4,62.0,57.7,62.2,69.3,63.3,67.8,26 -71.8,63.8,67.9,65.2,57.2,63.2,75.6,64.8,71.4,27 -81.0,65.7,72.9,73.8,57.6,66.6,86.4,65.7,77.4,28 -96.3,68.0,80.9,88.9,59.4,73.2,102.5,66.0,86.4,29 -115.4,70.4,91.6,108.6,62.0,83.3,121.9,65.7,98.4,30 -135.3,72.2,104.4,129.7,64.6,96.7,142.0,65.0,113.2,31 -153.0,72.9,118.8,149.4,66.6,113.4,160.2,63.9,130.5,32 -165.9,72.2,133.9,165.2,67.3,132.9,174.4,62.5,149.7,33 -174.7,70.5,148.8,177.2,67.0,153.2,185.0,61.1,169.1,34 -180.5,68.4,162.2,185.8,66.0,171.8,193.2,59.7,186.8,35 -184.5,66.6,172.8,191.7,64.8,186.3,199.8,58.5,200.7,36 -187.6,65.5,179.8,195.3,63.7,194.8,205.7,57.7,209.3,37 -190.3,65.1,183.9,197.3,62.8,198.7,210.9,57.3,213.7,38 -192.5,65.2,186.3,198.3,62.3,199.7,215.3,57.3,215.4,39 -194.4,65.7,188.1,198.9,62.1,199.8,218.7,57.6,216.0,40 -196.0,66.4,190.1,199.5,62.3,200.4,220.8,58.2,216.6,41 -197.5,67.3,192.2,200.2,62.9,201.5,222.0,59.2,217.4,42 -198.7,68.3,194.0,200.9,63.8,202.7,222.4,60.5,218.2,43 -199.8,69.3,195.3,201.6,64.8,203.4,222.3,62.1,218.7,44 -200.6,70.2,195.6,202.1,65.8,203.2,221.9,63.9,218.7,45 -201.4,71.1,195.3,202.7,66.7,202.3,221.4,65.7,218.2,46 -202.3,71.7,194.5,203.3,67.3,200.8,220.9,67.0,217.0,47 -203.4,72.0,193.5,204.3,67.5,198.9,220.5,67.5,215.1,48 -204.7,71.9,192.3,205.4,67.1,196.6,220.1,66.9,212.1,49 -205.5,71.6,190.3,206.1,66.2,193.3,219.4,65.4,207.8,50 -205.1,71.0,186.5,205.4,65.1,188.3,217.6,63.7,201.4,51 -202.5,70.2,180.0,202.5,63.9,180.9,214.2,62.1,192.6,52 -197.0,69.3,170.4,196.5,62.8,170.7,208.4,61.0,181.1,53 -188.7,68.5,159.3,187.7,62.0,159.4,200.2,60.3,168.7,54 -177.5,67.8,148.9,176.1,61.4,149.2,189.3,60.1,157.7,55 -163.8,67.5,141.3,162.0,61.2,142.2,175.5,60.3,150.3,56 -147.7,67.6,138.1,145.8,61.4,139.9,158.9,60.7,148.1,57 -131.0,67.9,139.2,129.0,61.9,142.2,141.2,61.4,151.0,58 -115.3,68.2,143.7,113.1,62.5,148.0,124.2,62.1,157.9,59 -102.6,68.4,151.2,99.9,63.0,156.6,109.8,63.0,168.3,60 -94.1,68.2,160.6,90.4,63.3,166.9,99.4,63.8,180.9,61 -89.2,67.8,170.6,84.1,63.4,177.6,92.5,64.6,194.1,62 -86.7,67.5,179.7,80.1,63.3,186.9,88.2,65.2,205.9,63 -85.5,67.5,186.3,77.4,63.0,193.5,85.5,65.7,214.2,64 -84.5,67.9,189.2,75.1,62.6,196.1,83.6,66.0,217.7,65 -83.5,68.5,189.5,73.3,62.3,196.0,82.5,66.5,218.2,66 -82.3,69.0,188.3,72.2,62.4,194.9,82.4,67.7,217.7,67 -81.0,69.3,187.2,72.0,63.0,194.4,83.7,70.2,218.7,68 -79.4,69.1,186.9,72.8,64.3,195.6,86.2,74.1,222.5,69 -77.8,68.7,187.2,74.0,65.9,197.4,89.3,78.8,227.3,70 -76.7,68.6,186.9,75.2,67.5,197.9,92.1,83.2,230.5,71 -76.5,69.3,185.4,75.6,68.4,195.3,93.6,86.4,229.5,72 -77.3,70.9,181.7,74.9,68.4,188.3,93.2,87.6,222.2,73 -78.7,73.0,175.7,73.7,68.0,177.7,91.8,87.5,209.9,74 -80.1,75.1,167.1,72.7,67.8,164.9,90.4,87.1,194.6,75 -81.0,76.5,155.7,72.9,68.4,151.2,90.0,87.3,178.2,76 -80.9,76.8,141.7,74.7,70.2,137.8,91.4,88.8,162.3,77 -80.3,76.5,127.2,77.6,72.8,125.5,93.7,90.9,147.6,78 -80.1,76.5,114.2,80.9,75.7,115.3,95.8,92.6,134.5,79 -81.0,77.4,105.3,83.7,78.3,108.0,96.3,92.7,123.3,80 -83.4,79.7,101.8,85.5,80.2,103.9,94.4,90.6,114.2,81 -86.7,82.7,102.3,86.1,81.3,102.1,90.8,86.8,107.0,82 -89.5,85.3,104.2,85.8,81.5,101.2,86.3,82.4,101.2,83 -90.9,86.4,105.3,84.6,81.0,99.9,81.9,78.3,96.3,84 -90.0,85.4,103.7,82.6,79.6,97.1,78.3,75.1,92.0,85 -87.5,82.7,100.0,80.2,77.7,93.2,75.5,72.7,88.0,86 -84.1,79.5,95.3,77.4,75.4,88.8,72.9,70.6,84.1,87 -81.0,76.5,90.9,74.7,72.9,84.6,70.2,68.4,80.1,88 -78.7,74.5,87.5,72.1,70.4,81.0,67.1,65.8,75.9,89 -77.1,73.2,85.2,69.9,68.1,78.1,64.0,63.0,71.8,90 -75.9,72.2,83.4,68.0,65.9,75.7,61.3,60.4,68.3,91 -74.7,71.1,81.9,66.6,63.9,73.8,59.4,58.5,65.7,92 -73.3,69.6,80.2,65.6,62.2,72.2,58.6,57.4,64.3,93 -71.8,68.0,78.6,65.0,61.0,70.8,58.5,57.1,63.7,94 -70.4,66.8,77.0,64.4,60.3,69.6,58.7,57.2,63.4,95 -69.3,66.6,75.6,63.9,60.3,68.4,58.5,57.6,63.0,96 +75.3,68.7,74.5,67.2,63.1,67.2,62.2,57.7,62.1,0 +75.5,68.3,73.6,65.9,62.2,66.1,61.2,56.4,60.8,1 +75.7,68.0,72.8,64.8,61.3,64.9,60.1,55.0,59.5,2 +75.6,67.5,72.0,63.9,60.3,63.9,59.4,54.0,58.5,3 +74.8,66.6,71.0,63.2,59.4,63.0,59.1,53.6,58.0,4 +73.6,65.6,70.0,62.7,58.6,62.2,59.2,53.6,57.8,5 +72.3,64.6,69.1,62.4,58.0,61.6,59.4,53.8,57.7,6 +71.1,63.9,68.4,62.1,57.6,61.2,59.4,54.0,57.6,7 +70.3,63.7,68.0,61.8,57.4,61.1,59.1,54.0,57.2,8 +69.8,63.7,67.9,61.6,57.4,61.1,58.6,53.7,56.6,9 +69.5,63.9,67.7,61.3,57.5,61.2,58.0,53.4,56.1,10 +69.3,63.9,67.5,61.2,57.6,61.2,57.6,53.1,55.8,11 +69.0,63.6,67.0,61.1,57.7,61.1,57.5,52.9,55.9,12 +68.8,63.0,66.4,61.1,57.7,60.9,57.5,52.7,56.2,13 +68.6,62.5,65.9,61.1,57.7,60.6,57.6,52.5,56.6,14 +68.4,62.1,65.7,61.2,57.6,60.3,57.6,52.2,56.7,15 +68.3,62.0,65.8,61.3,57.4,60.0,57.4,51.8,56.5,16 +68.3,62.0,66.1,61.4,57.3,59.8,57.2,51.6,56.2,17 +68.3,62.1,66.5,61.6,57.3,59.9,57.1,51.6,56.2,18 +68.4,62.1,66.6,62.1,57.6,60.3,57.6,52.2,56.7,19 +68.4,61.8,66.4,62.7,58.2,61.1,58.7,53.4,58.0,20 +68.3,61.5,65.9,63.3,58.9,62.1,60.2,55.2,59.8,21 +68.1,61.2,65.3,63.5,59.4,62.8,62.0,57.2,61.9,22 +67.5,61.2,64.8,63.0,59.4,63.0,63.9,59.4,63.9,23 +66.9,61.6,64.6,61.9,58.7,62.5,65.9,61.5,65.6,24 +67.7,62.5,65.4,62.0,57.7,62.2,69.3,63.3,67.8,25 +71.8,63.8,67.9,65.2,57.2,63.2,75.6,64.8,71.4,26 +81.0,65.7,72.9,73.8,57.6,66.6,86.4,65.7,77.4,27 +96.3,68.0,80.9,88.9,59.4,73.2,102.5,66.0,86.4,28 +115.4,70.4,91.6,108.6,62.0,83.3,121.9,65.7,98.4,29 +135.3,72.2,104.4,129.7,64.6,96.7,142.0,65.0,113.2,30 +153.0,72.9,118.8,149.4,66.6,113.4,160.2,63.9,130.5,31 +165.9,72.2,133.9,165.2,67.3,132.9,174.4,62.5,149.7,32 +174.7,70.5,148.8,177.2,67.0,153.2,185.0,61.1,169.1,33 +180.5,68.4,162.2,185.8,66.0,171.8,193.2,59.7,186.8,34 +184.5,66.6,172.8,191.7,64.8,186.3,199.8,58.5,200.7,35 +187.6,65.5,179.8,195.3,63.7,194.8,205.7,57.7,209.3,36 +190.3,65.1,183.9,197.3,62.8,198.7,210.9,57.3,213.7,37 +192.5,65.2,186.3,198.3,62.3,199.7,215.3,57.3,215.4,38 +194.4,65.7,188.1,198.9,62.1,199.8,218.7,57.6,216.0,39 +196.0,66.4,190.1,199.5,62.3,200.4,220.8,58.2,216.6,40 +197.5,67.3,192.2,200.2,62.9,201.5,222.0,59.2,217.4,41 +198.7,68.3,194.0,200.9,63.8,202.7,222.4,60.5,218.2,42 +199.8,69.3,195.3,201.6,64.8,203.4,222.3,62.1,218.7,43 +200.6,70.2,195.6,202.1,65.8,203.2,221.9,63.9,218.7,44 +201.4,71.1,195.3,202.7,66.7,202.3,221.4,65.7,218.2,45 +202.3,71.7,194.5,203.3,67.3,200.8,220.9,67.0,217.0,46 +203.4,72.0,193.5,204.3,67.5,198.9,220.5,67.5,215.1,47 +204.7,71.9,192.3,205.4,67.1,196.6,220.1,66.9,212.1,48 +205.5,71.6,190.3,206.1,66.2,193.3,219.4,65.4,207.8,49 +205.1,71.0,186.5,205.4,65.1,188.3,217.6,63.7,201.4,50 +202.5,70.2,180.0,202.5,63.9,180.9,214.2,62.1,192.6,51 +197.0,69.3,170.4,196.5,62.8,170.7,208.4,61.0,181.1,52 +188.7,68.5,159.3,187.7,62.0,159.4,200.2,60.3,168.7,53 +177.5,67.8,148.9,176.1,61.4,149.2,189.3,60.1,157.7,54 +163.8,67.5,141.3,162.0,61.2,142.2,175.5,60.3,150.3,55 +147.7,67.6,138.1,145.8,61.4,139.9,158.9,60.7,148.1,56 +131.0,67.9,139.2,129.0,61.9,142.2,141.2,61.4,151.0,57 +115.3,68.2,143.7,113.1,62.5,148.0,124.2,62.1,157.9,58 +102.6,68.4,151.2,99.9,63.0,156.6,109.8,63.0,168.3,59 +94.1,68.2,160.6,90.4,63.3,166.9,99.4,63.8,180.9,60 +89.2,67.8,170.6,84.1,63.4,177.6,92.5,64.6,194.1,61 +86.7,67.5,179.7,80.1,63.3,186.9,88.2,65.2,205.9,62 +85.5,67.5,186.3,77.4,63.0,193.5,85.5,65.7,214.2,63 +84.5,67.9,189.2,75.1,62.6,196.1,83.6,66.0,217.7,64 +83.5,68.5,189.5,73.3,62.3,196.0,82.5,66.5,218.2,65 +82.3,69.0,188.3,72.2,62.4,194.9,82.4,67.7,217.7,66 +81.0,69.3,187.2,72.0,63.0,194.4,83.7,70.2,218.7,67 +79.4,69.1,186.9,72.8,64.3,195.6,86.2,74.1,222.5,68 +77.8,68.7,187.2,74.0,65.9,197.4,89.3,78.8,227.3,69 +76.7,68.6,186.9,75.2,67.5,197.9,92.1,83.2,230.5,70 +76.5,69.3,185.4,75.6,68.4,195.3,93.6,86.4,229.5,71 +77.3,70.9,181.7,74.9,68.4,188.3,93.2,87.6,222.2,72 +78.7,73.0,175.7,73.7,68.0,177.7,91.8,87.5,209.9,73 +80.1,75.1,167.1,72.7,67.8,164.9,90.4,87.1,194.6,74 +81.0,76.5,155.7,72.9,68.4,151.2,90.0,87.3,178.2,75 +80.9,76.8,141.7,74.7,70.2,137.8,91.4,88.8,162.3,76 +80.3,76.5,127.2,77.6,72.8,125.5,93.7,90.9,147.6,77 +80.1,76.5,114.2,80.9,75.7,115.3,95.8,92.6,134.5,78 +81.0,77.4,105.3,83.7,78.3,108.0,96.3,92.7,123.3,79 +83.4,79.7,101.8,85.5,80.2,103.9,94.4,90.6,114.2,80 +86.7,82.7,102.3,86.1,81.3,102.1,90.8,86.8,107.0,81 +89.5,85.3,104.2,85.8,81.5,101.2,86.3,82.4,101.2,82 +90.9,86.4,105.3,84.6,81.0,99.9,81.9,78.3,96.3,83 +90.0,85.4,103.7,82.6,79.6,97.1,78.3,75.1,92.0,84 +87.5,82.7,100.0,80.2,77.7,93.2,75.5,72.7,88.0,85 +84.1,79.5,95.3,77.4,75.4,88.8,72.9,70.6,84.1,86 +81.0,76.5,90.9,74.7,72.9,84.6,70.2,68.4,80.1,87 +78.7,74.5,87.5,72.1,70.4,81.0,67.1,65.8,75.9,88 +77.1,73.2,85.2,69.9,68.1,78.1,64.0,63.0,71.8,89 +75.9,72.2,83.4,68.0,65.9,75.7,61.3,60.4,68.3,90 +74.7,71.1,81.9,66.6,63.9,73.8,59.4,58.5,65.7,91 +73.3,69.6,80.2,65.6,62.2,72.2,58.6,57.4,64.3,92 +71.8,68.0,78.6,65.0,61.0,70.8,58.5,57.1,63.7,93 +70.4,66.8,77.0,64.4,60.3,69.6,58.7,57.2,63.4,94 +69.3,66.6,75.6,63.9,60.3,68.4,58.5,57.6,63.0,95 diff --git a/src/main/resources/load/lpts_g5_ec51ae43-3849-4f14-8330-b2eea9414101.csv b/src/main/resources/load/lpts_g5_ec51ae43-3849-4f14-8330-b2eea9414101.csv index 56ce37f83..5cdfc79bf 100644 --- a/src/main/resources/load/lpts_g5_ec51ae43-3849-4f14-8330-b2eea9414101.csv +++ b/src/main/resources/load/lpts_g5_ec51ae43-3849-4f14-8330-b2eea9414101.csv @@ -1,97 +1,97 @@ SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour -91.8,48.8,67.4,75.6,42.5,56.0,66.6,38.9,50.1,1 -118.3,47.8,61.2,97.6,42.0,51.3,87.3,38.4,47.4,2 -145.6,46.6,54.6,121.4,41.6,46.6,111.7,38.1,44.9,3 -168.3,45.3,49.4,143.1,41.3,43.3,137.0,38.3,43.3,4 -182.2,44.3,46.7,159.4,41.1,42.4,160.7,39.2,43.0,5 -188.4,43.4,46.0,170.6,40.9,42.9,180.8,40.5,43.8,6 -189.4,42.8,45.9,177.6,41.0,43.7,195.6,41.7,45.0,7 -187.4,42.3,45.3,181.4,41.3,43.3,203.5,42.3,46.3,8 -184.6,42.0,43.9,182.9,41.9,41.4,203.7,42.0,47.5,9 -182.2,41.9,44.3,183.1,42.6,40.1,198.9,40.9,49.2,10 -181.2,42.0,50.0,182.9,43.1,42.8,192.6,39.6,52.2,11 -182.4,42.3,64.5,183.4,43.3,52.4,188.4,38.3,57.4,12 -186.5,42.8,89.7,185.2,43.0,71.0,189.1,37.4,65.9,13 -192.6,43.3,121.1,188.7,42.2,95.9,194.0,36.9,78.5,14 -199.7,43.9,152.6,193.7,41.3,123.5,201.6,36.9,96.5,15 -206.5,44.3,178.3,200.5,40.3,150.1,210.6,37.3,120.9,16 -212.3,44.6,193.7,208.8,39.5,172.6,219.6,38.0,151.7,17 -217.0,44.8,200.6,217.5,39.0,190.3,228.2,39.0,184.7,18 -221.0,45.0,202.4,225.2,38.9,203.3,236.0,40.2,214.5,19 -224.7,45.3,202.5,230.7,39.3,211.6,242.8,41.3,235.8,20 -228.3,46.0,203.8,233.1,40.4,215.4,248.4,42.3,244.7,21 -231.5,46.8,206.0,232.9,42.0,216.2,252.5,43.4,244.2,22 -234.1,48.0,208.6,231.4,44.0,215.7,255.0,44.7,238.7,23 -235.8,49.4,210.6,229.7,46.3,215.6,255.9,46.3,232.7,24 -236.2,51.0,211.5,228.7,48.8,217.2,255.1,48.5,229.8,25 -235.8,52.7,211.5,228.4,51.2,220.0,253.2,51.0,229.8,26 -234.8,54.2,211.1,228.8,53.2,223.1,250.5,53.4,231.4,27 -233.8,55.4,210.6,229.7,54.4,225.7,247.9,55.4,233.8,28 -232.6,56.2,210.3,230.9,54.8,227.0,245.4,56.8,235.7,29 -230.4,56.5,210.3,230.9,54.4,226.9,242.0,57.6,237.1,30 -225.9,56.6,210.4,228.0,53.5,225.8,236.2,57.8,237.9,31 -217.6,56.4,210.6,220.7,52.4,223.7,226.7,57.4,237.8,32 -204.9,56.2,210.8,207.9,51.3,220.8,212.7,56.6,236.9,33 -189.4,55.9,210.8,191.8,50.4,217.7,196.2,55.7,235.4,34 -173.1,55.6,210.4,175.3,50.1,214.8,180.2,54.8,233.6,35 -158.2,55.4,209.6,161.2,50.4,212.6,167.3,54.4,231.7,36 -146.4,55.4,208.1,151.7,51.6,211.3,159.5,54.6,230.0,37 -137.7,55.7,205.8,145.9,53.5,210.5,155.5,55.4,228.1,38 -131.7,56.7,202.6,142.2,55.8,209.1,153.4,56.7,225.4,39 -128.0,58.4,198.5,13.09,58.4,206.5,151.1,58.4,221.7,40 -126.0,61.2,193.4,135.1,61.1,202.2,147.0,60.4,216.4,41 -125.3,64.5,187.8,130.6,63.7,196.5,141.5,62.5,210.2,42 -125.2,68.1,182.3,126.0,66.2,190.3,135.6,64.6,203.7,43 -124.9,71.5,177.3,121.9,68.5,184.4,130.0,66.5,197.5,44 -124.1,74.4,173.3,118.8,70.6,179.2,125.6,68.2,192.0,45 -123.2,76.7,169.7,116.9,72.4,174.3,122.7,69.6,186.8,46 -122.6,78.4,165.6,116.5,73.7,168.9,121.4,70.7,181.1,47 -122.9,79.6,160.2,117.9,74.6,162.2,121.9,71.5,174.3,48 -124.4,80.2,153.0,120.8,74.8,153.7,124.1,72.0,165.9,49 -125.9,80.1,144.7,123.8,74.4,144.2,126.4,72.1,156.2,50 -125.9,79.2,136.0,124.8,73.3,134.6,127.0,71.7,146.1,51 -122.9,77.6,128.0,121.9,71.5,125.9,123.9,70.5,136,52 -116.0,75.1,121.3,113.9,69.1,119.1,116.1,68.7,126.7,53 -106.4,72.1,116.6,102.6,66.3,114.2,105,66.3,118.7,54 -96.0,69.1,114.0,90.3,63.7,111.1,93.1,63.8,112.6,55 -86.6,66.5,113.9,79.6,61.5,109.8,82.6,61.5,108.8,56 -79.8,64.6,116.3,72.3,60.0,110.1,75.3,59.5,107.7,57 -75.6,63.5,120.1,68.1,59.3,111.4,70.8,58.0,108.4,58 -73.6,63.1,123.8,66.1,59.2,112.9,68.2,57.0,109.8,59 -73.6,63.5,125.9,65.5,59.4,113.9,66.5,56.4,110.8,60 -75.0,64.4,125.5,65.5,59.9,113.8,64.9,56.3,110.7,61 -77.2,65.7,123.0,65.7,60.4,112.9,63.5,56.5,109.5,62 -79.4,66.8,119.5,65.8,60.6,111.4,62.3,56.9,107.7,63 -80.6,67.5,115.9,65.5,60.5,109.8,61.5,57.4,105.8,64 -80.3,67.4,113.0,64.6,59.7,108.3,61.1,57.9,104.1,65 -78.8,66.8,110.9,63.6,58.9,107.1,61.5,58.6,103.1,66 -76.7,66.0,109.5,63.0,58.3,106.2,62.5,59.7,103.1,67 -74.6,65.5,108.8,63.5,58.4,105.8,64.5,61.5,104.8,68 -72.8,65.4,108.5,65.4,59.7,105.8,67.3,64.1,108.1,69 -71.2,65.5,108.2,68.2,61.5,105.8,70.5,67.1,112.2,70 -69.5,65.3,107.1,71.2,63.3,105.3,73.5,70.1,115.9,71 -67.5,64.5,104.8,73.6,64.5,103.8,75.6,72.5,117.9,72 -65.0,62.7,100.7,74.8,64.6,100.8,76.3,74,117.3,73 -62.3,60.3,95.2,74.8,63.7,96.7,75.9,74.4,114.2,74 -59.9,57.8,89.0,73.7,62.2,91.9,74.6,73.6,109.2,75 -58.4,55.4,82.6,71.5,60.5,86.6,72.5,71.5,102.8,76 -58.1,53.7,76.6,68.6,58.6,81.5,70.1,68.3,95.3,77 -58.5,52.5,71.2,65.3,56.8,76.5,67.5,64.4,87.7,78 -59.2,51.8,66.7,62.0,55.1,72.2,64.9,60.5,80.5,79 -59.4,51.4,63.5,59.4,53.4,68.5,62.5,57.4,74.6,80 -59.0,51.2,61.6,57.8,51.8,65.8,60.4,55.6,70.4,81 -57.8,51.1,60.6,56.9,50.5,63.8,58.6,54.6,67.6,82 -56.2,50.9,60.1,56.3,49.3,62.5,57.0,54.1,65.5,83 -54.4,50.4,59.4,55.4,48.4,61.5,55.4,53.4,63.5,84 -52.6,49.4,58.3,54.1,47.7,60.6,53.9,52.2,61.1,85 -51.0,48.2,57.0,52.4,47.3,59.9,52.2,50.5,58.5,86 -49.5,47.1,55.8,50.7,46.9,59.2,50.4,48.5,56.1,87 -48.4,46.3,55.4,49.4,46.3,58.4,48.4,46.3,54.4,88 -47.6,46.2,56.0,48.6,45.6,57.7,46.1,44.1,53.6,89 -47.1,46.4,57.7,48.1,44.6,57.1,43.8,42.0,53.6,90 -47.1,46.9,60.2,47.8,43.5,56.9,41.8,40.0,53.9,91 -47.4,47.4,63.5,47.4,42.3,57.4,40.3,38.3,54.4,92 -48.0,47.7,67.3,46.5,41.1,58.7,39.6,36.9,54.7,93 -48.7,47.9,70.6,45.5,40.1,60.1,39.4,36.0,54.6,94 -49.3,48.1,72.4,44.3,39.4,60.6,39.4,35.8,53.9,95 -49.4,48.4,71.5,43.3,39.3,59.4,39.3,36.3,52.4,96 +91.8,48.8,67.4,75.6,42.5,56.0,66.6,38.9,50.1,0 +118.3,47.8,61.2,97.6,42.0,51.3,87.3,38.4,47.4,1 +145.6,46.6,54.6,121.4,41.6,46.6,111.7,38.1,44.9,2 +168.3,45.3,49.4,143.1,41.3,43.3,137.0,38.3,43.3,3 +182.2,44.3,46.7,159.4,41.1,42.4,160.7,39.2,43.0,4 +188.4,43.4,46.0,170.6,40.9,42.9,180.8,40.5,43.8,5 +189.4,42.8,45.9,177.6,41.0,43.7,195.6,41.7,45.0,6 +187.4,42.3,45.3,181.4,41.3,43.3,203.5,42.3,46.3,7 +184.6,42.0,43.9,182.9,41.9,41.4,203.7,42.0,47.5,8 +182.2,41.9,44.3,183.1,42.6,40.1,198.9,40.9,49.2,9 +181.2,42.0,50.0,182.9,43.1,42.8,192.6,39.6,52.2,10 +182.4,42.3,64.5,183.4,43.3,52.4,188.4,38.3,57.4,11 +186.5,42.8,89.7,185.2,43.0,71.0,189.1,37.4,65.9,12 +192.6,43.3,121.1,188.7,42.2,95.9,194.0,36.9,78.5,13 +199.7,43.9,152.6,193.7,41.3,123.5,201.6,36.9,96.5,14 +206.5,44.3,178.3,200.5,40.3,150.1,210.6,37.3,120.9,15 +212.3,44.6,193.7,208.8,39.5,172.6,219.6,38.0,151.7,16 +217.0,44.8,200.6,217.5,39.0,190.3,228.2,39.0,184.7,17 +221.0,45.0,202.4,225.2,38.9,203.3,236.0,40.2,214.5,18 +224.7,45.3,202.5,230.7,39.3,211.6,242.8,41.3,235.8,19 +228.3,46.0,203.8,233.1,40.4,215.4,248.4,42.3,244.7,20 +231.5,46.8,206.0,232.9,42.0,216.2,252.5,43.4,244.2,21 +234.1,48.0,208.6,231.4,44.0,215.7,255.0,44.7,238.7,22 +235.8,49.4,210.6,229.7,46.3,215.6,255.9,46.3,232.7,23 +236.2,51.0,211.5,228.7,48.8,217.2,255.1,48.5,229.8,24 +235.8,52.7,211.5,228.4,51.2,220.0,253.2,51.0,229.8,25 +234.8,54.2,211.1,228.8,53.2,223.1,250.5,53.4,231.4,26 +233.8,55.4,210.6,229.7,54.4,225.7,247.9,55.4,233.8,27 +232.6,56.2,210.3,230.9,54.8,227.0,245.4,56.8,235.7,28 +230.4,56.5,210.3,230.9,54.4,226.9,242.0,57.6,237.1,29 +225.9,56.6,210.4,228.0,53.5,225.8,236.2,57.8,237.9,30 +217.6,56.4,210.6,220.7,52.4,223.7,226.7,57.4,237.8,31 +204.9,56.2,210.8,207.9,51.3,220.8,212.7,56.6,236.9,32 +189.4,55.9,210.8,191.8,50.4,217.7,196.2,55.7,235.4,33 +173.1,55.6,210.4,175.3,50.1,214.8,180.2,54.8,233.6,34 +158.2,55.4,209.6,161.2,50.4,212.6,167.3,54.4,231.7,35 +146.4,55.4,208.1,151.7,51.6,211.3,159.5,54.6,230.0,36 +137.7,55.7,205.8,145.9,53.5,210.5,155.5,55.4,228.1,37 +131.7,56.7,202.6,142.2,55.8,209.1,153.4,56.7,225.4,38 +128.0,58.4,198.5,13.09,58.4,206.5,151.1,58.4,221.7,39 +126.0,61.2,193.4,135.1,61.1,202.2,147.0,60.4,216.4,40 +125.3,64.5,187.8,130.6,63.7,196.5,141.5,62.5,210.2,41 +125.2,68.1,182.3,126.0,66.2,190.3,135.6,64.6,203.7,42 +124.9,71.5,177.3,121.9,68.5,184.4,130.0,66.5,197.5,43 +124.1,74.4,173.3,118.8,70.6,179.2,125.6,68.2,192.0,44 +123.2,76.7,169.7,116.9,72.4,174.3,122.7,69.6,186.8,45 +122.6,78.4,165.6,116.5,73.7,168.9,121.4,70.7,181.1,46 +122.9,79.6,160.2,117.9,74.6,162.2,121.9,71.5,174.3,47 +124.4,80.2,153.0,120.8,74.8,153.7,124.1,72.0,165.9,48 +125.9,80.1,144.7,123.8,74.4,144.2,126.4,72.1,156.2,49 +125.9,79.2,136.0,124.8,73.3,134.6,127.0,71.7,146.1,50 +122.9,77.6,128.0,121.9,71.5,125.9,123.9,70.5,136,51 +116.0,75.1,121.3,113.9,69.1,119.1,116.1,68.7,126.7,52 +106.4,72.1,116.6,102.6,66.3,114.2,105,66.3,118.7,53 +96.0,69.1,114.0,90.3,63.7,111.1,93.1,63.8,112.6,54 +86.6,66.5,113.9,79.6,61.5,109.8,82.6,61.5,108.8,55 +79.8,64.6,116.3,72.3,60.0,110.1,75.3,59.5,107.7,56 +75.6,63.5,120.1,68.1,59.3,111.4,70.8,58.0,108.4,57 +73.6,63.1,123.8,66.1,59.2,112.9,68.2,57.0,109.8,58 +73.6,63.5,125.9,65.5,59.4,113.9,66.5,56.4,110.8,59 +75.0,64.4,125.5,65.5,59.9,113.8,64.9,56.3,110.7,60 +77.2,65.7,123.0,65.7,60.4,112.9,63.5,56.5,109.5,61 +79.4,66.8,119.5,65.8,60.6,111.4,62.3,56.9,107.7,62 +80.6,67.5,115.9,65.5,60.5,109.8,61.5,57.4,105.8,63 +80.3,67.4,113.0,64.6,59.7,108.3,61.1,57.9,104.1,64 +78.8,66.8,110.9,63.6,58.9,107.1,61.5,58.6,103.1,65 +76.7,66.0,109.5,63.0,58.3,106.2,62.5,59.7,103.1,66 +74.6,65.5,108.8,63.5,58.4,105.8,64.5,61.5,104.8,67 +72.8,65.4,108.5,65.4,59.7,105.8,67.3,64.1,108.1,68 +71.2,65.5,108.2,68.2,61.5,105.8,70.5,67.1,112.2,69 +69.5,65.3,107.1,71.2,63.3,105.3,73.5,70.1,115.9,70 +67.5,64.5,104.8,73.6,64.5,103.8,75.6,72.5,117.9,71 +65.0,62.7,100.7,74.8,64.6,100.8,76.3,74,117.3,72 +62.3,60.3,95.2,74.8,63.7,96.7,75.9,74.4,114.2,73 +59.9,57.8,89.0,73.7,62.2,91.9,74.6,73.6,109.2,74 +58.4,55.4,82.6,71.5,60.5,86.6,72.5,71.5,102.8,75 +58.1,53.7,76.6,68.6,58.6,81.5,70.1,68.3,95.3,76 +58.5,52.5,71.2,65.3,56.8,76.5,67.5,64.4,87.7,77 +59.2,51.8,66.7,62.0,55.1,72.2,64.9,60.5,80.5,78 +59.4,51.4,63.5,59.4,53.4,68.5,62.5,57.4,74.6,79 +59.0,51.2,61.6,57.8,51.8,65.8,60.4,55.6,70.4,80 +57.8,51.1,60.6,56.9,50.5,63.8,58.6,54.6,67.6,81 +56.2,50.9,60.1,56.3,49.3,62.5,57.0,54.1,65.5,82 +54.4,50.4,59.4,55.4,48.4,61.5,55.4,53.4,63.5,83 +52.6,49.4,58.3,54.1,47.7,60.6,53.9,52.2,61.1,84 +51.0,48.2,57.0,52.4,47.3,59.9,52.2,50.5,58.5,85 +49.5,47.1,55.8,50.7,46.9,59.2,50.4,48.5,56.1,86 +48.4,46.3,55.4,49.4,46.3,58.4,48.4,46.3,54.4,87 +47.6,46.2,56.0,48.6,45.6,57.7,46.1,44.1,53.6,88 +47.1,46.4,57.7,48.1,44.6,57.1,43.8,42.0,53.6,89 +47.1,46.9,60.2,47.8,43.5,56.9,41.8,40.0,53.9,90 +47.4,47.4,63.5,47.4,42.3,57.4,40.3,38.3,54.4,91 +48.0,47.7,67.3,46.5,41.1,58.7,39.6,36.9,54.7,92 +48.7,47.9,70.6,45.5,40.1,60.1,39.4,36.0,54.6,93 +49.3,48.1,72.4,44.3,39.4,60.6,39.4,35.8,53.9,94 +49.4,48.4,71.5,43.3,39.3,59.4,39.3,36.3,52.4,95 diff --git a/src/main/resources/load/lpts_g6_d0606284-5f9e-4950-a579-e02b31fa9d1a.csv b/src/main/resources/load/lpts_g6_d0606284-5f9e-4950-a579-e02b31fa9d1a.csv index a2d141656..769fdadf5 100644 --- a/src/main/resources/load/lpts_g6_d0606284-5f9e-4950-a579-e02b31fa9d1a.csv +++ b/src/main/resources/load/lpts_g6_d0606284-5f9e-4950-a579-e02b31fa9d1a.csv @@ -1,97 +1,97 @@ SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour -60.0,85.6,56.8,64.7,98.7,61,67.5,100.3,62.1,1 -59.4,79.0,52.0,63.4,91.2,54.9,67.8,91.1,55.6,2 -59.4,73.6,48.0,63.0,84.5,49.9,68.5,83.4,50.1,3 -58.9,69.3,45.0,62.4,78.5,46.2,68.1,77.4,46.2,4 -57.1,65.8,43.0,60.4,73.1,43.7,65.4,73.2,44.0,5 -54.3,63.0,41.8,57.5,68.1,42.1,61.0,70.5,43.0,6 -51.3,60.4,41.0,54.1,63.8,41.1,56.1,68.6,42.8,7 -48.5,57.7,40.4,50.8,60.0,40.4,52.0,67.0,42.7,8 -46.5,54.8,39.7,48.1,57.0,39.7,49.4,65.1,42.3,9 -45.2,51.7,39.1,45.9,54.3,39.0,48.1,63.0,41.7,10 -44.4,48.7,38.5,44.1,52.0,38.5,47.6,60.9,40.9,11 -43.9,46.2,38.1,42.7,49.7,38.1,47.3,58.9,40.4,12 -43.4,44.3,38.0,41.6,47.2,38.0,46.9,57.1,40.2,13 -43.0,42.8,38.1,40.6,44.7,38.1,46.4,55.4,40.2,14 -42.4,41.6,38.2,39.8,42.4,38.2,45.7,53.8,40.3,15 -41.6,40.4,38.1,39.3,40.4,38.1,45.0,52.0,40.4,16 -40.6,39.2,37.7,38.8,38.9,37.8,44.5,50.0,40.3,17 -39.5,38.0,37.2,38.5,37.8,37.4,44.0,48.0,40.2,18 -38.6,37.2,36.9,38.3,37.1,37.0,43.8,46.3,40.2,19 -38.1,37.0,37.0,38.1,37.0,37.0,43.9,45.0,40.4,20 -38.2,37.5,37.6,37.9,37.2,37.3,44.2,44.4,40.9,21 -38.7,38.3,38.6,37.7,37.5,37.9,44.7,44.3,41.6,22 -39.5,39.1,39.6,37.4,37.5,38.6,45.1,44.2,42.3,23 -40.4,39.3,40.4,37.0,37.0,39.3,45.0,43.9,42.7,24 -41.3,38.6,40.8,36.4,35.7,39.8,44.6,43.2,42.9,25 -42.3,37.7,41.0,36.3,34.5,40.4,44.0,42.5,43.0,26 -43.9,37.7,41.5,37.0,34.6,41.2,44.0,42.6,43.6,27 -46.2,39.3,42.7,39.3,37.0,42.7,45.0,43.9,45.0,28 -49.5,43.2,45.0,43.3,42.3,45.0,47.5,46.9,47.7,29 -53.4,49.1,48.3,48.5,49.8,48.1,51.1,51.1,51.7,30 -57.5,56.1,52.6,54.0,58.0,52.0,55.5,55.7,57.0,31 -61.2,63.5,57.7,58.9,65.8,56.6,60.0,60.0,63.5,32 -64.3,70.9,63.6,62.6,72.3,61.8,64.5,63.8,71.1,33 -67.2,78.3,69.6,65.6,78.7,67.5,68.6,68.3,79.2,34 -70.2,86.1,75.2,68.7,86.4,73.1,72.1,75.4,86.9,35 -73.9,94.7,79.7,72.8,97.0,78.5,75.1,86.6,93.5,36 -78.7,104.4,82.8,78.3,111.6,83.4,77.5,103.2,98.6,37 -84.7,115.4,85.2,85.5,129.1,88.1,80.8,123.6,102.6,38 -91.9,127.9,87.7,94.1,147.9,92.9,86.8,145.8,106.4,39 -100.5,142.0,91.2,103.9,166.3,98.2,97.0,167.4,110.9,40 -110.2,157.7,96.5,114.8,183.1,104.3,112.5,186.9,116.8,41 -120.3,173.7,103.5,126.0,198.4,111.6,131.1,203.9,124.4,42 -129.7,188.2,111.8,136.5,213.1,120.6,150.0,218.5,133.9,43 -137.4,199.8,121.3,145.5,227.5,131.6,166.3,231.0,145.5,44 -142.7,207.2,131.4,152.3,242.0,144.7,177.7,241.2,159.0,45 -145.9,211.0,141.2,157.1,255.2,158.3,184.6,249.2,172.7,46 -147.4,212.5,149.8,160.1,265.6,170.4,187.8,254.7,184.3,47 -147.8,212.5,155.9,161.7,271.4,179.0,188.2,257.5,191.7,48 -147.5,212.0,158.9,162.1,271.6,182.7,186.8,257.7,193.5,49 -146.8,211.5,159.2,161.8,267.8,182.6,184.3,256.1,191.1,50 -145.7,211.2,157.5,161.1,262.4,180.1,181.4,253.8,186.7,51 -144.3,211.3,154.7,160.5,257.5,176.7,179.0,251.7,182.5,52 -143.0,211.8,151.3,160.3,254.9,173.6,177.5,250.6,179.8,53 -142.1,211.7,147.2,160.7,253.3,170.1,177.0,249.1,177.6,54 -142.4,209.7,141.9,161.8,250.9,165.3,177.2,245.5,174.1,55 -144.3,204.4,135.1,164.0,246.0,158.2,177.8,237.9,167.4,56 -148.4,195.1,126.7,167.1,237.1,148.2,178.8,225.3,156.5,57 -154.0,183.1,117.8,170.9,225.2,136.6,179.9,209.3,143.2,58 -160.6,170.2,109.4,174.7,211.5,125.1,181.2,192.3,130.2,59 -167.4,158.2,102.8,177.8,197.5,115.5,182.5,176.7,120.1,60 -173.8,148.6,98.9,180.0,184.2,109.0,183.7,164.2,114.8,61 -179.2,141.2,97.3,181.2,171.9,105.2,184.8,154.7,113.5,62 -183.1,135.3,97.3,181.6,160.6,103.4,185.5,147.5,114.2,63 -184.8,130.5,98.2,181.3,150.1,102.8,185.9,142.0,115.5,64 -184.1,126.4,99.3,180.7,140.8,102.7,186.0,137.9,116.0,65 -182.1,123.6,100.8,180.5,133.8,103.7,186.9,136.1,116.6,66 -179.9,123.1,103.0,181.6,130.7,106.2,189.9,138.2,118.7,67 -179.0,125.9,106.2,184.8,132.8,110.9,196.3,145.5,123.6,68 -180.3,132.5,110.6,190.7,141.1,118.1,207.0,158.9,132.1,69 -183.8,142.1,115.8,198.9,154.4,127.2,220.8,176.8,143.0,70 -189.2,153.8,121.4,208.8,170.7,137.4,236.3,196.9,154.6,71 -196.3,166.3,127.0,219.4,188.2,147.8,251.7,217.1,165.1,72 -204.6,178.7,132.3,230.2,205.2,157.6,265.8,235.2,173.3,73 -213.4,190.1,137.1,240.7,220.5,166.3,277.9,249.8,179.3,74 -221.7,199.7,141.5,250.3,232.9,173.6,287.6,259.6,183.7,75 -228.6,206.7,145.5,258.7,241.3,179.0,294.5,263.3,187.1,76 -233.6,210.6,149.1,265.2,245.2,182.4,298.1,260.3,189.8,77 -236.4,212.0,152.2,269.8,245.3,184.2,298.7,252.5,192.1,78 -237.4,211.6,154.5,271.9,242.8,185.1,296.3,242.6,193.9,79 -236.7,210.2,155.9,271.4,239.0,185.9,291.0,233.3,195.2,80 -234.5,208.4,156.3,268.1,234.9,187.0,283.1,226.5,195.9,81 -231.0,206.0,155.8,262.6,230.1,188.0,273.4,221.6,195.8,82 -226.3,202.5,154.8,255.8,224.3,188.2,262.6,217.3,194.5,83 -220.6,197.5,153.6,248.3,217.1,187.1,251.7,212.5,191.7,84 -213.9,190.5,152.2,240.7,208.0,184.0,241.3,205.9,187.0,85 -206.1,182.0,150.0,232.6,197.2,178.9,231.2,197.3,180.2,86 -197.2,172.2,146.1,223.4,184.8,171.4,220.9,186.5,171.4,87 -187.1,161.7,139.7,212.5,170.9,161.7,210.2,173.2,160.5,88 -175.6,150.7,130.3,199.4,155.9,149.6,198.6,157.6,147.6,89 -163.1,139.2,118.7,184.8,140.2,136.0,186.3,140.7,133.5,90 -150.3,127.1,106.4,169.6,124.6,122.0,173.5,123.9,119.4,91 -137.4,114.3,94.7,154.7,109.7,108.5,160.5,108.5,106.2,92 -125.1,100.9,84.5,141.0,96.0,96.4,147.5,95.6,95.0,93 -113.5,87.5,76.0,128.5,83.9,85.8,134.7,84.9,85.4,94 -102.9,75.1,68.7,117.3,73.4,76.4,122.4,76.0,76.9,95 -93.5,64.7,62.4,107.4,64.7,68.1,110.9,68.1,69.3,96 +60.0,85.6,56.8,64.7,98.7,61,67.5,100.3,62.1,0 +59.4,79.0,52.0,63.4,91.2,54.9,67.8,91.1,55.6,1 +59.4,73.6,48.0,63.0,84.5,49.9,68.5,83.4,50.1,2 +58.9,69.3,45.0,62.4,78.5,46.2,68.1,77.4,46.2,3 +57.1,65.8,43.0,60.4,73.1,43.7,65.4,73.2,44.0,4 +54.3,63.0,41.8,57.5,68.1,42.1,61.0,70.5,43.0,5 +51.3,60.4,41.0,54.1,63.8,41.1,56.1,68.6,42.8,6 +48.5,57.7,40.4,50.8,60.0,40.4,52.0,67.0,42.7,7 +46.5,54.8,39.7,48.1,57.0,39.7,49.4,65.1,42.3,8 +45.2,51.7,39.1,45.9,54.3,39.0,48.1,63.0,41.7,9 +44.4,48.7,38.5,44.1,52.0,38.5,47.6,60.9,40.9,10 +43.9,46.2,38.1,42.7,49.7,38.1,47.3,58.9,40.4,11 +43.4,44.3,38.0,41.6,47.2,38.0,46.9,57.1,40.2,12 +43.0,42.8,38.1,40.6,44.7,38.1,46.4,55.4,40.2,13 +42.4,41.6,38.2,39.8,42.4,38.2,45.7,53.8,40.3,14 +41.6,40.4,38.1,39.3,40.4,38.1,45.0,52.0,40.4,15 +40.6,39.2,37.7,38.8,38.9,37.8,44.5,50.0,40.3,16 +39.5,38.0,37.2,38.5,37.8,37.4,44.0,48.0,40.2,17 +38.6,37.2,36.9,38.3,37.1,37.0,43.8,46.3,40.2,18 +38.1,37.0,37.0,38.1,37.0,37.0,43.9,45.0,40.4,19 +38.2,37.5,37.6,37.9,37.2,37.3,44.2,44.4,40.9,20 +38.7,38.3,38.6,37.7,37.5,37.9,44.7,44.3,41.6,21 +39.5,39.1,39.6,37.4,37.5,38.6,45.1,44.2,42.3,22 +40.4,39.3,40.4,37.0,37.0,39.3,45.0,43.9,42.7,23 +41.3,38.6,40.8,36.4,35.7,39.8,44.6,43.2,42.9,24 +42.3,37.7,41.0,36.3,34.5,40.4,44.0,42.5,43.0,25 +43.9,37.7,41.5,37.0,34.6,41.2,44.0,42.6,43.6,26 +46.2,39.3,42.7,39.3,37.0,42.7,45.0,43.9,45.0,27 +49.5,43.2,45.0,43.3,42.3,45.0,47.5,46.9,47.7,28 +53.4,49.1,48.3,48.5,49.8,48.1,51.1,51.1,51.7,29 +57.5,56.1,52.6,54.0,58.0,52.0,55.5,55.7,57.0,30 +61.2,63.5,57.7,58.9,65.8,56.6,60.0,60.0,63.5,31 +64.3,70.9,63.6,62.6,72.3,61.8,64.5,63.8,71.1,32 +67.2,78.3,69.6,65.6,78.7,67.5,68.6,68.3,79.2,33 +70.2,86.1,75.2,68.7,86.4,73.1,72.1,75.4,86.9,34 +73.9,94.7,79.7,72.8,97.0,78.5,75.1,86.6,93.5,35 +78.7,104.4,82.8,78.3,111.6,83.4,77.5,103.2,98.6,36 +84.7,115.4,85.2,85.5,129.1,88.1,80.8,123.6,102.6,37 +91.9,127.9,87.7,94.1,147.9,92.9,86.8,145.8,106.4,38 +100.5,142.0,91.2,103.9,166.3,98.2,97.0,167.4,110.9,39 +110.2,157.7,96.5,114.8,183.1,104.3,112.5,186.9,116.8,40 +120.3,173.7,103.5,126.0,198.4,111.6,131.1,203.9,124.4,41 +129.7,188.2,111.8,136.5,213.1,120.6,150.0,218.5,133.9,42 +137.4,199.8,121.3,145.5,227.5,131.6,166.3,231.0,145.5,43 +142.7,207.2,131.4,152.3,242.0,144.7,177.7,241.2,159.0,44 +145.9,211.0,141.2,157.1,255.2,158.3,184.6,249.2,172.7,45 +147.4,212.5,149.8,160.1,265.6,170.4,187.8,254.7,184.3,46 +147.8,212.5,155.9,161.7,271.4,179.0,188.2,257.5,191.7,47 +147.5,212.0,158.9,162.1,271.6,182.7,186.8,257.7,193.5,48 +146.8,211.5,159.2,161.8,267.8,182.6,184.3,256.1,191.1,49 +145.7,211.2,157.5,161.1,262.4,180.1,181.4,253.8,186.7,50 +144.3,211.3,154.7,160.5,257.5,176.7,179.0,251.7,182.5,51 +143.0,211.8,151.3,160.3,254.9,173.6,177.5,250.6,179.8,52 +142.1,211.7,147.2,160.7,253.3,170.1,177.0,249.1,177.6,53 +142.4,209.7,141.9,161.8,250.9,165.3,177.2,245.5,174.1,54 +144.3,204.4,135.1,164.0,246.0,158.2,177.8,237.9,167.4,55 +148.4,195.1,126.7,167.1,237.1,148.2,178.8,225.3,156.5,56 +154.0,183.1,117.8,170.9,225.2,136.6,179.9,209.3,143.2,57 +160.6,170.2,109.4,174.7,211.5,125.1,181.2,192.3,130.2,58 +167.4,158.2,102.8,177.8,197.5,115.5,182.5,176.7,120.1,59 +173.8,148.6,98.9,180.0,184.2,109.0,183.7,164.2,114.8,60 +179.2,141.2,97.3,181.2,171.9,105.2,184.8,154.7,113.5,61 +183.1,135.3,97.3,181.6,160.6,103.4,185.5,147.5,114.2,62 +184.8,130.5,98.2,181.3,150.1,102.8,185.9,142.0,115.5,63 +184.1,126.4,99.3,180.7,140.8,102.7,186.0,137.9,116.0,64 +182.1,123.6,100.8,180.5,133.8,103.7,186.9,136.1,116.6,65 +179.9,123.1,103.0,181.6,130.7,106.2,189.9,138.2,118.7,66 +179.0,125.9,106.2,184.8,132.8,110.9,196.3,145.5,123.6,67 +180.3,132.5,110.6,190.7,141.1,118.1,207.0,158.9,132.1,68 +183.8,142.1,115.8,198.9,154.4,127.2,220.8,176.8,143.0,69 +189.2,153.8,121.4,208.8,170.7,137.4,236.3,196.9,154.6,70 +196.3,166.3,127.0,219.4,188.2,147.8,251.7,217.1,165.1,71 +204.6,178.7,132.3,230.2,205.2,157.6,265.8,235.2,173.3,72 +213.4,190.1,137.1,240.7,220.5,166.3,277.9,249.8,179.3,73 +221.7,199.7,141.5,250.3,232.9,173.6,287.6,259.6,183.7,74 +228.6,206.7,145.5,258.7,241.3,179.0,294.5,263.3,187.1,75 +233.6,210.6,149.1,265.2,245.2,182.4,298.1,260.3,189.8,76 +236.4,212.0,152.2,269.8,245.3,184.2,298.7,252.5,192.1,77 +237.4,211.6,154.5,271.9,242.8,185.1,296.3,242.6,193.9,78 +236.7,210.2,155.9,271.4,239.0,185.9,291.0,233.3,195.2,79 +234.5,208.4,156.3,268.1,234.9,187.0,283.1,226.5,195.9,80 +231.0,206.0,155.8,262.6,230.1,188.0,273.4,221.6,195.8,81 +226.3,202.5,154.8,255.8,224.3,188.2,262.6,217.3,194.5,82 +220.6,197.5,153.6,248.3,217.1,187.1,251.7,212.5,191.7,83 +213.9,190.5,152.2,240.7,208.0,184.0,241.3,205.9,187.0,84 +206.1,182.0,150.0,232.6,197.2,178.9,231.2,197.3,180.2,85 +197.2,172.2,146.1,223.4,184.8,171.4,220.9,186.5,171.4,86 +187.1,161.7,139.7,212.5,170.9,161.7,210.2,173.2,160.5,87 +175.6,150.7,130.3,199.4,155.9,149.6,198.6,157.6,147.6,88 +163.1,139.2,118.7,184.8,140.2,136.0,186.3,140.7,133.5,89 +150.3,127.1,106.4,169.6,124.6,122.0,173.5,123.9,119.4,90 +137.4,114.3,94.7,154.7,109.7,108.5,160.5,108.5,106.2,91 +125.1,100.9,84.5,141.0,96.0,96.4,147.5,95.6,95.0,92 +113.5,87.5,76.0,128.5,83.9,85.8,134.7,84.9,85.4,93 +102.9,75.1,68.7,117.3,73.4,76.4,122.4,76.0,76.9,94 +93.5,64.7,62.4,107.4,64.7,68.1,110.9,68.1,69.3,95 diff --git a/src/main/resources/load/lpts_l1_aa65260e-efd5-49af-961b-b0daf04fdeee.csv b/src/main/resources/load/lpts_l1_aa65260e-efd5-49af-961b-b0daf04fdeee.csv index d1a2c5f8f..61be35c0e 100644 --- a/src/main/resources/load/lpts_l1_aa65260e-efd5-49af-961b-b0daf04fdeee.csv +++ b/src/main/resources/load/lpts_l1_aa65260e-efd5-49af-961b-b0daf04fdeee.csv @@ -1,97 +1,97 @@ SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour -58.2,53.8,57.7,64.9,60.4,64.4,67.9,63.5,66.7,1 -57.3,53.3,56.2,63.8,59.6,62.6,67.6,62.2,64.8,2 -56.7,53.0,54.9,62.9,59.1,61.0,67.8,61.4,63.2,3 -56.1,52.6,53.7,61.9,58.4,59.6,67.8,60.8,61.9,4 -55.2,51.7,52.6,60.6,57.3,58.2,67.3,59.9,60.8,5 -54.2,50.6,51.6,59.1,56.1,57.0,66.5,59.0,59.8,6 -53.3,49.6,50.8,57.9,55.1,56.2,65.4,58.1,59.0,7 -52.6,49.1,50.2,57.2,54.9,56.1,64.3,57.2,58.4,8 -52.2,49.1,50.1,57.4,55.7,56.7,63.2,56.7,58.0,9 -52.0,49.6,50.2,58.0,57.0,57.6,62.3,56.3,57.7,10 -51.8,50.1,50.3,58.5,58.1,58.3,61.5,56.1,57.5,11 -51.4,50.2,50.2,58.4,58.4,58.4,60.8,56.1,57.2,12 -50.7,49.8,49.9,57.5,57.4,57.5,60.1,56.2,57.0,13 -49.7,48.9,49.2,55.9,55.5,55.9,59.5,56.3,56.7,14 -48.7,47.8,48.5,54.1,53.3,54.1,59.0,56.3,56.4,15 -47.9,46.7,47.9,52.6,51.4,52.6,58.4,56.1,56.1,16 -47.4,46.0,47.4,51.6,50.4,51.7,57.8,55.5,55.7,17 -47.3,45.6,47.2,51.1,50.3,51.5,57.3,54.9,55.5,18 -47.5,45.8,47.4,51.1,51.0,51.8,57.1,54.6,55.6,19 -47.9,46.7,47.9,51.4,52.6,52.6,57.2,54.9,56.1,20 -48.5,48.5,48.9,52.1,54.9,53.8,58.0,56.1,57.2,21 -49.3,51.1,50.7,53.1,58.1,55.9,59.3,58.6,59.4,22 -50.3,54.8,53.4,54.8,62.4,59.2,61.4,62.8,62.7,23 -51.4,59.6,57.2,57.2,67.8,64.3,64.3,68.9,67.8,24 -53.1,65.8,62.8,60.8,74.7,71.5,68.2,77.5,74.8,25 -57.1,75.1,71.2,67.0,84.4,81.9,74.7,89.2,84.9,26 -66.0,89.1,84.0,77.3,98.3,96.3,85.3,104.8,98.9,27 -81.8,109.8,102.8,93.5,118.0,115.7,101.6,125.0,118.0,28 -105.9,137.8,128.1,116.4,144.0,140.3,124.9,150.1,142.5,29 -135.6,169.2,156.9,144.2,173.6,168.1,153.4,178.5,170.9,30 -167.0,198.9,185.2,174.4,203.1,196.6,185.3,208.2,200.8,31 -196.3,222.0,209.1,204.5,229.0,223.1,218.5,237.2,230.2,32 -220.0,234.3,225.3,231.5,248.0,245.1,250.4,263.0,256.4,33 -235.9,236.2,232.6,252.2,258.5,259.7,276.9,282.1,276.3,34 -241.9,229.0,230.9,262.7,259.2,264.2,293.5,290.8,286.3,35 -236.0,213.8,219.6,259.4,248.9,255.9,295.6,285.1,282.7,36 -217.4,192.5,199.4,240.3,227.3,233.6,280.5,263.1,263.8,37 -190.6,168.3,174.1,210.7,198.8,202.5,252.9,230.4,234.4,38 -161.4,144.9,148.5,177.8,169.1,169.5,219.2,194.8,201.1,39 -135.5,126.2,127.3,148.4,143.7,141.4,185.8,163.6,170.6,40 -117.5,114.8,114.4,128.2,126.8,123.3,158.0,142.8,148.1,41 -107.1,109.9,108.7,116.7,117.8,114.3,137.3,131.8,133.7,42 -102.7,109.6,108.3,112.0,114.7,111.8,123.9,128.2,126.0,43 -102.8,112.2,111.0,112.2,115.7,113.3,118.0,129.7,123.8,44 -105.9,115.9,115.0,115.3,118.7,116.5,119.2,134.0,125.7,45 -109.8,119.3,118.7,119.2,122.2,119.6,124.5,138.9,129.3,46 -112.6,121.2,121.0,122.0,124.5,121.4,130.0,142.1,132.2,47 -112.2,120.3,120.3,121.5,123.8,120.3,132.0,141.4,132.0,48 -107.1,115.9,116.0,116.4,119.2,115.6,127.8,135.2,127.0,49 -98.8,108.9,109.0,108.1,111.8,108.4,119.2,125.4,118.8,50 -89.7,100.9,100.9,98.9,103.4,100.4,109.1,114.6,109.6,51 -81.8,93.5,93.5,91.1,95.8,93.5,100.5,105.1,101.6,52 -76.8,87.9,87.9,86.4,90.5,88.9,95.5,99.2,96.8,53 -74.3,84.2,84.2,84,87.3,86.4,93.4,96.4,94.6,54 -73.2,82.3,82.2,82.9,85.8,85.4,92.8,95.9,94.2,55 -72.4,81.8,81.8,81.8,85.3,85.3,92.3,97,94.6,56 -71.2,82.5,82.5,79.8,85.4,85.5,90.7,98.7,95.1,57 -69.7,84.0,83.9,77.4,85.8,85.9,88.2,100.7,95.5,58 -68.0,85.5,85.5,75.1,86.2,86.3,85.5,102.6,95.7,59 -66.6,86.5,86.5,73.6,86.5,86.5,83.0,104.0,95.8,60 -65.6,86.5,86.5,73.4,86.3,86.3,81.1,104.6,95.8,61 -65.0,85.8,85.9,74.1,85.8,86.0,79.9,104.8,95.8,62 -64.6,84.8,85.0,75.2,85.0,85.6,79.4,104.9,96.1,63 -64.3,84.1,84.1,75.9,84.1,85.3,79.4,105.1,97.0,64 -63.9,83.9,83.7,76.1,83.2,85.2,80.1,106.1,98.5,65 -63.8,84.1,83.5,76.1,82.6,85.4,81.5,107.9,101.2,66 -64.2,84.2,83.3,77.0,82.8,86.2,84.3,111.0,105.2,67 -65.4,84.1,83.0,79.4,84.1,87.6,88.8,115.7,111.0,68 -68.1,84.0,82.8,84.5,87.4,90.3,95.7,122.5,119.1,69 -74.2,86.4,85.7,93.6,94.7,96.6,106.9,133.2,131.1,70 -85.8,94.8,95.1,108.5,108.4,109.2,124.9,149.7,148.8,71 -105.1,112.2,114.5,130.9,130.9,130.9,151.9,174.1,174.1,72 -133.1,140.2,145.3,161.0,162.9,162.7,188.6,206.9,207.3,73 -164.7,173.4,181.1,194.2,198.9,198.8,229.1,242.9,243.1,74 -193.7,205.0,213.8,224.4,231.9,232.0,266.1,275.4,274.4,75 -213.8,227.8,234.8,245.3,254.7,254.7,292.1,297.9,294.4,76 -220.4,236.6,238.4,252.6,262.0,261.4,301.4,305.2,298.0,77 -215.3,232.9,227.6,247.7,256.0,254.4,295.6,298.6,287.5,78 -201.8,219.9,208.2,233.7,240.6,237.9,278.1,280.8,267.1,79 -183.4,201.0,185.8,213.8,219.6,216.1,252.4,254.7,240.7,80 -163.1,179.1,164.9,190.8,196.8,192.7,221.6,223.1,212.2,81 -142.7,156.5,146.5,167.0,173.8,169.6,189.2,189.7,183.8,82 -123.7,135.1,130.5,144.4,152.2,148.1,158.2,158.1,157.6,83 -107.5,116.8,116.8,125.0,133.2,129.7,132,132.0,135.5,84 -95.2,103.2,105.4,110.4,118,115.3,113.0,114.3,118.9,85 -86.4,93.5,96.1,99.9,106.3,104.6,100.3,103.5,107.2,86 -80.2,86.7,88.7,92.7,97.5,96.8,92.4,97.3,99.1,87 -75.9,81.8,83.0,87.6,91.1,91.1,87.6,93.5,93.5,88 -72.7,77.7,78.6,83.8,86.5,86.9,84.6,90.0,89.3,89 -70.2,74.1,75.3,80.6,83.0,83.7,82.4,86.6,86.1,90 -67.9,70.9,72.6,77.8,80.0,80.9,80.5,83.0,83.3,91 -65.4,67.8,70.1,74.8,77.1,78.3,78.3,79.4,80.6,92 -62.6,64.7,67.4,71.3,73.8,75.3,75.3,75.8,77.7,93 -59.6,61.8,64.6,67.8,70.3,72.3,71.8,72.3,74.6,94 -57.0,59.2,61.9,64.5,67.0,69.3,68.3,69.1,71.6,95 -54.9,57.2,59.6,61.9,64.3,66.6,65.4,66.6,68.9,96 +58.2,53.8,57.7,64.9,60.4,64.4,67.9,63.5,66.7,0 +57.3,53.3,56.2,63.8,59.6,62.6,67.6,62.2,64.8,1 +56.7,53.0,54.9,62.9,59.1,61.0,67.8,61.4,63.2,2 +56.1,52.6,53.7,61.9,58.4,59.6,67.8,60.8,61.9,3 +55.2,51.7,52.6,60.6,57.3,58.2,67.3,59.9,60.8,4 +54.2,50.6,51.6,59.1,56.1,57.0,66.5,59.0,59.8,5 +53.3,49.6,50.8,57.9,55.1,56.2,65.4,58.1,59.0,6 +52.6,49.1,50.2,57.2,54.9,56.1,64.3,57.2,58.4,7 +52.2,49.1,50.1,57.4,55.7,56.7,63.2,56.7,58.0,8 +52.0,49.6,50.2,58.0,57.0,57.6,62.3,56.3,57.7,9 +51.8,50.1,50.3,58.5,58.1,58.3,61.5,56.1,57.5,10 +51.4,50.2,50.2,58.4,58.4,58.4,60.8,56.1,57.2,11 +50.7,49.8,49.9,57.5,57.4,57.5,60.1,56.2,57.0,12 +49.7,48.9,49.2,55.9,55.5,55.9,59.5,56.3,56.7,13 +48.7,47.8,48.5,54.1,53.3,54.1,59.0,56.3,56.4,14 +47.9,46.7,47.9,52.6,51.4,52.6,58.4,56.1,56.1,15 +47.4,46.0,47.4,51.6,50.4,51.7,57.8,55.5,55.7,16 +47.3,45.6,47.2,51.1,50.3,51.5,57.3,54.9,55.5,17 +47.5,45.8,47.4,51.1,51.0,51.8,57.1,54.6,55.6,18 +47.9,46.7,47.9,51.4,52.6,52.6,57.2,54.9,56.1,19 +48.5,48.5,48.9,52.1,54.9,53.8,58.0,56.1,57.2,20 +49.3,51.1,50.7,53.1,58.1,55.9,59.3,58.6,59.4,21 +50.3,54.8,53.4,54.8,62.4,59.2,61.4,62.8,62.7,22 +51.4,59.6,57.2,57.2,67.8,64.3,64.3,68.9,67.8,23 +53.1,65.8,62.8,60.8,74.7,71.5,68.2,77.5,74.8,24 +57.1,75.1,71.2,67.0,84.4,81.9,74.7,89.2,84.9,25 +66.0,89.1,84.0,77.3,98.3,96.3,85.3,104.8,98.9,26 +81.8,109.8,102.8,93.5,118.0,115.7,101.6,125.0,118.0,27 +105.9,137.8,128.1,116.4,144.0,140.3,124.9,150.1,142.5,28 +135.6,169.2,156.9,144.2,173.6,168.1,153.4,178.5,170.9,29 +167.0,198.9,185.2,174.4,203.1,196.6,185.3,208.2,200.8,30 +196.3,222.0,209.1,204.5,229.0,223.1,218.5,237.2,230.2,31 +220.0,234.3,225.3,231.5,248.0,245.1,250.4,263.0,256.4,32 +235.9,236.2,232.6,252.2,258.5,259.7,276.9,282.1,276.3,33 +241.9,229.0,230.9,262.7,259.2,264.2,293.5,290.8,286.3,34 +236.0,213.8,219.6,259.4,248.9,255.9,295.6,285.1,282.7,35 +217.4,192.5,199.4,240.3,227.3,233.6,280.5,263.1,263.8,36 +190.6,168.3,174.1,210.7,198.8,202.5,252.9,230.4,234.4,37 +161.4,144.9,148.5,177.8,169.1,169.5,219.2,194.8,201.1,38 +135.5,126.2,127.3,148.4,143.7,141.4,185.8,163.6,170.6,39 +117.5,114.8,114.4,128.2,126.8,123.3,158.0,142.8,148.1,40 +107.1,109.9,108.7,116.7,117.8,114.3,137.3,131.8,133.7,41 +102.7,109.6,108.3,112.0,114.7,111.8,123.9,128.2,126.0,42 +102.8,112.2,111.0,112.2,115.7,113.3,118.0,129.7,123.8,43 +105.9,115.9,115.0,115.3,118.7,116.5,119.2,134.0,125.7,44 +109.8,119.3,118.7,119.2,122.2,119.6,124.5,138.9,129.3,45 +112.6,121.2,121.0,122.0,124.5,121.4,130.0,142.1,132.2,46 +112.2,120.3,120.3,121.5,123.8,120.3,132.0,141.4,132.0,47 +107.1,115.9,116.0,116.4,119.2,115.6,127.8,135.2,127.0,48 +98.8,108.9,109.0,108.1,111.8,108.4,119.2,125.4,118.8,49 +89.7,100.9,100.9,98.9,103.4,100.4,109.1,114.6,109.6,50 +81.8,93.5,93.5,91.1,95.8,93.5,100.5,105.1,101.6,51 +76.8,87.9,87.9,86.4,90.5,88.9,95.5,99.2,96.8,52 +74.3,84.2,84.2,84,87.3,86.4,93.4,96.4,94.6,53 +73.2,82.3,82.2,82.9,85.8,85.4,92.8,95.9,94.2,54 +72.4,81.8,81.8,81.8,85.3,85.3,92.3,97,94.6,55 +71.2,82.5,82.5,79.8,85.4,85.5,90.7,98.7,95.1,56 +69.7,84.0,83.9,77.4,85.8,85.9,88.2,100.7,95.5,57 +68.0,85.5,85.5,75.1,86.2,86.3,85.5,102.6,95.7,58 +66.6,86.5,86.5,73.6,86.5,86.5,83.0,104.0,95.8,59 +65.6,86.5,86.5,73.4,86.3,86.3,81.1,104.6,95.8,60 +65.0,85.8,85.9,74.1,85.8,86.0,79.9,104.8,95.8,61 +64.6,84.8,85.0,75.2,85.0,85.6,79.4,104.9,96.1,62 +64.3,84.1,84.1,75.9,84.1,85.3,79.4,105.1,97.0,63 +63.9,83.9,83.7,76.1,83.2,85.2,80.1,106.1,98.5,64 +63.8,84.1,83.5,76.1,82.6,85.4,81.5,107.9,101.2,65 +64.2,84.2,83.3,77.0,82.8,86.2,84.3,111.0,105.2,66 +65.4,84.1,83.0,79.4,84.1,87.6,88.8,115.7,111.0,67 +68.1,84.0,82.8,84.5,87.4,90.3,95.7,122.5,119.1,68 +74.2,86.4,85.7,93.6,94.7,96.6,106.9,133.2,131.1,69 +85.8,94.8,95.1,108.5,108.4,109.2,124.9,149.7,148.8,70 +105.1,112.2,114.5,130.9,130.9,130.9,151.9,174.1,174.1,71 +133.1,140.2,145.3,161.0,162.9,162.7,188.6,206.9,207.3,72 +164.7,173.4,181.1,194.2,198.9,198.8,229.1,242.9,243.1,73 +193.7,205.0,213.8,224.4,231.9,232.0,266.1,275.4,274.4,74 +213.8,227.8,234.8,245.3,254.7,254.7,292.1,297.9,294.4,75 +220.4,236.6,238.4,252.6,262.0,261.4,301.4,305.2,298.0,76 +215.3,232.9,227.6,247.7,256.0,254.4,295.6,298.6,287.5,77 +201.8,219.9,208.2,233.7,240.6,237.9,278.1,280.8,267.1,78 +183.4,201.0,185.8,213.8,219.6,216.1,252.4,254.7,240.7,79 +163.1,179.1,164.9,190.8,196.8,192.7,221.6,223.1,212.2,80 +142.7,156.5,146.5,167.0,173.8,169.6,189.2,189.7,183.8,81 +123.7,135.1,130.5,144.4,152.2,148.1,158.2,158.1,157.6,82 +107.5,116.8,116.8,125.0,133.2,129.7,132,132.0,135.5,83 +95.2,103.2,105.4,110.4,118,115.3,113.0,114.3,118.9,84 +86.4,93.5,96.1,99.9,106.3,104.6,100.3,103.5,107.2,85 +80.2,86.7,88.7,92.7,97.5,96.8,92.4,97.3,99.1,86 +75.9,81.8,83.0,87.6,91.1,91.1,87.6,93.5,93.5,87 +72.7,77.7,78.6,83.8,86.5,86.9,84.6,90.0,89.3,88 +70.2,74.1,75.3,80.6,83.0,83.7,82.4,86.6,86.1,89 +67.9,70.9,72.6,77.8,80.0,80.9,80.5,83.0,83.3,90 +65.4,67.8,70.1,74.8,77.1,78.3,78.3,79.4,80.6,91 +62.6,64.7,67.4,71.3,73.8,75.3,75.3,75.8,77.7,92 +59.6,61.8,64.6,67.8,70.3,72.3,71.8,72.3,74.6,93 +57.0,59.2,61.9,64.5,67.0,69.3,68.3,69.1,71.6,94 +54.9,57.2,59.6,61.9,64.3,66.6,65.4,66.6,68.9,95 diff --git a/src/main/resources/load/lpts_l2_9029deec-5f70-4647-96db-086f463d0e0d.csv b/src/main/resources/load/lpts_l2_9029deec-5f70-4647-96db-086f463d0e0d.csv index 29346ad06..4bc665ade 100644 --- a/src/main/resources/load/lpts_l2_9029deec-5f70-4647-96db-086f463d0e0d.csv +++ b/src/main/resources/load/lpts_l2_9029deec-5f70-4647-96db-086f463d0e0d.csv @@ -1,97 +1,97 @@ SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour -70.9,65.9,69.7,74.5,66.8,73.1,77.1,70.0,75.2,1 -69.3,63.7,66.6,72.3,64.3,69.3,76.3,67.4,71.9,2 -68.0,61.8,63.9,70.7,62.4,66.0,76.1,65.6,69.1,3 -66.8,60.2,61.8,69.2,61.0,63.5,75.8,64.3,66.8,4 -65.1,58.8,60.2,67.8,60.0,61.8,75.0,63.5,64.8,5 -63.1,57.7,58.9,66.2,59.1,60.7,73.7,62.9,63.2,6 -61.2,56.7,57.8,64.8,58.4,60.0,72.0,62.4,61.9,7 -59.4,56.1,56.9,63.5,57.7,59.4,70.1,61.8,61.0,8 -57.9,55.6,56.0,62.4,57.0,58.6,68.1,61.0,60.4,9 -56.8,55.2,55.1,61.4,56.2,57.7,66.2,60.1,59.9,10 -56.0,54.9,54.3,60.4,55.6,56.9,64.3,59.2,59.6,11 -55.2,54.4,53.6,59.4,55.2,56.1,62.7,58.5,59.4,12 -54.5,53.8,53.1,58.1,55.1,55.4,61.2,58.1,59.0,13 -53.9,53.1,52.7,56.9,55.2,54.9,60.0,57.9,58.7,14 -53.3,52.5,52.3,55.8,55.3,54.6,59.1,57.8,58.2,15 -52.8,51.9,51.9,55.2,55.2,54.4,58.5,57.7,57.7,16 -52.4,51.6,51.5,55.2,54.9,54.5,58.3,57.5,57.1,17 -52.1,51.6,51.3,55.6,54.7,54.7,58.3,57.3,56.7,18 -51.9,52.0,51.3,56.2,54.7,55.3,58.7,57.6,56.8,19 -51.9,52.8,51.9,56.9,55.2,56.1,59.4,58.5,57.7,20 -52.1,54.1,53.2,57.4,56.7,57.2,60.3,60.4,59.6,21 -52.6,56.1,55.2,57.9,59.1,59.0,61.3,63.3,62.3,22 -53.3,59.1,57.8,58.5,62.7,61.8,62.4,67.4,65.9,23 -54.4,63.5,61.0,59.4,67.6,65.9,63.5,72.5,70.1,24 -56.0,69.3,64.8,60.7,73.9,71.7,64.5,78.9,74.8,25 -58.4,76.3,69.4,63.2,81.5,78.9,66.2,86.5,80.4,26 -62.2,84.4,75.2,67.7,90.4,87.5,69.1,95.1,87.2,27 -67.6,93.2,82.4,75.0,100.6,97.3,74.2,104.7,95.6,28 -75.1,102.5,91.3,85.7,111.8,108,81.9,115.2,105.8,29 -84.4,112.3,101.6,98.7,123.7,119.3,91.7,126.5,117.4,30 -95.2,122.6,112.8,112.9,135.8,131,103.1,138.4,129.8,31 -107.2,133.5,124.5,127,147.6,142.6,115.4,150.9,142.6,32 -119.9,144.9,136.1,139.9,158.5,153.7,128.1,163.6,155.2,33 -132.7,155.5,146.7,151.3,168.0,163.5,141.0,175.8,167.0,34 -144.4,164.0,155.0,161.4,175.6,170.8,154.1,186.7,177.3,35 -154.2,169.0,159.9,169.8,180.5,174.8,167.3,195.4,185.5,36 -161.2,169.6,160.6,176.6,182.4,174.7,180.5,201.1,191.0,37 -165.5,166.7,157.8,181.3,181.3,171.3,192.1,203.4,193.5,38 -167.0,161.4,152.8,183.3,177.3,165.7,200.6,202.2,192.6,39 -165.7,155.0,146.7,182.2,170.6,159.1,204.4,197.0,188.0,40 -162.0,148.7,140.7,177.9,161.9,152.5,202.7,188.2,179.8,41 -157.3,143.8,135.9,172.1,152.9,146.9,197.5,177.8,170.3,42 -153.6,141.3,133.5,167.3,146.0,143.3,191.6,168.6,161.9,43 -152.5,142.6,134.4,165.7,143.4,142.6,188.0,163.2,157.5,44 -155.2,148.1,139.1,168.6,146.6,145.3,188.4,163.3,158.4,45 -159.6,155.2,145.6,173.9,153.0,149.5,191.0,166.6,162.6,46 -163.2,161.1,151.0,178.4,159.2,152.9,192.6,169.8,166.7,47 -163.2,162.4,152.5,178.9,161.6,153.3,190.4,169.8,167.3,48 -157.8,157.1,148.2,173.3,157.8,149.1,182.3,164.3,162.3,49 -148.5,147.2,139.8,163.2,149.4,141.5,170.0,154.8,153.2,50 -137.4,135.6,129.6,151.2,139.1,132.6,156.2,144.3,142.5,51 -127.0,125.3,120.4,140.1,129.4,124.5,143.4,135.2,132.7,52 -118.8,118.6,113.9,131.9,122.5,118.6,133.8,129.7,125.9,53 -112.8,114.9,109.9,125.9,118.1,114.9,126.8,126.9,121.6,54 -108.0,113.1,107.7,121.1,115.2,112.7,121.3,125.7,119.3,55 -103.9,112.1,106.3,116.2,112.9,111.3,116.2,124.5,117.9,56 -99.7,110.9,105.3,110.5,110.7,110.2,110.8,122.3,116.9,57 -95.8,109.5,104.5,104.5,108.4,109.2,105.3,119.3,116.1,58 -92.4,108.2,104.0,98.9,106.3,108.5,100.3,116.1,115.6,59 -89.9,107.2,103.9,94.8,104.7,108.0,96.5,112.9,115.4,60 -88.5,106.6,104.3,92.7,103.6,107.7,94.1,110.4,115.6,61 -88.0,106.3,104.9,92.0,102.8,107.5,92.9,108.7,116.0,62 -88.1,106.0,105.4,92.2,102.2,107.3,92.5,107.8,116.5,63 -88.2,105.5,105.5,92.3,101.4,107.2,92.3,108.0,117.1,64 -88.2,104.6,105.1,92.0,100.4,107.0,92.2,109.4,117.6,65 -88.3,104.0,104.7,91.9,99.9,107.4,92.8,112.3,119.1,66 -89.0,104.3,104.9,92.8,101.0,108.9,95.3,117.2,122.4,67 -90.7,106.3,106.3,95.6,104.7,112.1,100.6,124.5,128.6,68 -93.7,110.6,109.6,100.9,111.5,117.6,109.4,134.2,138.3,69 -98.0,116.5,114.3,108.2,120.6,124.7,120.6,145.6,150.4,70 -103.3,123.3,120.0,116.6,130.8,133.0,132.7,157.5,163.6,71 -109.6,130.3,126.1,125.3,141.0,141.8,144.3,169.0,176.4,72 -116.7,136.6,132.3,133.7,150.0,150.4,154.1,179.1,187.8,73 -123.8,142.4,138.3,141.6,157.9,158.8,162.7,187.9,197.2,74 -130.5,147.6,144.3,149.0,164.7,166.6,170.7,195.5,204.8,75 -136.0,152.5,150.0,155.8,170.6,173.9,178.9,202.0,210.2,76 -139.9,156.9,155.4,161.9,175.7,180.4,187.5,207.3,213.4,77 -142.0,160.2,159.5,166.6,179.4,185.0,194.8,210.5,213.8,78 -142.3,161.5,161.4,169.0,180.9,186.8,198.7,210.3,211.0,79 -141.0,159.9,159.9,168.2,179.7,184.7,197.0,205.3,204.4,80 -138.0,155.1,154.6,163.6,175.3,178.0,188.4,194.8,193.9,81 -133.7,148.0,146.6,156.2,168.5,168.2,175.1,180.7,180.8,82 -128.5,140.1,137.6,147.4,160.3,157.1,159.9,165.3,166.7,83 -122.8,132.7,129.4,138.5,151.7,146.7,145.9,150.9,153.3,84 -116.9,127.0,123.2,130.5,143.5,138.4,135.4,139.3,142.0,85 -111.0,122.6,118.6,123.4,135.9,131.9,127.9,130.4,132.7,86 -105.2,118.7,114.9,117.1,128.7,126.4,122.1,123.5,125.1,87 -99.7,114.6,111.3,111.3,122.0,121.2,117.1,117.9,118.7,88 -94.7,109.6,107.1,105.8,115.6,115.7,111.7,113.0,113.2,89 -90.0,103.9,102.5,100.4,109.4,109.8,105.9,108.3,108.3,90 -85.6,97.8,97.5,95.2,103.3,103.9,100,103.4,103.7,91 -81.6,91.5,92.3,89.9,97.3,98.1,94.0,98.1,98.9,92 -77.9,85.3,87.2,84.4,91.2,92.5,88.1,92.0,93.9,93 -74.4,79.5,82.3,79.2,85.3,87.2,82.6,85.8,88.7,94 -71.3,74.3,77.6,74.3,79.8,82.2,77.6,79.9,83.7,95 -68.4,70.1,73.4,70.1,75.0,77.5,73.4,75.0,79.1,96 +70.9,65.9,69.7,74.5,66.8,73.1,77.1,70.0,75.2,0 +69.3,63.7,66.6,72.3,64.3,69.3,76.3,67.4,71.9,1 +68.0,61.8,63.9,70.7,62.4,66.0,76.1,65.6,69.1,2 +66.8,60.2,61.8,69.2,61.0,63.5,75.8,64.3,66.8,3 +65.1,58.8,60.2,67.8,60.0,61.8,75.0,63.5,64.8,4 +63.1,57.7,58.9,66.2,59.1,60.7,73.7,62.9,63.2,5 +61.2,56.7,57.8,64.8,58.4,60.0,72.0,62.4,61.9,6 +59.4,56.1,56.9,63.5,57.7,59.4,70.1,61.8,61.0,7 +57.9,55.6,56.0,62.4,57.0,58.6,68.1,61.0,60.4,8 +56.8,55.2,55.1,61.4,56.2,57.7,66.2,60.1,59.9,9 +56.0,54.9,54.3,60.4,55.6,56.9,64.3,59.2,59.6,10 +55.2,54.4,53.6,59.4,55.2,56.1,62.7,58.5,59.4,11 +54.5,53.8,53.1,58.1,55.1,55.4,61.2,58.1,59.0,12 +53.9,53.1,52.7,56.9,55.2,54.9,60.0,57.9,58.7,13 +53.3,52.5,52.3,55.8,55.3,54.6,59.1,57.8,58.2,14 +52.8,51.9,51.9,55.2,55.2,54.4,58.5,57.7,57.7,15 +52.4,51.6,51.5,55.2,54.9,54.5,58.3,57.5,57.1,16 +52.1,51.6,51.3,55.6,54.7,54.7,58.3,57.3,56.7,17 +51.9,52.0,51.3,56.2,54.7,55.3,58.7,57.6,56.8,18 +51.9,52.8,51.9,56.9,55.2,56.1,59.4,58.5,57.7,19 +52.1,54.1,53.2,57.4,56.7,57.2,60.3,60.4,59.6,20 +52.6,56.1,55.2,57.9,59.1,59.0,61.3,63.3,62.3,21 +53.3,59.1,57.8,58.5,62.7,61.8,62.4,67.4,65.9,22 +54.4,63.5,61.0,59.4,67.6,65.9,63.5,72.5,70.1,23 +56.0,69.3,64.8,60.7,73.9,71.7,64.5,78.9,74.8,24 +58.4,76.3,69.4,63.2,81.5,78.9,66.2,86.5,80.4,25 +62.2,84.4,75.2,67.7,90.4,87.5,69.1,95.1,87.2,26 +67.6,93.2,82.4,75.0,100.6,97.3,74.2,104.7,95.6,27 +75.1,102.5,91.3,85.7,111.8,108,81.9,115.2,105.8,28 +84.4,112.3,101.6,98.7,123.7,119.3,91.7,126.5,117.4,29 +95.2,122.6,112.8,112.9,135.8,131,103.1,138.4,129.8,30 +107.2,133.5,124.5,127,147.6,142.6,115.4,150.9,142.6,31 +119.9,144.9,136.1,139.9,158.5,153.7,128.1,163.6,155.2,32 +132.7,155.5,146.7,151.3,168.0,163.5,141.0,175.8,167.0,33 +144.4,164.0,155.0,161.4,175.6,170.8,154.1,186.7,177.3,34 +154.2,169.0,159.9,169.8,180.5,174.8,167.3,195.4,185.5,35 +161.2,169.6,160.6,176.6,182.4,174.7,180.5,201.1,191.0,36 +165.5,166.7,157.8,181.3,181.3,171.3,192.1,203.4,193.5,37 +167.0,161.4,152.8,183.3,177.3,165.7,200.6,202.2,192.6,38 +165.7,155.0,146.7,182.2,170.6,159.1,204.4,197.0,188.0,39 +162.0,148.7,140.7,177.9,161.9,152.5,202.7,188.2,179.8,40 +157.3,143.8,135.9,172.1,152.9,146.9,197.5,177.8,170.3,41 +153.6,141.3,133.5,167.3,146.0,143.3,191.6,168.6,161.9,42 +152.5,142.6,134.4,165.7,143.4,142.6,188.0,163.2,157.5,43 +155.2,148.1,139.1,168.6,146.6,145.3,188.4,163.3,158.4,44 +159.6,155.2,145.6,173.9,153.0,149.5,191.0,166.6,162.6,45 +163.2,161.1,151.0,178.4,159.2,152.9,192.6,169.8,166.7,46 +163.2,162.4,152.5,178.9,161.6,153.3,190.4,169.8,167.3,47 +157.8,157.1,148.2,173.3,157.8,149.1,182.3,164.3,162.3,48 +148.5,147.2,139.8,163.2,149.4,141.5,170.0,154.8,153.2,49 +137.4,135.6,129.6,151.2,139.1,132.6,156.2,144.3,142.5,50 +127.0,125.3,120.4,140.1,129.4,124.5,143.4,135.2,132.7,51 +118.8,118.6,113.9,131.9,122.5,118.6,133.8,129.7,125.9,52 +112.8,114.9,109.9,125.9,118.1,114.9,126.8,126.9,121.6,53 +108.0,113.1,107.7,121.1,115.2,112.7,121.3,125.7,119.3,54 +103.9,112.1,106.3,116.2,112.9,111.3,116.2,124.5,117.9,55 +99.7,110.9,105.3,110.5,110.7,110.2,110.8,122.3,116.9,56 +95.8,109.5,104.5,104.5,108.4,109.2,105.3,119.3,116.1,57 +92.4,108.2,104.0,98.9,106.3,108.5,100.3,116.1,115.6,58 +89.9,107.2,103.9,94.8,104.7,108.0,96.5,112.9,115.4,59 +88.5,106.6,104.3,92.7,103.6,107.7,94.1,110.4,115.6,60 +88.0,106.3,104.9,92.0,102.8,107.5,92.9,108.7,116.0,61 +88.1,106.0,105.4,92.2,102.2,107.3,92.5,107.8,116.5,62 +88.2,105.5,105.5,92.3,101.4,107.2,92.3,108.0,117.1,63 +88.2,104.6,105.1,92.0,100.4,107.0,92.2,109.4,117.6,64 +88.3,104.0,104.7,91.9,99.9,107.4,92.8,112.3,119.1,65 +89.0,104.3,104.9,92.8,101.0,108.9,95.3,117.2,122.4,66 +90.7,106.3,106.3,95.6,104.7,112.1,100.6,124.5,128.6,67 +93.7,110.6,109.6,100.9,111.5,117.6,109.4,134.2,138.3,68 +98.0,116.5,114.3,108.2,120.6,124.7,120.6,145.6,150.4,69 +103.3,123.3,120.0,116.6,130.8,133.0,132.7,157.5,163.6,70 +109.6,130.3,126.1,125.3,141.0,141.8,144.3,169.0,176.4,71 +116.7,136.6,132.3,133.7,150.0,150.4,154.1,179.1,187.8,72 +123.8,142.4,138.3,141.6,157.9,158.8,162.7,187.9,197.2,73 +130.5,147.6,144.3,149.0,164.7,166.6,170.7,195.5,204.8,74 +136.0,152.5,150.0,155.8,170.6,173.9,178.9,202.0,210.2,75 +139.9,156.9,155.4,161.9,175.7,180.4,187.5,207.3,213.4,76 +142.0,160.2,159.5,166.6,179.4,185.0,194.8,210.5,213.8,77 +142.3,161.5,161.4,169.0,180.9,186.8,198.7,210.3,211.0,78 +141.0,159.9,159.9,168.2,179.7,184.7,197.0,205.3,204.4,79 +138.0,155.1,154.6,163.6,175.3,178.0,188.4,194.8,193.9,80 +133.7,148.0,146.6,156.2,168.5,168.2,175.1,180.7,180.8,81 +128.5,140.1,137.6,147.4,160.3,157.1,159.9,165.3,166.7,82 +122.8,132.7,129.4,138.5,151.7,146.7,145.9,150.9,153.3,83 +116.9,127.0,123.2,130.5,143.5,138.4,135.4,139.3,142.0,84 +111.0,122.6,118.6,123.4,135.9,131.9,127.9,130.4,132.7,85 +105.2,118.7,114.9,117.1,128.7,126.4,122.1,123.5,125.1,86 +99.7,114.6,111.3,111.3,122.0,121.2,117.1,117.9,118.7,87 +94.7,109.6,107.1,105.8,115.6,115.7,111.7,113.0,113.2,88 +90.0,103.9,102.5,100.4,109.4,109.8,105.9,108.3,108.3,89 +85.6,97.8,97.5,95.2,103.3,103.9,100,103.4,103.7,90 +81.6,91.5,92.3,89.9,97.3,98.1,94.0,98.1,98.9,91 +77.9,85.3,87.2,84.4,91.2,92.5,88.1,92.0,93.9,92 +74.4,79.5,82.3,79.2,85.3,87.2,82.6,85.8,88.7,93 +71.3,74.3,77.6,74.3,79.8,82.2,77.6,79.9,83.7,94 +68.4,70.1,73.4,70.1,75.0,77.5,73.4,75.0,79.1,95 diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/DBEWLoadProfileFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactoryTest.groovy similarity index 61% rename from src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/DBEWLoadProfileFactoryTest.groovy rename to src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactoryTest.groovy index 834ca992d..d13a41185 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/DBEWLoadProfileFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactoryTest.groovy @@ -5,25 +5,22 @@ */ package edu.ie3.datamodel.io.factory.timeseries -import static java.time.DayOfWeek.* - import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation -import edu.ie3.datamodel.models.Season import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile -import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileEntry -import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileTimeSeries +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry +import edu.ie3.datamodel.models.value.load.BdewLoadValues import spock.lang.Shared import spock.lang.Specification -class DBEWLoadProfileFactoryTest extends Specification { +class BdewLoadProfileFactoryTest extends Specification { @Shared - BDEWLoadProfileFactory factory + BdewLoadProfileFactory factory @Shared - private Set allEntries + private Set> allEntries def setupSpec() { - factory = new BDEWLoadProfileFactory() + factory = new BdewLoadProfileFactory() def data0 = new LoadProfileData([ "SuSa": "74.6", @@ -36,7 +33,7 @@ class DBEWLoadProfileFactoryTest extends Specification { "WiSu": "63.2", "WiWd": "65.5", "quarterHour": "0" - ] as Map, BDEWLoadProfileEntry) + ] as Map, BdewLoadValues) def data1 = new LoadProfileData([ "SuSa": "76.2", @@ -49,7 +46,7 @@ class DBEWLoadProfileFactoryTest extends Specification { "WiSu": "61.0", "WiWd": "62.6", "quarterHour": "1" - ] as Map, BDEWLoadProfileEntry) + ] as Map, BdewLoadValues) def data2 = new LoadProfileData([ "SuSa": "77.7", @@ -62,13 +59,13 @@ class DBEWLoadProfileFactoryTest extends Specification { "WiSu": "58.9", "WiWd": "59.6", "quarterHour": "2" - ] as Map, BDEWLoadProfileEntry) + ] as Map, BdewLoadValues) allEntries = [ factory.buildModel(data0), factory.buildModel(data1), factory.buildModel(data2) - ].flatten() as Set + ].flatten() as Set> } def "A BDEWLoadProfileFactory returns the correct fields"() { @@ -87,7 +84,7 @@ class DBEWLoadProfileFactoryTest extends Specification { ] as Set when: - def actual = factory.getFields(BDEWLoadProfileEntry) + def actual = factory.getFields(BdewLoadValues) then: actual.size() == 1 @@ -96,15 +93,15 @@ class DBEWLoadProfileFactoryTest extends Specification { def "A BDEWLoadProfileFactory refuses to build from invalid data"() { given: - def actualFields = factory.newSet("Wd", "Sa", "Su") + def actualFields = factory.newSet("Sa", "Su", "Wd") when: - def actual = factory.validate(actualFields, BDEWLoadProfileEntry) + def actual = factory.validate(actualFields, BdewLoadValues) then: actual.failure - actual.exception.get().message == "The provided fields [Sa, Su, Wd] are invalid for instance of 'BDEWLoadProfileEntry'. \n" + - "The following fields (without complex objects e.g. nodes, operators, ...) to be passed to a constructor of 'BDEWLoadProfileEntry' are possible (NOT case-sensitive!):\n" + + actual.exception.get().message == "The provided fields [Sa, Su, Wd] are invalid for instance of 'BdewLoadValues'. \n" + + "The following fields (without complex objects e.g. nodes, operators, ...) to be passed to a constructor of 'BdewLoadValues' are possible (NOT case-sensitive!):\n" + "0: [quarterHour, SuSa, SuSu, SuWd, TrSa, TrSu, TrWd, WiSa, WiSu, WiWd] or [quarter_hour, su_sa, su_su, su_wd, tr_sa, tr_su, tr_wd, wi_sa, wi_su, wi_wd]\n" } @@ -124,10 +121,10 @@ class DBEWLoadProfileFactoryTest extends Specification { ] as Map when: - def entries = factory.buildModel(new LoadProfileData<>(data, BDEWLoadProfileEntry)) + def entry = factory.buildModel(new LoadProfileData<>(data, BdewLoadValues)) then: - entries.size() == 9 + entry.value.class == BdewLoadValues } def "A BDEWLoadProfileFactory builds time series from entries"() { @@ -141,20 +138,6 @@ class DBEWLoadProfileFactoryTest extends Specification { then: lpts.loadProfile == BdewStandardLoadProfile.G0 - lpts.entries.size() == 27 - - lpts.valueMapping.keySet() == [ - new BDEWLoadProfileTimeSeries.BdewKey(Season.SUMMER, SATURDAY), - new BDEWLoadProfileTimeSeries.BdewKey(Season.SUMMER, SUNDAY), - new BDEWLoadProfileTimeSeries.BdewKey(Season.SUMMER, MONDAY), - new BDEWLoadProfileTimeSeries.BdewKey(Season.TRANSITION, SATURDAY), - new BDEWLoadProfileTimeSeries.BdewKey(Season.TRANSITION, SUNDAY), - new BDEWLoadProfileTimeSeries.BdewKey(Season.TRANSITION, MONDAY), - new BDEWLoadProfileTimeSeries.BdewKey(Season.WINTER, SATURDAY), - new BDEWLoadProfileTimeSeries.BdewKey(Season.WINTER, SUNDAY), - new BDEWLoadProfileTimeSeries.BdewKey(Season.WINTER, MONDAY), - ] as Set - - lpts.valueMapping.values().every { it.size() == 3} + lpts.entries.size() == 3 } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy index 7ab6f8247..eaa1d3ea9 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy @@ -5,12 +5,10 @@ */ package edu.ie3.datamodel.io.factory.timeseries -import static java.time.DayOfWeek.* - import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation import edu.ie3.datamodel.models.profile.LoadProfile -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries -import edu.ie3.datamodel.models.timeseries.repetitive.RandomLoadProfileEntry +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry +import edu.ie3.datamodel.models.value.load.RandomLoadValues import spock.lang.Shared import spock.lang.Specification @@ -19,7 +17,7 @@ class RandomLoadProfileFactoryTest extends Specification { RandomLoadProfileFactory factory @Shared - private Set allEntries + private Set> allEntries def setupSpec() { factory = new RandomLoadProfileFactory() @@ -35,7 +33,7 @@ class RandomLoadProfileFactoryTest extends Specification { "sigmaSu": "0.0370676517486572", "sigmaWd": "0.0293692331761122", "quarterHour": "0" - ] as Map, RandomLoadProfileEntry) + ] as Map, RandomLoadValues) def data1 = new LoadProfileData([ "kSa": "0.281179457902908", @@ -48,7 +46,7 @@ class RandomLoadProfileFactoryTest extends Specification { "sigmaSu": "0.0334825366735458", "sigmaWd": "0.0265011098235846", "quarterHour": "1" - ] as Map, RandomLoadProfileEntry) + ] as Map, RandomLoadValues) def data2 = new LoadProfileData([ "kSa": "0.275563269853592", @@ -61,13 +59,13 @@ class RandomLoadProfileFactoryTest extends Specification { "sigmaSu": "0.0310499873012304", "sigmaWd": "0.0245211906731129", "quarterHour": "2" - ] as Map, RandomLoadProfileEntry) + ] as Map, RandomLoadValues) allEntries = [ factory.buildModel(data0), factory.buildModel(data1), factory.buildModel(data2) - ].flatten() as Set + ].flatten() as Set> } def "A RandomLoadProfileFactory returns the correct fields"() { @@ -86,7 +84,7 @@ class RandomLoadProfileFactoryTest extends Specification { ] as Set when: - def actual = factory.getFields(RandomLoadProfileEntry) + def actual = factory.getFields(RandomLoadValues) then: actual.size() == 1 @@ -98,12 +96,12 @@ class RandomLoadProfileFactoryTest extends Specification { def actualFields = factory.newSet("Wd", "Sa", "Su") when: - def actual = factory.validate(actualFields, RandomLoadProfileEntry) + def actual = factory.validate(actualFields, RandomLoadValues) then: actual.failure - actual.exception.get().message == "The provided fields [Sa, Su, Wd] are invalid for instance of 'RandomLoadProfileEntry'. \n" + - "The following fields (without complex objects e.g. nodes, operators, ...) to be passed to a constructor of 'RandomLoadProfileEntry' are possible (NOT case-sensitive!):\n" + + actual.exception.get().message == "The provided fields [Sa, Su, Wd] are invalid for instance of 'RandomLoadValues'. \n" + + "The following fields (without complex objects e.g. nodes, operators, ...) to be passed to a constructor of 'RandomLoadValues' are possible (NOT case-sensitive!):\n" + "0: [kSa, kSu, kWd, mySa, mySu, myWd, quarterHour, sigmaSa, sigmaSu, sigmaWd] or [k_sa, k_su, k_wd, my_sa, my_su, my_wd, quarter_hour, sigma_sa, sigma_su, sigma_wd]\n" } @@ -123,10 +121,10 @@ class RandomLoadProfileFactoryTest extends Specification { ] as Map when: - def entries = factory.buildModel(new LoadProfileData<>(data, RandomLoadProfileEntry)) + def entry = factory.buildModel(new LoadProfileData<>(data, RandomLoadValues)) then: - entries.size() == 3 + entry.value.class == RandomLoadValues } def "A RandomLoadProfileFactory builds time series from entries"() { @@ -140,14 +138,6 @@ class RandomLoadProfileFactoryTest extends Specification { then: lpts.loadProfile == LoadProfile.RandomLoadProfile.RANDOM_LOAD_PROFILE - lpts.entries.size() == 9 - - lpts.valueMapping.keySet() == [ - new LoadProfileTimeSeries.WeekDayKey(SATURDAY), - new LoadProfileTimeSeries.WeekDayKey(SUNDAY), - new LoadProfileTimeSeries.WeekDayKey(MONDAY), - ] as Set - - lpts.valueMapping.values().every { it.size() == 3} + lpts.entries.size() == 3 } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy index 434e3b70a..897873d76 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy @@ -34,7 +34,7 @@ import edu.ie3.datamodel.models.result.thermal.ThermalHouseResult import edu.ie3.datamodel.models.timeseries.IntValue import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue -import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileTimeSeries +import edu.ie3.datamodel.models.timeseries.repetitive.BdewLoadProfileTimeSeries import edu.ie3.datamodel.models.timeseries.repetitive.RepetitiveTimeSeries import edu.ie3.datamodel.models.value.EnergyPriceValue import edu.ie3.util.quantities.PowerSystemUnits @@ -414,7 +414,7 @@ class EntityPersistenceNamingStrategyTest extends Specification { def "A EntityPersistenceNamingStrategy without pre- or suffix should return valid file name for load profile time series" () { given: EntityPersistenceNamingStrategy strategy = new EntityPersistenceNamingStrategy() - BDEWLoadProfileTimeSeries timeSeries = Mock(BDEWLoadProfileTimeSeries) + BdewLoadProfileTimeSeries timeSeries = Mock(BdewLoadProfileTimeSeries) timeSeries.uuid >> uuid timeSeries.loadProfile >> type @@ -427,7 +427,7 @@ class EntityPersistenceNamingStrategyTest extends Specification { where: clazz | uuid | type || expectedFileName - BDEWLoadProfileTimeSeries | UUID.fromString("9b880468-309c-43c1-a3f4-26dd26266216") | BdewStandardLoadProfile.G3 || "lpts_g3_9b880468-309c-43c1-a3f4-26dd26266216" + BdewLoadProfileTimeSeries | UUID.fromString("9b880468-309c-43c1-a3f4-26dd26266216") | BdewStandardLoadProfile.G3 || "lpts_g3_9b880468-309c-43c1-a3f4-26dd26266216" } def "A EntityPersistenceNamingStrategy returns empty Optional, when there is no naming defined for a given time series class"() { diff --git a/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy index 2362ebae8..74d46aadf 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy @@ -40,13 +40,12 @@ import edu.ie3.datamodel.models.timeseries.TimeSeries import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue -import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileEntry -import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileTimeSeries +import edu.ie3.datamodel.models.timeseries.repetitive.BdewLoadProfileTimeSeries import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries -import edu.ie3.datamodel.models.timeseries.repetitive.RandomLoadProfileEntry import edu.ie3.datamodel.models.timeseries.repetitive.RandomLoadProfileTimeSeries import edu.ie3.datamodel.models.value.* +import edu.ie3.datamodel.models.value.load.BdewLoadValues +import edu.ie3.datamodel.models.value.load.RandomLoadValues import edu.ie3.datamodel.utils.Try import edu.ie3.test.common.TimeSeriesTestData import edu.ie3.util.TimeUtil @@ -145,8 +144,8 @@ class ProcessorProviderTest extends Specification implements TimeSeriesTestData new TimeSeriesProcessorKey(IndividualTimeSeries, TimeBasedValue, HeatAndPValue), new TimeSeriesProcessorKey(IndividualTimeSeries, TimeBasedValue, SValue), new TimeSeriesProcessorKey(IndividualTimeSeries, TimeBasedValue, HeatAndSValue), - new TimeSeriesProcessorKey(BDEWLoadProfileTimeSeries, BDEWLoadProfileEntry, PValue), - new TimeSeriesProcessorKey(RandomLoadProfileTimeSeries, RandomLoadProfileEntry, PValue) + new TimeSeriesProcessorKey(BdewLoadProfileTimeSeries, LoadProfileEntry, BdewLoadValues), + new TimeSeriesProcessorKey(RandomLoadProfileTimeSeries, LoadProfileEntry, RandomLoadValues) ] as Set when: diff --git a/src/test/groovy/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessorTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessorTest.groovy index 4633b1e58..56eb58c60 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessorTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessorTest.groovy @@ -10,11 +10,10 @@ import edu.ie3.datamodel.io.processor.Processor import edu.ie3.datamodel.models.timeseries.IntValue import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue -import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileEntry -import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileTimeSeries +import edu.ie3.datamodel.models.timeseries.repetitive.BdewLoadProfileTimeSeries import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries import edu.ie3.datamodel.models.value.* +import edu.ie3.datamodel.models.value.load.BdewLoadValues import edu.ie3.test.common.TimeSeriesTestData import spock.lang.Specification @@ -214,7 +213,7 @@ class TimeSeriesProcessorTest extends Specification implements TimeSeriesTestDat def "A TimeSeriesProcessors handles a complete LoadProfileTimeSeries correctly"() { given: - TimeSeriesProcessor processor = new TimeSeriesProcessor<>(BDEWLoadProfileTimeSeries, BDEWLoadProfileEntry, PValue) + TimeSeriesProcessor processor = new TimeSeriesProcessor<>(BdewLoadProfileTimeSeries, LoadProfileEntry, BdewLoadValues) when: Set> actual = processor.handleTimeSeries(loadProfileTimeSeries) diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/LoadProfileSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/LoadProfileSourceTest.groovy index 3f1b5b517..14066bd5a 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/LoadProfileSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/LoadProfileSourceTest.groovy @@ -19,7 +19,7 @@ class LoadProfileSourceTest extends Specification { then: profiles.size() == 11 BdewStandardLoadProfile.values().every { profiles.keySet().contains(it) } - profiles.values().every { it.entries.size() == 864} + profiles.values().every { it.entries.size() == 96} } def "A LoadProfileSourceTest should read in the build-in RandomLoadProfile"() { @@ -28,6 +28,6 @@ class LoadProfileSourceTest extends Specification { then: random.loadProfile == RANDOM_LOAD_PROFILE - random.entries.size() == 288 + random.entries.size() == 96 } } diff --git a/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy b/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy index a0a641cab..691646e4e 100644 --- a/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy +++ b/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy @@ -9,24 +9,22 @@ import static edu.ie3.util.quantities.PowerSystemUnits.* import static tech.units.indriya.unit.Units.CELSIUS import static tech.units.indriya.unit.Units.METRE_PER_SECOND -import edu.ie3.datamodel.models.Season import edu.ie3.datamodel.models.StandardUnits import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile import edu.ie3.datamodel.models.timeseries.IntValue import edu.ie3.datamodel.models.timeseries.TimeSeries import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue -import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileEntry -import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileTimeSeries -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries +import edu.ie3.datamodel.models.timeseries.repetitive.BdewLoadProfileTimeSeries +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry import edu.ie3.datamodel.models.value.* +import edu.ie3.datamodel.models.value.load.BdewLoadValues import org.locationtech.jts.geom.Coordinate import org.locationtech.jts.geom.GeometryFactory import org.locationtech.jts.geom.Point import org.locationtech.jts.geom.PrecisionModel import tech.units.indriya.quantity.Quantities -import java.time.DayOfWeek import java.time.ZoneId import java.time.ZonedDateTime @@ -396,52 +394,57 @@ trait TimeSeriesTestData { ] as LinkedHashMap ] as Set - BDEWLoadProfileTimeSeries loadProfileTimeSeries = new BDEWLoadProfileTimeSeries( + BdewLoadProfileTimeSeries loadProfileTimeSeries = new BdewLoadProfileTimeSeries( UUID.fromString("b0ad5ba2-0d5e-4c9b-b818-4079cebf59cc"), BdewStandardLoadProfile.G2, [ - new BDEWLoadProfileEntry( - new PValue(Quantities.getQuantity(5d, KILOWATT)), - Season.SUMMER, - DayOfWeek.MONDAY, - 0 + new LoadProfileEntry<>( + new BdewLoadValues(63.1, 50.6, 60.8, 73.1, 64.2, 70.5, 80.6, 73.7, 77.4), 0 ), - new BDEWLoadProfileEntry( - new PValue(Quantities.getQuantity(15d, KILOWATT)), - Season.SUMMER, - DayOfWeek.MONDAY, - 1 + new LoadProfileEntry<>( + new BdewLoadValues(58.0,47.4,53.0,67.6,60.7,61.9,74.6,68.7,67.4), 1), + new LoadProfileEntry<>( + new BdewLoadValues(53.5,44.3,46.0,62.8,56.9,54.4,69.2,63.6,58.4), 2 ), - new BDEWLoadProfileEntry( - new PValue(Quantities.getQuantity(10d, KILOWATT)), - Season.SUMMER, - DayOfWeek.MONDAY, - 2 - ) ] as Set ) Set> loadProfileTimeSeriesProcessed = [ [ - "dayOfWeek" : "MONDAY", - "loadProfile": "g2", - "season": "su", - "p" : "5.0", - "quarterHourOfDay" : "0" + "suSa": "63.1", + "suSu": "50.6", + "suWd": "60.8", + "trSa": "73.1", + "trSu": "64.2", + "trWd": "70.5", + "wiSa": "80.6", + "wiSu": "73.7", + "wiWd": "77.4", + "quarterHour": "0" ] as LinkedHashMap, [ - "dayOfWeek" : "MONDAY", - "loadProfile": "g2", - "season": "su", - "p" : "15.0", - "quarterHourOfDay" : "1" + "suSa": "58.0", + "suSu": "47.4", + "suWd": "53.0", + "trSa": "67.6", + "trSu": "60.7", + "trWd": "61.9", + "wiSa": "74.6", + "wiSu": "68.7", + "wiWd": "67.4", + "quarterHour": "1" ] as LinkedHashMap, [ - "dayOfWeek" : "MONDAY", - "loadProfile": "g2", - "season": "su", - "p" : "10.0", - "quarterHourOfDay" : "2" + "suSa": "53.5", + "suSu": "44.3", + "suWd": "46.0", + "trSa": "62.8", + "trSu": "56.9", + "trWd": "54.4", + "wiSa": "69.2", + "wiSu": "63.6", + "wiWd": "58.4", + "quarterHour": "2" ] as LinkedHashMap ] as Set From 683a2b7f5dbf012347fa3879fbff0bc3bcc80eb8 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Fri, 6 Sep 2024 14:15:15 +0200 Subject: [PATCH 06/23] Fixing codacy issues. --- src/main/java/edu/ie3/datamodel/models/BdewSeason.java | 2 +- .../edu/ie3/datamodel/models/value/load/BdewLoadValues.java | 2 +- .../edu/ie3/datamodel/io/source/LoadProfileSourceTest.groovy | 2 +- src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/models/BdewSeason.java b/src/main/java/edu/ie3/datamodel/models/BdewSeason.java index a10acb260..defb4c016 100644 --- a/src/main/java/edu/ie3/datamodel/models/BdewSeason.java +++ b/src/main/java/edu/ie3/datamodel/models/BdewSeason.java @@ -34,7 +34,7 @@ public static BdewSeason parse(String key) throws ParsingException { * @param time the time * @return a season */ - public static BdewSeason get(ZonedDateTime time) { + public static BdewSeason getSeason(ZonedDateTime time) { int day = time.getDayOfMonth(); // winter: 1.11.-20.03. diff --git a/src/main/java/edu/ie3/datamodel/models/value/load/BdewLoadValues.java b/src/main/java/edu/ie3/datamodel/models/value/load/BdewLoadValues.java index 1364efdaf..8e526c214 100644 --- a/src/main/java/edu/ie3/datamodel/models/value/load/BdewLoadValues.java +++ b/src/main/java/edu/ie3/datamodel/models/value/load/BdewLoadValues.java @@ -73,7 +73,7 @@ public PValue getValue(ZonedDateTime time, LoadProfile loadProfile) { TRANSITION, TrWd); }; - PValue value = new PValue(Quantities.getQuantity(mapping.get(BdewSeason.get(time)), KILOWATT)); + PValue value = new PValue(Quantities.getQuantity(mapping.get(getSeason(time)), KILOWATT)); if (loadProfile == BdewStandardLoadProfile.H0) { /* For the residential average profile, a dynamization has to be taken into account */ diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/LoadProfileSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/LoadProfileSourceTest.groovy index 14066bd5a..322ceb75b 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/LoadProfileSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/LoadProfileSourceTest.groovy @@ -19,7 +19,7 @@ class LoadProfileSourceTest extends Specification { then: profiles.size() == 11 BdewStandardLoadProfile.values().every { profiles.keySet().contains(it) } - profiles.values().every { it.entries.size() == 96} + profiles.values().every { it.entries.size() == 96 } } def "A LoadProfileSourceTest should read in the build-in RandomLoadProfile"() { diff --git a/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy b/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy index 691646e4e..d452e6220 100644 --- a/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy +++ b/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy @@ -402,9 +402,9 @@ trait TimeSeriesTestData { new BdewLoadValues(63.1, 50.6, 60.8, 73.1, 64.2, 70.5, 80.6, 73.7, 77.4), 0 ), new LoadProfileEntry<>( - new BdewLoadValues(58.0,47.4,53.0,67.6,60.7,61.9,74.6,68.7,67.4), 1), + new BdewLoadValues(58.0, 47.4, 53.0, 67.6, 60.7, 61.9, 74.6, 68.7, 67.4), 1), new LoadProfileEntry<>( - new BdewLoadValues(53.5,44.3,46.0,62.8,56.9,54.4,69.2,63.6,58.4), 2 + new BdewLoadValues(53.5, 44.3, 46.0, 62.8, 56.9, 54.4, 69.2, 63.6, 58.4), 2 ), ] as Set ) From 51f3bdbf0c929a4f72433f63c0b314267d76b9bc Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Mon, 9 Sep 2024 11:01:24 +0200 Subject: [PATCH 07/23] Adding `maxPower` to `BdewLoadProfileTimeSeries`. --- .../repetitive/BdewLoadProfileTimeSeries.java | 48 +++++++++++++++++-- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BdewLoadProfileTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BdewLoadProfileTimeSeries.java index 478a9f3b1..8036559cc 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BdewLoadProfileTimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BdewLoadProfileTimeSeries.java @@ -5,23 +5,65 @@ */ package edu.ie3.datamodel.models.timeseries.repetitive; +import static edu.ie3.util.quantities.PowerSystemUnits.KILOWATT; + import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; +import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; +import edu.ie3.datamodel.models.value.PValue; import edu.ie3.datamodel.models.value.load.BdewLoadValues; -import java.util.Objects; -import java.util.Set; -import java.util.UUID; +import java.util.*; +import tech.units.indriya.quantity.Quantities; /** * Describes a bdew load profile time series with repetitive values that can be calculated from a * pattern */ public class BdewLoadProfileTimeSeries extends LoadProfileTimeSeries { + /** + * The maximum average power consumption per quarter hour for a given load profile, calculated + * over all seasons and weekday types of given load profile + */ + public final PValue maxPower; public BdewLoadProfileTimeSeries( UUID uuid, BdewStandardLoadProfile loadProfile, Set> values) { super(uuid, loadProfile, values); + + double power; + + if (loadProfile == BdewStandardLoadProfile.H0) { + power = + values.stream() + .map(TimeSeriesEntry::getValue) + .map(v -> List.of(v.getWiSa(), v.getWiSu(), v.getWiWd())) + .flatMap(Collection::stream) + .max(Comparator.naturalOrder()) + .orElse(0d); + + } else { + power = + values.stream() + .map(LoadProfileEntry::getValue) + .map( + v -> + List.of( + v.getSuSa(), + v.getSuSu(), + v.getSuWd(), + v.getTrSa(), + v.getTrSu(), + v.getTrWd(), + v.getWiSa(), + v.getWiSu(), + v.getWiWd())) + .flatMap(Collection::stream) + .max(Comparator.naturalOrder()) + .orElse(0d); + } + + this.maxPower = new PValue(Quantities.getQuantity(power, KILOWATT)); } @Override From 086a492d2efd2b805f15e7bb9157df5e3019ef56 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Mon, 9 Sep 2024 11:37:20 +0200 Subject: [PATCH 08/23] Adding power information. --- .../timeseries/repetitive/BdewLoadProfileTimeSeries.java | 6 +++--- .../timeseries/repetitive/RandomLoadProfileTimeSeries.java | 5 +++++ .../edu/ie3/datamodel/models/value/load/BdewLoadValues.java | 6 +++--- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BdewLoadProfileTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BdewLoadProfileTimeSeries.java index 8036559cc..39ce98f09 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BdewLoadProfileTimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BdewLoadProfileTimeSeries.java @@ -5,7 +5,7 @@ */ package edu.ie3.datamodel.models.timeseries.repetitive; -import static edu.ie3.util.quantities.PowerSystemUnits.KILOWATT; +import static tech.units.indriya.unit.Units.WATT; import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; @@ -16,7 +16,7 @@ /** * Describes a bdew load profile time series with repetitive values that can be calculated from a - * pattern + * pattern. Each value of this timeseries is given in W. */ public class BdewLoadProfileTimeSeries extends LoadProfileTimeSeries { /** @@ -63,7 +63,7 @@ public BdewLoadProfileTimeSeries( .orElse(0d); } - this.maxPower = new PValue(Quantities.getQuantity(power, KILOWATT)); + this.maxPower = new PValue(Quantities.getQuantity(power, WATT)); } @Override diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java index 85e457880..cc50077b3 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java @@ -5,12 +5,17 @@ */ package edu.ie3.datamodel.models.timeseries.repetitive; +import de.lmu.ifi.dbs.elki.math.statistics.distribution.GeneralizedExtremeValueDistribution; import edu.ie3.datamodel.models.profile.LoadProfile; import edu.ie3.datamodel.models.value.load.RandomLoadValues; import java.util.Objects; import java.util.Set; import java.util.UUID; +/** + * Describes a random load profile time series based on a {@link + * GeneralizedExtremeValueDistribution}. Each value of this# timeseries is given in kW. + */ public class RandomLoadProfileTimeSeries extends LoadProfileTimeSeries { public RandomLoadProfileTimeSeries( UUID uuid, LoadProfile loadProfile, Set> entries) { diff --git a/src/main/java/edu/ie3/datamodel/models/value/load/BdewLoadValues.java b/src/main/java/edu/ie3/datamodel/models/value/load/BdewLoadValues.java index 8e526c214..1918542ec 100644 --- a/src/main/java/edu/ie3/datamodel/models/value/load/BdewLoadValues.java +++ b/src/main/java/edu/ie3/datamodel/models/value/load/BdewLoadValues.java @@ -6,9 +6,9 @@ package edu.ie3.datamodel.models.value.load; import static edu.ie3.datamodel.models.BdewSeason.*; -import static edu.ie3.util.quantities.PowerSystemUnits.KILOWATT; import static java.lang.Math.pow; import static java.lang.Math.round; +import static tech.units.indriya.unit.Units.WATT; import edu.ie3.datamodel.models.BdewSeason; import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; @@ -73,7 +73,7 @@ public PValue getValue(ZonedDateTime time, LoadProfile loadProfile) { TRANSITION, TrWd); }; - PValue value = new PValue(Quantities.getQuantity(mapping.get(getSeason(time)), KILOWATT)); + PValue value = new PValue(Quantities.getQuantity(mapping.get(getSeason(time)), WATT)); if (loadProfile == BdewStandardLoadProfile.H0) { /* For the residential average profile, a dynamization has to be taken into account */ @@ -103,7 +103,7 @@ private PValue dynamization(PValue load, int t) { load.getP() .map(v -> v.getValue().doubleValue()) .map(round) - .map(v -> Quantities.getQuantity(v, KILOWATT)) + .map(v -> Quantities.getQuantity(v, WATT)) .orElse(null); return new PValue(value); From ba498fd7f9d867af615267ee84c43f2849148e63 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Mon, 9 Sep 2024 16:35:33 +0200 Subject: [PATCH 09/23] Adding `maxPower` to `LoadProfileTimeSeries`. Adding sql sources for `LoadProfileTimeSeries`. --- .../timeseries/BdewLoadProfileFactory.java | 55 ++++- .../timeseries/LoadProfileFactory.java | 23 ++- .../timeseries/RandomLoadProfileFactory.java | 12 +- .../TimeSeriesMetaInformationFactory.java | 19 +- .../io/naming/DatabaseNamingStrategy.java | 5 + .../io/source/LoadProfileSource.java | 12 ++ .../TimeSeriesMetaInformationSource.java | 18 ++ .../io/source/csv/CsvLoadProfileSource.java | 6 + .../CsvTimeSeriesMetaInformationSource.java | 27 ++- .../io/source/sql/SqlLoadProfileSource.java | 195 ++++++++++++++++++ .../SqlTimeSeriesMetaInformationSource.java | 54 ++++- .../repetitive/BdewLoadProfileTimeSeries.java | 56 +---- .../repetitive/LoadProfileTimeSeries.java | 25 ++- .../RandomLoadProfileTimeSeries.java | 3 +- .../ie3/datamodel/utils/TimeSeriesUtils.java | 10 + .../source/sql/SqlLoadProfileSourceIT.groovy | 97 +++++++++ ...qlTimeSeriesMetaInformationSourceIT.groovy | 39 +++- .../common/TimeSeriesSourceTestData.groovy | 9 + .../ie3/test/common/TimeSeriesTestData.groovy | 3 +- .../_timeseries/time_series_load_profiles.sql | 36 ++++ 20 files changed, 633 insertions(+), 71 deletions(-) create mode 100644 src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java create mode 100644 src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSourceIT.groovy create mode 100644 src/test/resources/edu/ie3/datamodel/io/source/sql/_timeseries/time_series_load_profiles.sql diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java index 9c90e1818..265fd4c09 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java @@ -5,16 +5,20 @@ */ package edu.ie3.datamodel.io.factory.timeseries; +import static tech.units.indriya.unit.Units.WATT; + import edu.ie3.datamodel.exceptions.FactoryException; import edu.ie3.datamodel.exceptions.ParsingException; import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; +import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; import edu.ie3.datamodel.models.timeseries.repetitive.BdewLoadProfileTimeSeries; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; import edu.ie3.datamodel.models.value.load.BdewLoadValues; -import java.util.List; -import java.util.Set; +import java.util.*; +import javax.measure.quantity.Power; +import tech.units.indriya.ComparableQuantity; +import tech.units.indriya.quantity.Quantities; public class BdewLoadProfileFactory extends LoadProfileFactory { @@ -71,11 +75,14 @@ protected List> getFields(Class entityClass) { } @Override - public LoadProfileTimeSeries build( + public BdewLoadProfileTimeSeries build( LoadProfileTimeSeriesMetaInformation metaInformation, Set> entries) { - return new BdewLoadProfileTimeSeries( - metaInformation.getUuid(), parseProfile(metaInformation.getProfile()), entries); + + BdewStandardLoadProfile profile = parseProfile(metaInformation.getProfile()); + Optional> maxPower = calculateMaxPower(profile, entries); + + return new BdewLoadProfileTimeSeries(metaInformation.getUuid(), profile, entries, maxPower); } @Override @@ -86,4 +93,40 @@ public BdewStandardLoadProfile parseProfile(String profile) { throw new FactoryException("An error occurred while parsing the profile: " + profile, e); } } + + @Override + public Optional> calculateMaxPower( + BdewStandardLoadProfile loadProfile, Set> entries) { + Optional power; + + if (loadProfile == BdewStandardLoadProfile.H0) { + power = + entries.stream() + .map(TimeSeriesEntry::getValue) + .map(v -> List.of(v.getWiSa(), v.getWiSu(), v.getWiWd())) + .flatMap(Collection::stream) + .max(Comparator.naturalOrder()); + + } else { + power = + entries.stream() + .map(LoadProfileEntry::getValue) + .map( + v -> + List.of( + v.getSuSa(), + v.getSuSu(), + v.getSuWd(), + v.getTrSa(), + v.getTrSu(), + v.getTrWd(), + v.getWiSa(), + v.getWiSu(), + v.getWiWd())) + .flatMap(Collection::stream) + .max(Comparator.naturalOrder()); + } + + return power.map(p -> Quantities.getQuantity(p, WATT)); + } } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java index a7cb16b13..a65c39a32 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java @@ -11,18 +11,37 @@ import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; import edu.ie3.datamodel.models.value.load.LoadValues; +import java.util.Optional; import java.util.Set; +import javax.measure.quantity.Power; +import tech.units.indriya.ComparableQuantity; public abstract class LoadProfileFactory

extends Factory, LoadProfileEntry> { - public static final String QUARTER_HOUR = "quarterHour"; + protected static final String QUARTER_HOUR = "quarterHour"; public LoadProfileFactory(Class valueClass) { super(valueClass); } public abstract LoadProfileTimeSeries build( - LoadProfileTimeSeriesMetaInformation metaInformation, Set> data); + LoadProfileTimeSeriesMetaInformation metaInformation, Set> entries); public abstract P parseProfile(String profile); + + /** + * Calculates the maximum average power consumption per quarter-hour for a given calculated over + * all seasons and weekday types of given load profile + * + * @param loadProfile given load profile + * @param entries with power values + * @return an option for the maximal power + */ + public abstract Optional> calculateMaxPower( + P loadProfile, Set> entries); + + /** Returns the quarter-hour field. */ + public String getTimeFieldString() { + return QUARTER_HOUR; + } } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java index 8d741bb2a..c5c182ea6 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java @@ -10,11 +10,13 @@ import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; import edu.ie3.datamodel.models.profile.LoadProfile; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; import edu.ie3.datamodel.models.timeseries.repetitive.RandomLoadProfileTimeSeries; import edu.ie3.datamodel.models.value.load.RandomLoadValues; import java.util.List; +import java.util.Optional; import java.util.Set; +import javax.measure.quantity.Power; +import tech.units.indriya.ComparableQuantity; public class RandomLoadProfileFactory extends LoadProfileFactory { public static final String K_WEEKDAY = "kWd"; @@ -66,7 +68,7 @@ protected List> getFields(Class entityClass) { } @Override - public LoadProfileTimeSeries build( + public RandomLoadProfileTimeSeries build( LoadProfileTimeSeriesMetaInformation metaInformation, Set> entries) { return new RandomLoadProfileTimeSeries(metaInformation.getUuid(), RANDOM_LOAD_PROFILE, entries); @@ -76,4 +78,10 @@ public LoadProfileTimeSeries build( public LoadProfile parseProfile(String profile) { return RANDOM_LOAD_PROFILE; } + + @Override + public Optional> calculateMaxPower( + LoadProfile loadProfile, Set> loadProfileEntries) { + return Optional.empty(); + } } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMetaInformationFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMetaInformationFactory.java index 327f920eb..aebbfa02e 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMetaInformationFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMetaInformationFactory.java @@ -7,8 +7,10 @@ import edu.ie3.datamodel.io.factory.EntityData; import edu.ie3.datamodel.io.factory.EntityFactory; +import edu.ie3.datamodel.io.naming.TimeSeriesMetaInformation; import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme; import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; import java.util.Collections; import java.util.List; import java.util.Set; @@ -21,12 +23,13 @@ * mappings */ public class TimeSeriesMetaInformationFactory - extends EntityFactory { + extends EntityFactory { private static final String TIME_SERIES = "timeSeries"; private static final String COLUMN_SCHEME = "columnScheme"; + private static final String LOAD_PROFILE = "loadProfile"; public TimeSeriesMetaInformationFactory() { - super(IndividualTimeSeriesMetaInformation.class); + super(IndividualTimeSeriesMetaInformation.class, LoadProfileTimeSeriesMetaInformation.class); } @Override @@ -36,9 +39,15 @@ protected List> getFields(Class entityClass) { } @Override - protected IndividualTimeSeriesMetaInformation buildModel(EntityData data) { + protected TimeSeriesMetaInformation buildModel(EntityData data) { UUID timeSeries = data.getUUID(TIME_SERIES); - ColumnScheme columnScheme = ColumnScheme.parse(data.getField(COLUMN_SCHEME)).orElseThrow(); - return new IndividualTimeSeriesMetaInformation(timeSeries, columnScheme); + + if (LoadProfileTimeSeriesMetaInformation.class.isAssignableFrom(data.getTargetClass())) { + String profile = data.getField(LOAD_PROFILE); + return new LoadProfileTimeSeriesMetaInformation(timeSeries, profile); + } else { + ColumnScheme columnScheme = ColumnScheme.parse(data.getField(COLUMN_SCHEME)).orElseThrow(); + return new IndividualTimeSeriesMetaInformation(timeSeries, columnScheme); + } } } diff --git a/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java b/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java index 2be6831fd..26939fea2 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java @@ -42,6 +42,11 @@ public String getTimeSeriesEntityName(ColumnScheme columnScheme) { return TIME_SERIES_PREFIX + columnScheme.getScheme(); } + /** Provides the name of the time series table that contains all load profiles. */ + public String getLoadProfileTimeSeriesEntityName() { + return TIME_SERIES_PREFIX + "load_profiles"; + } + public Optional getEntityName(Class cls) { return entityPersistenceNamingStrategy.getEntityName(cls); } diff --git a/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java index 57f4dddb8..b9fc6c770 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java @@ -8,6 +8,7 @@ import static edu.ie3.datamodel.models.profile.LoadProfile.RandomLoadProfile.RANDOM_LOAD_PROFILE; import edu.ie3.datamodel.exceptions.FactoryException; +import edu.ie3.datamodel.exceptions.SourceException; import edu.ie3.datamodel.io.csv.CsvLoadProfileMetaInformation; import edu.ie3.datamodel.io.factory.timeseries.BdewLoadProfileFactory; import edu.ie3.datamodel.io.factory.timeseries.LoadProfileData; @@ -18,6 +19,7 @@ import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; import edu.ie3.datamodel.models.profile.LoadProfile; import edu.ie3.datamodel.models.timeseries.repetitive.*; +import edu.ie3.datamodel.models.value.PValue; import edu.ie3.datamodel.models.value.Value; import edu.ie3.datamodel.models.value.load.BdewLoadValues; import edu.ie3.datamodel.models.value.load.LoadValues; @@ -27,6 +29,7 @@ import java.time.ZonedDateTime; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.function.Function; import java.util.stream.Collectors; @@ -65,6 +68,15 @@ protected Try, FactoryException> createEntries( */ public abstract List getTimeKeysAfter(ZonedDateTime time); + /** + * Method to get the value for a given time. + * + * @param time for which a value is needed + * @return an optional + * @throws SourceException if an exception occurred + */ + public abstract Optional getValue(ZonedDateTime time) throws SourceException; + /** * Method to read in the build-in {@link BdewStandardLoadProfile}s. * diff --git a/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesMetaInformationSource.java b/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesMetaInformationSource.java index d97c032ba..3bc09db66 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesMetaInformationSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesMetaInformationSource.java @@ -7,6 +7,8 @@ import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme; import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; +import edu.ie3.datamodel.models.profile.LoadProfile; import java.util.Map; import java.util.Optional; import java.util.UUID; @@ -29,4 +31,20 @@ public interface TimeSeriesMetaInformationSource { * @return An Option on the meta information */ Optional getTimeSeriesMetaInformation(UUID timeSeriesUuid); + + /** + * Gat a mapping from load profile to {@link LoadProfileTimeSeriesMetaInformation}. + * + * @return that mapping + */ + Map getLoadProfileMetaInformation(); + + /** + * Get an option on the given time series meta information + * + * @param loadProfile load profile of the time series in question + * @return An Option on the meta information + */ + Optional getLoadProfileMetaInformation( + LoadProfile loadProfile); } diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java index aa742557d..3bcebfa12 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java @@ -14,6 +14,7 @@ import edu.ie3.datamodel.models.profile.LoadProfile; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; +import edu.ie3.datamodel.models.value.PValue; import edu.ie3.datamodel.models.value.load.LoadValues; import edu.ie3.datamodel.utils.Try; import java.nio.file.Path; @@ -67,6 +68,11 @@ public List getTimeKeysAfter(ZonedDateTime time) { return loadProfileTimeSeries.getTimeKeysAfter(time); } + @Override + public Optional getValue(ZonedDateTime time) throws SourceException { + return loadProfileTimeSeries.getValue(time); + } + // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- /** diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMetaInformationSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMetaInformationSource.java index dbf5114cf..101dd838c 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMetaInformationSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMetaInformationSource.java @@ -6,15 +6,20 @@ package edu.ie3.datamodel.io.source.csv; import edu.ie3.datamodel.io.csv.CsvIndividualTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.csv.CsvLoadProfileMetaInformation; import edu.ie3.datamodel.io.naming.FileNamingStrategy; import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme; import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; import edu.ie3.datamodel.io.source.TimeSeriesMetaInformationSource; +import edu.ie3.datamodel.models.profile.LoadProfile; import edu.ie3.datamodel.utils.TimeSeriesUtils; import java.nio.file.Path; +import java.util.Collections; import java.util.Map; import java.util.Optional; import java.util.UUID; +import java.util.function.Function; import java.util.stream.Collectors; /** @@ -27,6 +32,8 @@ public class CsvTimeSeriesMetaInformationSource implements TimeSeriesMetaInforma private final Map timeSeriesMetaInformation; + private final Map loadProfileMetaInformation; + /** * Creates a time series type source * @@ -41,12 +48,17 @@ public CsvTimeSeriesMetaInformationSource( this.timeSeriesMetaInformation = dataSource.getCsvIndividualTimeSeriesMetaInformation( TimeSeriesUtils.getAcceptedColumnSchemes().toArray(new ColumnScheme[0])); + + this.loadProfileMetaInformation = + dataSource.getCsvLoadProfileMetaInformation().stream() + .collect( + Collectors.toMap( + LoadProfileTimeSeriesMetaInformation::getProfile, Function.identity())); } @Override public Map getTimeSeriesMetaInformation() { - return timeSeriesMetaInformation.entrySet().stream() - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + return Collections.unmodifiableMap(timeSeriesMetaInformation); } @Override @@ -54,4 +66,15 @@ public Optional getTimeSeriesMetaInformatio UUID timeSeriesUuid) { return Optional.ofNullable(timeSeriesMetaInformation.get(timeSeriesUuid)); } + + @Override + public Map getLoadProfileMetaInformation() { + return Collections.unmodifiableMap(loadProfileMetaInformation); + } + + @Override + public Optional getLoadProfileMetaInformation( + LoadProfile loadProfile) { + return Optional.ofNullable(loadProfileMetaInformation.get(loadProfile.getKey())); + } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java new file mode 100644 index 000000000..5cdabea95 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java @@ -0,0 +1,195 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.io.source.sql; + +import static edu.ie3.datamodel.io.source.sql.SqlDataSource.createBaseQueryString; + +import edu.ie3.datamodel.exceptions.SourceException; +import edu.ie3.datamodel.exceptions.ValidationException; +import edu.ie3.datamodel.io.connectors.SqlConnector; +import edu.ie3.datamodel.io.factory.timeseries.LoadProfileFactory; +import edu.ie3.datamodel.io.naming.DatabaseNamingStrategy; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.source.LoadProfileSource; +import edu.ie3.datamodel.models.profile.LoadProfile; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; +import edu.ie3.datamodel.models.value.PValue; +import edu.ie3.datamodel.models.value.Value; +import edu.ie3.datamodel.models.value.load.LoadValues; +import edu.ie3.datamodel.utils.TimeSeriesUtils; +import java.time.ZonedDateTime; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Sql source for {@link LoadProfileTimeSeries}. + * + * @param

type of load profile + * @param type of load values + */ +public class SqlLoadProfileSource

+ extends LoadProfileSource { + protected static final Logger log = LoggerFactory.getLogger(SqlTimeSeriesSource.class); + private final SqlDataSource dataSource; + private final String tableName; + + private final LoadProfileTimeSeriesMetaInformation metaInformation; + private final P loadProfile; + + // General fields + private static final String WHERE = " WHERE "; + private static final String TIME_SERIES = "time_series"; + private static final String LOAD_PROFILE = "load_profile"; + + /** + * Queries that are available within this source. Motivation to have them as field value is to + * avoid creating a new string each time, bc they're always the same. + */ + private final String queryFull; + + private final String queryTime; + + public SqlLoadProfileSource( + SqlDataSource dataSource, + LoadProfileTimeSeriesMetaInformation metaInformation, + Class entryClass, + LoadProfileFactory entryFactory) { + super(entryClass, entryFactory); + this.dataSource = dataSource; + + this.tableName = dataSource.databaseNamingStrategy.getLoadProfileTimeSeriesEntityName(); + this.metaInformation = metaInformation; + this.loadProfile = entryFactory.parseProfile(metaInformation.getProfile()); + + String dbTimeColumnName = + dataSource.getDbColumnName(entryFactory.getTimeFieldString(), tableName); + + this.queryFull = createQueryFull(dataSource.schemaName, tableName); + this.queryTime = createQueryForTime(dataSource.schemaName, tableName, dbTimeColumnName); + } + + public SqlLoadProfileSource( + SqlConnector connector, + String schemaName, + DatabaseNamingStrategy namingStrategy, + LoadProfileTimeSeriesMetaInformation metaInformation, + Class entryClass, + LoadProfileFactory entryFactory) { + this( + new SqlDataSource(connector, schemaName, namingStrategy), + metaInformation, + entryClass, + entryFactory); + } + + @Override + public void validate() throws ValidationException { + validate(entryClass, () -> dataSource.getSourceFields(tableName), entryFactory); + } + + // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- + + @Override + public LoadProfileTimeSeries getTimeSeries() { + Set> entries = getEntries(queryFull, ps -> {}); + return entryFactory.build(metaInformation, entries); + } + + @Override + public List getTimeKeysAfter(ZonedDateTime time) { + return List.of(time.plusMinutes(15)); + } + + @Override + public Optional getValue(ZonedDateTime time) throws SourceException { + Set> entries = + getEntries(queryTime, ps -> ps.setInt(1, TimeSeriesUtils.calculateQuarterHourOfDay(time))); + if (entries.isEmpty()) return Optional.empty(); + if (entries.size() > 1) log.warn("Retrieved more than one result value, using the first"); + return Optional.of(entries.stream().toList().get(0).getValue().getValue(time, loadProfile)); + } + + // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- + + /** + * Creates a set of {@link LoadProfileEntry} from database. + * + * @param query to execute + * @param addParams additional parameters + * @return a set of {@link LoadProfileEntry} + */ + private Set> getEntries(String query, SqlDataSource.AddParams addParams) { + return dataSource + .executeQuery(query, addParams) + .map(this::createEntity) + .flatMap(Optional::stream) + .collect(Collectors.toSet()); + } + + /** + * Build a {@link LoadProfileEntry} of type {@code V}, whereas the underlying {@link Value} does + * not need any additional information. + * + * @param fieldToValues Mapping from field id to values + * @return optional {@link LoadProfileEntry} + */ + private Optional> createEntity(Map fieldToValues) { + fieldToValues.remove("timeSeries"); + return createEntries(fieldToValues).getData(); + } + + /** + * Creates a base query to retrieve all entities for this time series:
+ * {@code WHERE time_series = $timeSeriesUuid AND

extends EntitySource { - private static final CsvDataSource buildInSource = getBuildInSource(Path.of("load")); - protected final Class entryClass; protected final LoadProfileFactory entryFactory; @@ -82,7 +82,10 @@ protected Try, FactoryException> createEntries( * * @return a map: load profile to time series */ - public static Map getBDEWLoadProfiles() { + public static Map getBDEWLoadProfiles() + throws SourceException { + CsvDataSource buildInSource = getBuildInSource(LoadProfileSource.class, "/load"); + BdewLoadProfileFactory factory = new BdewLoadProfileFactory(); return buildInSource.getCsvLoadProfileMetaInformation(BdewStandardLoadProfile.values()).stream() @@ -100,7 +103,9 @@ public static Map getBDEWLoa * * @return the random load profile time series */ - public static RandomLoadProfileTimeSeries getRandomLoadProfile() { + public static RandomLoadProfileTimeSeries getRandomLoadProfile() throws SourceException { + CsvDataSource buildInSource = getBuildInSource(LoadProfileSource.class, "/load"); + CsvLoadProfileMetaInformation metaInformation = buildInSource.getCsvLoadProfileMetaInformation(RANDOM_LOAD_PROFILE).stream() .findAny() diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java index 322a1c9e6..c15e308cb 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java @@ -58,6 +58,13 @@ public CsvDataSource(String csvSep, Path directoryPath, FileNamingStrategy fileN this.fileNamingStrategy = fileNamingStrategy; } + public CsvDataSource( + String csvSep, CsvFileConnector connector, FileNamingStrategy fileNamingStrategy) { + this.csvSep = csvSep; + this.connector = connector; + this.fileNamingStrategy = fileNamingStrategy; + } + @Override public Optional> getSourceFields(Class entityClass) throws SourceException { diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMetaInformationSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMetaInformationSource.java index 101dd838c..a3c828903 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMetaInformationSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMetaInformationSource.java @@ -43,7 +43,16 @@ public class CsvTimeSeriesMetaInformationSource implements TimeSeriesMetaInforma */ public CsvTimeSeriesMetaInformationSource( String csvSep, Path folderPath, FileNamingStrategy fileNamingStrategy) { - this.dataSource = new CsvDataSource(csvSep, folderPath, fileNamingStrategy); + this(new CsvDataSource(csvSep, folderPath, fileNamingStrategy)); + } + + /** + * Creates a time series type source + * + * @param dataSource a csv data source + */ + public CsvTimeSeriesMetaInformationSource(CsvDataSource dataSource) { + this.dataSource = dataSource; // retrieve only the desired time series this.timeSeriesMetaInformation = dataSource.getCsvIndividualTimeSeriesMetaInformation( From 08ed24e10cad63d351a37714cc8313ca10c0ee94 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Fri, 20 Sep 2024 13:10:21 +0200 Subject: [PATCH 12/23] Improving code. --- .../io/factory/timeseries/BdewLoadProfileFactory.java | 5 +++++ .../io/factory/timeseries/LoadProfileFactory.java | 3 +++ .../factory/timeseries/RandomLoadProfileFactory.java | 5 +++++ .../ie3/datamodel/io/source/LoadProfileSource.java | 10 ++++++++++ .../datamodel/io/source/csv/CsvLoadProfileSource.java | 7 +++++++ .../datamodel/io/source/sql/SqlLoadProfileSource.java | 7 +++++++ .../java/edu/ie3/datamodel/models/BdewSeason.java | 11 +++++++---- 7 files changed, 44 insertions(+), 4 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java index 265fd4c09..c45b3705e 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java @@ -129,4 +129,9 @@ public Optional> calculateMaxPower( return power.map(p -> Quantities.getQuantity(p, WATT)); } + + @Override + public double getLoadProfileEnergyScaling() { + return 1000d; + } } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java index a65c39a32..18402be8f 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java @@ -44,4 +44,7 @@ public abstract Optional> calculateMaxPower( public String getTimeFieldString() { return QUARTER_HOUR; } + + /** Returns the load profile energy scaling. */ + public abstract double getLoadProfileEnergyScaling(); } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java index c5c182ea6..3dace9bdb 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java @@ -84,4 +84,9 @@ public Optional> calculateMaxPower( LoadProfile loadProfile, Set> loadProfileEntries) { return Optional.empty(); } + + @Override + public double getLoadProfileEnergyScaling() { + return 1d; + } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java index f5f60b0a4..baac992e9 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java @@ -34,6 +34,8 @@ import java.util.Optional; import java.util.function.Function; import java.util.stream.Collectors; +import javax.measure.quantity.Power; +import tech.units.indriya.ComparableQuantity; public abstract class LoadProfileSource

extends EntitySource { @@ -77,6 +79,14 @@ protected Try, FactoryException> createEntries( */ public abstract Optional getValue(ZonedDateTime time) throws SourceException; + /** Returns the maximal power value of the time series */ + public abstract Optional> getMaxValue(); + + /** Returns the load profile energy scaling for this load profile time series. */ + public double getLoadProfileEnergyScaling() { + return entryFactory.getLoadProfileEnergyScaling(); + } + /** * Method to read in the build-in {@link BdewStandardLoadProfile}s. * diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java index 3bcebfa12..c4719560e 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java @@ -22,6 +22,8 @@ import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; +import javax.measure.quantity.Power; +import tech.units.indriya.ComparableQuantity; /** * Source that is capable of providing information around load profile time series from csv files. @@ -73,6 +75,11 @@ public Optional getValue(ZonedDateTime time) throws SourceException { return loadProfileTimeSeries.getValue(time); } + @Override + public Optional> getMaxValue() { + return loadProfileTimeSeries.maxPower; + } + // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- /** diff --git a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java index 5cdabea95..1ab5de5a9 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java @@ -27,8 +27,10 @@ import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; +import javax.measure.quantity.Power; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import tech.units.indriya.ComparableQuantity; /** * Sql source for {@link LoadProfileTimeSeries}. @@ -118,6 +120,11 @@ public Optional getValue(ZonedDateTime time) throws SourceException { return Optional.of(entries.stream().toList().get(0).getValue().getValue(time, loadProfile)); } + @Override + public Optional> getMaxValue() { + return entryFactory.calculateMaxPower(loadProfile, getEntries(queryFull, ps -> {})); + } + // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- /** diff --git a/src/main/java/edu/ie3/datamodel/models/BdewSeason.java b/src/main/java/edu/ie3/datamodel/models/BdewSeason.java index defb4c016..eb7336c55 100644 --- a/src/main/java/edu/ie3/datamodel/models/BdewSeason.java +++ b/src/main/java/edu/ie3/datamodel/models/BdewSeason.java @@ -21,10 +21,13 @@ public enum BdewSeason { public static BdewSeason parse(String key) throws ParsingException { return switch (key) { - case "Wi" -> WINTER; - case "Su" -> SUMMER; - case "Tr" -> TRANSITION; - default -> throw new ParsingException("There is no season for key:" + key); + case "Wi", "Winter" -> WINTER; + case "Su", "Summer" -> SUMMER; + case "Tr", "Intermediate" -> TRANSITION; + default -> throw new ParsingException( + "There is no season for key:" + + key + + ". Permissible keys: 'Wi', 'Winter', 'Su', 'Summer', 'Tr', 'Intermediate'"); }; } From 8c4c8b6d4c71ee1944b80e09978a48b2bcca34ee Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Fri, 20 Sep 2024 13:40:34 +0200 Subject: [PATCH 13/23] Improving code. --- .../io/factory/timeseries/RandomLoadProfileFactory.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java index 3dace9bdb..d17e44c51 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java @@ -16,7 +16,10 @@ import java.util.Optional; import java.util.Set; import javax.measure.quantity.Power; + +import edu.ie3.util.quantities.PowerSystemUnits; import tech.units.indriya.ComparableQuantity; +import tech.units.indriya.quantity.Quantities; public class RandomLoadProfileFactory extends LoadProfileFactory { public static final String K_WEEKDAY = "kWd"; @@ -82,11 +85,11 @@ public LoadProfile parseProfile(String profile) { @Override public Optional> calculateMaxPower( LoadProfile loadProfile, Set> loadProfileEntries) { - return Optional.empty(); + return Optional.of(Quantities.getQuantity(159d, PowerSystemUnits.WATT)); } @Override public double getLoadProfileEnergyScaling() { - return 1d; + return 716.5416966513656; } } From 3779c1f39270d90a90875367e4dc500bf1b5f163 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Fri, 8 Nov 2024 13:21:11 +0100 Subject: [PATCH 14/23] Removing uuid for load profile time series. --- .../io/csv/CsvLoadProfileMetaInformation.java | 7 +-- .../timeseries/RandomLoadProfileFactory.java | 3 +- .../TimeSeriesMetaInformationFactory.java | 6 +- .../io/naming/DatabaseNamingStrategy.java | 17 +++--- .../EntityPersistenceNamingStrategy.java | 7 +-- .../LoadProfileTimeSeriesMetaInformation.java | 5 ++ .../edu/ie3/datamodel/io/sink/SqlSink.java | 59 ++++++++++++++----- .../ie3/datamodel/io/source/EntitySource.java | 1 - .../io/source/LoadProfileSource.java | 7 ++- .../io/source/csv/CsvDataSource.java | 8 ++- .../CsvTimeSeriesMetaInformationSource.java | 2 +- .../io/source/sql/SqlLoadProfileSource.java | 11 +--- .../SqlTimeSeriesMetaInformationSource.java | 6 +- ...479c-8a40-1323bb9150a9.csv => lpts_g0.csv} | 0 ...4a14-b627-71a43fea1d20.csv => lpts_g1.csv} | 0 ...4c9b-b818-4079cebf59cc.csv => lpts_g2.csv} | 0 ...43c1-a3f4-26dd26266216.csv => lpts_g3.csv} | 0 ...4f7d-a888-0a9502abd763.csv => lpts_g4.csv} | 0 ...4f14-8330-b2eea9414101.csv => lpts_g5.csv} | 0 ...4950-a579-e02b31fa9d1a.csv => lpts_g6.csv} | 0 ...4310-8f21-298e6af8b245.csv => lpts_h0.csv} | 0 ...4949-87e4-3611cf485a82.csv => lpts_l0.csv} | 0 ...49af-961b-b0daf04fdeee.csv => lpts_l1.csv} | 0 ...4647-96db-086f463d0e0d.csv => lpts_l2.csv} | 0 ...-869f-d22c4e9e07cb.csv => lpts_random.csv} | 0 ...EntityPersistenceNamingStrategyTest.groovy | 11 ++-- .../io/naming/FileNamingStrategyTest.groovy | 20 +++---- .../datamodel/io/sink/CsvFileSinkTest.groovy | 2 +- .../ie3/datamodel/io/sink/SqlSinkTest.groovy | 3 +- .../io/source/csv/CsvDataSourceTest.groovy | 26 +++----- .../source/sql/SqlLoadProfileSourceIT.groovy | 2 +- ...qlTimeSeriesMetaInformationSourceIT.groovy | 15 ++--- .../datamodel/io/sink/_sql/load_profile.sql | 11 ---- .../datamodel/io/sink/_sql/load_profiles.sql | 24 ++++++++ .../io/source/csv/_timeseries/lpts_g2.csv | 3 + .../source/sql/_timeseries/load_profiles.sql | 35 +++++++++++ .../_timeseries/time_series_load_profiles.sql | 36 ----------- 37 files changed, 173 insertions(+), 154 deletions(-) rename src/main/resources/load/{lpts_g0_fa3894c1-25af-479c-8a40-1323bb9150a9.csv => lpts_g0.csv} (100%) rename src/main/resources/load/{lpts_g1_177ebd2f-7174-4a14-b627-71a43fea1d20.csv => lpts_g1.csv} (100%) rename src/main/resources/load/{lpts_g2_b0ad5ba2-0d5e-4c9b-b818-4079cebf59cc.csv => lpts_g2.csv} (100%) rename src/main/resources/load/{lpts_g3_9b880468-309c-43c1-a3f4-26dd26266216.csv => lpts_g3.csv} (100%) rename src/main/resources/load/{lpts_g4_b7682f84-d317-4f7d-a888-0a9502abd763.csv => lpts_g4.csv} (100%) rename src/main/resources/load/{lpts_g5_ec51ae43-3849-4f14-8330-b2eea9414101.csv => lpts_g5.csv} (100%) rename src/main/resources/load/{lpts_g6_d0606284-5f9e-4950-a579-e02b31fa9d1a.csv => lpts_g6.csv} (100%) rename src/main/resources/load/{lpts_h0_de021c4d-bb57-4310-8f21-298e6af8b245.csv => lpts_h0.csv} (100%) rename src/main/resources/load/{lpts_l0_42f31f05-8c3b-4949-87e4-3611cf485a82.csv => lpts_l0.csv} (100%) rename src/main/resources/load/{lpts_l1_aa65260e-efd5-49af-961b-b0daf04fdeee.csv => lpts_l1.csv} (100%) rename src/main/resources/load/{lpts_l2_9029deec-5f70-4647-96db-086f463d0e0d.csv => lpts_l2.csv} (100%) rename src/main/resources/load/{lpts_random_34e34adb-a54a-4669-869f-d22c4e9e07cb.csv => lpts_random.csv} (100%) delete mode 100644 src/test/resources/edu/ie3/datamodel/io/sink/_sql/load_profile.sql create mode 100644 src/test/resources/edu/ie3/datamodel/io/sink/_sql/load_profiles.sql create mode 100644 src/test/resources/edu/ie3/datamodel/io/source/csv/_timeseries/lpts_g2.csv create mode 100644 src/test/resources/edu/ie3/datamodel/io/source/sql/_timeseries/load_profiles.sql delete mode 100644 src/test/resources/edu/ie3/datamodel/io/source/sql/_timeseries/time_series_load_profiles.sql diff --git a/src/main/java/edu/ie3/datamodel/io/csv/CsvLoadProfileMetaInformation.java b/src/main/java/edu/ie3/datamodel/io/csv/CsvLoadProfileMetaInformation.java index 8db0ef7fe..a7ccd4f8c 100644 --- a/src/main/java/edu/ie3/datamodel/io/csv/CsvLoadProfileMetaInformation.java +++ b/src/main/java/edu/ie3/datamodel/io/csv/CsvLoadProfileMetaInformation.java @@ -8,19 +8,18 @@ import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; import java.nio.file.Path; import java.util.Objects; -import java.util.UUID; public class CsvLoadProfileMetaInformation extends LoadProfileTimeSeriesMetaInformation { private final Path fullFilePath; - public CsvLoadProfileMetaInformation(UUID uuid, String profile, Path fullFilePath) { - super(uuid, profile); + public CsvLoadProfileMetaInformation(String profile, Path fullFilePath) { + super(profile); this.fullFilePath = fullFilePath; } public CsvLoadProfileMetaInformation( LoadProfileTimeSeriesMetaInformation metaInformation, Path fullFilePath) { - this(metaInformation.getUuid(), metaInformation.getProfile(), fullFilePath); + this(metaInformation.getProfile(), fullFilePath); } public Path getFullFilePath() { diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java index d17e44c51..d6555509a 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java @@ -12,12 +12,11 @@ import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; import edu.ie3.datamodel.models.timeseries.repetitive.RandomLoadProfileTimeSeries; import edu.ie3.datamodel.models.value.load.RandomLoadValues; +import edu.ie3.util.quantities.PowerSystemUnits; import java.util.List; import java.util.Optional; import java.util.Set; import javax.measure.quantity.Power; - -import edu.ie3.util.quantities.PowerSystemUnits; import tech.units.indriya.ComparableQuantity; import tech.units.indriya.quantity.Quantities; diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMetaInformationFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMetaInformationFactory.java index aebbfa02e..820f3f48a 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMetaInformationFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMetaInformationFactory.java @@ -40,12 +40,12 @@ protected List> getFields(Class entityClass) { @Override protected TimeSeriesMetaInformation buildModel(EntityData data) { - UUID timeSeries = data.getUUID(TIME_SERIES); - if (LoadProfileTimeSeriesMetaInformation.class.isAssignableFrom(data.getTargetClass())) { String profile = data.getField(LOAD_PROFILE); - return new LoadProfileTimeSeriesMetaInformation(timeSeries, profile); + return new LoadProfileTimeSeriesMetaInformation(profile); } else { + UUID timeSeries = data.getUUID(TIME_SERIES); + ColumnScheme columnScheme = ColumnScheme.parse(data.getField(COLUMN_SCHEME)).orElseThrow(); return new IndividualTimeSeriesMetaInformation(timeSeries, columnScheme); } diff --git a/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java b/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java index b3b35172b..ebcc1fdf6 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java @@ -12,7 +12,7 @@ import edu.ie3.datamodel.models.timeseries.TimeSeries; import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries; -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileInput; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; import edu.ie3.datamodel.models.value.Value; import java.util.Optional; @@ -21,7 +21,7 @@ public class DatabaseNamingStrategy { private static final String TIME_SERIES_PREFIX = "time_series_"; - private static final String LOAD_PROFILE_PREFIX = "load_profile_"; + private static final String LOAD_PROFILE_PREFIX = "load_profiles"; private final EntityPersistenceNamingStrategy entityPersistenceNamingStrategy; @@ -53,13 +53,12 @@ public String getTimeSeriesEntityName(ColumnScheme columnScheme) { } /** - * Provides the name of a load profile given by the load profile key + * Provides the name of the load profile table. * - * @param lpKey Load profile key * @return the table name */ - private String getLoadProfileEntityName(String lpKey) { - return LOAD_PROFILE_PREFIX + lpKey; + public String getLoadProfileEntityName() { + return LOAD_PROFILE_PREFIX; } /** @@ -78,7 +77,7 @@ public Optional getEntityName(Class cls) { * @param timeSeries to be named TimeSeries * @return the table name */ - public , E extends TimeSeriesEntry, V extends Value> + public , E extends TimeSeriesEntry, V extends Value> Optional getEntityName(T timeSeries) { if (timeSeries instanceof IndividualTimeSeries individualTimeSeries) { Optional maybeFirstElement = individualTimeSeries.getEntries().stream().findFirst(); @@ -89,8 +88,8 @@ Optional getEntityName(T timeSeries) { logger.error("Unable to determine content of time series {}", timeSeries); return Optional.empty(); } - } else if (timeSeries instanceof LoadProfileInput loadProfileInput) { - return Optional.of(getLoadProfileEntityName(loadProfileInput.getType().getKey())); + } else if (timeSeries instanceof LoadProfileTimeSeries) { + return Optional.of(getLoadProfileEntityName()); } else { logger.error("There is no naming strategy defined for {}", timeSeries); return Optional.empty(); diff --git a/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java b/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java index e328041b3..c6a0b89ab 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java @@ -60,7 +60,7 @@ public class EntityPersistenceNamingStrategy { * profile is accessible via the named capturing group "profile", the uuid by the group "uuid" */ private static final String LOAD_PROFILE_TIME_SERIES = - "lpts_(?[a-zA-Z]{1,11}[0-9]{0,3})_(?" + UUID_STRING + ")"; + "lpts_(?[a-zA-Z]{1,11}[0-9]{0,3})"; /** * Pattern to identify load profile time series in this instance of the naming strategy (takes @@ -163,8 +163,7 @@ public LoadProfileTimeSeriesMetaInformation loadProfileTimesSeriesMetaInformatio throw new IllegalArgumentException( "Cannot extract meta information on load profile time series from '" + fileName + "'."); - return new LoadProfileTimeSeriesMetaInformation( - UUID.fromString(matcher.group("uuid")), matcher.group("profile")); + return new LoadProfileTimeSeriesMetaInformation(matcher.group("profile")); } /** @@ -374,8 +373,6 @@ Optional getEntityName(T timeSeries) { .concat("lpts") .concat("_") .concat(loadProfileTimeSeries.getLoadProfile().getKey()) - .concat("_") - .concat(loadProfileTimeSeries.getUuid().toString()) .concat(suffix)); } else { logger.error("There is no naming strategy defined for {}", timeSeries); diff --git a/src/main/java/edu/ie3/datamodel/io/naming/timeseries/LoadProfileTimeSeriesMetaInformation.java b/src/main/java/edu/ie3/datamodel/io/naming/timeseries/LoadProfileTimeSeriesMetaInformation.java index d1e319668..72a3df4cf 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/timeseries/LoadProfileTimeSeriesMetaInformation.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/timeseries/LoadProfileTimeSeriesMetaInformation.java @@ -13,6 +13,11 @@ public class LoadProfileTimeSeriesMetaInformation extends TimeSeriesMetaInformation { private final String profile; + public LoadProfileTimeSeriesMetaInformation(String profile) { + super(UUID.randomUUID()); + this.profile = profile; + } + public LoadProfileTimeSeriesMetaInformation(UUID uuid, String profile) { super(uuid); this.profile = profile; diff --git a/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java b/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java index 907322b1f..35cdf3b9e 100644 --- a/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java +++ b/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java @@ -5,10 +5,12 @@ */ package edu.ie3.datamodel.io.sink; -import static edu.ie3.datamodel.io.SqlUtils.*; +import static edu.ie3.datamodel.io.SqlUtils.quote; import static java.util.stream.Collectors.groupingBy; -import edu.ie3.datamodel.exceptions.*; +import edu.ie3.datamodel.exceptions.EntityProcessorException; +import edu.ie3.datamodel.exceptions.ExtractorException; +import edu.ie3.datamodel.exceptions.ProcessorProviderException; import edu.ie3.datamodel.io.DbGridMetadata; import edu.ie3.datamodel.io.connectors.SqlConnector; import edu.ie3.datamodel.io.extractor.Extractor; @@ -18,17 +20,22 @@ import edu.ie3.datamodel.io.processor.ProcessorProvider; import edu.ie3.datamodel.io.processor.timeseries.TimeSeriesProcessorKey; import edu.ie3.datamodel.models.Entity; -import edu.ie3.datamodel.models.input.*; -import edu.ie3.datamodel.models.input.connector.*; +import edu.ie3.datamodel.models.input.AssetTypeInput; +import edu.ie3.datamodel.models.input.InputEntity; +import edu.ie3.datamodel.models.input.NodeInput; +import edu.ie3.datamodel.models.input.OperatorInput; +import edu.ie3.datamodel.models.input.connector.ConnectorInput; import edu.ie3.datamodel.models.input.container.JointGridContainer; import edu.ie3.datamodel.models.input.graphics.GraphicInput; -import edu.ie3.datamodel.models.input.system.*; +import edu.ie3.datamodel.models.input.system.SystemParticipantInput; import edu.ie3.datamodel.models.input.thermal.ThermalBusInput; import edu.ie3.datamodel.models.input.thermal.ThermalUnitInput; import edu.ie3.datamodel.models.result.ResultEntity; import edu.ie3.datamodel.models.timeseries.TimeSeries; import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; import edu.ie3.datamodel.models.value.Value; +import edu.ie3.datamodel.utils.TriFunction; import edu.ie3.util.StringUtils; import java.sql.SQLException; import java.util.*; @@ -47,6 +54,7 @@ public class SqlSink { private final String schemaName; private static final String TIME_SERIES = "time_series"; + private static final String LOAD_PROFILE = "load_profile"; public SqlSink( String schemaName, DatabaseNamingStrategy databaseNamingStrategy, SqlConnector connector) @@ -109,12 +117,12 @@ public void persistAll(Collection entities, DbGridMetadata } /** - * Persist an entity. By default this method takes care of the extraction process of nested + * Persist an entity. By default, this method takes care of the extraction process of nested * entities (if any) * * @param entity the entity that should be persisted * @param identifier identifier of the grid - * @throws SQLException + * @throws SQLException if an error occurred */ public void persist(C entity, DbGridMetadata identifier) throws SQLException { if (entity instanceof InputEntity inputEntity) { @@ -178,7 +186,7 @@ private void persistMixedList(List entities, DbGridMetadat * Persist a list of entities with same types. To minimize the number of queries, the entities * will be grouped by their class. */ - private , V extends Value> void persistList( + private , V extends Value> void persistList( List entities, Class cls, DbGridMetadata identifier) throws SQLException { // Check if there are only elements of the same class Class firstClass = entities.get(0).getClass(); @@ -222,7 +230,7 @@ private void insertListIgnoreNested( } /** Persist one time series. */ - protected , V extends Value> void persistTimeSeries( + protected , V extends Value> void persistTimeSeries( TimeSeries timeSeries, DbGridMetadata identifier) { try { TimeSeriesProcessorKey key = new TimeSeriesProcessorKey(timeSeries); @@ -234,17 +242,30 @@ protected , V extends Value> void persistTimeSeries } } - private , V extends Value> void persistTimeSeries( + private , V extends Value> void persistTimeSeries( TimeSeries timeSeries, String[] headerElements, DbGridMetadata identifier) throws ProcessorProviderException { try { + + TriFunction queryBuilder; + String timeSeriesIdentifier; + + if (timeSeries instanceof LoadProfileTimeSeries lpts) { + timeSeriesIdentifier = lpts.getLoadProfile().getKey(); + queryBuilder = this::basicInsertQueryValuesLPTS; + } else { + timeSeriesIdentifier = timeSeries.getUuid().toString(); + queryBuilder = this::basicInsertQueryValuesITS; + } + String query = - basicInsertQueryValuesITS( + queryBuilder.apply( schemaName, databaseNamingStrategy.getEntityName(timeSeries).orElseThrow(), headerElements); Set> entityFieldData = processorProvider.handleTimeSeries(timeSeries); + query = query + entityFieldData.stream() @@ -254,7 +275,7 @@ private , V extends Value> void persistTimeSeries( sqlEntityFieldData(data), headerElements, identifier, - timeSeries.getUuid().toString())) + timeSeriesIdentifier)) .collect(Collectors.joining(",\n", "", ";")); executeQueryToPersist(query); } catch (ProcessorProviderException e) { @@ -352,13 +373,13 @@ private String queryTimeSeriesValueLine( Map entityFieldData, String[] headerElements, DbGridMetadata identifier, - String tsUuid) { + String timeSeriesIdentifier) { return writeOneLine( Stream.concat( Stream.concat( Arrays.stream(headerElements).map(entityFieldData::get), identifier.getStreamForQuery()), - Stream.of(quote(tsUuid, "'")))); + Stream.of(quote(timeSeriesIdentifier, "'")))); } private LinkedHashMap sqlEntityFieldData( @@ -397,6 +418,16 @@ private String basicInsertQueryValuesITS( + "\nVALUES\n"; } + /** Provides the insert, column names, grid identifier, and the VALUES statement for a query. */ + private String basicInsertQueryValuesLPTS( + String schemaName, String tableName, String[] headerElements) { + String[] addParams = {DbGridMetadata.GRID_UUID_COLUMN, LOAD_PROFILE}; + return basicInsertQuery(schemaName, tableName) + + " " + + writeOneLine(StringUtils.camelCaseToSnakeCase(headerElements), addParams) + + "\nVALUES\n"; + } + /** Converts a stream of strings into an one line string with brackets. */ private String writeOneLine(Stream entries) { return "(" + entries.collect(Collectors.joining(",")) + ")"; diff --git a/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java b/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java index 2d752cc74..be0cdea31 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java @@ -129,7 +129,6 @@ protected static CsvDataSource getBuildInSource(Class clazz, String subdirect case "file" -> connector = new CsvFileConnector(Path.of(uri)); case "jar" -> { // handling resources in jar - String[] array = uri.toString().split("!"); if (jarFileSystem == null) { diff --git a/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java index baac992e9..c232e2252 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java @@ -98,7 +98,10 @@ public static Map getBDEWLoa BdewLoadProfileFactory factory = new BdewLoadProfileFactory(); - return buildInSource.getCsvLoadProfileMetaInformation(BdewStandardLoadProfile.values()).stream() + return buildInSource + .getCsvLoadProfileMetaInformation(BdewStandardLoadProfile.values()) + .values() + .stream() .map( metaInformation -> (BdewLoadProfileTimeSeries) @@ -117,7 +120,7 @@ public static RandomLoadProfileTimeSeries getRandomLoadProfile() throws SourceEx CsvDataSource buildInSource = getBuildInSource(LoadProfileSource.class, "/load"); CsvLoadProfileMetaInformation metaInformation = - buildInSource.getCsvLoadProfileMetaInformation(RANDOM_LOAD_PROFILE).stream() + buildInSource.getCsvLoadProfileMetaInformation(RANDOM_LOAD_PROFILE).values().stream() .findAny() .orElseThrow(); return (RandomLoadProfileTimeSeries) diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java index c15e308cb..da8700287 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java @@ -136,9 +136,9 @@ public FileNamingStrategy getNamingStrategy() { * Receive the information for specific load profile time series. They are given back mapped to * their uuid. * - * @return A mapping from uuid to the load profile time series meta information + * @return A mapping from profile to the load profile time series meta information */ - public Set getCsvLoadProfileMetaInformation( + public Map getCsvLoadProfileMetaInformation( LoadProfile... profiles) { return getTimeSeriesFilePaths(fileNamingStrategy.getLoadProfileTimeSeriesPattern()) .parallelStream() @@ -156,7 +156,9 @@ public Set getCsvLoadProfileMetaInformation( || profiles.length == 0 || Stream.of(profiles) .anyMatch(profile -> profile.getKey().equals(metaInformation.getProfile()))) - .collect(Collectors.toSet()); + .collect( + Collectors.toMap( + LoadProfileTimeSeriesMetaInformation::getProfile, Function.identity())); } /** diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMetaInformationSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMetaInformationSource.java index a3c828903..edd307727 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMetaInformationSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMetaInformationSource.java @@ -59,7 +59,7 @@ public CsvTimeSeriesMetaInformationSource(CsvDataSource dataSource) { TimeSeriesUtils.getAcceptedColumnSchemes().toArray(new ColumnScheme[0])); this.loadProfileMetaInformation = - dataSource.getCsvLoadProfileMetaInformation().stream() + dataSource.getCsvLoadProfileMetaInformation().values().stream() .collect( Collectors.toMap( LoadProfileTimeSeriesMetaInformation::getProfile, Function.identity())); diff --git a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java index 1ab5de5a9..cadb87e75 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java @@ -49,7 +49,6 @@ public class SqlLoadProfileSource

// General fields private static final String WHERE = " WHERE "; - private static final String TIME_SERIES = "time_series"; private static final String LOAD_PROFILE = "load_profile"; /** @@ -68,7 +67,7 @@ public SqlLoadProfileSource( super(entryClass, entryFactory); this.dataSource = dataSource; - this.tableName = dataSource.databaseNamingStrategy.getLoadProfileTimeSeriesEntityName(); + this.tableName = "load_profiles"; this.metaInformation = metaInformation; this.loadProfile = entryFactory.parseProfile(metaInformation.getProfile()); @@ -165,10 +164,6 @@ private Optional> createEntity(Map fieldToVa private String createQueryFull(String schemaName, String tableName) { return createBaseQueryString(schemaName, tableName) + WHERE - + TIME_SERIES - + " = '" - + metaInformation.getUuid().toString() - + "' AND " + LOAD_PROFILE + " = '" + loadProfile.getKey() @@ -188,10 +183,6 @@ private String createQueryFull(String schemaName, String tableName) { private String createQueryForTime(String schemaName, String tableName, String timeColumnName) { return createBaseQueryString(schemaName, tableName) + WHERE - + TIME_SERIES - + " = '" - + metaInformation.getUuid().toString() - + "' AND " + LOAD_PROFILE + " = '" + loadProfile.getKey() diff --git a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMetaInformationSource.java b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMetaInformationSource.java index a3d9a6567..97ea31888 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMetaInformationSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMetaInformationSource.java @@ -100,11 +100,7 @@ private String createQueryComplete(String schemaName) { * @return query String */ private String createLoadProfileQueryComplete(String schemaName) { - return "SELECT DISTINCT load_profile, time_series FROM " - + schemaName - + "." - + namingStrategy.getLoadProfileTimeSeriesEntityName() - + ";"; + return "SELECT DISTINCT load_profile FROM " + schemaName + ".load_profiles;"; } @Override diff --git a/src/main/resources/load/lpts_g0_fa3894c1-25af-479c-8a40-1323bb9150a9.csv b/src/main/resources/load/lpts_g0.csv similarity index 100% rename from src/main/resources/load/lpts_g0_fa3894c1-25af-479c-8a40-1323bb9150a9.csv rename to src/main/resources/load/lpts_g0.csv diff --git a/src/main/resources/load/lpts_g1_177ebd2f-7174-4a14-b627-71a43fea1d20.csv b/src/main/resources/load/lpts_g1.csv similarity index 100% rename from src/main/resources/load/lpts_g1_177ebd2f-7174-4a14-b627-71a43fea1d20.csv rename to src/main/resources/load/lpts_g1.csv diff --git a/src/main/resources/load/lpts_g2_b0ad5ba2-0d5e-4c9b-b818-4079cebf59cc.csv b/src/main/resources/load/lpts_g2.csv similarity index 100% rename from src/main/resources/load/lpts_g2_b0ad5ba2-0d5e-4c9b-b818-4079cebf59cc.csv rename to src/main/resources/load/lpts_g2.csv diff --git a/src/main/resources/load/lpts_g3_9b880468-309c-43c1-a3f4-26dd26266216.csv b/src/main/resources/load/lpts_g3.csv similarity index 100% rename from src/main/resources/load/lpts_g3_9b880468-309c-43c1-a3f4-26dd26266216.csv rename to src/main/resources/load/lpts_g3.csv diff --git a/src/main/resources/load/lpts_g4_b7682f84-d317-4f7d-a888-0a9502abd763.csv b/src/main/resources/load/lpts_g4.csv similarity index 100% rename from src/main/resources/load/lpts_g4_b7682f84-d317-4f7d-a888-0a9502abd763.csv rename to src/main/resources/load/lpts_g4.csv diff --git a/src/main/resources/load/lpts_g5_ec51ae43-3849-4f14-8330-b2eea9414101.csv b/src/main/resources/load/lpts_g5.csv similarity index 100% rename from src/main/resources/load/lpts_g5_ec51ae43-3849-4f14-8330-b2eea9414101.csv rename to src/main/resources/load/lpts_g5.csv diff --git a/src/main/resources/load/lpts_g6_d0606284-5f9e-4950-a579-e02b31fa9d1a.csv b/src/main/resources/load/lpts_g6.csv similarity index 100% rename from src/main/resources/load/lpts_g6_d0606284-5f9e-4950-a579-e02b31fa9d1a.csv rename to src/main/resources/load/lpts_g6.csv diff --git a/src/main/resources/load/lpts_h0_de021c4d-bb57-4310-8f21-298e6af8b245.csv b/src/main/resources/load/lpts_h0.csv similarity index 100% rename from src/main/resources/load/lpts_h0_de021c4d-bb57-4310-8f21-298e6af8b245.csv rename to src/main/resources/load/lpts_h0.csv diff --git a/src/main/resources/load/lpts_l0_42f31f05-8c3b-4949-87e4-3611cf485a82.csv b/src/main/resources/load/lpts_l0.csv similarity index 100% rename from src/main/resources/load/lpts_l0_42f31f05-8c3b-4949-87e4-3611cf485a82.csv rename to src/main/resources/load/lpts_l0.csv diff --git a/src/main/resources/load/lpts_l1_aa65260e-efd5-49af-961b-b0daf04fdeee.csv b/src/main/resources/load/lpts_l1.csv similarity index 100% rename from src/main/resources/load/lpts_l1_aa65260e-efd5-49af-961b-b0daf04fdeee.csv rename to src/main/resources/load/lpts_l1.csv diff --git a/src/main/resources/load/lpts_l2_9029deec-5f70-4647-96db-086f463d0e0d.csv b/src/main/resources/load/lpts_l2.csv similarity index 100% rename from src/main/resources/load/lpts_l2_9029deec-5f70-4647-96db-086f463d0e0d.csv rename to src/main/resources/load/lpts_l2.csv diff --git a/src/main/resources/load/lpts_random_34e34adb-a54a-4669-869f-d22c4e9e07cb.csv b/src/main/resources/load/lpts_random.csv similarity index 100% rename from src/main/resources/load/lpts_random_34e34adb-a54a-4669-869f-d22c4e9e07cb.csv rename to src/main/resources/load/lpts_random.csv diff --git a/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy index 897873d76..06765fdc1 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy @@ -80,7 +80,7 @@ class EntityPersistenceNamingStrategyTest extends Specification { def "The pattern for a repetitive load profile time series file name actually matches a valid file name and extracts the correct groups"() { given: def ens = new EntityPersistenceNamingStrategy() - def validFileName = "lpts_g3_bee0a8b6-4788-4f18-bf72-be52035f7304" + def validFileName = "lpts_g3" when: def matcher = ens.loadProfileTimeSeriesPattern.matcher(validFileName) @@ -89,11 +89,9 @@ class EntityPersistenceNamingStrategyTest extends Specification { matcher.matches() then: "it also has correct capturing groups" - matcher.groupCount() == 2 + matcher.groupCount() == 1 matcher.group(1) == "g3" - matcher.group(2) == "bee0a8b6-4788-4f18-bf72-be52035f7304" matcher.group("profile") == "g3" - matcher.group("uuid") == "bee0a8b6-4788-4f18-bf72-be52035f7304" } def "Trying to extract individual time series meta information throws an Exception, if it is provided a malformed string"() { @@ -415,7 +413,6 @@ class EntityPersistenceNamingStrategyTest extends Specification { given: EntityPersistenceNamingStrategy strategy = new EntityPersistenceNamingStrategy() BdewLoadProfileTimeSeries timeSeries = Mock(BdewLoadProfileTimeSeries) - timeSeries.uuid >> uuid timeSeries.loadProfile >> type when: @@ -426,8 +423,8 @@ class EntityPersistenceNamingStrategyTest extends Specification { actual.get() == expectedFileName where: - clazz | uuid | type || expectedFileName - BdewLoadProfileTimeSeries | UUID.fromString("9b880468-309c-43c1-a3f4-26dd26266216") | BdewStandardLoadProfile.G3 || "lpts_g3_9b880468-309c-43c1-a3f4-26dd26266216" + clazz | type || expectedFileName + BdewLoadProfileTimeSeries | BdewStandardLoadProfile.G3 || "lpts_g3" } def "A EntityPersistenceNamingStrategy returns empty Optional, when there is no naming defined for a given time series class"() { diff --git a/src/test/groovy/edu/ie3/datamodel/io/naming/FileNamingStrategyTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/naming/FileNamingStrategyTest.groovy index 4902b03e5..353fa3f8d 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/naming/FileNamingStrategyTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/naming/FileNamingStrategyTest.groovy @@ -399,7 +399,6 @@ class FileNamingStrategyTest extends Specification { given: def strategy = new FileNamingStrategy(simpleEntityNaming, defaultHierarchy) def timeSeries = Mock(LoadProfileTimeSeries) - timeSeries.uuid >> uuid timeSeries.loadProfile >> type when: @@ -410,8 +409,8 @@ class FileNamingStrategyTest extends Specification { actual.get() == expectedFileName where: - clazz | uuid | type || expectedFileName - LoadProfileTimeSeries | UUID.fromString("9b880468-309c-43c1-a3f4-26dd26266216") | BdewStandardLoadProfile.G3 || Path.of("test_grid", "input", "participants", "time_series", "lpts_g3_9b880468-309c-43c1-a3f4-26dd26266216") + clazz | type || expectedFileName + LoadProfileTimeSeries | BdewStandardLoadProfile.G3 || Path.of("test_grid", "input", "participants", "time_series", "lpts_g3") } def "A FileNamingStrategy with DefaultHierarchy and without pre- or suffixes should return valid directory path for time series mapping"() { @@ -706,7 +705,6 @@ class FileNamingStrategyTest extends Specification { given: "a naming strategy without pre- or suffixes" def strategy = new FileNamingStrategy(simpleEntityNaming, flatHierarchy) def timeSeries = Mock(LoadProfileTimeSeries) - timeSeries.uuid >> uuid timeSeries.loadProfile >> type when: @@ -717,8 +715,8 @@ class FileNamingStrategyTest extends Specification { actual.get() == expectedFilePath where: - clazz | uuid | type || expectedFilePath - LoadProfileTimeSeries | UUID.fromString("9b880468-309c-43c1-a3f4-26dd26266216") | BdewStandardLoadProfile.G3 || Path.of("lpts_g3_9b880468-309c-43c1-a3f4-26dd26266216") + clazz | type || expectedFilePath + LoadProfileTimeSeries | BdewStandardLoadProfile.G3 || Path.of("lpts_g3") } def "A FileNamingStrategy with FlatHierarchy does return valid file path for individual time series"() { @@ -764,7 +762,7 @@ class FileNamingStrategyTest extends Specification { def actual = strategy.loadProfileTimeSeriesPattern.pattern() then: - actual == "test_grid" + escapedFileSeparator + "input" + escapedFileSeparator + "participants" + escapedFileSeparator + "time_series" + escapedFileSeparator + "lpts_(?[a-zA-Z]{1,11}[0-9]{0,3})_(?[a-zA-Z0-9]{8}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{12})" + actual == "test_grid" + escapedFileSeparator + "input" + escapedFileSeparator + "participants" + escapedFileSeparator + "time_series" + escapedFileSeparator + "lpts_(?[a-zA-Z]{1,11}[0-9]{0,3})" } def "A FileNamingStrategy with FlatHierarchy returns correct individual time series file name pattern"() { @@ -786,7 +784,7 @@ class FileNamingStrategyTest extends Specification { def actual = strategy.loadProfileTimeSeriesPattern.pattern() then: - actual == "lpts_(?[a-zA-Z]{1,11}[0-9]{0,3})_(?[a-zA-Z0-9]{8}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{12})" + actual == "lpts_(?[a-zA-Z]{1,11}[0-9]{0,3})" } def "Trying to extract time series meta information throws an Exception, if it is provided a malformed string"() { @@ -908,7 +906,7 @@ class FileNamingStrategyTest extends Specification { def "The FileNamingStrategy extracts correct meta information from a valid load profile time series file name"() { given: def fns = new FileNamingStrategy(simpleEntityNaming, flatHierarchy) - def path = Path.of("/bla/foo/lpts_g3_bee0a8b6-4788-4f18-bf72-be52035f7304.csv") + def path = Path.of("/bla/foo/lpts_g3.csv") when: def metaInformation = fns.timeSeriesMetaInformation(path) @@ -916,7 +914,6 @@ class FileNamingStrategyTest extends Specification { then: LoadProfileTimeSeriesMetaInformation.isAssignableFrom(metaInformation.getClass()) (metaInformation as LoadProfileTimeSeriesMetaInformation).with { - assert uuid == UUID.fromString("bee0a8b6-4788-4f18-bf72-be52035f7304") assert profile == "g3" } } @@ -924,7 +921,7 @@ class FileNamingStrategyTest extends Specification { def "The FileNamingStrategy extracts correct meta information from a valid load profile time series file name with pre- and suffix"() { given: def fns = new FileNamingStrategy(new EntityPersistenceNamingStrategy("prefix", "suffix"), flatHierarchy) - def path = Path.of("/bla/foo/prefix_lpts_g3_bee0a8b6-4788-4f18-bf72-be52035f7304_suffix.csv") + def path = Path.of("/bla/foo/prefix_lpts_g3_suffix.csv") when: def metaInformation = fns.timeSeriesMetaInformation(path) @@ -932,7 +929,6 @@ class FileNamingStrategyTest extends Specification { then: LoadProfileTimeSeriesMetaInformation.isAssignableFrom(metaInformation.getClass()) (metaInformation as LoadProfileTimeSeriesMetaInformation).with { - assert uuid == UUID.fromString("bee0a8b6-4788-4f18-bf72-be52035f7304") assert profile == "g3" } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy index 649f70518..84a54459b 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy @@ -236,7 +236,7 @@ class CsvFileSinkTest extends Specification implements TimeSeriesTestData { testBaseFolderPath.resolve("its_ph_56c20b88-c001-4225-8dac-cd13a75c6b48.csv").toFile().exists() testBaseFolderPath.resolve("its_pqh_83b577cc-06b1-47a1-bfff-ad648a00784b.csv").toFile().exists() testBaseFolderPath.resolve("its_c_a4bbcb77-b9d0-4b88-92be-b9a14a3e332b.csv").toFile().exists() - testBaseFolderPath.resolve("lpts_g2_b0ad5ba2-0d5e-4c9b-b818-4079cebf59cc.csv").toFile().exists() + testBaseFolderPath.resolve("lpts_g2.csv").toFile().exists() testBaseFolderPath.resolve("its_weather_4fcbdfcd-4ff0-46dd-b0df-f3af7ae3ed98.csv").toFile().exists() } diff --git a/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy index 9e45cf059..15eb3d9b8 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy @@ -110,7 +110,7 @@ class SqlSinkTest extends Specification implements TestContainerHelper, TimeSeri "result_entities.sql", "input_entities.sql", "time_series.sql", - "load_profile.sql" + "load_profiles.sql" ) for (String file: importFiles) { Container.ExecResult res = postgreSQLContainer.execInContainer("psql", "-Utest", "-f/home/" + file) @@ -222,6 +222,7 @@ class SqlSinkTest extends Specification implements TestContainerHelper, TimeSeri source.executeQuery("SELECT * FROM " + schemaName + "." + "time_series_ph", ps -> {}).count() == 3 source.executeQuery("SELECT * FROM " + schemaName + "." + "time_series_pqh", ps -> {}).count() == 3 source.executeQuery("SELECT * FROM " + schemaName + "." + "time_series_weather", ps -> {}).count() == 3 + source.executeQuery("SELECT * FROM " + schemaName + "." + "load_profiles", ps -> {}).count() == 3 cleanup: sink.shutdown() diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvDataSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvDataSourceTest.groovy index f0721a805..5388c5b2d 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvDataSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvDataSourceTest.groovy @@ -72,9 +72,9 @@ class CsvDataSourceTest extends Specification implements CsvTestDataMeta { timeSeriesPaths.forEach { path -> Files.createFile(testBaseFolderPath.resolve(path)) } loadProfileTimeSeriesPaths = [ - "lpts_r1_aac618d5-f707-4000-8871-ea080c24df82.csv", - "lpts_r2_0b5059d9-dbf5-4047-85f7-522a43608448.csv", - "lpts_g0_fa3894c1-25af-479c-8a40-1323bb9150a9.csv" + "lpts_r1.csv", + "lpts_r2.csv", + "lpts_g0.csv" ].stream().map { file -> Path.of(file) }.collect(Collectors.toSet()) loadProfileTimeSeriesPaths.forEach { path -> Files.createFile(testBaseFolderPath.resolve(path)) } } @@ -360,30 +360,22 @@ class CsvDataSourceTest extends Specification implements CsvTestDataMeta { } def "The CsvDataSource is able to build correct load profile meta information"() { - given: - def expected = [ - new CsvLoadProfileMetaInformation(UUID.fromString("aac618d5-f707-4000-8871-ea080c24df82"), "r1", Path.of("lpts_r1_aac618d5-f707-4000-8871-ea080c24df82")), - new CsvLoadProfileMetaInformation(UUID.fromString("0b5059d9-dbf5-4047-85f7-522a43608448"), "r2", Path.of("lpts_r2_0b5059d9-dbf5-4047-85f7-522a43608448")), - new CsvLoadProfileMetaInformation(UUID.fromString("fa3894c1-25af-479c-8a40-1323bb9150a9"), "g0", Path.of("lpts_g0_fa3894c1-25af-479c-8a40-1323bb9150a9")) - ] as Set - when: def actual = dummyCsvSource.getCsvLoadProfileMetaInformation() then: - actual == expected + actual.size() == 3 + actual.get("r1").fullFilePath == Path.of("lpts_r1") + actual.get("r2").fullFilePath == Path.of("lpts_r2") + actual.get("g0").fullFilePath == Path.of("lpts_g0") } def "The CsvDataSource is able to build correct load profile meta information when restricting load profile"() { - given: - def expected = [ - new CsvLoadProfileMetaInformation(UUID.fromString("fa3894c1-25af-479c-8a40-1323bb9150a9"), "g0", Path.of("lpts_g0_fa3894c1-25af-479c-8a40-1323bb9150a9")) - ] as Set - when: def actual = dummyCsvSource.getCsvLoadProfileMetaInformation(BdewStandardLoadProfile.G0) then: - actual == expected + actual.size() == 1 + actual.get("g0").fullFilePath == Path.of("lpts_g0") } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSourceIT.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSourceIT.groovy index dd00ce6a1..e46a108c6 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSourceIT.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSourceIT.groovy @@ -49,7 +49,7 @@ class SqlLoadProfileSourceIT extends Specification implements TestContainerHelpe postgreSQLContainer.copyFileToContainer(sqlImportFile, "/home/") // Execute import script - Iterable importFiles = Arrays.asList("time_series_load_profiles.sql") + Iterable importFiles = Arrays.asList("load_profiles.sql") for (String file: importFiles) { Container.ExecResult res = postgreSQLContainer.execInContainer("psql", "-Utest", "-f/home/" + file) assert res.stderr.empty diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMetaInformationSourceIT.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMetaInformationSourceIT.groovy index 23e53553d..4f26fa36c 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMetaInformationSourceIT.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMetaInformationSourceIT.groovy @@ -43,7 +43,7 @@ class SqlTimeSeriesMetaInformationSourceIT extends Specification implements Test "time_series_ph.sql", "time_series_pq.sql", "time_series_pqh.sql", - "time_series_load_profiles.sql") + "load_profiles.sql") for (String file: importFiles) { Container.ExecResult res = postgreSQLContainer.execInContainer("psql", "-Utest", "-f/home/" + file) assert res.stderr.empty @@ -112,9 +112,6 @@ class SqlTimeSeriesMetaInformationSourceIT extends Specification implements Test result.size() == 2 result.keySet() == ["g2", "g3"] as Set - - result.get("g2").uuid == UUID.fromString('b0ad5ba2-0d5e-4c9b-b818-4079cebf59cc') - result.get("g3").uuid == UUID.fromString('9b880468-309c-43c1-a3f4-26dd26266216') } def "The SQL time series meta information source returns correct meta information for a given load profile"() { @@ -122,13 +119,13 @@ class SqlTimeSeriesMetaInformationSourceIT extends Specification implements Test def result = source.getLoadProfileMetaInformation(profile) then: - result.present - result.get().uuid == expectedUuid + result.present == expected where: - profile || expectedUuid - BdewStandardLoadProfile.G2 || UUID.fromString('b0ad5ba2-0d5e-4c9b-b818-4079cebf59cc') - BdewStandardLoadProfile.G3 || UUID.fromString('9b880468-309c-43c1-a3f4-26dd26266216') + profile || expected + BdewStandardLoadProfile.G2 || true + BdewStandardLoadProfile.G3 || true + BdewStandardLoadProfile.L0 ||false } def "The SQL time series meta information source returns an empty optional for an unknown load profile"() { diff --git a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/load_profile.sql b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/load_profile.sql deleted file mode 100644 index 474be75de..000000000 --- a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/load_profile.sql +++ /dev/null @@ -1,11 +0,0 @@ -CREATE TABLE public.load_profile_g2 -( - time_series UUID NOT NULL, - day_of_week TEXT NOT NULL, - quarter_hour_of_day TEXT NOT NULL, - p DOUBLE PRECISION, - grid_uuid UUID NOT NULL REFERENCES grids(uuid) -) - WITHOUT OIDS - TABLESPACE pg_default; - diff --git a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/load_profiles.sql b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/load_profiles.sql new file mode 100644 index 000000000..da883ded9 --- /dev/null +++ b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/load_profiles.sql @@ -0,0 +1,24 @@ +CREATE TABLE public.load_profiles +( + load_profile VARCHAR(11) NOT NULL, + quarter_hour integer NOT NULL, + su_sa DOUBLE PRECISION NOT NULL, + su_su DOUBLE PRECISION NOT NULL, + su_wd DOUBLE PRECISION NOT NULL, + tr_sa DOUBLE PRECISION NOT NULL, + tr_su DOUBLE PRECISION NOT NULL, + tr_wd DOUBLE PRECISION NOT NULL, + wi_sa DOUBLE PRECISION NOT NULL, + wi_su DOUBLE PRECISION NOT NULL, + wi_wd DOUBLE PRECISION NOT NULL, + grid_uuid UUID NOT NULL REFERENCES grids(uuid) +) + WITHOUT OIDS + TABLESPACE pg_default; + +CREATE INDEX load_profiles_series_id ON load_profiles USING hash (load_profile); + +-- Order of columns is important when using btree: https://www.postgresql.org/docs/14/indexes-multicolumn.html +-- Column time_series needs to placed as the first argument since we at most use an equality constraint on +-- time_series and a range query on time. +CREATE UNIQUE INDEX load_profiles_series_time ON load_profiles USING btree (load_profile, quarter_hour); \ No newline at end of file diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_timeseries/lpts_g2.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_timeseries/lpts_g2.csv new file mode 100644 index 000000000..b216cb1f6 --- /dev/null +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_timeseries/lpts_g2.csv @@ -0,0 +1,3 @@ +SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour +63.1,50.6,60.8,73.1,64.2,70.5,80.6,73.7,77.4,0 +58.0,47.4,53.0,67.6,60.7,61.9,74.6,68.7,67.4,1 \ No newline at end of file diff --git a/src/test/resources/edu/ie3/datamodel/io/source/sql/_timeseries/load_profiles.sql b/src/test/resources/edu/ie3/datamodel/io/source/sql/_timeseries/load_profiles.sql new file mode 100644 index 000000000..8402798ae --- /dev/null +++ b/src/test/resources/edu/ie3/datamodel/io/source/sql/_timeseries/load_profiles.sql @@ -0,0 +1,35 @@ +CREATE TABLE public.load_profiles +( + load_profile VARCHAR(11) NOT NULL, + quarter_hour integer NOT NULL, + su_sa DOUBLE PRECISION NOT NULL, + su_su DOUBLE PRECISION NOT NULL, + su_wd DOUBLE PRECISION NOT NULL, + tr_sa DOUBLE PRECISION NOT NULL, + tr_su DOUBLE PRECISION NOT NULL, + tr_wd DOUBLE PRECISION NOT NULL, + wi_sa DOUBLE PRECISION NOT NULL, + wi_su DOUBLE PRECISION NOT NULL, + wi_wd DOUBLE PRECISION NOT NULL +) + WITHOUT OIDS + TABLESPACE pg_default; + +CREATE INDEX load_profiles_series_id ON load_profiles USING hash (load_profile); + +-- Order of columns is important when using btree: https://www.postgresql.org/docs/14/indexes-multicolumn.html +-- Column time_series needs to placed as the first argument since we at most use an equality constraint on +-- time_series and a range query on time. +CREATE UNIQUE INDEX load_profiles_series_time ON load_profiles USING btree (load_profile, quarter_hour); + +INSERT INTO + public.load_profiles (load_profile, quarter_hour, su_sa, su_su, su_wd, tr_sa, tr_su, tr_wd, wi_sa, wi_su, wi_wd) +VALUES + +('g2', 0, 63.1, 50.6, 60.8, 73.1, 64.2, 70.5, 80.6, 73.7, 77.4), +('g2', 1, 58.0, 47.4, 53.0, 67.6, 60.7, 61.9, 74.6, 68.7, 67.4), +('g2', 2, 53.5, 44.3, 46.0, 62.8, 56.9, 54.4, 69.2, 63.6, 58.4), + +('g3', 0, 99.0, 94.6, 98.5, 92.5, 87.6, 91.2, 95.3, 87.8, 94.7), +('g3', 1, 100.0, 95.3, 99.0, 93.0, 87.3, 90.2, 95.5, 88.3, 94.1), +('g3', 2, 100.9, 96.0, 99.4, 93.7, 87.4, 89.4, 96.2, 89.0, 94.1); diff --git a/src/test/resources/edu/ie3/datamodel/io/source/sql/_timeseries/time_series_load_profiles.sql b/src/test/resources/edu/ie3/datamodel/io/source/sql/_timeseries/time_series_load_profiles.sql deleted file mode 100644 index e428877f0..000000000 --- a/src/test/resources/edu/ie3/datamodel/io/source/sql/_timeseries/time_series_load_profiles.sql +++ /dev/null @@ -1,36 +0,0 @@ -CREATE TABLE public.time_series_load_profiles -( - load_profile VARCHAR(11) NOT NULL, - time_series uuid NOT NULL, - quarter_hour integer NOT NULL, - SuSa double precision NOT NULL, - SuSu double precision NOT NULL, - SuWd double precision NOT NULL, - TrSa double precision NOT NULL, - TrSu double precision NOT NULL, - TrWd double precision NOT NULL, - WiSa double precision NOT NULL, - WiSu double precision NOT NULL, - WiWd double precision NOT NULL -) - WITHOUT OIDS - TABLESPACE pg_default; - -CREATE INDEX time_series_load_profiles_series_id ON time_series_load_profiles USING hash (time_series); - --- Order of columns is important when using btree: https://www.postgresql.org/docs/14/indexes-multicolumn.html --- Column time_series needs to placed as the first argument since we at most use an equality constraint on --- time_series and a range query on time. -CREATE UNIQUE INDEX time_series_load_profiles_series_time ON time_series_load_profiles USING btree (time_series, quarter_hour); - -INSERT INTO - public.time_series_load_profiles (load_profile, time_series, quarter_hour, SuSa, SuSu, SuWd, TrSa, TrSu, TrWd, WiSa, WiSu, WiWd) -VALUES - -('g2', 'b0ad5ba2-0d5e-4c9b-b818-4079cebf59cc', 0, 63.1, 50.6, 60.8, 73.1, 64.2, 70.5, 80.6, 73.7, 77.4), -('g2', 'b0ad5ba2-0d5e-4c9b-b818-4079cebf59cc', 1, 58.0, 47.4, 53.0, 67.6, 60.7, 61.9, 74.6, 68.7, 67.4), -('g2', 'b0ad5ba2-0d5e-4c9b-b818-4079cebf59cc', 2, 53.5, 44.3, 46.0, 62.8, 56.9, 54.4, 69.2, 63.6, 58.4), - -('g3', '9b880468-309c-43c1-a3f4-26dd26266216', 0, 99.0, 94.6, 98.5, 92.5, 87.6, 91.2, 95.3, 87.8, 94.7), -('g3', '9b880468-309c-43c1-a3f4-26dd26266216', 1, 100.0, 95.3, 99.0, 93.0, 87.3, 90.2, 95.5, 88.3, 94.1), -('g3', '9b880468-309c-43c1-a3f4-26dd26266216', 2, 100.9, 96.0, 99.4, 93.7, 87.4, 89.4, 96.2, 89.0, 94.1); From cc26b88e7d8b49eb4a3bf09f0f69975c2d3eeb28 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Tue, 12 Nov 2024 14:55:01 +0100 Subject: [PATCH 15/23] Improving code. --- build.gradle | 1 + .../timeseries/BdewLoadProfileFactory.java | 42 +++++++------------ .../models/value/load/BdewLoadValues.java | 30 +++++-------- 3 files changed, 27 insertions(+), 46 deletions(-) diff --git a/build.gradle b/build.gradle index 97155e59f..5783c2386 100644 --- a/build.gradle +++ b/build.gradle @@ -11,6 +11,7 @@ plugins { id 'jacoco' // java code coverage plugin id "org.sonarqube" version "5.1.0.4882" // sonarqube id 'net.thauvin.erik.gradle.semver' version '1.0.4' // semantic versioning + id "com.github.johnrengelman.shadow" version "8.1.1" // fat jar } ext { diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java index c45b3705e..868c672e6 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java @@ -16,6 +16,8 @@ import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; import edu.ie3.datamodel.models.value.load.BdewLoadValues; import java.util.*; +import java.util.function.Function; +import java.util.stream.Stream; import javax.measure.quantity.Power; import tech.units.indriya.ComparableQuantity; import tech.units.indriya.quantity.Quantities; @@ -97,37 +99,23 @@ public BdewStandardLoadProfile parseProfile(String profile) { @Override public Optional> calculateMaxPower( BdewStandardLoadProfile loadProfile, Set> entries) { - Optional power; + Function> valueExtractor; if (loadProfile == BdewStandardLoadProfile.H0) { - power = - entries.stream() - .map(TimeSeriesEntry::getValue) - .map(v -> List.of(v.getWiSa(), v.getWiSu(), v.getWiWd())) - .flatMap(Collection::stream) - .max(Comparator.naturalOrder()); - + // maximum dynamization factor is on day 366 (leap year) or day 365 (regular year). + // The difference between day 365 and day 366 is negligible, thus pick 366 + valueExtractor = + v -> + Stream.of(v.getWiSa(), v.getWiSu(), v.getWiWd()) + .map(p -> BdewLoadValues.dynamization(p, 366)); } else { - power = - entries.stream() - .map(LoadProfileEntry::getValue) - .map( - v -> - List.of( - v.getSuSa(), - v.getSuSu(), - v.getSuWd(), - v.getTrSa(), - v.getTrSu(), - v.getTrWd(), - v.getWiSa(), - v.getWiSu(), - v.getWiWd())) - .flatMap(Collection::stream) - .max(Comparator.naturalOrder()); + valueExtractor = v -> v.values().stream(); } - - return power.map(p -> Quantities.getQuantity(p, WATT)); + return entries.stream() + .map(TimeSeriesEntry::getValue) + .flatMap(valueExtractor) + .max(Comparator.naturalOrder()) + .map(p -> Quantities.getQuantity(p, WATT)); } @Override diff --git a/src/main/java/edu/ie3/datamodel/models/value/load/BdewLoadValues.java b/src/main/java/edu/ie3/datamodel/models/value/load/BdewLoadValues.java index 1918542ec..0bf549cac 100644 --- a/src/main/java/edu/ie3/datamodel/models/value/load/BdewLoadValues.java +++ b/src/main/java/edu/ie3/datamodel/models/value/load/BdewLoadValues.java @@ -15,11 +15,9 @@ import edu.ie3.datamodel.models.profile.LoadProfile; import edu.ie3.datamodel.models.value.PValue; import java.time.ZonedDateTime; +import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.function.Function; -import javax.measure.quantity.Power; -import tech.units.indriya.ComparableQuantity; import tech.units.indriya.quantity.Quantities; /** Load values for a {@link BdewStandardLoadProfile} */ @@ -73,14 +71,14 @@ public PValue getValue(ZonedDateTime time, LoadProfile loadProfile) { TRANSITION, TrWd); }; - PValue value = new PValue(Quantities.getQuantity(mapping.get(getSeason(time)), WATT)); + double power = mapping.get(getSeason(time)); if (loadProfile == BdewStandardLoadProfile.H0) { /* For the residential average profile, a dynamization has to be taken into account */ - return dynamization(value, time.getDayOfYear()); // leap years are ignored - } else { - return value; + power = dynamization(power, time.getDayOfYear()); // leap years are ignored } + + return new PValue(Quantities.getQuantity(power, WATT)); } /** @@ -92,21 +90,11 @@ public PValue getValue(ZonedDateTime time, LoadProfile loadProfile) { * @param t day of year (1-366) * @return dynamization factor */ - private PValue dynamization(PValue load, int t) { + public static double dynamization(double load, int t) { double factor = (-3.92e-10 * pow(t, 4) + 3.2e-7 * pow(t, 3) - 7.02e-5 * pow(t, 2) + 2.1e-3 * t + 1.24); double rndFactor = round(factor * 1e4) / 1e4; // round to 4 decimal places - Function round = - l -> round(l * rndFactor * 1e1) / 1e1; // rounded to 1 decimal place - - ComparableQuantity value = - load.getP() - .map(v -> v.getValue().doubleValue()) - .map(round) - .map(v -> Quantities.getQuantity(v, WATT)) - .orElse(null); - - return new PValue(value); + return round(load * rndFactor * 1e1) / 1e1; // rounded to 1 decimal place } public double getSuSa() { @@ -145,6 +133,10 @@ public double getWiWd() { return WiWd; } + public List values() { + return List.of(SuSa, SuSu, SuWd, TrSa, TrSu, TrWd, WiSa, WiSu, WiWd); + } + @Override public boolean equals(Object o) { if (this == o) return true; From 22279f37c538e3ef1fe6b0f354f1fc49356d2238 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Wed, 13 Nov 2024 10:08:04 +0100 Subject: [PATCH 16/23] Fixing small issue in `SqlTimeSeriesMetaInformationSource`. Renaming `LoadProfileTimeSeriesMetaInformation` to `LoadProfileMetaInformation`. --- .../io/csv/CsvLoadProfileMetaInformation.java | 6 +- .../timeseries/BdewLoadProfileFactory.java | 5 +- .../timeseries/LoadProfileFactory.java | 4 +- .../timeseries/RandomLoadProfileFactory.java | 5 +- .../TimeSeriesMetaInformationFactory.java | 8 +-- .../io/naming/DatabaseNamingStrategy.java | 9 ++- .../EntityPersistenceNamingStrategy.java | 7 +-- .../io/naming/FileNamingStrategy.java | 5 +- ...n.java => LoadProfileMetaInformation.java} | 8 +-- .../TimeSeriesMetaInformationSource.java | 24 +++++--- .../io/source/csv/CsvDataSource.java | 8 +-- .../CsvTimeSeriesMetaInformationSource.java | 23 +------- .../io/source/sql/SqlLoadProfileSource.java | 8 +-- .../SqlTimeSeriesMetaInformationSource.java | 59 ++++++++----------- .../BdewLoadProfileFactoryTest.groovy | 4 +- .../RandomLoadProfileFactoryTest.groovy | 4 +- .../io/naming/FileNamingStrategyTest.groovy | 10 ++-- .../source/sql/SqlLoadProfileSourceIT.groovy | 4 +- 18 files changed, 90 insertions(+), 111 deletions(-) rename src/main/java/edu/ie3/datamodel/io/naming/timeseries/{LoadProfileTimeSeriesMetaInformation.java => LoadProfileMetaInformation.java} (78%) diff --git a/src/main/java/edu/ie3/datamodel/io/csv/CsvLoadProfileMetaInformation.java b/src/main/java/edu/ie3/datamodel/io/csv/CsvLoadProfileMetaInformation.java index a7ccd4f8c..905f1ee3f 100644 --- a/src/main/java/edu/ie3/datamodel/io/csv/CsvLoadProfileMetaInformation.java +++ b/src/main/java/edu/ie3/datamodel/io/csv/CsvLoadProfileMetaInformation.java @@ -5,11 +5,11 @@ */ package edu.ie3.datamodel.io.csv; -import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation; import java.nio.file.Path; import java.util.Objects; -public class CsvLoadProfileMetaInformation extends LoadProfileTimeSeriesMetaInformation { +public class CsvLoadProfileMetaInformation extends LoadProfileMetaInformation { private final Path fullFilePath; public CsvLoadProfileMetaInformation(String profile, Path fullFilePath) { @@ -18,7 +18,7 @@ public CsvLoadProfileMetaInformation(String profile, Path fullFilePath) { } public CsvLoadProfileMetaInformation( - LoadProfileTimeSeriesMetaInformation metaInformation, Path fullFilePath) { + LoadProfileMetaInformation metaInformation, Path fullFilePath) { this(metaInformation.getProfile(), fullFilePath); } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java index 868c672e6..492a53be7 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java @@ -9,7 +9,7 @@ import edu.ie3.datamodel.exceptions.FactoryException; import edu.ie3.datamodel.exceptions.ParsingException; -import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation; import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; import edu.ie3.datamodel.models.timeseries.repetitive.BdewLoadProfileTimeSeries; @@ -78,8 +78,7 @@ protected List> getFields(Class entityClass) { @Override public BdewLoadProfileTimeSeries build( - LoadProfileTimeSeriesMetaInformation metaInformation, - Set> entries) { + LoadProfileMetaInformation metaInformation, Set> entries) { BdewStandardLoadProfile profile = parseProfile(metaInformation.getProfile()); Optional> maxPower = calculateMaxPower(profile, entries); diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java index 18402be8f..d4b25d395 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java @@ -6,7 +6,7 @@ package edu.ie3.datamodel.io.factory.timeseries; import edu.ie3.datamodel.io.factory.Factory; -import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation; import edu.ie3.datamodel.models.profile.LoadProfile; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; @@ -25,7 +25,7 @@ public LoadProfileFactory(Class valueClass) { } public abstract LoadProfileTimeSeries build( - LoadProfileTimeSeriesMetaInformation metaInformation, Set> entries); + LoadProfileMetaInformation metaInformation, Set> entries); public abstract P parseProfile(String profile); diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java index d6555509a..15745884f 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java @@ -7,7 +7,7 @@ import static edu.ie3.datamodel.models.profile.LoadProfile.RandomLoadProfile.RANDOM_LOAD_PROFILE; -import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation; import edu.ie3.datamodel.models.profile.LoadProfile; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; import edu.ie3.datamodel.models.timeseries.repetitive.RandomLoadProfileTimeSeries; @@ -71,8 +71,7 @@ protected List> getFields(Class entityClass) { @Override public RandomLoadProfileTimeSeries build( - LoadProfileTimeSeriesMetaInformation metaInformation, - Set> entries) { + LoadProfileMetaInformation metaInformation, Set> entries) { return new RandomLoadProfileTimeSeries(metaInformation.getUuid(), RANDOM_LOAD_PROFILE, entries); } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMetaInformationFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMetaInformationFactory.java index 820f3f48a..71c64cbd8 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMetaInformationFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMetaInformationFactory.java @@ -10,7 +10,7 @@ import edu.ie3.datamodel.io.naming.TimeSeriesMetaInformation; import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme; import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation; -import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation; import java.util.Collections; import java.util.List; import java.util.Set; @@ -29,7 +29,7 @@ public class TimeSeriesMetaInformationFactory private static final String LOAD_PROFILE = "loadProfile"; public TimeSeriesMetaInformationFactory() { - super(IndividualTimeSeriesMetaInformation.class, LoadProfileTimeSeriesMetaInformation.class); + super(IndividualTimeSeriesMetaInformation.class, LoadProfileMetaInformation.class); } @Override @@ -40,9 +40,9 @@ protected List> getFields(Class entityClass) { @Override protected TimeSeriesMetaInformation buildModel(EntityData data) { - if (LoadProfileTimeSeriesMetaInformation.class.isAssignableFrom(data.getTargetClass())) { + if (LoadProfileMetaInformation.class.isAssignableFrom(data.getTargetClass())) { String profile = data.getField(LOAD_PROFILE); - return new LoadProfileTimeSeriesMetaInformation(profile); + return new LoadProfileMetaInformation(profile); } else { UUID timeSeries = data.getUUID(TIME_SERIES); diff --git a/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java b/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java index ebcc1fdf6..03a9a32d2 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java @@ -21,7 +21,7 @@ public class DatabaseNamingStrategy { private static final String TIME_SERIES_PREFIX = "time_series_"; - private static final String LOAD_PROFILE_PREFIX = "load_profiles"; + private static final String LOAD_PROFILE = "load_profiles"; private final EntityPersistenceNamingStrategy entityPersistenceNamingStrategy; @@ -42,6 +42,11 @@ public String getTimeSeriesPrefix() { return TIME_SERIES_PREFIX; } + /** Returns the String of the load profile table */ + public String getLoadProfileTableName() { + return LOAD_PROFILE; + } + /** * Provides the name of a time series table given a column scheme * @@ -58,7 +63,7 @@ public String getTimeSeriesEntityName(ColumnScheme columnScheme) { * @return the table name */ public String getLoadProfileEntityName() { - return LOAD_PROFILE_PREFIX; + return getLoadProfileTableName(); } /** diff --git a/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java b/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java index c6a0b89ab..37a070aa3 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java @@ -7,7 +7,7 @@ import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme; import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation; -import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation; import edu.ie3.datamodel.io.source.TimeSeriesMappingSource; import edu.ie3.datamodel.models.Entity; import edu.ie3.datamodel.models.input.*; @@ -156,14 +156,13 @@ public IndividualTimeSeriesMetaInformation individualTimesSeriesMetaInformation( * @param fileName File name to extract information from * @return Meta information form load profile time series file name */ - public LoadProfileTimeSeriesMetaInformation loadProfileTimesSeriesMetaInformation( - String fileName) { + public LoadProfileMetaInformation loadProfileTimesSeriesMetaInformation(String fileName) { Matcher matcher = getLoadProfileTimeSeriesPattern().matcher(fileName); if (!matcher.matches()) throw new IllegalArgumentException( "Cannot extract meta information on load profile time series from '" + fileName + "'."); - return new LoadProfileTimeSeriesMetaInformation(matcher.group("profile")); + return new LoadProfileMetaInformation(matcher.group("profile")); } /** diff --git a/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java b/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java index c81520bc3..dc3e8dc66 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java @@ -7,7 +7,7 @@ import edu.ie3.datamodel.io.IoUtil; import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation; -import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation; import edu.ie3.datamodel.models.Entity; import edu.ie3.datamodel.models.timeseries.TimeSeries; import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; @@ -238,8 +238,7 @@ public IndividualTimeSeriesMetaInformation individualTimeSeriesMetaInformation(S removeFileNameEnding(fileName)); } - public LoadProfileTimeSeriesMetaInformation loadProfileTimeSeriesMetaInformation( - String fileName) { + public LoadProfileMetaInformation loadProfileTimeSeriesMetaInformation(String fileName) { return entityPersistenceNamingStrategy.loadProfileTimesSeriesMetaInformation( removeFileNameEnding(fileName)); } diff --git a/src/main/java/edu/ie3/datamodel/io/naming/timeseries/LoadProfileTimeSeriesMetaInformation.java b/src/main/java/edu/ie3/datamodel/io/naming/timeseries/LoadProfileMetaInformation.java similarity index 78% rename from src/main/java/edu/ie3/datamodel/io/naming/timeseries/LoadProfileTimeSeriesMetaInformation.java rename to src/main/java/edu/ie3/datamodel/io/naming/timeseries/LoadProfileMetaInformation.java index 72a3df4cf..875c881e6 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/timeseries/LoadProfileTimeSeriesMetaInformation.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/timeseries/LoadProfileMetaInformation.java @@ -10,15 +10,15 @@ import java.util.UUID; /** Specific meta information, that can be derived from a load profile time series file */ -public class LoadProfileTimeSeriesMetaInformation extends TimeSeriesMetaInformation { +public class LoadProfileMetaInformation extends TimeSeriesMetaInformation { private final String profile; - public LoadProfileTimeSeriesMetaInformation(String profile) { + public LoadProfileMetaInformation(String profile) { super(UUID.randomUUID()); this.profile = profile; } - public LoadProfileTimeSeriesMetaInformation(UUID uuid, String profile) { + public LoadProfileMetaInformation(UUID uuid, String profile) { super(uuid); this.profile = profile; } @@ -30,7 +30,7 @@ public String getProfile() { @Override public boolean equals(Object o) { if (this == o) return true; - if (!(o instanceof LoadProfileTimeSeriesMetaInformation that)) return false; + if (!(o instanceof LoadProfileMetaInformation that)) return false; if (!super.equals(o)) return false; return profile.equals(that.profile); } diff --git a/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesMetaInformationSource.java b/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesMetaInformationSource.java index 3bc09db66..7bf442bca 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesMetaInformationSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesMetaInformationSource.java @@ -7,14 +7,17 @@ import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme; import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation; -import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation; import edu.ie3.datamodel.models.profile.LoadProfile; +import java.util.Collections; import java.util.Map; import java.util.Optional; import java.util.UUID; /** Source for all available time series with their {@link UUID} and {@link ColumnScheme} */ -public interface TimeSeriesMetaInformationSource { +public abstract class TimeSeriesMetaInformationSource { + + protected Map loadProfileMetaInformation; /** * Get a mapping from time series {@link UUID} to its meta information {@link @@ -22,7 +25,7 @@ public interface TimeSeriesMetaInformationSource { * * @return that mapping */ - Map getTimeSeriesMetaInformation(); + public abstract Map getTimeSeriesMetaInformation(); /** * Get an option on the given time series meta information @@ -30,14 +33,17 @@ public interface TimeSeriesMetaInformationSource { * @param timeSeriesUuid Unique identifier of the time series in question * @return An Option on the meta information */ - Optional getTimeSeriesMetaInformation(UUID timeSeriesUuid); + public abstract Optional getTimeSeriesMetaInformation( + UUID timeSeriesUuid); /** - * Gat a mapping from load profile to {@link LoadProfileTimeSeriesMetaInformation}. + * Gat a mapping from load profile to {@link LoadProfileMetaInformation}. * * @return that mapping */ - Map getLoadProfileMetaInformation(); + public Map getLoadProfileMetaInformation() { + return Collections.unmodifiableMap(loadProfileMetaInformation); + } /** * Get an option on the given time series meta information @@ -45,6 +51,8 @@ public interface TimeSeriesMetaInformationSource { * @param loadProfile load profile of the time series in question * @return An Option on the meta information */ - Optional getLoadProfileMetaInformation( - LoadProfile loadProfile); + public Optional getLoadProfileMetaInformation( + LoadProfile loadProfile) { + return Optional.ofNullable(loadProfileMetaInformation.get(loadProfile.getKey())); + } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java index da8700287..ad978e462 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java @@ -13,7 +13,7 @@ import edu.ie3.datamodel.io.naming.TimeSeriesMetaInformation; import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme; import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation; -import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation; import edu.ie3.datamodel.io.source.DataSource; import edu.ie3.datamodel.models.Entity; import edu.ie3.datamodel.models.profile.LoadProfile; @@ -145,7 +145,7 @@ public Map getCsvLoadProfileMetaInformati .map( filePath -> { /* Extract meta information from file path and enhance it with the file path itself */ - LoadProfileTimeSeriesMetaInformation metaInformation = + LoadProfileMetaInformation metaInformation = fileNamingStrategy.loadProfileTimeSeriesMetaInformation(filePath.toString()); return new CsvLoadProfileMetaInformation( metaInformation, FileNamingStrategy.removeFileNameEnding(filePath.getFileName())); @@ -156,9 +156,7 @@ public Map getCsvLoadProfileMetaInformati || profiles.length == 0 || Stream.of(profiles) .anyMatch(profile -> profile.getKey().equals(metaInformation.getProfile()))) - .collect( - Collectors.toMap( - LoadProfileTimeSeriesMetaInformation::getProfile, Function.identity())); + .collect(Collectors.toMap(LoadProfileMetaInformation::getProfile, Function.identity())); } /** diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMetaInformationSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMetaInformationSource.java index edd307727..786474e87 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMetaInformationSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMetaInformationSource.java @@ -6,13 +6,11 @@ package edu.ie3.datamodel.io.source.csv; import edu.ie3.datamodel.io.csv.CsvIndividualTimeSeriesMetaInformation; -import edu.ie3.datamodel.io.csv.CsvLoadProfileMetaInformation; import edu.ie3.datamodel.io.naming.FileNamingStrategy; import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme; import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation; -import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation; import edu.ie3.datamodel.io.source.TimeSeriesMetaInformationSource; -import edu.ie3.datamodel.models.profile.LoadProfile; import edu.ie3.datamodel.utils.TimeSeriesUtils; import java.nio.file.Path; import java.util.Collections; @@ -26,14 +24,12 @@ * CSV implementation for retrieving {@link TimeSeriesMetaInformationSource} from input directory * structures */ -public class CsvTimeSeriesMetaInformationSource implements TimeSeriesMetaInformationSource { +public class CsvTimeSeriesMetaInformationSource extends TimeSeriesMetaInformationSource { protected final CsvDataSource dataSource; private final Map timeSeriesMetaInformation; - private final Map loadProfileMetaInformation; - /** * Creates a time series type source * @@ -60,9 +56,7 @@ public CsvTimeSeriesMetaInformationSource(CsvDataSource dataSource) { this.loadProfileMetaInformation = dataSource.getCsvLoadProfileMetaInformation().values().stream() - .collect( - Collectors.toMap( - LoadProfileTimeSeriesMetaInformation::getProfile, Function.identity())); + .collect(Collectors.toMap(LoadProfileMetaInformation::getProfile, Function.identity())); } @Override @@ -75,15 +69,4 @@ public Optional getTimeSeriesMetaInformatio UUID timeSeriesUuid) { return Optional.ofNullable(timeSeriesMetaInformation.get(timeSeriesUuid)); } - - @Override - public Map getLoadProfileMetaInformation() { - return Collections.unmodifiableMap(loadProfileMetaInformation); - } - - @Override - public Optional getLoadProfileMetaInformation( - LoadProfile loadProfile) { - return Optional.ofNullable(loadProfileMetaInformation.get(loadProfile.getKey())); - } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java index cadb87e75..68a612921 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java @@ -12,7 +12,7 @@ import edu.ie3.datamodel.io.connectors.SqlConnector; import edu.ie3.datamodel.io.factory.timeseries.LoadProfileFactory; import edu.ie3.datamodel.io.naming.DatabaseNamingStrategy; -import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation; import edu.ie3.datamodel.io.source.LoadProfileSource; import edu.ie3.datamodel.models.profile.LoadProfile; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; @@ -44,7 +44,7 @@ public class SqlLoadProfileSource

private final SqlDataSource dataSource; private final String tableName; - private final LoadProfileTimeSeriesMetaInformation metaInformation; + private final LoadProfileMetaInformation metaInformation; private final P loadProfile; // General fields @@ -61,7 +61,7 @@ public class SqlLoadProfileSource

public SqlLoadProfileSource( SqlDataSource dataSource, - LoadProfileTimeSeriesMetaInformation metaInformation, + LoadProfileMetaInformation metaInformation, Class entryClass, LoadProfileFactory entryFactory) { super(entryClass, entryFactory); @@ -82,7 +82,7 @@ public SqlLoadProfileSource( SqlConnector connector, String schemaName, DatabaseNamingStrategy namingStrategy, - LoadProfileTimeSeriesMetaInformation metaInformation, + LoadProfileMetaInformation metaInformation, Class entryClass, LoadProfileFactory entryFactory) { this( diff --git a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMetaInformationSource.java b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMetaInformationSource.java index 97ea31888..fdc161f34 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMetaInformationSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMetaInformationSource.java @@ -11,10 +11,10 @@ import edu.ie3.datamodel.io.naming.DatabaseNamingStrategy; import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme; import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation; -import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation; import edu.ie3.datamodel.io.source.TimeSeriesMetaInformationSource; -import edu.ie3.datamodel.models.profile.LoadProfile; import edu.ie3.datamodel.utils.TimeSeriesUtils; +import java.util.List; import java.util.Map; import java.util.Optional; import java.util.UUID; @@ -22,16 +22,14 @@ import java.util.stream.Collectors; /** SQL implementation for retrieving {@link TimeSeriesMetaInformationSource} from the SQL scheme */ -public class SqlTimeSeriesMetaInformationSource implements TimeSeriesMetaInformationSource { +public class SqlTimeSeriesMetaInformationSource extends TimeSeriesMetaInformationSource { - private static final TimeSeriesMetaInformationFactory mappingFactory = + private static final TimeSeriesMetaInformationFactory metaInformationFactory = new TimeSeriesMetaInformationFactory(); - private final DatabaseNamingStrategy namingStrategy; - private final Map mapping; - private final Map - loadProfileTimeSeriesMetaInformation; + private final Map timeSeriesMetaInformation; + private final DatabaseNamingStrategy namingStrategy; private final SqlDataSource dataSource; public SqlTimeSeriesMetaInformationSource( @@ -42,7 +40,7 @@ public SqlTimeSeriesMetaInformationSource( String queryComplete = createQueryComplete(schemaName); String loadMetaInformationQuery = createLoadProfileQueryComplete(schemaName); - this.mapping = + this.timeSeriesMetaInformation = dataSource .executeQuery(queryComplete) .map(this::createEntity) @@ -51,14 +49,12 @@ public SqlTimeSeriesMetaInformationSource( Collectors.toMap( IndividualTimeSeriesMetaInformation::getUuid, Function.identity())); - this.loadProfileTimeSeriesMetaInformation = + this.loadProfileMetaInformation = dataSource .executeQuery(loadMetaInformationQuery) .map(this::createLoadProfileEntity) .flatMap(Optional::stream) - .collect( - Collectors.toMap( - LoadProfileTimeSeriesMetaInformation::getProfile, Function.identity())); + .collect(Collectors.toMap(LoadProfileMetaInformation::getProfile, Function.identity())); } /** @@ -74,7 +70,7 @@ private String createQueryComplete(String schemaName) { Collectors.toMap( namingStrategy::getTimeSeriesEntityName, columnScheme -> columnScheme)); - Iterable selectQueries = + List selectQueries = dataSource.getDbTables(schemaName, namingStrategy.getTimeSeriesPrefix() + "%").stream() .map( tableName -> @@ -90,7 +86,7 @@ private String createQueryComplete(String schemaName) { .flatMap(Optional::stream) .toList(); - return String.join("\nUNION\n", selectQueries) + ";"; + return selectQueries.isEmpty() ? ";" : String.join("\nUNION\n", selectQueries) + ";"; } /** @@ -100,48 +96,41 @@ private String createQueryComplete(String schemaName) { * @return query String */ private String createLoadProfileQueryComplete(String schemaName) { - return "SELECT DISTINCT load_profile FROM " + schemaName + ".load_profiles;"; + String tableName = namingStrategy.getLoadProfileTableName(); + boolean isNotPresent = dataSource.getDbTables(schemaName, tableName).isEmpty(); + + return isNotPresent + ? ";" + : "SELECT DISTINCT load_profile FROM " + schemaName + "." + tableName + ";"; } @Override public Map getTimeSeriesMetaInformation() { - return this.mapping; + return timeSeriesMetaInformation; } @Override public Optional getTimeSeriesMetaInformation( UUID timeSeriesUuid) { - return Optional.ofNullable(this.mapping.get(timeSeriesUuid)); - } - - @Override - public Map getLoadProfileMetaInformation() { - return loadProfileTimeSeriesMetaInformation; - } - - @Override - public Optional getLoadProfileMetaInformation( - LoadProfile loadProfile) { - return Optional.ofNullable(loadProfileTimeSeriesMetaInformation.get(loadProfile.getKey())); + return Optional.ofNullable(timeSeriesMetaInformation.get(timeSeriesUuid)); } private Optional createEntity( Map fieldToValues) { EntityData entityData = new EntityData(fieldToValues, IndividualTimeSeriesMetaInformation.class); - return mappingFactory + return metaInformationFactory .get(entityData) .map(meta -> (IndividualTimeSeriesMetaInformation) meta) .getData(); } - private Optional createLoadProfileEntity( + private Optional createLoadProfileEntity( Map fieldToValues) { - EntityData entityData = - new EntityData(fieldToValues, LoadProfileTimeSeriesMetaInformation.class); - return mappingFactory + EntityData entityData = new EntityData(fieldToValues, LoadProfileMetaInformation.class); + return metaInformationFactory .get(entityData) - .map(meta -> (LoadProfileTimeSeriesMetaInformation) meta) + .map(meta -> (LoadProfileMetaInformation) meta) .getData(); } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactoryTest.groovy index d13a41185..80a2f5300 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactoryTest.groovy @@ -5,7 +5,7 @@ */ package edu.ie3.datamodel.io.factory.timeseries -import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry import edu.ie3.datamodel.models.value.load.BdewLoadValues @@ -130,7 +130,7 @@ class BdewLoadProfileFactoryTest extends Specification { def "A BDEWLoadProfileFactory builds time series from entries"() { given: UUID uuid = UUID.fromString("fa3894c1-25af-479c-8a40-1323bb9150a9") - LoadProfileTimeSeriesMetaInformation metaInformation = new LoadProfileTimeSeriesMetaInformation(uuid, "g0") + LoadProfileMetaInformation metaInformation = new LoadProfileMetaInformation(uuid, "g0") when: diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy index eaa1d3ea9..514fb598a 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy @@ -5,7 +5,7 @@ */ package edu.ie3.datamodel.io.factory.timeseries -import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation import edu.ie3.datamodel.models.profile.LoadProfile import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry import edu.ie3.datamodel.models.value.load.RandomLoadValues @@ -130,7 +130,7 @@ class RandomLoadProfileFactoryTest extends Specification { def "A RandomLoadProfileFactory builds time series from entries"() { given: UUID uuid = UUID.fromString("fa3894c1-25af-479c-8a40-1323bb9150a9") - LoadProfileTimeSeriesMetaInformation metaInformation = new LoadProfileTimeSeriesMetaInformation(uuid, "random") + LoadProfileMetaInformation metaInformation = new LoadProfileMetaInformation(uuid, "random") when: diff --git a/src/test/groovy/edu/ie3/datamodel/io/naming/FileNamingStrategyTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/naming/FileNamingStrategyTest.groovy index 353fa3f8d..528529532 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/naming/FileNamingStrategyTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/naming/FileNamingStrategyTest.groovy @@ -7,7 +7,7 @@ package edu.ie3.datamodel.io.naming import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation -import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation import edu.ie3.datamodel.io.source.TimeSeriesMappingSource import edu.ie3.datamodel.models.UniqueEntity import edu.ie3.datamodel.models.input.MeasurementUnitInput @@ -912,8 +912,8 @@ class FileNamingStrategyTest extends Specification { def metaInformation = fns.timeSeriesMetaInformation(path) then: - LoadProfileTimeSeriesMetaInformation.isAssignableFrom(metaInformation.getClass()) - (metaInformation as LoadProfileTimeSeriesMetaInformation).with { + LoadProfileMetaInformation.isAssignableFrom(metaInformation.getClass()) + (metaInformation as LoadProfileMetaInformation).with { assert profile == "g3" } } @@ -927,8 +927,8 @@ class FileNamingStrategyTest extends Specification { def metaInformation = fns.timeSeriesMetaInformation(path) then: - LoadProfileTimeSeriesMetaInformation.isAssignableFrom(metaInformation.getClass()) - (metaInformation as LoadProfileTimeSeriesMetaInformation).with { + LoadProfileMetaInformation.isAssignableFrom(metaInformation.getClass()) + (metaInformation as LoadProfileMetaInformation).with { assert profile == "g3" } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSourceIT.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSourceIT.groovy index e46a108c6..c29dcca76 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSourceIT.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSourceIT.groovy @@ -12,7 +12,7 @@ import static edu.ie3.test.common.TimeSeriesSourceTestData.TIME_00MIN import edu.ie3.datamodel.io.connectors.SqlConnector import edu.ie3.datamodel.io.factory.timeseries.BdewLoadProfileFactory import edu.ie3.datamodel.io.naming.DatabaseNamingStrategy -import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile import edu.ie3.datamodel.models.value.load.BdewLoadValues import edu.ie3.test.helper.TestContainerHelper @@ -56,7 +56,7 @@ class SqlLoadProfileSourceIT extends Specification implements TestContainerHelpe } connector = new SqlConnector(postgreSQLContainer.jdbcUrl, postgreSQLContainer.username, postgreSQLContainer.password) - def metaInformation = new LoadProfileTimeSeriesMetaInformation(timeSeriesUuid, "g3") + def metaInformation = new LoadProfileMetaInformation(timeSeriesUuid, "g3") namingStrategy = new DatabaseNamingStrategy() From 3691920b672bac95bc4ee4fdf87f43c559a7a7aa Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Wed, 13 Nov 2024 15:11:54 +0100 Subject: [PATCH 17/23] Improving code. --- .../timeseries/BdewLoadProfileFactory.java | 7 +++- .../timeseries/LoadProfileFactory.java | 3 +- .../timeseries/RandomLoadProfileFactory.java | 15 ++++--- .../io/source/LoadProfileSource.java | 40 +++++++++---------- .../io/source/csv/CsvLoadProfileSource.java | 14 ++++++- .../io/source/sql/SqlLoadProfileSource.java | 13 +++++- .../repetitive/BdewLoadProfileTimeSeries.java | 9 ++++- .../repetitive/LoadProfileTimeSeries.java | 10 ++++- .../RandomLoadProfileTimeSeries.java | 10 ++++- .../io/source/LoadProfileSourceTest.groovy | 6 +-- 10 files changed, 87 insertions(+), 40 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java index 492a53be7..b2bc2a74d 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java @@ -15,9 +15,11 @@ import edu.ie3.datamodel.models.timeseries.repetitive.BdewLoadProfileTimeSeries; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; import edu.ie3.datamodel.models.value.load.BdewLoadValues; +import edu.ie3.util.quantities.PowerSystemUnits; import java.util.*; import java.util.function.Function; import java.util.stream.Stream; +import javax.measure.quantity.Energy; import javax.measure.quantity.Power; import tech.units.indriya.ComparableQuantity; import tech.units.indriya.quantity.Quantities; @@ -118,7 +120,8 @@ public Optional> calculateMaxPower( } @Override - public double getLoadProfileEnergyScaling() { - return 1000d; + public Optional> getLoadProfileEnergyScaling( + BdewStandardLoadProfile loadProfile) { + return Optional.of(Quantities.getQuantity(1000d, PowerSystemUnits.KILOWATTHOUR)); } } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java index d4b25d395..e4af59b88 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java @@ -13,6 +13,7 @@ import edu.ie3.datamodel.models.value.load.LoadValues; import java.util.Optional; import java.util.Set; +import javax.measure.quantity.Energy; import javax.measure.quantity.Power; import tech.units.indriya.ComparableQuantity; @@ -46,5 +47,5 @@ public String getTimeFieldString() { } /** Returns the load profile energy scaling. */ - public abstract double getLoadProfileEnergyScaling(); + public abstract Optional> getLoadProfileEnergyScaling(P loadProfile); } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java index 15745884f..25a94e8f7 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java @@ -8,7 +8,7 @@ import static edu.ie3.datamodel.models.profile.LoadProfile.RandomLoadProfile.RANDOM_LOAD_PROFILE; import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation; -import edu.ie3.datamodel.models.profile.LoadProfile; +import edu.ie3.datamodel.models.profile.LoadProfile.RandomLoadProfile; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; import edu.ie3.datamodel.models.timeseries.repetitive.RandomLoadProfileTimeSeries; import edu.ie3.datamodel.models.value.load.RandomLoadValues; @@ -16,11 +16,13 @@ import java.util.List; import java.util.Optional; import java.util.Set; +import javax.measure.quantity.Energy; import javax.measure.quantity.Power; import tech.units.indriya.ComparableQuantity; import tech.units.indriya.quantity.Quantities; -public class RandomLoadProfileFactory extends LoadProfileFactory { +public class RandomLoadProfileFactory + extends LoadProfileFactory { public static final String K_WEEKDAY = "kWd"; public static final String K_SATURDAY = "kSa"; public static final String K_SUNDAY = "kSu"; @@ -76,18 +78,19 @@ public RandomLoadProfileTimeSeries build( } @Override - public LoadProfile parseProfile(String profile) { + public RandomLoadProfile parseProfile(String profile) { return RANDOM_LOAD_PROFILE; } @Override public Optional> calculateMaxPower( - LoadProfile loadProfile, Set> loadProfileEntries) { + RandomLoadProfile loadProfile, Set> loadProfileEntries) { return Optional.of(Quantities.getQuantity(159d, PowerSystemUnits.WATT)); } @Override - public double getLoadProfileEnergyScaling() { - return 716.5416966513656; + public Optional> getLoadProfileEnergyScaling( + RandomLoadProfile loadProfile) { + return Optional.of(Quantities.getQuantity(716.5416966513656, PowerSystemUnits.KILOWATTHOUR)); } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java index c232e2252..60e30dd4e 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java @@ -18,7 +18,6 @@ import edu.ie3.datamodel.io.source.csv.CsvLoadProfileSource; import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; import edu.ie3.datamodel.models.profile.LoadProfile; -import edu.ie3.datamodel.models.timeseries.repetitive.BdewLoadProfileTimeSeries; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; import edu.ie3.datamodel.models.timeseries.repetitive.RandomLoadProfileTimeSeries; @@ -34,6 +33,7 @@ import java.util.Optional; import java.util.function.Function; import java.util.stream.Collectors; +import javax.measure.quantity.Energy; import javax.measure.quantity.Power; import tech.units.indriya.ComparableQuantity; @@ -79,21 +79,23 @@ protected Try, FactoryException> createEntries( */ public abstract Optional getValue(ZonedDateTime time) throws SourceException; + /** Returns the load profile of this source. */ + public abstract P getLoadProfile(); + /** Returns the maximal power value of the time series */ - public abstract Optional> getMaxValue(); + public abstract Optional> getMaxPower(); /** Returns the load profile energy scaling for this load profile time series. */ - public double getLoadProfileEnergyScaling() { - return entryFactory.getLoadProfileEnergyScaling(); - } + public abstract Optional> getLoadProfileEnergyScaling(); /** * Method to read in the build-in {@link BdewStandardLoadProfile}s. * - * @return a map: load profile to time series + * @return a map: load profile to load profile source */ - public static Map getBDEWLoadProfiles() - throws SourceException { + public static Map< + BdewStandardLoadProfile, CsvLoadProfileSource> + getBdewLoadProfiles() throws SourceException { CsvDataSource buildInSource = getBuildInSource(LoadProfileSource.class, "/load"); BdewLoadProfileFactory factory = new BdewLoadProfileFactory(); @@ -104,31 +106,25 @@ public static Map getBDEWLoa .stream() .map( metaInformation -> - (BdewLoadProfileTimeSeries) - new CsvLoadProfileSource<>( - buildInSource, metaInformation, BdewLoadValues.class, factory) - .getTimeSeries()) - .collect(Collectors.toMap(BdewLoadProfileTimeSeries::getLoadProfile, Function.identity())); + new CsvLoadProfileSource<>( + buildInSource, metaInformation, BdewLoadValues.class, factory)) + .collect(Collectors.toMap(CsvLoadProfileSource::getLoadProfile, Function.identity())); } /** * Method to read in the build-in {@link RandomLoadProfileTimeSeries}. * - * @return the random load profile time series + * @return the random load profile source */ - public static RandomLoadProfileTimeSeries getRandomLoadProfile() throws SourceException { + public static CsvLoadProfileSource + getRandomLoadProfile() throws SourceException { CsvDataSource buildInSource = getBuildInSource(LoadProfileSource.class, "/load"); CsvLoadProfileMetaInformation metaInformation = buildInSource.getCsvLoadProfileMetaInformation(RANDOM_LOAD_PROFILE).values().stream() .findAny() .orElseThrow(); - return (RandomLoadProfileTimeSeries) - new CsvLoadProfileSource<>( - buildInSource, - metaInformation, - RandomLoadValues.class, - new RandomLoadProfileFactory()) - .getTimeSeries(); + return new CsvLoadProfileSource<>( + buildInSource, metaInformation, RandomLoadValues.class, new RandomLoadProfileFactory()); } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java index c4719560e..278eb7a8e 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java @@ -22,6 +22,7 @@ import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; +import javax.measure.quantity.Energy; import javax.measure.quantity.Power; import tech.units.indriya.ComparableQuantity; @@ -76,10 +77,21 @@ public Optional getValue(ZonedDateTime time) throws SourceException { } @Override - public Optional> getMaxValue() { + @SuppressWarnings("unchecked") + public P getLoadProfile() { + return (P) getTimeSeries().getLoadProfile(); + } + + @Override + public Optional> getMaxPower() { return loadProfileTimeSeries.maxPower; } + @Override + public Optional> getLoadProfileEnergyScaling() { + return loadProfileTimeSeries.profileEnergyScaling; + } + // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- /** diff --git a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java index 68a612921..df85a139e 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java @@ -27,6 +27,7 @@ import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; +import javax.measure.quantity.Energy; import javax.measure.quantity.Power; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -120,10 +121,20 @@ public Optional getValue(ZonedDateTime time) throws SourceException { } @Override - public Optional> getMaxValue() { + public P getLoadProfile() { + return loadProfile; + } + + @Override + public Optional> getMaxPower() { return entryFactory.calculateMaxPower(loadProfile, getEntries(queryFull, ps -> {})); } + @Override + public Optional> getLoadProfileEnergyScaling() { + return entryFactory.getLoadProfileEnergyScaling(loadProfile); + } + // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- /** diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BdewLoadProfileTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BdewLoadProfileTimeSeries.java index 39864fbfa..38edbd08c 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BdewLoadProfileTimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BdewLoadProfileTimeSeries.java @@ -7,12 +7,14 @@ import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; import edu.ie3.datamodel.models.value.load.BdewLoadValues; +import edu.ie3.util.quantities.PowerSystemUnits; import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.UUID; import javax.measure.quantity.Power; import tech.units.indriya.ComparableQuantity; +import tech.units.indriya.quantity.Quantities; /** * Describes a bdew load profile time series with repetitive values that can be calculated from a @@ -25,7 +27,12 @@ public BdewLoadProfileTimeSeries( BdewStandardLoadProfile loadProfile, Set> values, Optional> maxPower) { - super(uuid, loadProfile, values, maxPower); + super( + uuid, + loadProfile, + values, + maxPower, + Optional.of(Quantities.getQuantity(1000d, PowerSystemUnits.KILOWATTHOUR))); } @Override diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java index f980279a0..6a14a863c 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java @@ -12,6 +12,7 @@ import java.time.ZonedDateTime; import java.util.*; import java.util.stream.Collectors; +import javax.measure.quantity.Energy; import javax.measure.quantity.Power; import tech.units.indriya.ComparableQuantity; @@ -25,15 +26,19 @@ public class LoadProfileTimeSeries /** * The maximum average power consumption per quarter-hour for a given calculated over all seasons - * and weekday types of given load profile + * and weekday types of given load profile. */ public final Optional> maxPower; + /** The profile energy scaling in kWh. */ + public final Optional> profileEnergyScaling; + public LoadProfileTimeSeries( UUID uuid, LoadProfile loadProfile, Set> entries, - Optional> maxPower) { + Optional> maxPower, + Optional> profileEnergyScaling) { super(uuid, entries); this.loadProfile = loadProfile; this.valueMapping = @@ -42,6 +47,7 @@ public LoadProfileTimeSeries( Collectors.toMap(LoadProfileEntry::getQuarterHour, LoadProfileEntry::getValue)); this.maxPower = maxPower; + this.profileEnergyScaling = profileEnergyScaling; } /** Returns the {@link LoadProfile}. */ diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java index e1adcf4ef..c494112ce 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java @@ -8,19 +8,27 @@ import de.lmu.ifi.dbs.elki.math.statistics.distribution.GeneralizedExtremeValueDistribution; import edu.ie3.datamodel.models.profile.LoadProfile; import edu.ie3.datamodel.models.value.load.RandomLoadValues; +import edu.ie3.util.quantities.PowerSystemUnits; import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.UUID; +import tech.units.indriya.quantity.Quantities; /** * Describes a random load profile time series based on a {@link * GeneralizedExtremeValueDistribution}. Each value of this# timeseries is given in kW. */ public class RandomLoadProfileTimeSeries extends LoadProfileTimeSeries { + public RandomLoadProfileTimeSeries( UUID uuid, LoadProfile loadProfile, Set> entries) { - super(uuid, loadProfile, entries, Optional.empty()); + super( + uuid, + loadProfile, + entries, + Optional.empty(), + Optional.of(Quantities.getQuantity(716.5416966513656, PowerSystemUnits.KILOWATTHOUR))); } @Override diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/LoadProfileSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/LoadProfileSourceTest.groovy index 322ceb75b..013e93e67 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/LoadProfileSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/LoadProfileSourceTest.groovy @@ -14,17 +14,17 @@ class LoadProfileSourceTest extends Specification { def "A LoadProfileSourceTest should read in all build-in BDEWStandardLoadProfiles"() { when: - def profiles = LoadProfileSource.getBDEWLoadProfiles() + def profiles = LoadProfileSource.bdewLoadProfiles then: profiles.size() == 11 BdewStandardLoadProfile.values().every { profiles.keySet().contains(it) } - profiles.values().every { it.entries.size() == 96 } + profiles.values().every { it.timeSeries.entries.size() == 96 } } def "A LoadProfileSourceTest should read in the build-in RandomLoadProfile"() { when: - def random = LoadProfileSource.randomLoadProfile + def random = LoadProfileSource.randomLoadProfile.timeSeries then: random.loadProfile == RANDOM_LOAD_PROFILE From 9639c882b5acb3dca9b9c4b23b4b19a5eaa7c105 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Fri, 22 Nov 2024 14:45:19 +0100 Subject: [PATCH 18/23] Fixing some sonarqube issues. --- .../models/value/load/BdewLoadValues.java | 148 +++++++++--------- .../models/value/load/RandomLoadValues.java | 3 +- 2 files changed, 75 insertions(+), 76 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/models/value/load/BdewLoadValues.java b/src/main/java/edu/ie3/datamodel/models/value/load/BdewLoadValues.java index 0bf549cac..278dcaa0e 100644 --- a/src/main/java/edu/ie3/datamodel/models/value/load/BdewLoadValues.java +++ b/src/main/java/edu/ie3/datamodel/models/value/load/BdewLoadValues.java @@ -22,35 +22,35 @@ /** Load values for a {@link BdewStandardLoadProfile} */ public class BdewLoadValues implements LoadValues { - private final double SuSa; - private final double SuSu; - private final double SuWd; - private final double TrSa; - private final double TrSu; - private final double TrWd; - private final double WiSa; - private final double WiSu; - private final double WiWd; + private final double suSa; + private final double suSu; + private final double suWd; + private final double trSa; + private final double trSu; + private final double trWd; + private final double wiSa; + private final double wiSu; + private final double wiWd; public BdewLoadValues( - double SuSa, - double SuSu, - double SuWd, - double TrSa, - double TrSu, - double TrWd, - double WiSa, - double WiSu, - double WiWd) { - this.SuSa = SuSa; - this.SuSu = SuSu; - this.SuWd = SuWd; - this.TrSa = TrSa; - this.TrSu = TrSu; - this.TrWd = TrWd; - this.WiSa = WiSa; - this.WiSu = WiSu; - this.WiWd = WiWd; + double suSa, + double suSu, + double suWd, + double trSa, + double trSu, + double trWd, + double wiSa, + double wiSu, + double wiWd) { + this.suSa = suSa; + this.suSu = suSu; + this.suWd = suWd; + this.trSa = trSa; + this.trSu = trSu; + this.trWd = trWd; + this.wiSa = wiSa; + this.wiSu = wiSu; + this.wiWd = wiWd; } @Override @@ -58,17 +58,17 @@ public PValue getValue(ZonedDateTime time, LoadProfile loadProfile) { Map mapping = switch (time.getDayOfWeek()) { case SATURDAY -> Map.of( - SUMMER, SuSa, - WINTER, WiSa, - TRANSITION, TrSa); + SUMMER, suSa, + WINTER, wiSa, + TRANSITION, trSa); case SUNDAY -> Map.of( - SUMMER, SuSu, - WINTER, WiSu, - TRANSITION, TrSu); + SUMMER, suSu, + WINTER, wiSu, + TRANSITION, trSu); default -> Map.of( - SUMMER, SuWd, - WINTER, WiWd, - TRANSITION, TrWd); + SUMMER, suWd, + WINTER, wiWd, + TRANSITION, trWd); }; double power = mapping.get(getSeason(time)); @@ -98,43 +98,43 @@ public static double dynamization(double load, int t) { } public double getSuSa() { - return SuSa; + return suSa; } public double getSuSu() { - return SuSu; + return suSu; } public double getSuWd() { - return SuWd; + return suWd; } public double getTrSa() { - return TrSa; + return trSa; } public double getTrSu() { - return TrSu; + return trSu; } public double getTrWd() { - return TrWd; + return trWd; } public double getWiSa() { - return WiSa; + return wiSa; } public double getWiSu() { - return WiSu; + return wiSu; } public double getWiWd() { - return WiWd; + return wiWd; } public List values() { - return List.of(SuSa, SuSu, SuWd, TrSa, TrSu, TrWd, WiSa, WiSu, WiWd); + return List.of(suSa, suSu, suWd, trSa, trSu, trWd, wiSa, wiSu, wiWd); } @Override @@ -142,43 +142,43 @@ public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; BdewLoadValues that = (BdewLoadValues) o; - return Objects.equals(SuSa, that.SuSa) - && Objects.equals(SuSu, that.SuSu) - && Objects.equals(SuWd, that.SuWd) - && Objects.equals(TrSa, that.TrSa) - && Objects.equals(TrSu, that.TrSu) - && Objects.equals(TrWd, that.TrWd) - && Objects.equals(WiSa, that.WiSa) - && Objects.equals(WiSu, that.WiSu) - && Objects.equals(WiWd, that.WiWd); + return Objects.equals(suSa, that.suSa) + && Objects.equals(suSu, that.suSu) + && Objects.equals(suWd, that.suWd) + && Objects.equals(trSa, that.trSa) + && Objects.equals(trSu, that.trSu) + && Objects.equals(trWd, that.trWd) + && Objects.equals(wiSa, that.wiSa) + && Objects.equals(wiSu, that.wiSu) + && Objects.equals(wiWd, that.wiWd); } @Override public int hashCode() { - return Objects.hash(SuWd, SuSa, SuSu, WiWd, WiSa, WiSu, TrWd, TrSa, TrSu); + return Objects.hash(suSa, suSu, suWd, trSa, trSu, trWd, wiSa, wiSu, wiWd); } @Override public String toString() { return "BDEWLoadValues{" - + "SuWd=" - + SuWd - + ", SuSa=" - + SuSa - + ", SuSu=" - + SuSu - + ", WiWd=" - + WiWd - + ", WiSa=" - + WiSa - + ", WiSu=" - + WiSu - + ", TrWd=" - + TrWd - + ", TrSa=" - + TrSa - + ", TrSu=" - + TrSu + + "suSa=" + + suSa + + ", suSu=" + + suSu + + ", suWd=" + + suWd + + ", trSa=" + + trSa + + ", trSu=" + + trSu + + ", trWd=" + + trWd + + ", wiSa=" + + wiSa + + ", wiSu=" + + wiSu + + ", wiWd=" + + wiWd + '}'; } } diff --git a/src/main/java/edu/ie3/datamodel/models/value/load/RandomLoadValues.java b/src/main/java/edu/ie3/datamodel/models/value/load/RandomLoadValues.java index 072ca763f..d5d399301 100644 --- a/src/main/java/edu/ie3/datamodel/models/value/load/RandomLoadValues.java +++ b/src/main/java/edu/ie3/datamodel/models/value/load/RandomLoadValues.java @@ -86,8 +86,7 @@ public RandomLoadValues( this.sigmaSa = sigmaSa; this.sigmaSu = sigmaSu; - Random random = new Random(); - RandomFactory factory = RandomFactory.get(random.nextLong()); + RandomFactory factory = RandomFactory.get(new Random().nextLong()); this.gevWd = new GeneralizedExtremeValueDistribution(myWd, sigmaWd, kWd, factory.getRandom()); From 7bb1b23294170f27325efd50233a4f1ce628fc0c Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Mon, 3 Feb 2025 12:10:09 +0100 Subject: [PATCH 19/23] Adding some tests. --- .../BdewLoadProfileFactoryTest.groovy | 20 +++++++++++++++++++ .../RandomLoadProfileFactoryTest.groovy | 20 +++++++++++++++++++ .../models/profile/LoadProfileTest.groovy | 2 +- 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactoryTest.groovy index 80a2f5300..db4e2849a 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactoryTest.groovy @@ -9,8 +9,10 @@ import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry import edu.ie3.datamodel.models.value.load.BdewLoadValues +import edu.ie3.util.quantities.PowerSystemUnits import spock.lang.Shared import spock.lang.Specification +import tech.units.indriya.quantity.Quantities class BdewLoadProfileFactoryTest extends Specification { @Shared @@ -140,4 +142,22 @@ class BdewLoadProfileFactoryTest extends Specification { lpts.loadProfile == BdewStandardLoadProfile.G0 lpts.entries.size() == 3 } + + def "A BDEWLoadProfileFactory does return the max power correctly"() { + when: + def maxPower = factory.calculateMaxPower(BdewStandardLoadProfile.G0, allEntries) + + then: + maxPower.isPresent() + maxPower.get() == Quantities.getQuantity(77.7, PowerSystemUnits.WATT) + } + + def "A BDEWLoadProfileFactory does return an energy scaling correctly"() { + when: + def energyScaling = factory.getLoadProfileEnergyScaling(BdewStandardLoadProfile.G0) + + then: + energyScaling.isPresent() + energyScaling.get() == Quantities.getQuantity(1000d, PowerSystemUnits.KILOWATTHOUR) + } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy index 514fb598a..22cb08121 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy @@ -9,8 +9,10 @@ import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation import edu.ie3.datamodel.models.profile.LoadProfile import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry import edu.ie3.datamodel.models.value.load.RandomLoadValues +import edu.ie3.util.quantities.PowerSystemUnits import spock.lang.Shared import spock.lang.Specification +import tech.units.indriya.quantity.Quantities class RandomLoadProfileFactoryTest extends Specification { @Shared @@ -140,4 +142,22 @@ class RandomLoadProfileFactoryTest extends Specification { lpts.loadProfile == LoadProfile.RandomLoadProfile.RANDOM_LOAD_PROFILE lpts.entries.size() == 3 } + + def "A RandomLoadProfileFactory does return the max power correctly"() { + when: + def maxPower = factory.calculateMaxPower(LoadProfile.RandomLoadProfile.RANDOM_LOAD_PROFILE, allEntries) + + then: + maxPower.isPresent() + maxPower.get() == Quantities.getQuantity(159d, PowerSystemUnits.WATT) + } + + def "A RandomLoadProfileFactory does return an energy scaling correctly"() { + when: + def energyScaling = factory.getLoadProfileEnergyScaling(LoadProfile.RandomLoadProfile.RANDOM_LOAD_PROFILE) + + then: + energyScaling.isPresent() + energyScaling.get() == Quantities.getQuantity(716.5416966513656, PowerSystemUnits.KILOWATTHOUR) + } } diff --git a/src/test/groovy/edu/ie3/datamodel/models/profile/LoadProfileTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/profile/LoadProfileTest.groovy index d7fb77e5c..0265d24c4 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/profile/LoadProfileTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/profile/LoadProfileTest.groovy @@ -110,7 +110,7 @@ class LoadProfileTest extends Specification { "H_0" || BdewStandardLoadProfile.H0 } - def "Tempearture dependent load profiles can be parsed correctly"() { + def "Temperature dependent load profiles can be parsed correctly"() { when: TemperatureDependantLoadProfile actual = TemperatureDependantLoadProfile.parse(key) From 560cc77c8e281e0bcff70c15da94734ad12c67b8 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Fri, 14 Feb 2025 14:13:40 +0100 Subject: [PATCH 20/23] Adapting to changes in `dev`. --- .../timeseries/BdewLoadProfileFactory.java | 1 - .../timeseries/RandomLoadProfileFactory.java | 19 ++++++++++++------- .../timeseries/TimeSeriesProcessor.java | 1 + .../io/source/LoadProfileSource.java | 4 ++-- .../io/source/csv/CsvLoadProfileSource.java | 4 ++-- .../io/source/sql/SqlLoadProfileSource.java | 4 ++-- .../RandomLoadProfileTimeSeries.java | 19 +++++++++---------- .../models/value/load/RandomLoadValues.java | 6 +++--- .../RandomLoadProfileFactoryTest.groovy | 6 ++---- .../io/processor/ProcessorProviderTest.groovy | 2 ++ 10 files changed, 35 insertions(+), 31 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java index 1c865b948..2d10a0c00 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java @@ -15,7 +15,6 @@ import edu.ie3.datamodel.models.timeseries.repetitive.BdewLoadProfileTimeSeries; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; import edu.ie3.datamodel.models.value.load.BdewLoadValues; -import edu.ie3.util.quantities.PowerSystemUnits; import java.util.*; import java.util.function.Function; import java.util.stream.Stream; diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java index 25a94e8f7..98cc0d749 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java @@ -6,6 +6,7 @@ package edu.ie3.datamodel.io.factory.timeseries; import static edu.ie3.datamodel.models.profile.LoadProfile.RandomLoadProfile.RANDOM_LOAD_PROFILE; +import static tech.units.indriya.unit.Units.WATT; import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation; import edu.ie3.datamodel.models.profile.LoadProfile.RandomLoadProfile; @@ -14,7 +15,6 @@ import edu.ie3.datamodel.models.value.load.RandomLoadValues; import edu.ie3.util.quantities.PowerSystemUnits; import java.util.List; -import java.util.Optional; import java.util.Set; import javax.measure.quantity.Energy; import javax.measure.quantity.Power; @@ -74,7 +74,13 @@ protected List> getFields(Class entityClass) { @Override public RandomLoadProfileTimeSeries build( LoadProfileMetaInformation metaInformation, Set> entries) { - return new RandomLoadProfileTimeSeries(metaInformation.getUuid(), RANDOM_LOAD_PROFILE, entries); + RandomLoadProfile profile = RANDOM_LOAD_PROFILE; + + ComparableQuantity maxPower = calculateMaxPower(profile, entries); + ComparableQuantity profileEnergyScaling = getLoadProfileEnergyScaling(profile); + + return new RandomLoadProfileTimeSeries( + metaInformation.getUuid(), profile, entries, maxPower, profileEnergyScaling); } @Override @@ -83,14 +89,13 @@ public RandomLoadProfile parseProfile(String profile) { } @Override - public Optional> calculateMaxPower( + public ComparableQuantity calculateMaxPower( RandomLoadProfile loadProfile, Set> loadProfileEntries) { - return Optional.of(Quantities.getQuantity(159d, PowerSystemUnits.WATT)); + return Quantities.getQuantity(159d, WATT); } @Override - public Optional> getLoadProfileEnergyScaling( - RandomLoadProfile loadProfile) { - return Optional.of(Quantities.getQuantity(716.5416966513656, PowerSystemUnits.KILOWATTHOUR)); + public ComparableQuantity getLoadProfileEnergyScaling(RandomLoadProfile loadProfile) { + return Quantities.getQuantity(716.5416966513656, PowerSystemUnits.KILOWATTHOUR); } } diff --git a/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java b/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java index 63f3a0990..d536bbb02 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java @@ -16,6 +16,7 @@ import edu.ie3.datamodel.models.timeseries.repetitive.*; import edu.ie3.datamodel.models.value.*; import edu.ie3.datamodel.models.value.load.BdewLoadValues; +import edu.ie3.datamodel.models.value.load.RandomLoadValues; import java.lang.reflect.Method; import java.util.*; import java.util.stream.Collectors; diff --git a/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java index 60e30dd4e..be767995e 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java @@ -83,10 +83,10 @@ protected Try, FactoryException> createEntries( public abstract P getLoadProfile(); /** Returns the maximal power value of the time series */ - public abstract Optional> getMaxPower(); + public abstract ComparableQuantity getMaxPower(); /** Returns the load profile energy scaling for this load profile time series. */ - public abstract Optional> getLoadProfileEnergyScaling(); + public abstract ComparableQuantity getLoadProfileEnergyScaling(); /** * Method to read in the build-in {@link BdewStandardLoadProfile}s. diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java index 278eb7a8e..b96e8ee21 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java @@ -83,12 +83,12 @@ public P getLoadProfile() { } @Override - public Optional> getMaxPower() { + public ComparableQuantity getMaxPower() { return loadProfileTimeSeries.maxPower; } @Override - public Optional> getLoadProfileEnergyScaling() { + public ComparableQuantity getLoadProfileEnergyScaling() { return loadProfileTimeSeries.profileEnergyScaling; } diff --git a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java index df85a139e..193272e33 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java @@ -126,12 +126,12 @@ public P getLoadProfile() { } @Override - public Optional> getMaxPower() { + public ComparableQuantity getMaxPower() { return entryFactory.calculateMaxPower(loadProfile, getEntries(queryFull, ps -> {})); } @Override - public Optional> getLoadProfileEnergyScaling() { + public ComparableQuantity getLoadProfileEnergyScaling() { return entryFactory.getLoadProfileEnergyScaling(loadProfile); } diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java index c494112ce..b77fbf065 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java @@ -8,12 +8,12 @@ import de.lmu.ifi.dbs.elki.math.statistics.distribution.GeneralizedExtremeValueDistribution; import edu.ie3.datamodel.models.profile.LoadProfile; import edu.ie3.datamodel.models.value.load.RandomLoadValues; -import edu.ie3.util.quantities.PowerSystemUnits; import java.util.Objects; -import java.util.Optional; import java.util.Set; import java.util.UUID; -import tech.units.indriya.quantity.Quantities; +import javax.measure.quantity.Energy; +import javax.measure.quantity.Power; +import tech.units.indriya.ComparableQuantity; /** * Describes a random load profile time series based on a {@link @@ -22,13 +22,12 @@ public class RandomLoadProfileTimeSeries extends LoadProfileTimeSeries { public RandomLoadProfileTimeSeries( - UUID uuid, LoadProfile loadProfile, Set> entries) { - super( - uuid, - loadProfile, - entries, - Optional.empty(), - Optional.of(Quantities.getQuantity(716.5416966513656, PowerSystemUnits.KILOWATTHOUR))); + UUID uuid, + LoadProfile loadProfile, + Set> entries, + ComparableQuantity maxPower, + ComparableQuantity profileEnergyScaling) { + super(uuid, loadProfile, entries, maxPower, profileEnergyScaling); } @Override diff --git a/src/main/java/edu/ie3/datamodel/models/value/load/RandomLoadValues.java b/src/main/java/edu/ie3/datamodel/models/value/load/RandomLoadValues.java index d5d399301..3e9684e56 100644 --- a/src/main/java/edu/ie3/datamodel/models/value/load/RandomLoadValues.java +++ b/src/main/java/edu/ie3/datamodel/models/value/load/RandomLoadValues.java @@ -51,9 +51,9 @@ public class RandomLoadValues implements LoadValues { /** Scale parameter for a working day */ private final double sigmaWd; - private final GeneralizedExtremeValueDistribution gevWd; - private final GeneralizedExtremeValueDistribution gevSa; - private final GeneralizedExtremeValueDistribution gevSu; + private final transient GeneralizedExtremeValueDistribution gevWd; + private final transient GeneralizedExtremeValueDistribution gevSa; + private final transient GeneralizedExtremeValueDistribution gevSu; /** * @param kSa Shape parameter for a Saturday diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy index 22cb08121..901a3a3b1 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy @@ -148,8 +148,7 @@ class RandomLoadProfileFactoryTest extends Specification { def maxPower = factory.calculateMaxPower(LoadProfile.RandomLoadProfile.RANDOM_LOAD_PROFILE, allEntries) then: - maxPower.isPresent() - maxPower.get() == Quantities.getQuantity(159d, PowerSystemUnits.WATT) + maxPower == Quantities.getQuantity(159d, PowerSystemUnits.WATT) } def "A RandomLoadProfileFactory does return an energy scaling correctly"() { @@ -157,7 +156,6 @@ class RandomLoadProfileFactoryTest extends Specification { def energyScaling = factory.getLoadProfileEnergyScaling(LoadProfile.RandomLoadProfile.RANDOM_LOAD_PROFILE) then: - energyScaling.isPresent() - energyScaling.get() == Quantities.getQuantity(716.5416966513656, PowerSystemUnits.KILOWATTHOUR) + energyScaling == Quantities.getQuantity(716.5416966513656, PowerSystemUnits.KILOWATTHOUR) } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy index f40e246eb..7d63bcfae 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy @@ -42,8 +42,10 @@ import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue import edu.ie3.datamodel.models.timeseries.repetitive.BdewLoadProfileTimeSeries import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry +import edu.ie3.datamodel.models.timeseries.repetitive.RandomLoadProfileTimeSeries import edu.ie3.datamodel.models.value.* import edu.ie3.datamodel.models.value.load.BdewLoadValues +import edu.ie3.datamodel.models.value.load.RandomLoadValues import edu.ie3.datamodel.utils.Try import edu.ie3.test.common.TimeSeriesTestData import edu.ie3.util.TimeUtil From d75926f51c80c545af4a233ecc9035841ed5860a Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Tue, 25 Feb 2025 14:59:24 +0100 Subject: [PATCH 21/23] Adapting `LoadProfileSource`s. --- .../edu/ie3/datamodel/io/source/LoadProfileSource.java | 4 ++-- .../datamodel/io/source/csv/CsvLoadProfileSource.java | 8 ++++---- .../datamodel/io/source/sql/SqlLoadProfileSource.java | 9 +++++---- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java index be767995e..60e30dd4e 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java @@ -83,10 +83,10 @@ protected Try, FactoryException> createEntries( public abstract P getLoadProfile(); /** Returns the maximal power value of the time series */ - public abstract ComparableQuantity getMaxPower(); + public abstract Optional> getMaxPower(); /** Returns the load profile energy scaling for this load profile time series. */ - public abstract ComparableQuantity getLoadProfileEnergyScaling(); + public abstract Optional> getLoadProfileEnergyScaling(); /** * Method to read in the build-in {@link BdewStandardLoadProfile}s. diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java index b96e8ee21..f3b271617 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java @@ -83,13 +83,13 @@ public P getLoadProfile() { } @Override - public ComparableQuantity getMaxPower() { - return loadProfileTimeSeries.maxPower; + public Optional> getMaxPower() { + return loadProfileTimeSeries.maxPower(); } @Override - public ComparableQuantity getLoadProfileEnergyScaling() { - return loadProfileTimeSeries.profileEnergyScaling; + public Optional> getLoadProfileEnergyScaling() { + return loadProfileTimeSeries.loadProfileScaling(); } // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- diff --git a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java index 193272e33..28544f37e 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java @@ -126,13 +126,14 @@ public P getLoadProfile() { } @Override - public ComparableQuantity getMaxPower() { - return entryFactory.calculateMaxPower(loadProfile, getEntries(queryFull, ps -> {})); + public Optional> getMaxPower() { + return Optional.ofNullable( + entryFactory.calculateMaxPower(loadProfile, getEntries(queryFull, ps -> {}))); } @Override - public ComparableQuantity getLoadProfileEnergyScaling() { - return entryFactory.getLoadProfileEnergyScaling(loadProfile); + public Optional> getLoadProfileEnergyScaling() { + return Optional.ofNullable(entryFactory.getLoadProfileEnergyScaling(loadProfile)); } // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- From ec5742e2c3848bbff92c60a54be912494815f218 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Wed, 26 Feb 2025 09:42:57 +0100 Subject: [PATCH 22/23] Enhancing documentation. --- docs/readthedocs/io/csvfiles.md | 26 +++++++++++++++++-- .../models/input/additionaldata/timeseries.md | 5 ++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/docs/readthedocs/io/csvfiles.md b/docs/readthedocs/io/csvfiles.md index 3e96eb59d..7a29737d3 100644 --- a/docs/readthedocs/io/csvfiles.md +++ b/docs/readthedocs/io/csvfiles.md @@ -94,11 +94,13 @@ Csv id coordinate sources can have two different ways to represent their coordin * - Model - File Name * - individual time series - - *prefix_* its *_columnScheme_UUID_suffix* + - *prefix_* its *_columnScheme_UUID *_suffix* * - load profile input - - *prefix_* rts *_profileKey_UUID_suffix* + - *prefix_* lpts *_profileKey *_suffix* ``` +#### Individual Time Series + Let's spend a few more words on the individual time series: Those files are meant to carry different types of content - one might give information about wholesale market prices, the other is a record of power values provided by a real system. @@ -154,6 +156,26 @@ The following keys are supported until now: ``` + +##### Load Profile Time Series + +The following profiles are supported until now: +```{list-table} + :widths: auto + :class: wrapping + :header-rows: 1 + + * - Key + - Information and supported head line. + * - e.g.: H0 + - + Permissible head line: ``SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour`` + * - random + - + Permissible head line: ``kSa,kSu,kWd,mySa,mySu,myWd,sigmaSa,sigmaSu,sigmaWd,quarterHour`` + +``` + ### Results ```{list-table} diff --git a/docs/readthedocs/models/input/additionaldata/timeseries.md b/docs/readthedocs/models/input/additionaldata/timeseries.md index 991568b4b..eb24eec12 100644 --- a/docs/readthedocs/models/input/additionaldata/timeseries.md +++ b/docs/readthedocs/models/input/additionaldata/timeseries.md @@ -55,4 +55,9 @@ The following different values are available: * - `WeatherValue` - Combination of irradiance, temperature and wind information + * - `BdewLoadValues` + - Values for combination of seasons and day types + + * - `RandomLoadValues` + - Parameters for a probability density function to draw random power consumptions ``` From d02ea9735c23d1b1663bee050a12da4849a2cf20 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Wed, 26 Feb 2025 10:46:11 +0100 Subject: [PATCH 23/23] Enhancing documentation. --- docs/readthedocs/io/csvfiles.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/docs/readthedocs/io/csvfiles.md b/docs/readthedocs/io/csvfiles.md index 7a29737d3..67dadf6b3 100644 --- a/docs/readthedocs/io/csvfiles.md +++ b/docs/readthedocs/io/csvfiles.md @@ -94,9 +94,9 @@ Csv id coordinate sources can have two different ways to represent their coordin * - Model - File Name * - individual time series - - *prefix_* its *_columnScheme_UUID *_suffix* + - *prefix_* its *_columnScheme_UUID* *_suffix* * - load profile input - - *prefix_* lpts *_profileKey *_suffix* + - *prefix_* lpts *_profileKey* *_suffix* ``` #### Individual Time Series @@ -166,13 +166,14 @@ The following profiles are supported until now: :header-rows: 1 * - Key - - Information and supported head line. + - Information + - Supported head line. * - e.g.: H0 - - - Permissible head line: ``SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour`` + - BDEW standard load profiles ([source](https://www.bdew.de/energie/standardlastprofile-strom/)) + - Permissible head line: ``SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour`` * - random - - - Permissible head line: ``kSa,kSu,kWd,mySa,mySu,myWd,sigmaSa,sigmaSu,sigmaWd,quarterHour`` + - A random load proile based on: ``Kays - Agent-based simulation environment for improving the planning of distribution grids`` + - Permissible head line: ``kSa,kSu,kWd,mySa,mySu,myWd,sigmaSa,sigmaSu,sigmaWd,quarterHour`` ```