如何构建Python数据预处理管道的代码(用于生产)

Kai*_*sar 5 python pandas

我有一个具有定义的列结构的大型数据集,我为其构建了一个脚本/管道,通常执行以下操作:首先,摄取数据(格式化、清理等),其次,它转换值并创建一个新列这些新的转换值(最终结果)或多或少像这样:

  1. 将csv导入pandas框架,填充nans,清理某些列中的一些值,同质化文本、名称等。 1.1。创建一个新列(清理名称)
  2. 通过在字典中查找、进行分组等来转换/转换另一列中的值。 2.2 创建 1 个新列(转换后的值)

我的脚本分为两个文件(每个文件约 150 行代码),由许多方法组成:.where, .replace, .map, .apply, .etc. 鉴于 pandas 允许方法链接并且非常灵活,因此可以在不定义任何函数(除了一些 for )的情况下处理数据集df.apply(func)。我的代码将 csv 获取到 df 中,并自然地开始使用上述方法对其进行处理,.where, .replace, .map, .apply, .etc而不使用任何函数或.pipeline方法。我的项目树如下所示:

/project
    table.csv
    ingest.py (outputs a clean intermediate_table.csv)
    transform.py (reads previous table.csv and outputs a final_table.csv)
    final_table.csv
Run Code Online (Sandbox Code Playgroud)

问题是,我需要将此代码发送给其他将在更多数据集中运行我的脚本的人,因此我需要对其进行评论和测试。鉴于上述情况,这是我在代码结构方面的问题。

  • 我应该为上述每个步骤都有一个函数吗?
  • 如果是的话,粒度是多少?

例如,我应该有如下所示的多个功能吗?:

df = pd.read_csv('file.csv')

def uppercase_column_A(dataframe, col) 
def clean_column(dataframe, col) 
def calculate_mean_here(dataframe, col)
def transform_values_there(dataframe, col)

df
.pipe(uppercase_column_A)
.pipe(clean_column)
.pipe(calculate_mean_here)
.pipe(transform_values_there)
.pipe(etc)
)

Run Code Online (Sandbox Code Playgroud)

或者,也许只是两个大功能?

df = pd.read_csv('file.csv')
def ingest(df): returns intermediate_df
def transform(intermediate_df)

df
.pipe(ingest)
.pipe(transform)
Run Code Online (Sandbox Code Playgroud)
  • 我真的需要使用 .pipe 吗?根本不
  • 我应该使用类吗?分成模块?

我知道这个问题很广泛,但我认为常见的做法和代码本身一样重要。在学术界(我的背景),这并不重要,因为没有“生产”方面。那么,一般来说,在代码/结构方面构建数据管道的推荐行业方式是什么?

zer*_*ero 2

根据我的经验,使用较小的函数更有利于维护,因为错误代码更容易遵循较少的抽象级别(这是拥有 2 个大函数所无法做到的)。

我个人的建议:

  1. 添加尽可能多的评论。函数上方、变量名称上方、函数调用下方等...

  2. 对命名结构进行描述。calculate_mean_of_columns例如,而不是calc_mean_cols。尽可能避免使用缩写(甚至是 DS 社区中的标准缩写),例如dfcols

  3. 老实说,我会以不同的方式构建我的文件夹。我的典型管道具有如下一致的结构:

    /project
        /code
             code_to_transform_dataframe.py
        /data
             datetimestamp_filename.csv
        /output
             datetimestamp_output.csv
    
    Run Code Online (Sandbox Code Playgroud)

您可以将其用作您自己的用例的框架,但这是我在几家不同公司所做的工作。