【问题标题】:Functional python design with dataclasses, pandas and inheritance具有数据类、熊猫和继承的功能性 Python 设计
【发布时间】:2022-11-03 14:51:16
【问题描述】:

我以“广泛”的功能方式编写了一个 python 应用程序,使用冻结的数据类作为函数的输入和输出。这些数据类通常包含一个数据框,也许还有另一个属性,例如:

@dataclass(frozen=True)
class TimeSeries:
    log: pd.DataFrame
    sourceName: str

我现在有更多可能的数据对象,它们遵循“as-a”继承结构。因此,TimeSeries 的 DataFrame 可能只有 TimeA 的列,ExtendedTimeSeries 有一个包含这些列的列,还有一个 B 列,依此类推。我现在有 4 个不同的 TimeSeries,它们在 OO 范式中会落入一个层次结构中。

什么是最好的结构?

我可以使用(OO 风格)组合而不是继承,并且让 ExtendedTimeSeries 数据结构包含一个 TimeSeries 对象和一个独立的温度系列,但这似乎并不高效(必须在执行 df 操作之前合并)或安全(可能不匹配的行数)。

如果没有 DataFrame,这种组合方法似乎可以正常工作。有什么好的设计技巧吗?

我可以有一系列相互继承的数据类,但它们将具有完全相同的变量(在上面的示例中logsourceName),我不确定这是可能的/明智的。

【问题讨论】:

    标签: python


    【解决方案1】:

    在这种情况下,我将使用src_type 属性区分这些情况,然后可以使用该属性来识别数据类型。此 src_type 可以在 __post_init__ 方法中自动确定,然后用于功能评估。

    from enum import Enum
    from dataclasses import dataclass
    
    import pandas as pd
    
    
    # predefined source types for easier discrimination
    class SrcType(Enum):
        STANDARD = 0
        EXTENDED = 1
    
    
    @dataclass(frozen=True)
    class TimeSeries:
        log: pd.DataFrame
        src_name: str
        src_type: SrcType = None
    
        def __post_init__(self):
            # criteria for various source types
            if 'B' in self.log.columns:
                src_type = SrcType.EXTENDED
            else:
                src_type = SrcType.STANDARD
            # bypassing the frozen attribute
            object.__setattr__(self, 'src_type', src_type)
    
    
    series = TimeSeries(pd.DataFrame(), "my_src")
    print(series.src_type)  # <- STANDARD
    series = TimeSeries(pd.DataFrame({'B': [0]}), "my_src")
    print(series.src_type)  # <- EXTENDED
    

    【讨论】:

      猜你喜欢
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-23
      • 2022-06-28
      • 2017-10-14
      • 1970-01-01
      相关资源
      最近更新 更多