如何在类中更好地构建代码,以便您的类返回您想要的df
,但是您没有调用其他许多其他方法的main方法方法按顺序排列。我发现在很多情况下我都会遇到这种结构并且看起来很糟糕。我有一个df
,我只是用其他基本函数(我单元测试)的结果覆盖它,直到我得到我想要的东西。
class A:
def main(self):
df = self.load_file_into_df()
df = self.add_x_columns(df)
df = self.calculate_y(df)
df = self.calculate_consequence(df)
...
return df
def add_x_columns(df)
def calculate_y(df)
def calculate_consequence(df)
...
# now use it somewhere else
df = A().main()
答案 0 :(得分:2)
您可能希望使用的一项功能是pd.DataFrame.pipe
。这被认为是“可扩展的”,因为它有助于操作员链接。
在我看来,您应该将读取数据与操作数据帧的数据帧分开。例如:
class A:
def main(self):
df = self.load_file_into_df()
df = df.pipe(self.add_x_columns)\
.pipe(self.calculate_y)\
.pipe(self.calculate_consequence)
return df
函数组合不是Python的原生,但第三方toolz
库确实提供了此功能。这允许您懒洋洋地定义链接函数。注意颠倒的操作顺序,即首先执行compose
的最后一个参数。
from toolz import compose
class A:
def main(self)
df = self.load_file_into_df()
transformer = compose(self.calculate_consequence,
self.calculate_y,
self.add_x_columns)
df = df.pipe(transformer)
return df
在我看来,compose
提供了灵活且适应性强的解决方案。例如,您可以定义任意数量的合成,并在工作流程的不同位置选择性地或重复地应用它们。