在课堂上构建一系列df操作的更好方法

时间:2018-06-04 12:09:17

标签: python pandas oop dataframe functional-programming

如何在类中更好地构建代码,以便您的类返回您想要的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()

1 个答案:

答案 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提供了灵活且适应性强的解决方案。例如,您可以定义任意数量的合成,并在工作流程的不同位置选择性地或重复地应用它们。