我以这样的方式编写了一个类,它需要一个float
或None
。然而,事实证明,也存在float('nan')
值的可能性。我正在寻找一个干净的方法来解决它
from typing import Optional
from dataclasses import dataclass
@dataclass
class PricingLimits:
min_price : Optional[float] = None
min_percent : Optional[float] = None
max_percent : Optional[float] = None
min_delta : Optional[float] = None
到目前为止,我看到两种可能性:
None
,只期待float
。使用float('nan')
而不是None
李>nan
(not inf
)。我不知道该怎么做,但如果我做了:@dataclass
class PricingLimits:
min_price : Optional[NumberFloat] = None
min_percent : Optional[NumberFloat] = None
max_percent : Optional[NumberFloat] = None
min_delta : Optional[NumberFloat] = None
# And use a validator like Pydantic
好的,我也可以这样做:
from pydantic import root_validator
from pydantic.dataclasses import dataclass
import numpy as np
@dataclass
class PricingLimits:
min_price : Optional[float] = None
min_percent : Optional[float] = None
max_percent : Optional[float] = None
min_delta : Optional[float] = None
@root_validator
def nan_to_none(cls, values):
for k, v in values.items():
if np.isnan(v):
values[k] = None
return values
这样,在对象实例化时,所有nan
值都将自动转换为None
你对此有什么看法
如果您想使用numpy或pandas进行数学运算,最好将
NaN
值保留为np.nan
,因此我会做相反的事情,我会将None
替换为np.nan
使用
np.nan
(超过None
)的主要原因是它可以与numpy的float64 dtype
一起存储,而不是使用效率较低的object dtype
np.nan
允许向量化操作,而None
根据定义,禁用numpy中的所有效率另一个很好的原因是
NaN
被用作熊猫中缺失数据的占位符:pandas docs如果您的目标是拥有一个值或
None
(这就是有人会使用Optional[x]
的原因),并且值仅在实例化时设置,那么将np.nan
转换为None
是正确的方法:如果希望在实例化后自由更改值,可以使用属性,但这会影响性能:
相关问题 更多 >
编程相关推荐