From a6481b933c0600285177aa42d1ffe06c2f471220 Mon Sep 17 00:00:00 2001 From: "Julian.Endres" Date: Fri, 10 Nov 2023 16:59:00 +0100 Subject: [PATCH 01/18] Add tsam to reading module Tsam is currently only available for multi-period. --- src/oemof/tabular/datapackage/reading.py | 44 ++++++++++++++++++++---- 1 file changed, 38 insertions(+), 6 deletions(-) diff --git a/src/oemof/tabular/datapackage/reading.py b/src/oemof/tabular/datapackage/reading.py index fac4ed7d..c8856c97 100644 --- a/src/oemof/tabular/datapackage/reading.py +++ b/src/oemof/tabular/datapackage/reading.py @@ -554,12 +554,44 @@ def create_yearly_values(values, years): else: # look for periods resource and if present, take periods from it if package.get_resource("periods"): - es = cls( - timeindex=period_data["timeindex"], - timeincrement=period_data["timeincrement"], - periods=period_data["periods"], - infer_last_interval=False, - ) + # look for tsa_parameters resource and if present, get + # tsa_parameters from it + # currently only works for multi-period + if package.get_resource("tsa_parameters"): + df_tsa_parameters = pd.DataFrame.from_dict( + package.get_resource("tsa_parameters").read(keyed=True) + ).set_index("period", drop=True) + + df_timeindex = pd.DataFrame.from_dict( + package.get_resource("timeindex").read(keyed=True) + ) + tsa_parameters = [] + for p, data in df_tsa_parameters.sort_index().iterrows(): + tsa_parameters.append( + { + "timesteps_per_period": data[ + "timesteps_per_period" + ], + "order": data["order"], + "timeindex": pd.to_datetime( + df_timeindex.loc[:, f"period_{p}"].values + ), + } + ) + es = cls( + timeindex=period_data["timeindex"], + timeincrement=period_data["timeincrement"], + periods=period_data["periods"], + tsa_parameters=tsa_parameters, + infer_last_interval=False, + ) + else: + es = cls( + timeindex=period_data["timeindex"], + timeincrement=period_data["timeincrement"], + periods=period_data["periods"], + infer_last_interval=False, + ) # if lst is not empty elif lst: From dc78863067ff822aa84713981cb3fc285cdaeb9f Mon Sep 17 00:00:00 2001 From: "Julian.Endres" Date: Fri, 10 Nov 2023 17:00:17 +0100 Subject: [PATCH 02/18] Add tsam multi-period example --- .../dispatch_multi_period_tsam/README.md | 5 + .../data/elements/bus.csv | 5 + .../data/elements/dispatchable.csv | 4 + .../data/elements/link.csv | 3 + .../data/elements/load.csv | 3 + .../data/elements/storage.csv | 3 + .../data/elements/volatile.csv | 3 + .../data/periods/periods.csv | 13 + .../data/sequences/load_profile.csv | 4 + .../data/sequences/volatile_profile.csv | 4 + .../data/tsam/timeindex.csv | 9 + .../data/tsam/tsa_parameters.csv | 4 + .../datapackage.json | 528 ++++++++++++++++++ .../scripts/infer.py | 21 + .../tabular/examples/scripting/compute.py | 3 +- 15 files changed, 611 insertions(+), 1 deletion(-) create mode 100644 src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/README.md create mode 100644 src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/elements/bus.csv create mode 100644 src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/elements/dispatchable.csv create mode 100644 src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/elements/link.csv create mode 100644 src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/elements/load.csv create mode 100644 src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/elements/storage.csv create mode 100644 src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/elements/volatile.csv create mode 100644 src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/periods/periods.csv create mode 100644 src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/sequences/load_profile.csv create mode 100644 src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/sequences/volatile_profile.csv create mode 100644 src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/tsam/timeindex.csv create mode 100644 src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/tsam/tsa_parameters.csv create mode 100644 src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/datapackage.json create mode 100644 src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/scripts/infer.py diff --git a/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/README.md b/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/README.md new file mode 100644 index 00000000..be203d7c --- /dev/null +++ b/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/README.md @@ -0,0 +1,5 @@ +# Dispatch example for oemof-tabular + +Run `scripts/infer.py` from the datapackage root directory to add the +meta data file `datapackage.json` after updating the resources of the +datapackage. diff --git a/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/elements/bus.csv b/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/elements/bus.csv new file mode 100644 index 00000000..56beebcf --- /dev/null +++ b/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/elements/bus.csv @@ -0,0 +1,5 @@ +name;type;balanced +bus0;bus;true +bus1;bus;true +heat-bus;bus;false +gas-bus;bus;false diff --git a/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/elements/dispatchable.csv b/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/elements/dispatchable.csv new file mode 100644 index 00000000..bac86320 --- /dev/null +++ b/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/elements/dispatchable.csv @@ -0,0 +1,4 @@ +name;type;carrier;tech;capacity;bus;marginal_cost;profile;output_parameters +gas;dispatchable;gas;gt;100;bus1;40;1;{"full_load_time_max": 2000} +coal;dispatchable;coal;st;100;bus0;40;1;{} +lignite;dispatchable;lignite;st;50;bus0;20;1;{} diff --git a/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/elements/link.csv b/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/elements/link.csv new file mode 100644 index 00000000..0fb78032 --- /dev/null +++ b/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/elements/link.csv @@ -0,0 +1,3 @@ +name;type;capacity;capacity_cost;loss;from_bus;to_bus +conn1;link;100;10;0.05;bus0;bus1 +conn2;link;10;0;0.05;heat-bus;gas-bus diff --git a/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/elements/load.csv b/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/elements/load.csv new file mode 100644 index 00000000..5a3b43d3 --- /dev/null +++ b/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/elements/load.csv @@ -0,0 +1,3 @@ +name;amount;profile;type;bus +demand0;5000;electricity-load-profile;load;bus0 +demand1;1000;electricity-load-profile;load;bus1 diff --git a/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/elements/storage.csv b/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/elements/storage.csv new file mode 100644 index 00000000..d05c11eb --- /dev/null +++ b/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/elements/storage.csv @@ -0,0 +1,3 @@ +name,carrier,tech,storage_capacity,capacity,capacity_cost,storage_capacity_initial,type,bus +el-storage1,lithium,battery,100,10,10,0.5,storage,bus0 +el-storage2,lithium,battery,200,20,15,0.2,storage,bus0 diff --git a/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/elements/volatile.csv b/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/elements/volatile.csv new file mode 100644 index 00000000..8c5d3f1b --- /dev/null +++ b/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/elements/volatile.csv @@ -0,0 +1,3 @@ +name;type;carrier;tech;capacity;capacity_cost;bus;marginal_cost;profile;output_parameters +wind;volatile;wind;onshore;50;;bus0;0;wind-profile;{} +pv;volatile;solar;pv;20;;bus1;0;pv-profile;{} diff --git a/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/periods/periods.csv b/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/periods/periods.csv new file mode 100644 index 00000000..4f2ba2fd --- /dev/null +++ b/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/periods/periods.csv @@ -0,0 +1,13 @@ +timeindex;periods;timeincrement +2011-01-01T00:00:00Z;0;1 +2011-01-01T01:00:00Z;0;1 +2011-01-01T02:00:00Z;0;1 +2011-01-01T03:00:00Z;0;1 +2035-01-01T00:00:00Z;1;1 +2035-01-01T01:00:00Z;1;1 +2035-01-01T02:00:00Z;1;1 +2035-01-01T03:00:00Z;1;1 +2050-01-01T00:00:00Z;2;1 +2050-01-01T01:00:00Z;2;1 +2050-01-01T02:00:00Z;2;1 +2050-01-01T03:00:00Z;2;1 diff --git a/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/sequences/load_profile.csv b/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/sequences/load_profile.csv new file mode 100644 index 00000000..3e7b680e --- /dev/null +++ b/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/sequences/load_profile.csv @@ -0,0 +1,4 @@ +timeindex;electricity-load-profile +2011-01-01T00:00:00Z;0.000745659236 +2011-01-01T01:00:00Z;0.000709651546 +2011-01-01T02:00:00Z;0.00068564642 diff --git a/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/sequences/volatile_profile.csv b/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/sequences/volatile_profile.csv new file mode 100644 index 00000000..80d3212e --- /dev/null +++ b/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/sequences/volatile_profile.csv @@ -0,0 +1,4 @@ +timeindex;wind-profile;pv-profile +2011-01-01T00:00:00Z;0.147532;0 +2011-01-01T01:00:00Z;0.184181;0 +2011-01-01T02:00:00Z;0.223937;0 diff --git a/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/tsam/timeindex.csv b/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/tsam/timeindex.csv new file mode 100644 index 00000000..9451ef7f --- /dev/null +++ b/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/tsam/timeindex.csv @@ -0,0 +1,9 @@ +period_0;period_1;period_2 +2011-01-01T00:00:00Z;2035-01-01T00:00:00Z;2050-01-01T00:00:00Z +2011-01-01T01:00:00Z;2035-01-01T01:00:00Z;2050-01-01T01:00:00Z +2011-01-01T02:00:00Z;2035-01-01T02:00:00Z;2050-01-01T02:00:00Z +2011-01-01T03:00:00Z;2035-01-01T03:00:00Z;2050-01-01T03:00:00Z +2011-01-01T04:00:00Z;2035-01-01T04:00:00Z;2050-01-01T04:00:00Z +2011-01-01T05:00:00Z;2035-01-01T05:00:00Z;2050-01-01T05:00:00Z +2011-01-01T06:00:00Z;2035-01-01T06:00:00Z;2050-01-01T06:00:00Z +2011-01-01T07:00:00Z;2035-01-01T07:00:00Z;2050-01-01T07:00:00Z diff --git a/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/tsam/tsa_parameters.csv b/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/tsam/tsa_parameters.csv new file mode 100644 index 00000000..d4299c88 --- /dev/null +++ b/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/tsam/tsa_parameters.csv @@ -0,0 +1,4 @@ +period;timesteps_per_period; order +0; 2; [0, 1, 1, 0] +1; 2; [0, 1, 1, 1] +2; 2; [0, 0, 1, 2] diff --git a/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/datapackage.json b/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/datapackage.json new file mode 100644 index 00000000..c6e89014 --- /dev/null +++ b/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/datapackage.json @@ -0,0 +1,528 @@ +{ + "profile": "tabular-data-package", + "name": "oemof-tabular-dispatch-example", + "oemof_tabular_version": "0.0.5dev", + "resources": [ + { + "path": "data/elements/bus.csv", + "profile": "tabular-data-resource", + "name": "bus", + "format": "csv", + "mediatype": "text/csv", + "encoding": "utf-8", + "schema": { + "fields": [ + { + "name": "name", + "type": "string", + "format": "default" + }, + { + "name": "type", + "type": "string", + "format": "default" + }, + { + "name": "balanced", + "type": "boolean", + "format": "default" + } + ], + "missingValues": [ + "" + ], + "primaryKey": "name", + "foreignKeys": [] + } + }, + { + "path": "data/elements/dispatchable.csv", + "profile": "tabular-data-resource", + "name": "dispatchable", + "format": "csv", + "mediatype": "text/csv", + "encoding": "utf-8", + "schema": { + "fields": [ + { + "name": "name", + "type": "string", + "format": "default" + }, + { + "name": "type", + "type": "string", + "format": "default" + }, + { + "name": "carrier", + "type": "string", + "format": "default" + }, + { + "name": "tech", + "type": "string", + "format": "default" + }, + { + "name": "capacity", + "type": "integer", + "format": "default" + }, + { + "name": "bus", + "type": "string", + "format": "default" + }, + { + "name": "marginal_cost", + "type": "integer", + "format": "default" + }, + { + "name": "profile", + "type": "integer", + "format": "default" + }, + { + "name": "output_parameters", + "type": "object", + "format": "default" + } + ], + "missingValues": [ + "" + ], + "primaryKey": "name", + "foreignKeys": [ + { + "fields": "bus", + "reference": { + "resource": "bus", + "fields": "name" + } + } + ] + } + }, + { + "path": "data/elements/link.csv", + "profile": "tabular-data-resource", + "name": "link", + "format": "csv", + "mediatype": "text/csv", + "encoding": "utf-8", + "schema": { + "fields": [ + { + "name": "name", + "type": "string", + "format": "default" + }, + { + "name": "type", + "type": "string", + "format": "default" + }, + { + "name": "capacity", + "type": "integer", + "format": "default" + }, + { + "name": "capacity_cost", + "type": "integer", + "format": "default" + }, + { + "name": "loss", + "type": "number", + "format": "default" + }, + { + "name": "from_bus", + "type": "string", + "format": "default" + }, + { + "name": "to_bus", + "type": "string", + "format": "default" + } + ], + "missingValues": [ + "" + ], + "primaryKey": "name", + "foreignKeys": [ + { + "fields": "from_bus", + "reference": { + "resource": "bus", + "fields": "name" + } + }, + { + "fields": "to_bus", + "reference": { + "resource": "bus", + "fields": "name" + } + } + ] + } + }, + { + "path": "data/elements/load.csv", + "profile": "tabular-data-resource", + "name": "load", + "format": "csv", + "mediatype": "text/csv", + "encoding": "utf-8", + "schema": { + "fields": [ + { + "name": "name", + "type": "string", + "format": "default" + }, + { + "name": "amount", + "type": "integer", + "format": "default" + }, + { + "name": "profile", + "type": "string", + "format": "default" + }, + { + "name": "type", + "type": "string", + "format": "default" + }, + { + "name": "bus", + "type": "string", + "format": "default" + } + ], + "missingValues": [ + "" + ], + "primaryKey": "name", + "foreignKeys": [ + { + "fields": "bus", + "reference": { + "resource": "bus", + "fields": "name" + } + }, + { + "fields": "profile", + "reference": { + "resource": "load_profile" + } + } + ] + } + }, + { + "path": "data/elements/storage.csv", + "profile": "tabular-data-resource", + "name": "storage", + "format": "csv", + "mediatype": "text/csv", + "encoding": "utf-8", + "schema": { + "fields": [ + { + "name": "name", + "type": "string", + "format": "default" + }, + { + "name": "carrier", + "type": "string", + "format": "default" + }, + { + "name": "tech", + "type": "string", + "format": "default" + }, + { + "name": "storage_capacity", + "type": "integer", + "format": "default" + }, + { + "name": "capacity", + "type": "integer", + "format": "default" + }, + { + "name": "capacity_cost", + "type": "integer", + "format": "default" + }, + { + "name": "storage_capacity_initial", + "type": "number", + "format": "default" + }, + { + "name": "type", + "type": "string", + "format": "default" + }, + { + "name": "bus", + "type": "string", + "format": "default" + } + ], + "missingValues": [ + "" + ], + "primaryKey": "name", + "foreignKeys": [ + { + "fields": "bus", + "reference": { + "resource": "bus", + "fields": "name" + } + } + ] + } + }, + { + "path": "data/elements/volatile.csv", + "profile": "tabular-data-resource", + "name": "volatile", + "format": "csv", + "mediatype": "text/csv", + "encoding": "utf-8", + "schema": { + "fields": [ + { + "name": "name", + "type": "string", + "format": "default" + }, + { + "name": "type", + "type": "string", + "format": "default" + }, + { + "name": "carrier", + "type": "string", + "format": "default" + }, + { + "name": "tech", + "type": "string", + "format": "default" + }, + { + "name": "capacity", + "type": "integer", + "format": "default" + }, + { + "name": "capacity_cost", + "type": "string", + "format": "default" + }, + { + "name": "bus", + "type": "string", + "format": "default" + }, + { + "name": "marginal_cost", + "type": "integer", + "format": "default" + }, + { + "name": "profile", + "type": "string", + "format": "default" + }, + { + "name": "output_parameters", + "type": "object", + "format": "default" + } + ], + "missingValues": [ + "" + ], + "primaryKey": "name", + "foreignKeys": [ + { + "fields": "bus", + "reference": { + "resource": "bus", + "fields": "name" + } + }, + { + "fields": "profile", + "reference": { + "resource": "volatile_profile" + } + } + ] + } + }, + { + "path": "data/sequences/load_profile.csv", + "profile": "tabular-data-resource", + "name": "load_profile", + "format": "csv", + "mediatype": "text/csv", + "encoding": "utf-8", + "schema": { + "fields": [ + { + "name": "timeindex", + "type": "datetime", + "format": "default" + }, + { + "name": "electricity-load-profile", + "type": "number", + "format": "default" + } + ], + "missingValues": [ + "" + ] + } + }, + { + "path": "data/sequences/volatile_profile.csv", + "profile": "tabular-data-resource", + "name": "volatile_profile", + "format": "csv", + "mediatype": "text/csv", + "encoding": "utf-8", + "schema": { + "fields": [ + { + "name": "timeindex", + "type": "datetime", + "format": "default" + }, + { + "name": "wind-profile", + "type": "number", + "format": "default" + }, + { + "name": "pv-profile", + "type": "integer", + "format": "default" + } + ], + "missingValues": [ + "" + ] + } + }, + { + "path": "data/periods/periods.csv", + "profile": "tabular-data-resource", + "name": "periods", + "format": "csv", + "mediatype": "text/csv", + "encoding": "utf-8", + "schema": { + "fields": [ + { + "name": "timeindex", + "type": "datetime", + "format": "default" + }, + { + "name": "periods", + "type": "integer", + "format": "default" + }, + { + "name": "timeincrement", + "type": "integer", + "format": "default" + } + ], + "missingValues": [ + "" + ] + } + }, + { + "path": "data/tsam/timeindex.csv", + "profile": "tabular-data-resource", + "name": "timeindex", + "format": "csv", + "mediatype": "text/csv", + "encoding": "utf-8", + "schema": { + "fields": [ + { + "name": "period_0", + "type": "datetime", + "format": "default" + }, + { + "name": "period_1", + "type": "datetime", + "format": "default" + }, + { + "name": "period_2", + "type": "datetime", + "format": "default" + } + ], + "missingValues": [ + "" + ] + } + }, + { + "path": "data/tsam/tsa_parameters.csv", + "profile": "tabular-data-resource", + "name": "tsa_parameters", + "format": "csv", + "mediatype": "text/csv", + "encoding": "utf-8", + "schema": { + "fields": [ + { + "name": "period", + "type": "integer", + "format": "default" + }, + { + "name": "timesteps_per_period", + "type": "integer", + "format": "default" + }, + { + "name": "order", + "type": "array", + "format": "default" + } + ], + "missingValues": [ + "" + ] + } + } + ] +} diff --git a/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/scripts/infer.py b/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/scripts/infer.py new file mode 100644 index 00000000..f14f7f67 --- /dev/null +++ b/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/scripts/infer.py @@ -0,0 +1,21 @@ +""" +Run this script from the root directory of the datapackage to update +or create meta data. +""" +from oemof.tabular.datapackage import building + +# This part is for testing only: It allows to pass +# the filename of inferred metadata other than the default. +if "kwargs" not in locals(): + kwargs = {} + +building.infer_metadata( + package_name="oemof-tabular-dispatch-example", + foreign_keys={ + "bus": ["volatile", "dispatchable", "storage", "load"], + "profile": ["load", "volatile"], + "from_to_bus": ["link"], + "chp": [], + }, + **kwargs, +) diff --git a/src/oemof/tabular/examples/scripting/compute.py b/src/oemof/tabular/examples/scripting/compute.py index 09a737df..fa6477c6 100644 --- a/src/oemof/tabular/examples/scripting/compute.py +++ b/src/oemof/tabular/examples/scripting/compute.py @@ -12,8 +12,9 @@ from oemof.tabular.postprocessing import calculations examples = [ - "dispatch_multi_period", "dispatch", + "dispatch_multi_period", + "dispatch_multi_period_tsam", "investment", "investment_multi_period", "foreignkeys", From bb0a97a95638e2e05fbb90e84a00ec346b367a44 Mon Sep 17 00:00:00 2001 From: "Julian.Endres" Date: Mon, 4 Dec 2023 11:39:11 +0100 Subject: [PATCH 03/18] Remove timesteps from tsa_parameters TSA timesteps are now disaggregated internally from periods in oemof.solph --- src/oemof/tabular/datapackage/reading.py | 20 +++----------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/src/oemof/tabular/datapackage/reading.py b/src/oemof/tabular/datapackage/reading.py index c8856c97..6252ffc3 100644 --- a/src/oemof/tabular/datapackage/reading.py +++ b/src/oemof/tabular/datapackage/reading.py @@ -562,27 +562,13 @@ def create_yearly_values(values, years): package.get_resource("tsa_parameters").read(keyed=True) ).set_index("period", drop=True) - df_timeindex = pd.DataFrame.from_dict( - package.get_resource("timeindex").read(keyed=True) - ) - tsa_parameters = [] - for p, data in df_tsa_parameters.sort_index().iterrows(): - tsa_parameters.append( - { - "timesteps_per_period": data[ - "timesteps_per_period" - ], - "order": data["order"], - "timeindex": pd.to_datetime( - df_timeindex.loc[:, f"period_{p}"].values - ), - } - ) es = cls( timeindex=period_data["timeindex"], timeincrement=period_data["timeincrement"], periods=period_data["periods"], - tsa_parameters=tsa_parameters, + tsa_parameters=df_tsa_parameters.sort_index().to_dict( + "records" + ), infer_last_interval=False, ) else: From 268f9409a72d6145bfc68ab1f3c8db030af88d4f Mon Sep 17 00:00:00 2001 From: "Julian.Endres" Date: Mon, 4 Dec 2023 11:48:28 +0100 Subject: [PATCH 04/18] Adjust timeseries data for tsam example --- .../data/elements/volatile.csv | 2 +- .../data/sequences/load_profile.csv | 13 +++++++++++-- .../data/sequences/volatile_profile.csv | 9 +++++++++ .../dispatch_multi_period_tsam/datapackage.json | 2 +- 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/elements/volatile.csv b/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/elements/volatile.csv index 8c5d3f1b..f02ef097 100644 --- a/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/elements/volatile.csv +++ b/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/elements/volatile.csv @@ -1,3 +1,3 @@ name;type;carrier;tech;capacity;capacity_cost;bus;marginal_cost;profile;output_parameters wind;volatile;wind;onshore;50;;bus0;0;wind-profile;{} -pv;volatile;solar;pv;20;;bus1;0;pv-profile;{} +pv;volatile;solar;pv;50;;bus1;0;pv-profile;{} diff --git a/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/sequences/load_profile.csv b/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/sequences/load_profile.csv index 3e7b680e..b4171690 100644 --- a/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/sequences/load_profile.csv +++ b/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/sequences/load_profile.csv @@ -1,4 +1,13 @@ timeindex;electricity-load-profile -2011-01-01T00:00:00Z;0.000745659236 -2011-01-01T01:00:00Z;0.000709651546 +2011-01-01T00:00:00Z;0.00074565923 +2011-01-01T01:00:00Z;0.00070965154 2011-01-01T02:00:00Z;0.00068564642 +2011-01-01T03:00:00Z;0.00074565923 +2035-01-01T00:00:00Z;0.00074565923 +2035-01-01T01:00:00Z;0.00070965154 +2035-01-01T02:00:00Z;0.00068564642 +2035-01-01T03:00:00Z;0.00074565923 +2050-01-01T00:00:00Z;0.00074565923 +2050-01-01T01:00:00Z;0.00070965154 +2050-01-01T02:00:00Z;0.00068564642 +2050-01-01T03:00:00Z;0.00074565923 diff --git a/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/sequences/volatile_profile.csv b/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/sequences/volatile_profile.csv index 80d3212e..c7370c9a 100644 --- a/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/sequences/volatile_profile.csv +++ b/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/sequences/volatile_profile.csv @@ -2,3 +2,12 @@ timeindex;wind-profile;pv-profile 2011-01-01T00:00:00Z;0.147532;0 2011-01-01T01:00:00Z;0.184181;0 2011-01-01T02:00:00Z;0.223937;0 +2011-01-01T03:00:00Z;0.147532;0 +2035-01-01T00:00:00Z;0;0.147532 +2035-01-01T01:00:00Z;0;0.184181 +2035-01-01T02:00:00Z;0;0.223937 +2035-01-01T03:00:00Z;0;0.147532 +2050-01-01T00:00:00Z;0.147532;0 +2050-01-01T01:00:00Z;0.184181;0 +2050-01-01T02:00:00Z;0.223937;0 +2050-01-01T03:00:00Z;0.147532;0 diff --git a/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/datapackage.json b/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/datapackage.json index c6e89014..dfea05de 100644 --- a/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/datapackage.json +++ b/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/datapackage.json @@ -425,7 +425,7 @@ }, { "name": "pv-profile", - "type": "integer", + "type": "number", "format": "default" } ], From 8b16116024a91545468fcd02324abd4930f437f4 Mon Sep 17 00:00:00 2001 From: "Julian.Endres" Date: Mon, 4 Dec 2023 12:17:38 +0100 Subject: [PATCH 05/18] Remove timeindex.csv --- .../dispatch_multi_period_tsam/data/tsam/timeindex.csv | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/tsam/timeindex.csv diff --git a/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/tsam/timeindex.csv b/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/tsam/timeindex.csv deleted file mode 100644 index 9451ef7f..00000000 --- a/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/tsam/timeindex.csv +++ /dev/null @@ -1,9 +0,0 @@ -period_0;period_1;period_2 -2011-01-01T00:00:00Z;2035-01-01T00:00:00Z;2050-01-01T00:00:00Z -2011-01-01T01:00:00Z;2035-01-01T01:00:00Z;2050-01-01T01:00:00Z -2011-01-01T02:00:00Z;2035-01-01T02:00:00Z;2050-01-01T02:00:00Z -2011-01-01T03:00:00Z;2035-01-01T03:00:00Z;2050-01-01T03:00:00Z -2011-01-01T04:00:00Z;2035-01-01T04:00:00Z;2050-01-01T04:00:00Z -2011-01-01T05:00:00Z;2035-01-01T05:00:00Z;2050-01-01T05:00:00Z -2011-01-01T06:00:00Z;2035-01-01T06:00:00Z;2050-01-01T06:00:00Z -2011-01-01T07:00:00Z;2035-01-01T07:00:00Z;2050-01-01T07:00:00Z From 5fc423e119c97960cb840e9ae68c424f6460efaa Mon Sep 17 00:00:00 2001 From: "Julian.Endres" Date: Mon, 4 Dec 2023 12:19:48 +0100 Subject: [PATCH 06/18] Add changelog entry --- CHANGELOG.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 58456454..f26eb9c9 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -12,6 +12,8 @@ Features * Improve reading error message `#134 `_ * Remove facade relicts `#135 `_ +* Add tsam to datapackge `#141 `_ + Fixes From ae5f1595f67f9511bf7a421b490111823e906879 Mon Sep 17 00:00:00 2001 From: "Julian.Endres" Date: Mon, 4 Dec 2023 12:30:51 +0100 Subject: [PATCH 07/18] Remove timeindex.csv from datapackage.json --- .../datapackage.json | 30 ------------------- 1 file changed, 30 deletions(-) diff --git a/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/datapackage.json b/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/datapackage.json index dfea05de..7fdb636a 100644 --- a/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/datapackage.json +++ b/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/datapackage.json @@ -464,36 +464,6 @@ ] } }, - { - "path": "data/tsam/timeindex.csv", - "profile": "tabular-data-resource", - "name": "timeindex", - "format": "csv", - "mediatype": "text/csv", - "encoding": "utf-8", - "schema": { - "fields": [ - { - "name": "period_0", - "type": "datetime", - "format": "default" - }, - { - "name": "period_1", - "type": "datetime", - "format": "default" - }, - { - "name": "period_2", - "type": "datetime", - "format": "default" - } - ], - "missingValues": [ - "" - ] - } - }, { "path": "data/tsam/tsa_parameters.csv", "profile": "tabular-data-resource", From 21b01598f8ff6ed0959dbdce95d07874b8d8c41f Mon Sep 17 00:00:00 2001 From: "Julian.Endres" Date: Mon, 4 Dec 2023 12:35:00 +0100 Subject: [PATCH 08/18] Add tsam resource to infer_metadata --- src/oemof/tabular/datapackage/building.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/oemof/tabular/datapackage/building.py b/src/oemof/tabular/datapackage/building.py index 1302fe99..ab8e0bfe 100644 --- a/src/oemof/tabular/datapackage/building.py +++ b/src/oemof/tabular/datapackage/building.py @@ -231,6 +231,25 @@ def infer_metadata( ) p.add_resource(r.descriptor) + # create meta data resources tsam + if not os.path.exists("data/tsam"): + print( + "No periods path found in directory {}. Skipping...".format( + os.getcwd() + ) + ) + else: + for f in os.listdir("data/tsam"): + r = Resource( + {"path": str(pathlib.PurePosixPath("data", "tsam", f))} + ) + r.infer() + r.commit() + r.save( + pathlib.PurePosixPath("resources", f.replace(".csv", ".json")) + ) + p.add_resource(r.descriptor) + p.commit() p.save(metadata_filename) From 87afb284e48bb61d5196ae661edcae6f6c76f04e Mon Sep 17 00:00:00 2001 From: "Julian.Endres" Date: Mon, 11 Dec 2023 16:25:08 +0100 Subject: [PATCH 09/18] Add further exceptions for not converted periodic values --- src/oemof/tabular/datapackage/reading.py | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/oemof/tabular/datapackage/reading.py b/src/oemof/tabular/datapackage/reading.py index 6252ffc3..04df9cd7 100644 --- a/src/oemof/tabular/datapackage/reading.py +++ b/src/oemof/tabular/datapackage/reading.py @@ -474,9 +474,17 @@ def create_yearly_values(values, years): if period_data and isinstance(v, list): # check if length of list equals number of periods if len(v) == len(period_data["periods"]): - if f in ["capacity_costs"]: - # special period parameters don't need to be - # converted into timeseries + if f in [ + "capacity_costs", + "capacity_cost", + "capacity", + "capacity_potential", + "lifetime", + ]: + # special periodic parameters don't need to be + # converted into full length timeseries + # and can stay as lists but decimals should be + # converted to floats (why? @günni) facade[f] = [ float(vv) if isinstance(vv, Decimal) @@ -485,9 +493,10 @@ def create_yearly_values(values, years): ] continue elif f in ["fixed_costs"]: - # special period parameter need to be - # converted into timeseries with value for each - # year + # special periodic parameters need to be + # converted into timeseries with value for + # every year (implicit and explicit) + facade[f] = create_yearly_values( v, period_data["years"] ) @@ -502,7 +511,8 @@ def create_yearly_values(values, years): warnings.warn(msg, UserWarning) else: - # create timeseries with periodic values + # create full length timeseries with changing + # values for every period facade[f] = create_periodic_values( v, period_data["periods"] ) From 447546f0c05e144399ed256de5d77d3a35419496 Mon Sep 17 00:00:00 2001 From: "Julian.Endres" Date: Mon, 11 Dec 2023 16:35:56 +0100 Subject: [PATCH 10/18] Make lifetime parameter a constant value --- src/oemof/tabular/datapackage/reading.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/oemof/tabular/datapackage/reading.py b/src/oemof/tabular/datapackage/reading.py index 04df9cd7..ef51ef51 100644 --- a/src/oemof/tabular/datapackage/reading.py +++ b/src/oemof/tabular/datapackage/reading.py @@ -479,7 +479,6 @@ def create_yearly_values(values, years): "capacity_cost", "capacity", "capacity_potential", - "lifetime", ]: # special periodic parameters don't need to be # converted into full length timeseries @@ -509,7 +508,11 @@ def create_yearly_values(values, years): "aware, when using this feature!" ) warnings.warn(msg, UserWarning) - + continue + elif f in ["lifetime"]: + # parameter which needs to be a constant value + # fix to smallest value if list of values + facade[f] = min(v) else: # create full length timeseries with changing # values for every period From 32dc918b0aca9cc061b63c69d76a3fadd9da93a6 Mon Sep 17 00:00:00 2001 From: "Julian.Endres" Date: Mon, 11 Dec 2023 16:37:36 +0100 Subject: [PATCH 11/18] Raise error if length mismatches periods or index --- src/oemof/tabular/datapackage/reading.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/oemof/tabular/datapackage/reading.py b/src/oemof/tabular/datapackage/reading.py index ef51ef51..15d713ce 100644 --- a/src/oemof/tabular/datapackage/reading.py +++ b/src/oemof/tabular/datapackage/reading.py @@ -528,6 +528,18 @@ def create_yearly_values(values, years): " be aware, when using this feature!" ) warnings.warn(msg, UserWarning) + continue + elif len(v) == len(period_data["timeindex"]): + facade[f] = [ + float(vv) if isinstance(vv, Decimal) else vv + for vv in v + ] + continue + else: # pragma: no cover + raise ValueError( + "Length of list does not equal number of " + "periods or timeindex." + ) read_facade( facade, facades, From 1345f7b1e81314ac023c642036d2ab18f936dc07 Mon Sep 17 00:00:00 2001 From: FelixMau Date: Tue, 23 Jan 2024 12:47:10 +0100 Subject: [PATCH 12/18] tsam period order 2-0 --- .../data/tsam/tsa_parameters.csv | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/tsam/tsa_parameters.csv b/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/tsam/tsa_parameters.csv index d4299c88..4c5f146f 100644 --- a/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/tsam/tsa_parameters.csv +++ b/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/data/tsam/tsa_parameters.csv @@ -1,4 +1,4 @@ -period;timesteps_per_period; order -0; 2; [0, 1, 1, 0] -1; 2; [0, 1, 1, 1] -2; 2; [0, 0, 1, 2] +period;timesteps_per_period;order +0;2;[0, 1, 1, 0] +1;2;[0, 1, 1, 1] +2;2;[0, 0, 1, 0] From d84168bc5c486d1c47c08213709591303b00392a Mon Sep 17 00:00:00 2001 From: FelixMau Date: Tue, 23 Jan 2024 12:50:18 +0100 Subject: [PATCH 13/18] Solph dependency --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 5f59add4..0dd38c5d 100644 --- a/setup.py +++ b/setup.py @@ -68,7 +68,7 @@ def read(*names, **kwargs): "datapackage==1.5.1", "tableschema==1.7.4", # newer versions (v1.8.0 and up) fail! # "oemof.solph>=0.5.1", - "oemof.solph==0.5.2dev0", + "oemof.solph==0.5.2dev2", "pandas>=0.22", "paramiko", "toml", From cb8d0587f8979d427351a0d3379512cca8e63876 Mon Sep 17 00:00:00 2001 From: FelixMau Date: Tue, 23 Jan 2024 14:23:28 +0100 Subject: [PATCH 14/18] Sepcify oemof.solph and oemof.network --- setup.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 0dd38c5d..3a47b7e4 100644 --- a/setup.py +++ b/setup.py @@ -68,7 +68,8 @@ def read(*names, **kwargs): "datapackage==1.5.1", "tableschema==1.7.4", # newer versions (v1.8.0 and up) fail! # "oemof.solph>=0.5.1", - "oemof.solph==0.5.2dev2", + "oemof.solph @ git+https://github.com/oemof/oemof-solph.git@feature/integrate_tsam", + "oemof.network==0.5.0.a5", "pandas>=0.22", "paramiko", "toml", From 4bcbfb0789b8036e95bd7efe5350a4ef05d7df32 Mon Sep 17 00:00:00 2001 From: FelixMau Date: Tue, 23 Jan 2024 12:50:18 +0100 Subject: [PATCH 15/18] Solph dependency --- setup.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 5f59add4..ac12d4e1 100644 --- a/setup.py +++ b/setup.py @@ -68,7 +68,9 @@ def read(*names, **kwargs): "datapackage==1.5.1", "tableschema==1.7.4", # newer versions (v1.8.0 and up) fail! # "oemof.solph>=0.5.1", - "oemof.solph==0.5.2dev0", + # Fixing solph version. Might Upgrade later but depends on explicit arguments + "oemof.solph @ git+https://github.com/oemof/oemof-solph.git@feature/integrate_tsam", + "oemof.network==0.5.0.a5", "pandas>=0.22", "paramiko", "toml", From 11c432c0dd8b5a114d9a20adaa45af68814d3767 Mon Sep 17 00:00:00 2001 From: FelixMau Date: Wed, 7 Feb 2024 15:57:19 +0100 Subject: [PATCH 16/18] Linting --- .../datapackages/dispatch_multi_period_tsam/scripts/infer.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/scripts/infer.py b/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/scripts/infer.py index f14f7f67..f156383c 100644 --- a/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/scripts/infer.py +++ b/src/oemof/tabular/examples/datapackages/dispatch_multi_period_tsam/scripts/infer.py @@ -2,6 +2,7 @@ Run this script from the root directory of the datapackage to update or create meta data. """ + from oemof.tabular.datapackage import building # This part is for testing only: It allows to pass From 99681e4720791e6cec38beb3e3f3544ab68836a2 Mon Sep 17 00:00:00 2001 From: Hendrik Huyskens Date: Mon, 15 Apr 2024 16:49:24 +0200 Subject: [PATCH 17/18] Add option to set up TSAM Model without multi period mode --- src/oemof/tabular/datapackage/reading.py | 32 +- .../README.md | 5 + .../data/elements/bus.csv | 5 + .../data/elements/dispatchable.csv | 4 + .../data/elements/link.csv | 3 + .../data/elements/load.csv | 3 + .../data/elements/storage.csv | 3 + .../data/elements/volatile.csv | 3 + .../data/sequences/load_profile.csv | 13 + .../data/sequences/volatile_profile.csv | 13 + .../data/tsam/tsa_parameters.csv | 2 + .../datapackage.json | 468 ++++++++++++++++++ .../scripts/infer.py | 22 + 13 files changed, 557 insertions(+), 19 deletions(-) create mode 100644 src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/README.md create mode 100644 src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/data/elements/bus.csv create mode 100644 src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/data/elements/dispatchable.csv create mode 100644 src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/data/elements/link.csv create mode 100644 src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/data/elements/load.csv create mode 100644 src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/data/elements/storage.csv create mode 100644 src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/data/elements/volatile.csv create mode 100644 src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/data/sequences/load_profile.csv create mode 100644 src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/data/sequences/volatile_profile.csv create mode 100644 src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/data/tsam/tsa_parameters.csv create mode 100644 src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/datapackage.json create mode 100644 src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/scripts/infer.py diff --git a/src/oemof/tabular/datapackage/reading.py b/src/oemof/tabular/datapackage/reading.py index b7e130c1..884b830c 100644 --- a/src/oemof/tabular/datapackage/reading.py +++ b/src/oemof/tabular/datapackage/reading.py @@ -577,6 +577,17 @@ def unpack_sequences(facade, period_data): resource, ) + def get_tsam_parameters(): + """Extract TSAM parameters from pacakge if given.""" + if package.get_resource("tsa_parameters"): + df_tsa_parameters = pd.DataFrame.from_dict( + package.get_resource("tsa_parameters").read(keyed=True) + ).set_index("period", drop=True) + return df_tsa_parameters.sort_index().to_dict( + "records" + ) + return None + # TODO: Find concept how to deal with timeindices and clean up based on # concept lst = [idx for idx in timeindices.values()] @@ -597,35 +608,18 @@ def unpack_sequences(facade, period_data): name="timeindex", ) timeindex = temporal.index - es = cls(timeindex=timeindex, temporal=temporal) + es = cls(timeindex=timeindex, temporal=temporal, tsa_parameters=get_tsam_parameters()) # if no temporal provided as resource, take the first timeindex # from dict else: # look for periods resource and if present, take periods from it if package.get_resource("periods"): - # look for tsa_parameters resource and if present, get - # tsa_parameters from it - # currently only works for multi-period - if package.get_resource("tsa_parameters"): - df_tsa_parameters = pd.DataFrame.from_dict( - package.get_resource("tsa_parameters").read(keyed=True) - ).set_index("period", drop=True) - - es = cls( - timeindex=period_data["timeindex"], - timeincrement=period_data["timeincrement"], - periods=period_data["periods"], - tsa_parameters=df_tsa_parameters.sort_index().to_dict( - "records" - ), - infer_last_interval=False, - ) - else: es = cls( timeindex=period_data["timeindex"], timeincrement=period_data["timeincrement"], periods=period_data["periods"], + tsam_parameters=get_tsam_parameters(), infer_last_interval=False, ) diff --git a/src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/README.md b/src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/README.md new file mode 100644 index 00000000..be203d7c --- /dev/null +++ b/src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/README.md @@ -0,0 +1,5 @@ +# Dispatch example for oemof-tabular + +Run `scripts/infer.py` from the datapackage root directory to add the +meta data file `datapackage.json` after updating the resources of the +datapackage. diff --git a/src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/data/elements/bus.csv b/src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/data/elements/bus.csv new file mode 100644 index 00000000..56beebcf --- /dev/null +++ b/src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/data/elements/bus.csv @@ -0,0 +1,5 @@ +name;type;balanced +bus0;bus;true +bus1;bus;true +heat-bus;bus;false +gas-bus;bus;false diff --git a/src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/data/elements/dispatchable.csv b/src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/data/elements/dispatchable.csv new file mode 100644 index 00000000..bac86320 --- /dev/null +++ b/src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/data/elements/dispatchable.csv @@ -0,0 +1,4 @@ +name;type;carrier;tech;capacity;bus;marginal_cost;profile;output_parameters +gas;dispatchable;gas;gt;100;bus1;40;1;{"full_load_time_max": 2000} +coal;dispatchable;coal;st;100;bus0;40;1;{} +lignite;dispatchable;lignite;st;50;bus0;20;1;{} diff --git a/src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/data/elements/link.csv b/src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/data/elements/link.csv new file mode 100644 index 00000000..0fb78032 --- /dev/null +++ b/src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/data/elements/link.csv @@ -0,0 +1,3 @@ +name;type;capacity;capacity_cost;loss;from_bus;to_bus +conn1;link;100;10;0.05;bus0;bus1 +conn2;link;10;0;0.05;heat-bus;gas-bus diff --git a/src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/data/elements/load.csv b/src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/data/elements/load.csv new file mode 100644 index 00000000..5a3b43d3 --- /dev/null +++ b/src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/data/elements/load.csv @@ -0,0 +1,3 @@ +name;amount;profile;type;bus +demand0;5000;electricity-load-profile;load;bus0 +demand1;1000;electricity-load-profile;load;bus1 diff --git a/src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/data/elements/storage.csv b/src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/data/elements/storage.csv new file mode 100644 index 00000000..d05c11eb --- /dev/null +++ b/src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/data/elements/storage.csv @@ -0,0 +1,3 @@ +name,carrier,tech,storage_capacity,capacity,capacity_cost,storage_capacity_initial,type,bus +el-storage1,lithium,battery,100,10,10,0.5,storage,bus0 +el-storage2,lithium,battery,200,20,15,0.2,storage,bus0 diff --git a/src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/data/elements/volatile.csv b/src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/data/elements/volatile.csv new file mode 100644 index 00000000..f02ef097 --- /dev/null +++ b/src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/data/elements/volatile.csv @@ -0,0 +1,3 @@ +name;type;carrier;tech;capacity;capacity_cost;bus;marginal_cost;profile;output_parameters +wind;volatile;wind;onshore;50;;bus0;0;wind-profile;{} +pv;volatile;solar;pv;50;;bus1;0;pv-profile;{} diff --git a/src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/data/sequences/load_profile.csv b/src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/data/sequences/load_profile.csv new file mode 100644 index 00000000..b4171690 --- /dev/null +++ b/src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/data/sequences/load_profile.csv @@ -0,0 +1,13 @@ +timeindex;electricity-load-profile +2011-01-01T00:00:00Z;0.00074565923 +2011-01-01T01:00:00Z;0.00070965154 +2011-01-01T02:00:00Z;0.00068564642 +2011-01-01T03:00:00Z;0.00074565923 +2035-01-01T00:00:00Z;0.00074565923 +2035-01-01T01:00:00Z;0.00070965154 +2035-01-01T02:00:00Z;0.00068564642 +2035-01-01T03:00:00Z;0.00074565923 +2050-01-01T00:00:00Z;0.00074565923 +2050-01-01T01:00:00Z;0.00070965154 +2050-01-01T02:00:00Z;0.00068564642 +2050-01-01T03:00:00Z;0.00074565923 diff --git a/src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/data/sequences/volatile_profile.csv b/src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/data/sequences/volatile_profile.csv new file mode 100644 index 00000000..c7370c9a --- /dev/null +++ b/src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/data/sequences/volatile_profile.csv @@ -0,0 +1,13 @@ +timeindex;wind-profile;pv-profile +2011-01-01T00:00:00Z;0.147532;0 +2011-01-01T01:00:00Z;0.184181;0 +2011-01-01T02:00:00Z;0.223937;0 +2011-01-01T03:00:00Z;0.147532;0 +2035-01-01T00:00:00Z;0;0.147532 +2035-01-01T01:00:00Z;0;0.184181 +2035-01-01T02:00:00Z;0;0.223937 +2035-01-01T03:00:00Z;0;0.147532 +2050-01-01T00:00:00Z;0.147532;0 +2050-01-01T01:00:00Z;0.184181;0 +2050-01-01T02:00:00Z;0.223937;0 +2050-01-01T03:00:00Z;0.147532;0 diff --git a/src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/data/tsam/tsa_parameters.csv b/src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/data/tsam/tsa_parameters.csv new file mode 100644 index 00000000..fa82f6d1 --- /dev/null +++ b/src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/data/tsam/tsa_parameters.csv @@ -0,0 +1,2 @@ +period;timesteps_per_period;order +0;2;[0, 1, 1, 0] diff --git a/src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/datapackage.json b/src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/datapackage.json new file mode 100644 index 00000000..65058c78 --- /dev/null +++ b/src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/datapackage.json @@ -0,0 +1,468 @@ +{ + "profile": "tabular-data-package", + "name": "oemof-tabular-dispatch-example", + "oemof_tabular_version": "0.0.5dev", + "resources": [ + { + "path": "data/elements/bus.csv", + "profile": "tabular-data-resource", + "name": "bus", + "format": "csv", + "mediatype": "text/csv", + "encoding": "utf-8", + "schema": { + "fields": [ + { + "name": "name", + "type": "string", + "format": "default" + }, + { + "name": "type", + "type": "string", + "format": "default" + }, + { + "name": "balanced", + "type": "boolean", + "format": "default" + } + ], + "missingValues": [ + "" + ], + "primaryKey": "name", + "foreignKeys": [] + } + }, + { + "path": "data/elements/dispatchable.csv", + "profile": "tabular-data-resource", + "name": "dispatchable", + "format": "csv", + "mediatype": "text/csv", + "encoding": "utf-8", + "schema": { + "fields": [ + { + "name": "name", + "type": "string", + "format": "default" + }, + { + "name": "type", + "type": "string", + "format": "default" + }, + { + "name": "carrier", + "type": "string", + "format": "default" + }, + { + "name": "tech", + "type": "string", + "format": "default" + }, + { + "name": "capacity", + "type": "integer", + "format": "default" + }, + { + "name": "bus", + "type": "string", + "format": "default" + }, + { + "name": "marginal_cost", + "type": "integer", + "format": "default" + }, + { + "name": "profile", + "type": "integer", + "format": "default" + }, + { + "name": "output_parameters", + "type": "object", + "format": "default" + } + ], + "missingValues": [ + "" + ], + "primaryKey": "name", + "foreignKeys": [ + { + "fields": "bus", + "reference": { + "resource": "bus", + "fields": "name" + } + } + ] + } + }, + { + "path": "data/elements/link.csv", + "profile": "tabular-data-resource", + "name": "link", + "format": "csv", + "mediatype": "text/csv", + "encoding": "utf-8", + "schema": { + "fields": [ + { + "name": "name", + "type": "string", + "format": "default" + }, + { + "name": "type", + "type": "string", + "format": "default" + }, + { + "name": "capacity", + "type": "integer", + "format": "default" + }, + { + "name": "capacity_cost", + "type": "integer", + "format": "default" + }, + { + "name": "loss", + "type": "number", + "format": "default" + }, + { + "name": "from_bus", + "type": "string", + "format": "default" + }, + { + "name": "to_bus", + "type": "string", + "format": "default" + } + ], + "missingValues": [ + "" + ], + "primaryKey": "name", + "foreignKeys": [ + { + "fields": "from_bus", + "reference": { + "resource": "bus", + "fields": "name" + } + }, + { + "fields": "to_bus", + "reference": { + "resource": "bus", + "fields": "name" + } + } + ] + } + }, + { + "path": "data/elements/load.csv", + "profile": "tabular-data-resource", + "name": "load", + "format": "csv", + "mediatype": "text/csv", + "encoding": "utf-8", + "schema": { + "fields": [ + { + "name": "name", + "type": "string", + "format": "default" + }, + { + "name": "amount", + "type": "integer", + "format": "default" + }, + { + "name": "profile", + "type": "string", + "format": "default" + }, + { + "name": "type", + "type": "string", + "format": "default" + }, + { + "name": "bus", + "type": "string", + "format": "default" + } + ], + "missingValues": [ + "" + ], + "primaryKey": "name", + "foreignKeys": [ + { + "fields": "bus", + "reference": { + "resource": "bus", + "fields": "name" + } + }, + { + "fields": "profile", + "reference": { + "resource": "load_profile" + } + } + ] + } + }, + { + "path": "data/elements/storage.csv", + "profile": "tabular-data-resource", + "name": "storage", + "format": "csv", + "mediatype": "text/csv", + "encoding": "utf-8", + "schema": { + "fields": [ + { + "name": "name", + "type": "string", + "format": "default" + }, + { + "name": "carrier", + "type": "string", + "format": "default" + }, + { + "name": "tech", + "type": "string", + "format": "default" + }, + { + "name": "storage_capacity", + "type": "integer", + "format": "default" + }, + { + "name": "capacity", + "type": "integer", + "format": "default" + }, + { + "name": "capacity_cost", + "type": "integer", + "format": "default" + }, + { + "name": "storage_capacity_initial", + "type": "number", + "format": "default" + }, + { + "name": "type", + "type": "string", + "format": "default" + }, + { + "name": "bus", + "type": "string", + "format": "default" + } + ], + "missingValues": [ + "" + ], + "primaryKey": "name", + "foreignKeys": [ + { + "fields": "bus", + "reference": { + "resource": "bus", + "fields": "name" + } + } + ] + } + }, + { + "path": "data/elements/volatile.csv", + "profile": "tabular-data-resource", + "name": "volatile", + "format": "csv", + "mediatype": "text/csv", + "encoding": "utf-8", + "schema": { + "fields": [ + { + "name": "name", + "type": "string", + "format": "default" + }, + { + "name": "type", + "type": "string", + "format": "default" + }, + { + "name": "carrier", + "type": "string", + "format": "default" + }, + { + "name": "tech", + "type": "string", + "format": "default" + }, + { + "name": "capacity", + "type": "integer", + "format": "default" + }, + { + "name": "capacity_cost", + "type": "string", + "format": "default" + }, + { + "name": "bus", + "type": "string", + "format": "default" + }, + { + "name": "marginal_cost", + "type": "integer", + "format": "default" + }, + { + "name": "profile", + "type": "string", + "format": "default" + }, + { + "name": "output_parameters", + "type": "object", + "format": "default" + } + ], + "missingValues": [ + "" + ], + "primaryKey": "name", + "foreignKeys": [ + { + "fields": "bus", + "reference": { + "resource": "bus", + "fields": "name" + } + }, + { + "fields": "profile", + "reference": { + "resource": "volatile_profile" + } + } + ] + } + }, + { + "path": "data/sequences/load_profile.csv", + "profile": "tabular-data-resource", + "name": "load_profile", + "format": "csv", + "mediatype": "text/csv", + "encoding": "utf-8", + "schema": { + "fields": [ + { + "name": "timeindex", + "type": "datetime", + "format": "default" + }, + { + "name": "electricity-load-profile", + "type": "number", + "format": "default" + } + ], + "missingValues": [ + "" + ] + } + }, + { + "path": "data/sequences/volatile_profile.csv", + "profile": "tabular-data-resource", + "name": "volatile_profile", + "format": "csv", + "mediatype": "text/csv", + "encoding": "utf-8", + "schema": { + "fields": [ + { + "name": "timeindex", + "type": "datetime", + "format": "default" + }, + { + "name": "wind-profile", + "type": "number", + "format": "default" + }, + { + "name": "pv-profile", + "type": "number", + "format": "default" + } + ], + "missingValues": [ + "" + ] + } + }, + { + "path": "data/tsam/tsa_parameters.csv", + "profile": "tabular-data-resource", + "name": "tsa_parameters", + "format": "csv", + "mediatype": "text/csv", + "encoding": "utf-8", + "schema": { + "fields": [ + { + "name": "period", + "type": "integer", + "format": "default" + }, + { + "name": "timesteps_per_period", + "type": "integer", + "format": "default" + }, + { + "name": "order", + "type": "array", + "format": "default" + } + ], + "missingValues": [ + "" + ] + } + } + ] +} diff --git a/src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/scripts/infer.py b/src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/scripts/infer.py new file mode 100644 index 00000000..f156383c --- /dev/null +++ b/src/oemof/tabular/examples/datapackages/dispatch_tsam_without_multi_periods/scripts/infer.py @@ -0,0 +1,22 @@ +""" +Run this script from the root directory of the datapackage to update +or create meta data. +""" + +from oemof.tabular.datapackage import building + +# This part is for testing only: It allows to pass +# the filename of inferred metadata other than the default. +if "kwargs" not in locals(): + kwargs = {} + +building.infer_metadata( + package_name="oemof-tabular-dispatch-example", + foreign_keys={ + "bus": ["volatile", "dispatchable", "storage", "load"], + "profile": ["load", "volatile"], + "from_to_bus": ["link"], + "chp": [], + }, + **kwargs, +) From 8c9fcc0b74f63c2ba0d2ad7428dde54bc0d86e06 Mon Sep 17 00:00:00 2001 From: Hendrik Huyskens Date: Tue, 16 Apr 2024 13:00:24 +0200 Subject: [PATCH 18/18] Read TSAM parameters for all timeindex options --- src/oemof/tabular/datapackage/reading.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/oemof/tabular/datapackage/reading.py b/src/oemof/tabular/datapackage/reading.py index 884b830c..e851416f 100644 --- a/src/oemof/tabular/datapackage/reading.py +++ b/src/oemof/tabular/datapackage/reading.py @@ -630,7 +630,7 @@ def get_tsam_parameters(): idx.values, freq=idx.inferred_freq, name="timeindex" ) temporal = None - es = cls(timeindex=timeindex, temporal=temporal) + es = cls(timeindex=timeindex, temporal=temporal, tsa_parameters=get_tsam_parameters()) # if for any reason lst of datetimeindices is empty # (i.e. no sequences) have been provided, set datetime to one time # step of today (same as in the EnergySystem __init__ if no @@ -639,7 +639,7 @@ def get_tsam_parameters(): timeindex = pd.date_range( start=pd.to_datetime("today"), periods=1, freq="H" ) - es = cls(timeindex=timeindex) + es = cls(timeindex=timeindex, tsa_parameters=get_tsam_parameters()) es.add( *chain(