Я хочу заполнить нули в серии, распределив разницу между следующим ненулевым и предыдущим ненулевым значением. Распределение не является линейным, но для расчета порционирования используются значения из другого столбца.
Пример
Код: Выделить всё
df = pl.DataFrame({
"id": ["a", "a", "a", "b", "b", "b", "b", "b"],
"timestamp": ["2023-09-13 14:05:34", "2023-09-13 14:15:04", "2023-09-13 14:30:01", "2023-09-13 12:12:02", "2023-09-13 12:15:02", "2023-09-13 12:30:07", "2023-09-13 12:45:01", "2023-09-13 13:00:02"],
"value": [10, None, 30, 5, 10, None, None, 40]
}).with_columns(
pl.col("timestamp").str.to_datetime(),
)
shape: (8, 3)
┌─────┬─────────────────────┬───────┐
│ id ┆ timestamp ┆ value │
│ --- ┆ --- ┆ --- │
│ str ┆ datetime[μs] ┆ i64 │
╞═════╪═════════════════════╪═══════╡
│ a ┆ 2023-09-13 14:05:34 ┆ 10 │
│ a ┆ 2023-09-13 14:15:04 ┆ null │
│ a ┆ 2023-09-13 14:30:01 ┆ 30 │
│ b ┆ 2023-09-13 12:12:02 ┆ 5 │
│ b ┆ 2023-09-13 12:15:02 ┆ 10 │
│ b ┆ 2023-09-13 12:30:07 ┆ null │
│ b ┆ 2023-09-13 12:45:01 ┆ null │
│ b ┆ 2023-09-13 13:00:02 ┆ 40 │
└─────┴─────────────────────┴───────┘
Код: Выделить всё
shape: (8, 9)
┌─────┬─────────────────────┬───────┬───────────┬────────────┬────────────────┬─────────┬────────────┬───────┐
│ id ┆ timestamp ┆ value ┆ gap value ┆ gap time s ┆ gap proportion ┆ portion ┆ fill value ┆ final │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ datetime[ns] ┆ str ┆ f64 ┆ f64 ┆ f64 ┆ f64 ┆ f64 ┆ f64 │
╞═════╪═════════════════════╪═══════╪═══════════╪════════════╪════════════════╪═════════╪════════════╪═══════╡
│ a ┆ 2023-09-13 14:05:34 ┆ 10 ┆ null ┆ null ┆ null ┆ null ┆ null ┆ 10.0 │
│ a ┆ 2023-09-13 14:15:04 ┆ null ┆ 20.0 ┆ 1467.0 ┆ 570.0 ┆ 7.77 ┆ 17.77 ┆ 17.77 │
│ a ┆ 2023-09-13 14:30:01 ┆ 30 ┆ null ┆ null ┆ null ┆ null ┆ null ┆ 30.0 │
│ b ┆ 2023-09-13 12:12:02 ┆ 5 ┆ null ┆ null ┆ null ┆ null ┆ null ┆ 5.0 │
│ b ┆ 2023-09-13 12:15:02 ┆ 10 ┆ null ┆ null ┆ null ┆ null ┆ null ┆ 10.0 │
│ b ┆ 2023-09-13 12:30:07 ┆ null ┆ 30.0 ┆ 2700.0 ┆ 905.0 ┆ 10.06 ┆ 20.06 ┆ 20.06 │
│ b ┆ 2023-09-13 12:45:01 ┆ null ┆ 30.0 ┆ 2700.0 ┆ 1799.0 ┆ 19.99 ┆ 29.99 ┆ 29.99 │
│ b ┆ 2023-09-13 13:00:02 ┆ 40 ┆ null ┆ null ┆ null ┆ null ┆ null ┆ 40.0 │
└─────┴─────────────────────┴───────┴───────────┴────────────┴────────────────┴─────────┴────────────┴───────┘
В качестве примера я возьму группу «b».
< ul>
[*]Есть 2 строки с нулями, которые необходимо заполнить.
[*]разница между следующим и предыдущим значением составляет 30 ( 40 - 10 )
[*]разница во времени между следующим и предыдущим значением составляет 2700 секунд (13:00:02 - 12:15:02)
[*]для первой пустой строки Разница во времени составляет 905 секунд (12:30:07 - 12:15:02). Таким образом, этой строке присваивается часть 30 * ( 905 / 2700 ), назначенная (10.06)
[*]поэтому при ее заполнении значение заполнения равно 10 + 10.06
[*] следующая пустая строка получает часть 30 * ( 1799 / 2700 ) (19,99), поэтому ее значение заполнения равно 10 + 19,99.
Спасибо за помощь. Я новичок как в Polars, так и в Python, поэтому мой ум, ориентированный на SQL, все еще обдумывает все это.
Лично я считаю, что это было бы отличным дополнением к fill_null, чтобы иметь возможность использовать правило трех с использованием другого столбца для пропорциональности
Спасибо
Подробнее здесь: https://stackoverflow.com/questions/770 ... ltered-set