我有一个具有定义的列结构的大型数据集,我为其构建了一个脚本/管道,通常执行以下操作:首先,摄取数据(格式化、清理等),其次,它转换值并创建一个新列这些新的转换值(最终结果)或多或少像这样:
我的脚本分为两个文件(每个文件约 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)
我知道这个问题很广泛,但我认为常见的做法和代码本身一样重要。在学术界(我的背景),这并不重要,因为没有“生产”方面。那么,一般来说,在代码/结构方面构建数据管道的推荐行业方式是什么?
根据我的经验,使用较小的函数更有利于维护,因为错误代码更容易遵循较少的抽象级别(这是拥有 2 个大函数所无法做到的)。
我个人的建议:
添加尽可能多的评论。函数上方、变量名称上方、函数调用下方等...
对命名结构进行描述。calculate_mean_of_columns例如,而不是calc_mean_cols。尽可能避免使用缩写(甚至是 DS 社区中的标准缩写),例如df或cols。
老实说,我会以不同的方式构建我的文件夹。我的典型管道具有如下一致的结构:
/project
/code
code_to_transform_dataframe.py
/data
datetimestamp_filename.csv
/output
datetimestamp_output.csv
Run Code Online (Sandbox Code Playgroud)您可以将其用作您自己的用例的框架,但这是我在几家不同公司所做的工作。
| 归档时间: |
|
| 查看次数: |
1388 次 |
| 最近记录: |