66from typing import Self
77
88import pandas as pd
9- from pydantic import BaseModel
9+ from pydantic import BaseModel , field_validator
1010
1111
1212class 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