Вернуть две ближайшие/ближайшие строки выше и ниже целевого значения в Polars.Python

Программы на Python
Anonymous
 Вернуть две ближайшие/ближайшие строки выше и ниже целевого значения в Polars.

Сообщение Anonymous »

Я пытаюсь найти наиболее элегантный способ в Polars найти в двух строках брекетинга (сначала сверху и снизу) конкретную цель. По сути, Min > 0 и Max < 0.
import polars as pl

data = {
"strike": [5,10,15,20,25,30],
"target": [16] * 6,
}

df = (pl.DataFrame(data)
.with_columns(
diff = pl.col('strike') - pl.col('target')))

shape: (6, 3)
┌────────┬────────┬──────┐
│ strike ┆ target ┆ diff │
│ --- ┆ --- ┆ --- │
│ i64 ┆ i64 ┆ i64 │
╞════════╪════════╪══════╡
│ 5 ┆ 16 ┆ -11 │
│ 10 ┆ 16 ┆ -6 │
│ 15 ┆ 16 ┆ -1 │
│ 20 ┆ 16 ┆ 4 │
│ 25 ┆ 16 ┆ 9 │
│ 30 ┆ 16 ┆ 14 │
└────────┴────────┴──────┘

Это то, к чему я пытаюсь прийти.
shape: (2, 3)
┌────────┬────────┬──────┐
│ strike ┆ target ┆ diff │
│ --- ┆ --- ┆ --- │
│ i64 ┆ i64 ┆ i64 │
╞════════╪════════╪══════╡
│ 15 ┆ 16 ┆ -1 │
│ 20 ┆ 16 ┆ 4 │
└────────┴────────┴──────┘

Я могу сделать это с помощью двух отдельных операций фильтра, но я не могу объединить их вместе и хотел бы избежать необходимости объединять два отдельных результата обратно в один фрейм данных, если это возможно.
df1 = (pl.DataFrame(data)
.with_columns(
diff = pl.col('strike') - pl.col('target'))
.filter((pl.col('diff') > 0)).min())

shape: (1, 3)
┌────────┬────────┬──────┐
│ strike ┆ target ┆ diff │
│ --- ┆ --- ┆ --- │
│ i64 ┆ i64 ┆ i64 │
╞════════╪════════╪══════╡
│ 20 ┆ 16 ┆ 4 │
└────────┴────────┴──────┘

df2 = (pl.DataFrame(data)
.with_columns(
diff = pl.col('strike') - pl.col('target'))
.filter((pl.col('diff') < 0)).max())

shape: (1, 3)
┌────────┬────────┬──────┐
│ strike ┆ target ┆ diff │
│ --- ┆ --- ┆ --- │
│ i64 ┆ i64 ┆ i64 │
╞════════╪════════╪══════╡
│ 15 ┆ 16 ┆ -1 │
└────────┴────────┴──────┘


Подробнее здесь: https://stackoverflow.com/questions/792 ... -in-polars

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