Уменьшение дублирования кода/выражений при использовании Polars `with_columns`?

Рассмотрим пример кода Polars:

df.with_columns(
    pl.date_ranges(
        pl.col("current_start"), pl.col("current_end"), "1mo", closed = "left"
    ).alias("current_tpoints")
).drop("current_start", "current_end").with_columns(
    pl.date_ranges(
        pl.col("history_start"), pl.col("history_end"), "1mo", closed = "left"
    ).alias("history_tpoints")
).drop(
    "history_start", "history_end"
)

Ключевой проблемой, на которую следует обратить внимание, является повторяемость history_* и current_*. Я мог бы уменьшить дублирование, выполнив следующее:

for x in ["history", "current"]:
    fstring = f"{x}" + "_{other}"
    start = fstring.format(other = "start")
    end = fstring.format(other = "end")
    df = df.with_columns(
        pl.date_ranges(
            pl.col(start),
            pl.col(end),
            "1mo",
            closed = "left",
        ).alias(fstring.format(other = "tpoints"))
    ).drop(start, end)

Но есть ли другие способы уменьшить дублирование, которые мне следует рассмотреть?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
76
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Поскольку кажется, что вам не нужны исходные столбцы, вы можете использовать select() вместо with_columns(), так что drop() столбцы вам не нужны.

И вы можете перебирать имена столбцов внутри select()/with_columns():

df.select(
    pl.date_ranges(
        pl.col(f"{c}_start"), pl.col(f"{c}_end"), "1mo", closed = "left"
    ).alias(f"{c}_tpoints") for c in ["current", "history"]
)

Чтобы объяснить, почему это работает:

Согласно документации, оба метода select() и with_columns() могут *exprs: IntoExpr | Iterable[IntoExpr], что означает переменное количество аргументов. Видите ли, это может быть либо несколько выражений, либо несколько списков выражений.

Это именно то, что мы можем сделать с помощью понимания списка, мы просто создаем список выражений.

[
    pl.date_ranges(
        pl.col(f"{c}_start"), pl.col(f"{c}_end"), "1mo", closed = "left"
    ).alias(f"{c}_tpoints") for c in ["current", "history"]
]

[<Expr ['col("current_start").date_rang…'] at 0x206D93030E0>,
 <Expr ['col("history_start").date_rang…'] at 0x206D8F85520>]

Который мы затем можем передать в полярный метод. Обратите внимание, что в окончательном ответе у меня не было квадратных скобок. Это потому, что нам на самом деле не нужен список выражений, нам просто нужен итерируемый объект (в данном случае — генератор).

Ой! Можете ли вы указать мне какую-нибудь документацию о том, почему выражение цикла работает? Интерпретируется ли это как выражение на стороне Python (например, аналогично тому, что происходит в map_elements, или оно интерпретируется как выражение на стороне Polars/Rust?

bzm3r 08.07.2024 19:08

Я добавил несколько комментариев, надеюсь, это поможет. По сути, мы используем понимание списка Python для создания списка выражений, который затем передаем в метод поляров.

Roman Pekar 08.07.2024 19:23

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