Код: Выделить всё
np.nanКод: Выделить всё
NoneЯ использую версию 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.]}Код: Выделить всё
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 │
└─────┴─────────┘
Код: Выделить всё
NoneКод: Выделить всё
data_dict_2 = {"x":[1., 1., 1., np.nan, 1., 1., 1., 1., 1., None, 1., 1., 1.]}Код: Выделить всё
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 │
└──────┴─────────┘
Для сравнения, используя функцию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
Мобильная версия