Удаление дубликатов, возникающих в пределах временной разницыPython

Программы на Python
Ответить
Anonymous
 Удаление дубликатов, возникающих в пределах временной разницы

Сообщение Anonymous »

У меня есть временные метки просмотра продукта, и я хочу удалить дубликаты, возникающие в течение первых десяти минут после предыдущей неповторяющейся временной метки (это может быть связано с тем, что пользователь обновляет страницу). Я также хочу сохранить метаданные, связанные с каждым продуктом.
Чтобы быть предельно ясным: если определенный продукт сначала просматривается в момент времени = 25 минут, а затем снова в момент времени = 30 минут, то второй экземпляр считается дубликатом и должен быть удален. Если существует еще одно представление того же продукта в момент времени = 26 минут, то это новое представление происходит более чем через десять минут после предыдущего неповторяющегося представления, и поэтому его следует сохранить.

Код: Выделить всё

from datetime import datetime
import polars as pl

df = pl.DataFrame(
{
"created_time": [
datetime(2023, 1, 1, 0, 0),
datetime(2023, 1, 1, 0, 1),
datetime(2023, 1, 1, 0, 2),
datetime(2023, 1, 1, 0, 3),
datetime(2023, 1, 1, 0, 11),
datetime(2023, 1, 1, 0, 29),
datetime(2023, 1, 1, 0, 31),
],
"product_id": [1, 1, 2, 1, 1, 1, 1],
"metadata":["a", "b", "c", "d", "e", "f", "g"]
}
)

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"]
}
)
Необработанные данные

Код: Выделить всё

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        │
└─────────────────────┴────────────┴──────────┘
Желаемый результат

Код: Выделить всё

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        │
└─────────────────────┴────────────┴──────────┘
В приведенных выше необработанных данных первая строка не является дубликатом, поскольку в течение 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 на первой и второй минутах в приведенном ниже примере.
Я также рассматривал возможность использования чего-то вроде:

Код: Выделить всё

from datetime import timedelta
df.group_by_dynamic("created_time", every=timedelta(minutes=10))
но я тоже не знаю, как правильно удалить строки.
Может ли кто-нибудь помочь?

Подробнее здесь: https://stackoverflow.com/questions/756 ... -timedelta
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»