Вычисление оконных цепочек событийPython

Программы на Python
Ответить
Anonymous
 Вычисление оконных цепочек событий

Сообщение Anonymous »

При наличии фрейма данных Polars
data = pl.DataFrame({"user_id": [1, 1, 1, 1, 1, 2, 2, 2, 2], "event": [False, True, True, False, True, True, True, False, False]

Я хочу вычислить столбец event_chain, который подсчитывает серию случаев, когда у пользователя возникало событие, когда в любой из предыдущих 4 строк у него также было событие. Каждый раз, когда происходит новое событие, когда у пользователя уже активна полоса, счетчик полос увеличивается. Затем он должен быть установлен на ноль, если у него нет другого события для еще 4 строк.



user_id
event
цепочка_событий
причина ценности




1
False
0
событий пока нет


1
Истина
0
Нет событий в последних 4 строках (не включая текущую строку)


1
Истина
1
событие в этой строке и 1 событие из последних 4 rows


1
False
1
Не сбрасывается в 0, поскольку в следующих 4 строках есть событие


1
True
2
событие этой строки и событие последних 4 строк, увеличение серии


2
True
0
Нет предыдущих событий


2
True
1
Событие в этой строке и в последних 4 строках для пользователя


2
False
0
Нет событий в этой строке и нет событий в следующих 4 строках для пользователя, сбрасывается на 0


2
False
0




Для этого у меня есть рабочий код, но я думаю, что должен быть более чистый способ сделать это
data.with_columns(
rows_since_last_event=pl.int_range(pl.len()).over("user_id")
- pl.when("event").then(pl.int_range(pl.len())).forward_fill()
.over("user_id"),
rows_till_next_event=pl.when("event").then(pl.int_range(pl.len()))
.backward_fill().over("user_id") - pl.int_range(pl.len()).over("athlete_id")
)
.with_columns(
chain_event=pl.when(
pl.col("event")
.fill_null(0)
.rolling_sum(window_size=4, min_periods=1)
.over("user_id")
- pl.col("event").fill_null(0)
> 0
)
.then(1)
.otherwise(0)
)
.with_columns(
chain_event_change=pl.when(
pl.col("chain_event").eq(1),
pl.col("chain_event").shift().eq(0),
pl.col("rows_since_last_event").fill_null(5) > 3,
)
.then(1)
.when(
pl.col("congested_event").eq(0),
pl.col("congested_event").shift().eq(1),
pl.col("rows_till_next_event").fill_null(5) > 3,
)
.then(1)
.otherwise(0)
)
.with_columns(
chain_event_identifier=pl.col("chain_event_change")
.cum_sum()
.over("user_id")
)
.with_columns(
event_chain=pl.col("chain_event")
.cum_sum()
.over("user_id", "chain_event_identifier")
)
)


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

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

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

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

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

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