Код: Выделить всё
Cusid). Мне нужно найти «переднюю часть» скользящего окна (последняя Tts_dateВот упрощенный набор моих данных для одного клиента:
Tts_date
Tts
Sts_date
Sts
Tstk
Tpl
21 октября 2024 г.
21 октября 2024 г. 20:22:13.407753
23 октября 2024
23 октября 2024 23:57:51.516142
0,9087
-0,034531
21 октября 2024
21 октября 2024 20:27:09.564456
24 октября 2024
24 октября 2024 21:12:24.782179
0.9087
-0.113587
2024-10-21
2024-10-21 21:06:14.450495
21 октября 2024
21 октября 2024 22:44:55.843398
0,9087
-0,113587
22 октября 2024
22 октября 2024 11:14:14.842511
23 октября 2024
23 октября 2024 21:26:07.460226
0.9087
-0.113587
2024-10-25
2024-10-25 16:54:15.857769
2024-10-25
2024-10-25 21:23:25.701182
0.9087
-0.113587
Я сортирую по Tts и усекаю Sts до Sts_date, поскольку хочу суммировать Tpl только в том случае, если заявка была урегулирована в этот момент времени.
Столбцы: Tts_date, Tts, Sts_date, Sts, Tstk, Tpl. Меня интересуют только Tts_date, Tts (так как я сортирую свои данные с их помощью) и Sts_date, который представляет собой Sts, усеченный только до даты, и Tpl, который я буду суммировать, только если заявка была урегулирована в этот момент времени.
Например, если window_size = 5d, когда скользящее окно находится в Tts_date = 21 октября 2024 ни одна из заявок в окне еще не будет урегулирована, поэтому sum_tpl_settled для всех строк с этой Tts_date будет равна 0. Однако, когда скользящее окно перемещается к последним строкам (например, Tts_date = 2024-10-25 в этом подмножестве), все заявки в окне будут урегулированы, и sum_tpl_settled будет суммой Tpl всех строк в окне.
В моем скользящем окне некоторые заявки могут еще не быть урегулированы, поэтому мне нужна динамическая «первичная дата» каждого окна.
Текущее рабочее решение:
Код: Выделить всё
front = pl.col("Tts_date").max() # works but expensive
# front = pl.col("Tts_date").last() # works and should be faster
# front = pl.col("Tts_date").tail(1) # extremely fast but incorrect
tickets_rolling_features = (
tickets
.sort(["Cusid", "Tts"])
.rolling(
index_column="Tts_date",
period=window_size,
group_by="Cusid",
closed="right"
)
.agg([
pl.when(pl.col("Sts_date")
Подробнее здесь: [url]https://stackoverflow.com/questions/79809140/how-to-efficiently-get-the-last-row-of-a-rolling-aggregation-group-without-last[/url]
Мобильная версия