Как выполнить join_asof в Polars, просматривая только назад и сопоставляя определенные условия? [дубликат]Python

Программы на Python
Ответить
Anonymous
 Как выполнить join_asof в Polars, просматривая только назад и сопоставляя определенные условия? [дубликат]

Сообщение Anonymous »

Я пытаюсь выполнить join_asof в Polars, где он смотрит только назад во времени, игнорируя совпадения в той же строке. В частности, я хочу, чтобы он нашел последнюю строку, в которой Team и Field точно совпадают, но только если значение Wk меньше, чем значение Wk текущей строки.
Цель состоит в том, чтобы получить последнюю GeneralLambda для последних игр, «На выезде» или «Дома», исключая текущую игру. Я думал, что лучше всего это сделать с помощью join_asof, но я пытаюсь заставить его учитывать только прошлые строки и сопоставлять их как по команде, так и по полю.
Вот пример DataFrame для иллюстрации:

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

import polars as pl

pl.Config(tbl_rows=15)

df = pl.from_repr("""
┌────────┬─────┬───────┬───────┬───────────────┐
│ Season ┆ Wk  ┆ Team  ┆ Field ┆ GeneralLambda │
│ ---    ┆ --- ┆ ---   ┆ ---   ┆ ---           │
│ i64    ┆ i64 ┆ str   ┆ str   ┆ f64           │
╞════════╪═════╪═══════╪═══════╪═══════════════╡
│ 2024   ┆ 25  ┆ TeamA ┆ Away  ┆ 2.123456      │
│ 2024   ┆ 25  ┆ TeamB ┆ Home  ┆ 1.234567      │
│ 2024   ┆ 25  ┆ TeamC ┆ Away  ┆ 0.987654      │
│ 2024   ┆ 25  ┆ TeamD ┆ Home  ┆ 1.345678      │
│ 2024   ┆ 25  ┆ TeamE ┆ Away  ┆ 1.456789      │
│ 2024   ┆ 26  ┆ TeamA ┆ Home  ┆ 1.234567      │
│ 2024   ┆ 26  ┆ TeamB ┆ Away  ┆ 1.345678      │
│ 2024   ┆ 26  ┆ TeamC ┆ Home  ┆ 0.876543      │
│ 2024   ┆ 26  ┆ TeamD ┆ Away  ┆ 1.456789      │
│ 2024   ┆ 26  ┆ TeamE ┆ Home  ┆ 1.56789       │
│ 2024   ┆ 27  ┆ TeamA ┆ Away  ┆ 2.278759      │
│ 2024   ┆ 27  ┆ TeamB ┆ Away  ┆ 1.103829      │
│ 2024   ┆ 27  ┆ TeamC ┆ Home  ┆ 0.992563      │
│ 2024   ┆ 27  ┆ TeamD ┆ Home  ┆ 1.089324      │
│ 2024   ┆ 27  ┆ TeamE ┆ Home  ┆ 1.074221      │
└────────┴─────┴───────┴───────┴───────────────┘
""")
Для каждой строки мне нужно соединить ее с последней совпадающей строкой, где: Я надеюсь, что DataFrame будет выглядеть так:

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

┌────────┬─────┬───────┬───────┬───────────────┬────────────────────┐
│ Season ┆ Wk  ┆ Team  ┆ Field ┆ GeneralLambda ┆ Prev_GeneralLambda │
│ ---    ┆ --- ┆ ---   ┆ ---   ┆ ---           ┆ ---                │
│ i64    ┆ i64 ┆ str   ┆ str   ┆ f64           ┆ str                │
╞════════╪═════╪═══════╪═══════╪═══════════════╪════════════════════╡
│ 2024   ┆ 25  ┆ TeamA ┆ Away  ┆ 2.123456      ┆ ALastAwayValue     │
│ 2024   ┆ 25  ┆ TeamB ┆ Home  ┆ 1.234567      ┆ BLastHomeValue     │
│ 2024   ┆ 25  ┆ TeamC ┆ Away  ┆ 0.987654      ┆ CLastAwayValue     │
│ 2024   ┆ 25  ┆ TeamD ┆ Home  ┆ 1.345678      ┆ DLastHomeValue     │
│ 2024   ┆ 25  ┆ TeamE ┆ Away  ┆ 1.456789      ┆ ELastAwayValue     │
│ 2024   ┆ 26  ┆ TeamA ┆ Home  ┆ 1.234567      ┆ ALastHomeValue     │
│ 2024   ┆ 26  ┆ TeamB ┆ Away  ┆ 1.345678      ┆ BLastAwayValue     │
│ 2024   ┆ 26  ┆ TeamC ┆ Home  ┆ 0.876543      ┆ CLastHomeValue     │
│ 2024   ┆ 26  ┆ TeamD ┆ Away  ┆ 1.456789      ┆ DLastAwayValue     │
│ 2024   ┆ 26  ┆ TeamE ┆ Home  ┆ 1.56789       ┆ ELastHomeValue     │
│ 2024   ┆ 27  ┆ TeamA ┆ Away  ┆ 2.278759      ┆ 2.123456           │
│ 2024   ┆ 27  ┆ TeamB ┆ Away  ┆ 1.103829      ┆ 1.345678           │
│ 2024   ┆ 27  ┆ TeamC ┆ Home  ┆ 0.992563      ┆ 0.876543           │
│ 2024   ┆ 27  ┆ TeamD ┆ Home  ┆ 1.089324      ┆ 1.345678           │
│ 2024   ┆ 27  ┆ TeamE ┆ Home  ┆ 1.074221      ┆ 1.567890           │
└────────┴─────┴───────┴───────┴───────────────┴────────────────────┘
Есть ли способ сделать это в Polars?

Подробнее здесь: https://stackoverflow.com/questions/791 ... g-on-speci
Ответить

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

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

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

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

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