Skip to content

Commit 0f94f75

Browse files
authored
Merge pull request #11 from EnergieID/develop
Convert NaN to None in TimeSeries Models
2 parents a1fafd7 + 8934a0e commit 0f94f75

File tree

2 files changed

+19
-7
lines changed

2 files changed

+19
-7
lines changed

openenergyid/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"""Open Energy ID Python SDK."""
22

3-
__version__ = "0.1.14"
3+
__version__ = "0.1.15"
44

55
from .enums import Granularity
66
from .models import TimeDataFrame, TimeSeries

openenergyid/models.py

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from typing import Self
77

88
import pandas as pd
9-
from pydantic import BaseModel
9+
from pydantic import BaseModel, field_validator
1010

1111

1212
class TimeSeriesBase(BaseModel):
@@ -47,7 +47,7 @@ def from_json(cls, string: str, **kwargs) -> Self:
4747

4848
@overload
4949
@classmethod
50-
def from_json(cls, path: str, **kwargs) -> Self:
50+
def from_json(cls, *, path: str, **kwargs) -> Self:
5151
"""Load from a JSON file."""
5252

5353
@classmethod
@@ -66,12 +66,18 @@ class TimeSeries(TimeSeriesBase):
6666
"""Time series data with a single column."""
6767

6868
name: str | None = None
69-
data: list[float]
69+
data: list[float | None]
70+
71+
@field_validator("data")
72+
@classmethod
73+
def replace_nan_with_none(cls, data: list[float]) -> list[float | None]:
74+
"""Replace NaN values with None."""
75+
return [None if pd.isna(value) else value for value in data]
7076

7177
@classmethod
7278
def from_pandas(cls, data: pd.Series) -> Self:
7379
"""Create from a Pandas Series."""
74-
return cls.model_construct(name=data.name, data=data.tolist(), index=data.index.tolist())
80+
return cls(name=str(data.name), data=data.tolist(), index=data.index.tolist())
7581

7682
def to_pandas(self, timezone: str = "UTC") -> pd.Series:
7783
"""Convert to a Pandas Series."""
@@ -84,12 +90,18 @@ class TimeDataFrame(TimeSeriesBase):
8490
"""Time series data with multiple columns."""
8591

8692
columns: list[str]
87-
data: list[list[float]]
93+
data: list[list[float | None]]
94+
95+
@field_validator("data")
96+
@classmethod
97+
def replace_nan_with_none(cls, data: list[list[float]]) -> list[list[float | None]]:
98+
"""Replace NaN values with None."""
99+
return [[None if pd.isna(value) else value for value in row] for row in data]
88100

89101
@classmethod
90102
def from_pandas(cls, data: pd.DataFrame) -> Self:
91103
"""Create from a Pandas DataFrame."""
92-
return cls.model_construct(
104+
return cls(
93105
columns=data.columns.tolist(), data=data.values.tolist(), index=data.index.tolist()
94106
)
95107

0 commit comments

Comments
 (0)