У меня есть временные метки просмотра продукта, и я хочу удалить дубликаты, возникающие в течение первых десяти минут после предыдущей неповторяющейся временной метки (это может быть связано с тем, что пользователь обновляет страницу). Я также хочу сохранить метаданные, связанные с каждым продуктом.
Чтобы быть предельно ясным: если определенный продукт сначала просматривается в момент времени = 25 минут, а затем снова в момент времени = 30 минут, то второй экземпляр считается дубликатом и должен быть удален. Если существует еще одно представление того же продукта в момент времени = 26 минут, то это новое представление происходит более чем через десять минут после предыдущего неповторяющегося представления, и поэтому его следует сохранить.
В приведенных выше необработанных данных первая строка не является дубликатом, поскольку в течение 10 минут до нее нет меток времени с product_id = 1 (до нее вообще нет строк). Называя их теперь по метаданным, строка b дублируется, поскольку она встречается в течение 10 минут после a. c — это новый Product_id, а не дубликат. d повторяется и находится в пределах 10 минут после a. e не является дубликатом, поскольку прошло более 10 минут после a. f не является дубликатом, поскольку прошло более 10 минут после e. g является дубликатом, поскольку он находится менее чем через 10 минут после f, который является предыдущим недубликатом.
Я рассматривал возможность группировки по Product_id, но тогда я не уверен, как правильно удалить записи для Product_id == 1 на первой и второй минутах в приведенном ниже примере.
Я также рассматривал возможность использования чего-то вроде:
У меня есть временные метки просмотра продукта, и я хочу удалить дубликаты, возникающие в течение первых десяти минут после предыдущей неповторяющейся временной метки (это может быть связано с тем, что пользователь обновляет страницу). Я также хочу сохранить метаданные, связанные с каждым продуктом. Чтобы быть предельно ясным: если определенный продукт сначала просматривается в момент времени = 25 минут, а затем снова в момент времени = 30 минут, то второй экземпляр считается дубликатом и должен быть удален. Если существует еще одно представление того же продукта в момент времени = 26 минут, то это новое представление происходит более чем через десять минут после предыдущего неповторяющегося представления, и поэтому его следует сохранить. [code]from datetime import datetime import polars as pl
df_desirable = pl.DataFrame( { "created_time": [ datetime(2023, 1, 1, 0, 0), datetime(2023, 1, 1, 0, 2), datetime(2023, 1, 1, 0, 11), datetime(2023, 1, 1, 0, 29), ], "product_id": [1, 2, 1, 1], "metadata":["a", "c", "e", "f"] } ) [/code] Необработанные данные [code]print(df) shape: (7, 3) ┌─────────────────────┬────────────┬──────────┐ │ created_time ┆ product_id ┆ metadata │ │ --- ┆ --- ┆ --- │ │ datetime[μs] ┆ i64 ┆ str │ ╞═════════════════════╪════════════╪══════════╡ │ 2023-01-01 00:00:00 ┆ 1 ┆ a │ │ 2023-01-01 00:01:00 ┆ 1 ┆ b │ │ 2023-01-01 00:02:00 ┆ 2 ┆ c │ │ 2023-01-01 00:03:00 ┆ 1 ┆ d │ │ 2023-01-01 00:11:00 ┆ 1 ┆ e │ │ 2023-01-01 00:29:00 ┆ 1 ┆ f │ │ 2023-01-01 00:31:00 ┆ 1 ┆ g │ └─────────────────────┴────────────┴──────────┘ [/code] Желаемый результат [code]print(df_desirable) shape: (4, 3) ┌─────────────────────┬────────────┬──────────┐ │ created_time ┆ product_id ┆ metadata │ │ --- ┆ --- ┆ --- │ │ datetime[μs] ┆ i64 ┆ str │ ╞═════════════════════╪════════════╪══════════╡ │ 2023-01-01 00:00:00 ┆ 1 ┆ a │ │ 2023-01-01 00:02:00 ┆ 2 ┆ c │ │ 2023-01-01 00:11:00 ┆ 1 ┆ e │ │ 2023-01-01 00:29:00 ┆ 1 ┆ f │ └─────────────────────┴────────────┴──────────┘ [/code] В приведенных выше необработанных данных первая строка не является дубликатом, поскольку в течение 10 минут до нее нет меток времени с product_id = 1 (до нее вообще нет строк). Называя их теперь по метаданным, строка b дублируется, поскольку она встречается в течение 10 минут после a. c — это новый Product_id, а не дубликат. d повторяется и находится в пределах 10 минут после a. e не является дубликатом, поскольку прошло более 10 минут после a. f не является дубликатом, поскольку прошло более 10 минут после e. g является дубликатом, поскольку он находится менее чем через 10 минут после f, который является предыдущим недубликатом. Я рассматривал возможность группировки по Product_id, но тогда я не уверен, как правильно удалить записи для Product_id == 1 на первой и второй минутах в приведенном ниже примере. Я также рассматривал возможность использования чего-то вроде: [code]from datetime import timedelta df.group_by_dynamic("created_time", every=timedelta(minutes=10)) [/code] но я тоже не знаю, как правильно удалить строки. Может ли кто-нибудь помочь?