Полярные значения: заполните нуль, используя «правило трех» на основе отфильтрованного набора.Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Полярные значения: заполните нуль, используя «правило трех» на основе отфильтрованного набора.

Сообщение Anonymous »

Цель
Я хочу заполнить нули в серии, распределив разницу между следующим ненулевым и предыдущим ненулевым значением. Распределение не является линейным, но для расчета порционирования используются значения из другого столбца.
Пример

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

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
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Полярные поля - заполнить нуль над группами
    Anonymous » » в форуме Python
    0 Ответы
    4 Просмотры
    Последнее сообщение Anonymous
  • Как я могу отфильтровать базу данных pandas и создать график карты на основе этого отфильтрованного набора данных?
    Anonymous » » в форуме Python
    0 Ответы
    23 Просмотры
    Последнее сообщение Anonymous
  • Неожиданно обнаружил нуль при развертывании необязательного значения?
    Anonymous » » в форуме IOS
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous
  • Как реализовать правило трех/пяти/ноля с массивами производных объектов?
    Anonymous » » в форуме C++
    0 Ответы
    29 Просмотры
    Последнее сообщение Anonymous
  • Что такое правило трех?
    Anonymous » » в форуме C++
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous

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