Неожиданное поведение некоторых функций вращения поляров, когда значения NaN и нули находятся вместе.Python

Программы на Python
Ответить
Anonymous
 Неожиданное поведение некоторых функций вращения поляров, когда значения NaN и нули находятся вместе.

Сообщение Anonymous »

Недавно я столкнулся с непонятным поведением некоторых функций прокрутки Polars. Кажется, проблема возникает только тогда, когда есть NaN (), а также нулевой () в данных.

Я использую версию Polars 1.31.0, numpy 2.3.1 и Python 3.12.11.

Вот несколько примеров, обратите внимание, что я буду использовать функциюrolling_sum с размером окна 2 во всех примерах:
Во-первых, несложное приложение с ожидаемым поведением

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

data_dict_1 = {"x":[1., 1., 1., np.nan, 1., 1., 1., 1., 1.]}
Эти данные содержат значение NaN, поэтому я ожидаю, что функцияrolling_sum будет иметь нулевое значение в позиции индекса 0 и два значения NaN в позициях индекса 3 и 4, именно это мы и видим.

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

data_1 = pl.DataFrame(data_dict_1)
with pl.Config(tbl_rows=20):
print(data_1.with_columns(pl.col("x").rolling_sum(2).alias("rolling")))

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

shape: (9, 2)
┌─────┬─────────┐
│ x   ┆ rolling │
│ --- ┆ ---     │
│ f64 ┆ f64     │
╞═════╪═════════╡
│ 1.0 ┆ null    │
│ 1.0 ┆ 2.0     │
│ 1.0 ┆ 2.0     │
│ NaN ┆ NaN     │
│ 1.0 ┆ NaN     │
│ 1.0 ┆ 2.0     │
│ 1.0 ┆ 2.0     │
│ 1.0 ┆ 2.0     │
│ 1.0 ┆ 2.0     │
└─────┴─────────┘
Но если значение null () теперь добавляется в данные, поведение отличается от ожидаемого.

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

data_dict_2 = {"x":[1., 1., 1., np.nan, 1., 1., 1., 1., 1., None, 1., 1., 1.]}
Теперь я ожидал бы ноль в позиции индекса 0, два NaN в позициях индекса 3 и 4 и два нуля в позициях индекса 9 и 10. Но вместо этого результат, который я получаю, похоже, имеет какое-то странное распространение NaN.

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

data_2 = pl.DataFrame(data_dict_2)
with pl.Config(tbl_rows=20):
print(data_2.with_columns(pl.col("x").rolling_sum(2).alias("rolling")))

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

shape: (13, 2)
┌──────┬─────────┐
│ x    ┆ rolling │
│ ---  ┆ ---     │
│ f64  ┆ f64     │
╞══════╪═════════╡
│ 1.0  ┆ null    │
│ 1.0  ┆ 2.0     │
│ 1.0  ┆ 2.0     │
│ NaN  ┆ NaN     │
│ 1.0  ┆ NaN     │
│ 1.0  ┆ 2.0     │
│ 1.0  ┆ NaN     │
│ 1.0  ┆ NaN     │
│ 1.0  ┆ NaN     │
│ null ┆ null    │
│ 1.0  ┆ null    │
│ 1.0  ┆ NaN     │
│ 1.0  ┆ NaN     │
└──────┴─────────┘
В частности, обратите внимание, что мы получаем только одно «нормальное» значение после NaN (т. е. 2.0), с этого момента оно не выводит то, что ожидается (кроме нулевых значений).
Для сравнения, используя функциюrolling_map с функцией sum, я могу получить желаемый результат и то, что я ожидал от функцииrolling_sum.
/>

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

with pl.Config(tbl_rows=20):
print(data_2.with_columns(pl.col("x").rolling_map(sum, 2).alias("rolling")))

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

shape: (13, 2)
┌──────┬─────────┐
│ x    ┆ rolling │
│ ---  ┆ ---     │
│ f64  ┆ f64     │
╞══════╪═════════╡
│ 1.0  ┆ null    │
│ 1.0  ┆ 2.0     │
│ 1.0  ┆ 2.0     │
│ NaN  ┆ NaN     │
│ 1.0  ┆ NaN     │
│ 1.0  ┆ 2.0     │
│ 1.0  ┆ 2.0     │
│ 1.0  ┆ 2.0     │
│ 1.0  ┆ 2.0     │
│ null ┆ null    │
│ 1.0  ┆ null    │
│ 1.0  ┆ 2.0     │
│ 1.0  ┆ 2.0     │
└──────┴─────────┘
При моем тестировании этого примера не имеет значения, где в данных находится нулевое значение, и это все равно приведет к неожиданным, на мой взгляд, результатам.

Конечно, в этом небольшом примере простым решением может быть замена всех значений NaN нулевыми, и тогда все должно вести себя так, как я ожидаю (конечно, значения NaN в выходных данных будут нулевыми, но, по крайней мере, фактические значения будут там), или просто использовать Rolling_map с суммой.

Но я считаю (поправьте меня, если я ошибаюсь), что использование Rolling_map обычно медленнее, чем использование встроенной функции Polars, такой как Rolling_sum.

Кроме того, набор данных, в котором я изначально столкнулся с этой проблемой, более сложен, чем этот пример, и простое исправление замены NaN на null, похоже, не помогло. Я не смог создать простой набор данных, для которого проблема сохраняется после замены NaN на null, здесь, и поэтому я надеюсь, что вместо этого кто-нибудь сможет пролить свет на то, почему такое поведение происходит в этом простом наборе данных, поэтому я могу попробовать отладить мой больший анализ набора данных из там.

Подробнее здесь: https://stackoverflow.com/questions/797 ... ulls-are-t
Ответить

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

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

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

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

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