Описание:
Я использовал SQL-подобное дополнение в запросах Polars DataFrame для лучшей читаемости и упрощения комментирования условий. Этот подход предполагает использование True
(аналог 1=1
в SQL) для дополнения условной логики.
В SQL дополнение с помощью 1=1
позволяет легко добавлять или удалять условия:
SELECT *
FROM employees
WHERE 1=1
AND department = 'Sales'
AND salary > 50000
AND hire_date > '2020-01-01';
SELECT *
FROM employees
WHERE 1=1
AND department = 'Sales'
-- AND salary > 50000
AND hire_date > '2020-01-01';
(>>>> по моему мнению <<<<) Это упрощает добавление, удаление и замену операторов. Также это упрощает git diff, поскольку добавление и удаление условий отображается как один diff.
Вот эквивалент Polars, который я использовал:
# Example data
data = {
"name": ["Alice", "Bob", "Charlie", "David"],
"department": ["Sales", "HR", "Sales", "IT"],
"salary": [60000, 45000, 70000, 50000],
"hire_date": ["2021-06-01", "2019-03-15", "2020-08-20", "2018-11-05"]
}
# Create a DataFrame
df = pl.DataFrame(data)
# Filter with padding
filtered_df = df.filter(
(
True
& pl.col("department").eq("Sales")
# & pl.col("salary").gt(50000)
& pl.col("hire_date").gt("2020-01-01")
& True
)
)
print(filtered_df)
Меня беспокоит потенциальное влияние этого подхода на производительность в Polars. Влияет ли заполнение условий фильтра True
на производительность выполнения запросов в Polars? И есть ли лучший способ сделать это?
Спасибо вам за вашу помощь.
Лично для SQL я переключился на «и в конце строки», потому что считаю, что так гораздо читабельнее. Это усложняет комментирование последней строки, но мне просто не нравится фиктивное условие 1=1.
К счастью, в современной библиотеке фреймов данных, такой как поляры, вам больше не нужно этого делать. Просто передайте несколько условий фильтра вместо одного.
filtered_df = df.filter(
pl.col("department").eq("Sales"),
# pl.col("salary").gt(50000),
pl.col("hire_date").gt("2020-01-01"),
)
Да, я думаю, ты прав. «Может быть», это старая привычка, которую мне нужно оставить позади. Я чувствую себя глупо, не проверяя, принимает ли фильтр *args. Спасибо !