【问题标题】:DataClass remove inf valsDataClass 删除 inf 值
【发布时间】:2021-11-08 17:10:09
【问题描述】:

我有一个数据类

from dataclasses import dataclass

@dataclass
class ModelResult:
    scorecard_calcs: dict

然后在Model类中使用这个

import pandas as pd
import numpy as np

class Model:
    def predict(self, input):
        scorecard_calcs = pd.DataFrame([{'val':np.inf}, {'val':-np.inf}]).to_dict()
        return ModelResult(scorecard_calcs=scorecard_calcs)

这将在其他地方转换为 json,但 inf 不是有效的 json。

如何更改 ModelResult 数据类,使其自动将所有 inf 值替换为有效 json 的 1.7976931348623157e+308

【问题讨论】:

  • 创建scorecard_calcs时不要使用inf?
  • 嗯,这实际上是正确的值,我只是根据 json 约定来更改它,因此我认为在 ModelResult 中更改它会更聪明,然后将其传递出去,但也许这更聪明方式...(这是一个简化版本,计分卡calcs中的值是计算出来的)
  • 这是有道理的。您应该调整“其他地方这将被转换为 json”代码。但是,如何完成转换很重要,因为如果您使用 json 模块,例如,您可以传递一个处理 inf 的自定义编码器。
  • 我运行代码并通过调用predict 得到ModelResult(scorecard_calcs={'val': {0: inf, 1: -inf}})。这不正是你所期待的吗?
  • 如果您想在__init__之后更改任何内容,可以使用__post_init__

标签: python json python-dataclasses


【解决方案1】:

这是我按照@balderman 的建议使用__post_init__ 的方法

from dataclasses import dataclass
import numpy as np

ALMOST_INF = 1.7976931348623157e308

@dataclass
class ModelResult:
    scorecard_calcs: dict
    pd: float

    @staticmethod
    def replace_inf(val):
        if not isinstance(val, (int, float, complex)):
            return val

        if np.isposinf(val):
            return ALMOST_INF

        if np.isneginf(val):
            return -ALMOST_INF

        return val

    def __post_init__(self):
        self.pd = self.replace_inf(self.pd)

        scorecard_calcs = pd.DataFrame(self.scorecard_calcs)
        scorecard_calcs = scorecard_calcs.applymap(self.replace_inf)
        self.scorecard_calcs = scorecard_calcs.to_dict()

这行得通,因为我知道 scorecard_calcs 是一个字典,它以前是熊猫数据框。

【讨论】:

    猜你喜欢
    • 2018-01-26
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    • 1970-01-01
    • 2016-08-15
    • 2017-01-09
    相关资源
    最近更新 更多