Skip to content

Commit 20c9665

Browse files
Feature/add polars input (#511)
* feat: add polars series for constant input * add another test * update doc --------- Co-authored-by: Fabian Hofmann <[email protected]>
1 parent ede540f commit 20c9665

File tree

7 files changed

+26
-7
lines changed

7 files changed

+26
-7
lines changed

doc/release_notes.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ Upcoming Version
99
* Improved constraint equality check in `linopy.testing.assert_conequal` to less strict optionally
1010
* Minor bugfix for multiplying variables with numpy type constants
1111
* Harmonize dtypes before concatenation in lp file writing to avoid dtype mismatch errors. This error occurred when creating and storing models in netcdf format using windows machines and loading and solving them on linux machines.
12+
* Add option to use polars series as constant input
1213
* Fix expression merge to explicitly use outer join when combining expressions with disjoint coordinates for consistent behavior across xarray versions
1314

1415
Version 0.5.6

linopy/common.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,8 @@ def as_dataarray(
254254
arr = pandas_to_dataarray(arr, coords=coords, dims=dims, **kwargs)
255255
elif isinstance(arr, np.ndarray):
256256
arr = numpy_to_dataarray(arr, coords=coords, dims=dims, **kwargs)
257+
elif isinstance(arr, pl.Series):
258+
arr = numpy_to_dataarray(arr.to_numpy(), coords=coords, dims=dims, **kwargs)
257259
elif isinstance(arr, np.number):
258260
arr = DataArray(float(arr), coords=coords, dims=dims, **kwargs)
259261
elif isinstance(arr, int | float | str | bool | list):
@@ -269,6 +271,7 @@ def as_dataarray(
269271
pd.DataFrame,
270272
np.ndarray,
271273
DataArray,
274+
pl.Series,
272275
]
273276
supported_types_str = ", ".join([t.__name__ for t in supported_types])
274277
raise TypeError(

linopy/expressions.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@
9898
pd.Series,
9999
pd.DataFrame,
100100
np.ndarray,
101+
pl.Series,
101102
)
102103

103104

linopy/types.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from typing import TYPE_CHECKING, Union
66

77
import numpy
8-
import numpy.typing
8+
import polars as pl
99
from pandas import DataFrame, Index, Series
1010
from xarray import DataArray
1111
from xarray.core.coordinates import DataArrayCoordinates, DatasetCoordinates
@@ -37,6 +37,7 @@
3737
DataArray,
3838
Series,
3939
DataFrame,
40+
pl.Series,
4041
]
4142
SignLike = Union[str, numpy.ndarray, DataArray, Series, DataFrame] # noqa: UP007
4243
VariableLike = Union["ScalarVariable", "Variable"]

linopy/variables.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -287,12 +287,7 @@ def to_pandas(self) -> pd.Series:
287287

288288
def to_linexpr(
289289
self,
290-
coefficient: int
291-
| float
292-
| pd.Series
293-
| pd.DataFrame
294-
| np.ndarray
295-
| DataArray = 1,
290+
coefficient: ConstantLike = 1,
296291
) -> expressions.LinearExpression:
297292
"""
298293
Create a linear expression from the variables.

test/test_common.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import numpy as np
99
import pandas as pd
10+
import polars as pl
1011
import pytest
1112
import xarray as xr
1213
from test_linear_expression import m, u, x # noqa: F401
@@ -120,6 +121,16 @@ def test_as_dataarray_with_series_aligned_coords() -> None:
120121
assert list(da.coords[target_dim].values) == target_index
121122

122123

124+
def test_as_dataarray_with_pl_series_dims_default() -> None:
125+
target_dim = "dim_0"
126+
target_index = [0, 1, 2]
127+
s = pl.Series([1, 2, 3])
128+
da = as_dataarray(s)
129+
assert isinstance(da, DataArray)
130+
assert da.dims == (target_dim,)
131+
assert list(da.coords[target_dim].values) == target_index
132+
133+
123134
def test_as_dataarray_dataframe_dims_default() -> None:
124135
target_dims = ("dim_0", "dim_1")
125136
target_index = [0, 1]

test/test_linear_expression.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,13 @@ def test_linexpr_from_constant_dataarray(m: Model) -> None:
111111
assert expr.nterm == 0
112112

113113

114+
def test_linexpr_from_constant_pl_series(m: Model) -> None:
115+
const = pl.Series([1, 2])
116+
expr = LinearExpression(const, m)
117+
assert (expr.const == const.to_numpy()).all()
118+
assert expr.nterm == 0
119+
120+
114121
def test_linexpr_from_constant_pandas_series(m: Model) -> None:
115122
const = pd.Series([1, 2], index=pd.RangeIndex(2, name="dim_0"))
116123
expr = LinearExpression(const, m)

0 commit comments

Comments
 (0)