Эффективное обозначение праздников в столбце данных

Я пытаюсь добавить столбец, в котором указывается, является ли дата праздником или нет. Я нашел код в Интернете, но считаю, что есть более эффективный способ сделать это, возможно, используя полярный метод вместо элементов карты и лямбда-выражений.

Пример кода:

import polars as pl
import holidays

# Initialize the holidays for Chile
cl_holidays = holidays.CL()

# Sample data
data = {
    "Date": ["2024-06-20 00:00:00", "2024-06-21 00:00:00", "2024-06-22 00:00:00", "2024-06-23 00:00:00", "2024-06-24 00:00:00"],
    "Amount": [100, 200, 300, 400, 500],
    "User_Count" : [1, 2, 3, 4, 5]
}

# Create DataFrame
df = pl.DataFrame(data)

# Add a new column 'Is_Holiday' based on the Date column
df = df.with_columns(
    (pl.col("Date").map_elements(lambda x: x.split(" ")[0] in cl_holidays, return_dtype=pl.Boolean)).alias("Is_Holiday")
).with_columns(pl.col("Date").str.strptime(pl.Datetime))

df

Ожидаемый результат:

shape: (5, 4)
┌─────────────────────┬────────┬────────────┬────────────┐
│ Date                ┆ Amount ┆ User_Count ┆ Is_Holiday │
│ ---                 ┆ ---    ┆ ---        ┆ ---        │
│ datetime[μs]        ┆ i64    ┆ i64        ┆ bool       │
╞═════════════════════╪════════╪════════════╪════════════╡
│ 2024-06-20 00:00:00 ┆ 100    ┆ 1          ┆ true       │
│ 2024-06-21 00:00:00 ┆ 200    ┆ 2          ┆ false      │
│ 2024-06-22 00:00:00 ┆ 300    ┆ 3          ┆ false      │
│ 2024-06-23 00:00:00 ┆ 400    ┆ 4          ┆ false      │
│ 2024-06-24 00:00:00 ┆ 500    ┆ 5          ┆ false      │
└─────────────────────┴────────┴────────────┴────────────┘

ОБНОВЛЕНИЕ: я попробовал использовать подход @ignoring_gradity, а также попытался изменить формат даты, но все равно получаю false вместо true

ОБНОВЛЕНИЕ 2: Если я попробую подход @Hericks, я продолжаю получать ложные сведения. (Я использую поляры 0.20.31)

import polars as pl
import holidays

# Initialize the holidays for Chile
cl_holidays = holidays.CL()

# Sample data
data = {
    "Date": ["2024-06-20 00:00:00", "2024-06-21 00:00:00", "2024-06-22 00:00:00", "2024-06-23 00:00:00", "2024-06-24 00:00:00"],
    "Amount": [100, 200, 300, 400, 500],
    "User_Count" : [1, 2, 3, 4, 5]
}

# Create DataFrame
df = pl.DataFrame(data)

# Add a new column 'Is_Holiday' based on the Date column
df.with_columns(
    Is_Holiday=pl.col('Date').str.to_datetime().dt.date().is_in(cl_holidays.keys())
)

Выход:

shape: (5, 4)
┌─────────────────────┬────────┬────────────┬────────────┐
│ Date                ┆ Amount ┆ User_Count ┆ Is_Holiday │
│ ---                 ┆ ---    ┆ ---        ┆ ---        │
│ str                 ┆ i64    ┆ i64        ┆ bool       │
╞═════════════════════╪════════╪════════════╪════════════╡
│ 2024-06-20 00:00:00 ┆ 100    ┆ 1          ┆ false      │
│ 2024-06-21 00:00:00 ┆ 200    ┆ 2          ┆ false      │
│ 2024-06-22 00:00:00 ┆ 300    ┆ 3          ┆ false      │
│ 2024-06-23 00:00:00 ┆ 400    ┆ 4          ┆ false      │
│ 2024-06-24 00:00:00 ┆ 500    ┆ 5          ┆ false      │
└─────────────────────┴────────┴────────────┴────────────┘

Какую версию поляра вы используете? Для меня бег df.with_columns(pl.col("Date").str.to_datetime().dt.date().i‌​s_in(cl_holidays.key‌​s()).alias("IsHolida‌​y"))df = pl.DataFrame(data)) тоже работает.

Hericks 24.06.2024 15:44

Привет @Hericks! Я использую поляры 0.20.22. Я также пробовал в Google Collab, и там тоже получаю ложь

Simon 24.06.2024 16:38

Я просто обновляюсь до 0.20.31 и повторно запускаю код с вашим. Но я продолжаю получать тот же результат

Simon 24.06.2024 16:40
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
5
3
127
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Выражения — это все, что вам нужно

df.with_columns(
    Is_Holiday=pl.col('Date').str.to_datetime().dt.date().is_in(cl_holidays.keys())
)
shape: (5, 4)
┌─────────────────────┬────────┬────────────┬────────────┐
│ Date                ┆ Amount ┆ User_Count ┆ Is_Holiday │
│ ---                 ┆ ---    ┆ ---        ┆ ---        │
│ str                 ┆ i64    ┆ i64        ┆ bool       │
╞═════════════════════╪════════╪════════════╪════════════╡
│ 2024-06-20 00:00:00 ┆ 100    ┆ 1          ┆ true       │
│ 2024-06-21 00:00:00 ┆ 200    ┆ 2          ┆ false      │
│ 2024-06-22 00:00:00 ┆ 300    ┆ 3          ┆ false      │
│ 2024-06-23 00:00:00 ┆ 400    ┆ 4          ┆ false      │
│ 2024-06-24 00:00:00 ┆ 500    ┆ 5          ┆ false      │
└─────────────────────┴────────┴────────────┴────────────┘

Привет! @ignoring_gradity я только что заменил свой with_columns на твой, но вместо истинного получаю ложное значение

Simon 24.06.2024 02:36
Ответ принят как подходящий

Проведя небольшое исследование, я обнаружил, что мне нужно потратить годы на мой конструктор Holidays.CL.

import polars as pl
import holidays

# Initialize the holidays for Chile
cl_holidays = holidays.CL()

# Sample data
data = {
    "Date": ["2024-06-20 00:00:00", "2024-06-21 00:00:00", "2024-06-22 00:00:00", "2024-06-23 00:00:00", "2024-06-24 00:00:00"],
    "Amount": [100, 200, 300, 400, 500],
    "User_Count" : [1, 2, 3, 4, 5]
}

# Create DataFrame
df = pl.DataFrame(data)

# Add a new column 'Is_Holiday' based on the Date column
df.with_columns(
    pl.col("Date").str.to_date(format = "%Y-%m-%d %H:%M:%S")
).with_columns(
    pl.col("Date").is_in(list(holidays.CL(years=[2024]).keys())).alias("holiday")
)

Выход :

shape: (5, 4)
┌────────────┬────────┬────────────┬─────────┐
│ Date       ┆ Amount ┆ User_Count ┆ holiday │
│ ---        ┆ ---    ┆ ---        ┆ ---     │
│ date       ┆ i64    ┆ i64        ┆ bool    │
╞════════════╪════════╪════════════╪═════════╡
│ 2024-06-20 ┆ 100    ┆ 1          ┆ true    │
│ 2024-06-21 ┆ 200    ┆ 2          ┆ false   │
│ 2024-06-22 ┆ 300    ┆ 3          ┆ false   │
│ 2024-06-23 ┆ 400    ┆ 4          ┆ false   │
│ 2024-06-24 ┆ 500    ┆ 5          ┆ false   │
└────────────┴────────┴────────────┴─────────┘

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