При наличии фрейма данных 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
Вычисление оконных цепочек событий ⇐ Python
Программы на Python
1762257538
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")
)
)
Подробнее здесь: [url]https://stackoverflow.com/questions/78620310/calculate-windowed-event-chains[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия