Запустите короткий код Python прямо на змейке

У меня есть конвейер змеи, где мне нужно сделать небольшой шаг обработки данных (применив скользящее среднее значение к кадру данных).

Я хотел бы написать что-то вроде этого:

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}")
        """

Однако это не работает.

Должен ли я создавать файл Python с этими 4 строками кода? Альтернатива, которая приходит мне в голову, немного громоздка. Это было бы

Среднее_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}
        """

Есть ли более умный или более эффективный способ сделать это? Это было бы прекрасно! Ждем ваших отзывов!

Используйте run: вместо shell: см.: snakemake.readthedocs.io/en/stable/snakefiles/…

Alex 14.02.2023 11:20
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
Потяните за рычаг выброса энергососущих проектов
Потяните за рычаг выброса энергососущих проектов
На этой неделе моя команда отменила проект, над которым я работал. Неделя усилий пошла насмарку.
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Привет, люди RPA, это снова я и я несу подарки! В очередном моем приключении о том, как создавать ботов для облегчения рутины. Вот, думаю, стоит...
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
3
1
55
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Этого можно добиться с помощью директивы 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 доступны напрямую через input, output, params и т. д.

Большое спасибо, это то, что я искал! Что вы имеете в виду под прямой доступностью? Или в чем разница между input.df_raw и {input.df_raw}?

Ulises Rey 14.02.2023 11:21

Синтаксис фигурных скобок используется при замене значений в директиве shell, но в директиве run вы можете напрямую вызывать соответствующий объект/шаблон. Таким образом, в run вы бы назвали input.df_raw, а не "{input.df_raw}" (который будет использоваться в shell).

SultanOrazbayev 14.02.2023 11:23

Я понимаю. Итак, в вашем ответе params.window также будет без {}, верно? Спасибо!

Ulises Rey 14.02.2023 11:24

Вы правы, я исправил код.

SultanOrazbayev 14.02.2023 11:26

Директива run кажется подходящей. Возможно, полезно знать, что вы можете сделать то же самое, используя аргумент -c в python для запуска скрипта, переданного в виде строки. Например.:

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

Другие вопросы по теме