pandas 直接在snakemake上运行简短的python代码

kdfy810k  于 2023-02-14  发布在  Python
关注(0)|答案(2)|浏览(123)

我有一个snakemake管道,我需要在其中执行一个处理数据的小步骤(将滚动平均值应用到 Dataframe )。
我想这样写:

rule average_df:
    input:
        # script = ,
        df_raw = "{sample}_raw.csv"
    params:
        window = 83
    output:
        df_avg = "{sample}_avg.csv"
    shell:
        """
        python
        import pandas as pd
        df=pd.read_csv("{input.df_raw}")
        df=df.rolling(window={params.window}, center=True, min_periods=1).mean()
        df.to_csv("{output.df_avg}")
        """

然而,它不起作用。
我必须用这4行代码创建一个python文件吗?我想到的替代方案有点麻烦。
平均值_df. py

import pandas as pd

def average_df(i_path, o_path, window):

        df=pd.read_csv(path)
        df=df.rolling(window=window, center=True, min_periods=1).mean()
        df.to_csv(o_path)

        return None

if __name__ == "__main__":
    import argparse

    parser = argparse.ArgumentParser(description='Description of your program')
    parser.add_argument('-i_path', '--input_path', help='csv file', required=True)
    parser.add_argument('-o_path', '--output_path', help='csv file ', required=True)
    parser.add_argument('-w', '--window', help='window for averaging', required=True)

    args = vars(parser.parse_args())

    i_path = args['input_path']
    o_path = args['output_path']
    window = args['window']

    average_df(i_path, o_path, window)

然后有这样的造蛇规则:

rule average_df:
    input:
        script = average_df.py,
        df_raw = "{sample}_raw.csv"
    params:
        window = 83
    output:
        df_avg = "{sample}_avg.csv"
    shell:
        """
        python average_df.py --input_path {input.df_raw} --ouput_path {output.df_avg} -window {params.window}
        """

有没有更聪明或更有效的方法来做到这一点?那太好了!期待你的投入!

bvhaajcl

bvhaajcl1#

这可以通过run指令实现:

rule average_df:
    input:
        # script = ,
        df_raw = "{sample}_raw.csv"
    params:
        window = 83
    output:
        df_avg = "{sample}_avg.csv"
    run:
        import pandas as pd
        df=pd.read_csv(input.df_raw)
        df=df.rolling(window=params.window, center=True, min_periods=1).mean()
        df.to_csv(output.df_avg)

请注意,所有snakemake对象都可以直接通过inputoutputparams等获得。

zqry0prt

zqry0prt2#

run指令似乎是可行的方法。如果你知道在python中使用-c参数来运行一个以字符串形式传递的脚本,你可能会很高兴。

shell:
        r"""
python -c '
import pandas as pd
df=pd.read_csv("{input.df_raw}")
etc etc...
'
        """

相关问题