我有一个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}
"""
有没有更聪明或更有效的方法来做到这一点?那太好了!期待你的投入!
2条答案
按热度按时间bvhaajcl1#
这可以通过
run
指令实现:请注意,所有
snakemake
对象都可以直接通过input
、output
、params
等获得。zqry0prt2#
run
指令似乎是可行的方法。如果你知道在python中使用-c
参数来运行一个以字符串形式传递的脚本,你可能会很高兴。