diff --git a/core/src/config.jl b/core/src/config.jl index 1fc0012e2..7ea4ce0f4 100644 --- a/core/src/config.jl +++ b/core/src/config.jl @@ -119,7 +119,6 @@ end # Separate struct, as basin clashes with nodetype @option struct Results <: TableOption - outstate::Union{String, Nothing} = nothing compression::Bool = true compression_level::Int = 6 subgrid::Bool = false diff --git a/core/src/write.jl b/core/src/write.jl index 4ccc91312..91e2e2775 100644 --- a/core/src/write.jl +++ b/core/src/write.jl @@ -119,8 +119,8 @@ function basin_table( )::@NamedTuple{ time::Vector{DateTime}, node_id::Vector{Int32}, - storage::Vector{Float64}, level::Vector{Float64}, + storage::Vector{Float64}, inflow_rate::Vector{Float64}, outflow_rate::Vector{Float64}, storage_rate::Vector{Float64}, @@ -167,8 +167,8 @@ function basin_table( return (; time, node_id, - storage, level, + storage, inflow_rate, outflow_rate, storage_rate, diff --git a/core/test/docs.toml b/core/test/docs.toml index ac155cebf..12c336535 100644 --- a/core/test/docs.toml +++ b/core/test/docs.toml @@ -45,9 +45,9 @@ evaporate_mass = true # optional, default true to simulate a correct mass balan verbosity = "info" # optional, default "info", can otherwise be "debug", "warn" or "error" [results] -# These results files are always written -compression = true # optional, default true, using zstd compression +compression = true # optional, default true, using zstd compression compression_level = 6 # optional, default 6 +subgrid = false # optional, default false [experimental] # Experimental features, disabled by default diff --git a/core/test/run_models_test.jl b/core/test/run_models_test.jl index ce8593cef..6e791b79a 100644 --- a/core/test/run_models_test.jl +++ b/core/test/run_models_test.jl @@ -45,8 +45,8 @@ ( :time, :node_id, - :storage, :level, + :storage, :inflow_rate, :outflow_rate, :storage_rate, diff --git a/docs/reference/usage.qmd b/docs/reference/usage.qmd index 2ea46dab7..d9f24c625 100644 --- a/docs/reference/usage.qmd +++ b/docs/reference/usage.qmd @@ -230,8 +230,8 @@ column | type | unit -------------- | ---------| ---- time | DateTime | - node_id | Int32 | - -storage | Float64 | $\text{m}^3$ level | Float64 | $\text{m}$ +storage | Float64 | $\text{m}^3$ inflow_rate | Float64 | $\text{m}^3/\text{s}$ outflow_rate | Float64 | $\text{m}^3/\text{s}$ storage_rate | Float64 | $\text{m}^3/\text{s}$ diff --git a/python/ribasim/ribasim/config.py b/python/ribasim/ribasim/config.py index 49060b2b9..30d4f17d6 100644 --- a/python/ribasim/ribasim/config.py +++ b/python/ribasim/ribasim/config.py @@ -72,7 +72,6 @@ class Allocation(ChildModel): class Results(ChildModel): - outstate: str | None = None compression: bool = True compression_level: int = 6 subgrid: bool = False diff --git a/python/ribasim/ribasim/input_base.py b/python/ribasim/ribasim/input_base.py index c6613c908..48e0e03fd 100644 --- a/python/ribasim/ribasim/input_base.py +++ b/python/ribasim/ribasim/input_base.py @@ -217,7 +217,6 @@ def _check_dataframe(cls, value: Any) -> Any: # Enable initialization with a DataFrame. if isinstance(value, pd.DataFrame | gpd.GeoDataFrame): - value.index.rename("fid", inplace=True) value = {"df": value} return value @@ -386,7 +385,6 @@ def _from_db(cls, path: Path, table: str): # tell pyarrow to map to pd.ArrowDtype rather than NumPy arrow_to_pandas_kwargs={"types_mapper": pd.ArrowDtype}, ) - df.index.rename(cls.tableschema()._index_name(), inplace=True) else: df = None diff --git a/python/ribasim/ribasim/schemas.py b/python/ribasim/ribasim/schemas.py index b80a5d466..e910b22a0 100644 --- a/python/ribasim/ribasim/schemas.py +++ b/python/ribasim/ribasim/schemas.py @@ -20,6 +20,11 @@ class Config: def _index_name(self) -> str: return "fid" + @pa.dataframe_parser + def _name_index(cls, df): + df.index.name = cls._index_name() + return df + @classmethod def migrate(cls, df: Any, schema_version: int) -> Any: f: Callable[[Any, Any], Any] = getattr( diff --git a/python/ribasim/tests/test_io.py b/python/ribasim/tests/test_io.py index 0320dca87..7c2dcf7b7 100644 --- a/python/ribasim/tests/test_io.py +++ b/python/ribasim/tests/test_io.py @@ -97,6 +97,11 @@ def test_extra_columns(): def test_index_tables(): p = pump.Static(flow_rate=[1.2]) assert p.df.index.name == "fid" + # Index name is applied by _name_index + df = p.df.reset_index(drop=True) + assert df.index.name is None + p.df = df + assert p.df.index.name == "fid" def test_extra_spatial_columns(): diff --git a/python/ribasim/tests/test_model.py b/python/ribasim/tests/test_model.py index f5e341561..9336b5275 100644 --- a/python/ribasim/tests/test_model.py +++ b/python/ribasim/tests/test_model.py @@ -112,6 +112,12 @@ def test_write_adds_fid_in_tables(basic, tmp_path): assert model_orig.edge.df.index.name == "edge_id" assert model_orig.edge.df.index.equals(pd.RangeIndex(1, nrow + 1)) + # Index name is applied by _name_index + df = model_orig.edge.df.copy() + df.index.name = "other" + model_orig.edge.df = df + assert model_orig.edge.df.index.name == "edge_id" + model_orig.write(tmp_path / "basic/ribasim.toml") with connect(tmp_path / "basic/database.gpkg") as connection: query = f"select * from {esc_id('Basin / profile')}" diff --git a/utils/templates/schemas.py.jinja b/utils/templates/schemas.py.jinja index 19b53c7ce..d986e4dc0 100644 --- a/utils/templates/schemas.py.jinja +++ b/utils/templates/schemas.py.jinja @@ -19,6 +19,11 @@ class _BaseSchema(pa.DataFrameModel): def _index_name(self) -> str: return "fid" + @pa.dataframe_parser + def _name_index(cls, df): + df.index.name = cls._index_name() + return df + @classmethod def migrate(cls, df: Any, schema_version: int) -> Any: f: Callable[[Any, Any], Any] = getattr(