Код: Выделить всё
np.nan
Код: Выделить всё
None
i am in polars версия 1.31.0 < /code>, numpy 2.3.1 < /code> и python 3.12.11 < /code>.
Вот несколько примеров, обратите внимание, что я буду использовать функцию rolling_sum < /code> с размером окна 2 во всех примерах: < /p>
Код: Выделить всё
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")))
< /code>
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 │
└─────┴─────────┘
< /code>
But if a null
Код: Выделить всё
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")))
< /code>
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 │
└──────┴─────────┘
< /code>
Notice in particular that we only get one 'normal' value after the 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")))
< /code>
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 │
└──────┴─────────┘
< /code>
In my testing of this example it does not seem to matter where the null
, конечно, в этом небольшом примере простое решение может состоять в том, чтобы заменить все NAN s на NULL s, а затем все должно вести себя, как я ожидаю (конечно, NAN в выводе будет NULL s, но, по крайней мере, фактические значения будут там), или действительно, чтобы просто использовать Rolling_Map с Sum с Sum .
Но я считаю (поправьте меня, если я ошибаюсь), что использование Rolling_map < /code>, как правило, медленнее, чем использование встроенной функции Polars, такими как Rolling_sum < /code>.
Кроме того, набор данных, на котором я изначально столкнулся с этой проблемой, более сложный, чем этот пример, и простое исправление замены Nan s на Null не помог, я не мог создать простой набор данных, для которого проблема не может быть на одном поведении, на что -то, что, на этом, может быть, что -то, что можно было вспомогать. Набор данных, чтобы я мог попробовать отладить свой больший анализ наборов данных оттуда.
Подробнее здесь: https://stackoverflow.com/questions/797 ... ulls-are-t