如何创建保留数据类型的空Pandas DataFrame模板?
问题修复方案
原代码报错的核心原因:empty方法中使用self()尝试创建新实例,但self是已实例化的对象,而非类本身,会触发TypeError: 'OpenOrder' object is not callable错误。
以下是三种可行的修改方案:
方案1:直接使用类名创建实例
修改empty方法中实例化的代码,用类名OpenOrder替代self:
import pandas as pd import datetime from dataclasses import dataclass @dataclass class OpenOrder: symbol: str = "Dummy" secType: str = "STK" dt: datetime.datetime = datetime.datetime.now() price: float = 0.0 status: str = None def empty(self): open_ord = OpenOrder() # 改用类名创建实例 empty_df = pd.DataFrame([open_ord.__dict__]) return empty_df.iloc[0:0]
调用方式保持不变:
open_order = OpenOrder() order_df = open_order.empty()
方案2:转为类方法(更推荐)
将empty定义为类方法,无需先实例化类即可生成空模板,更符合场景逻辑:
import pandas as pd import datetime from dataclasses import dataclass @dataclass class OpenOrder: symbol: str = "Dummy" secType: str = "STK" dt: datetime.datetime = datetime.datetime.now() price: float = 0.0 status: str = None @classmethod def empty(cls): open_ord = cls() # 用cls指代当前类,避免硬编码类名 empty_df = pd.DataFrame([open_ord.__dict__]) return empty_df.iloc[0:0]
调用时直接通过类调用:
order_df = OpenOrder.empty()
方案3:直接从dataclass字段构建(更高效)
无需创建实例,直接提取dataclass的字段类型构建空DataFrame,性能更优:
import pandas as pd import datetime from dataclasses import dataclass, fields @dataclass class OpenOrder: symbol: str = "Dummy" secType: str = "STK" dt: datetime.datetime = datetime.datetime.now() price: float = 0.0 status: str = None @classmethod def empty(cls): # 提取所有字段的类型映射 dtype_map = {field.name: field.type for field in fields(cls)} return pd.DataFrame([], dtype=dtype_map)
调用方式同方案2,最终生成的空DataFrame会严格保留每个字段的原始数据类型。
内容的提问来源于stack exchange,提问作者reservoirinvest
相关产品推荐
相关产品推荐

