我在 Python Polars 中收到一個未知錯誤:
thread '<unnamed>' panicked at 'assertion failed: `(left == right)`
left: `Float64[NaN, 1, NaN, NaN, NaN, ...[clip]...
right: `Float64[NaN, 1, NaN, NaN, NaN, ...[clip]...
這是內部錯誤嗎?
觸發它的代碼是:
df.select([
pl.col('total').shift().ewm_mean(half_life = 10).over('group')
])
我很難問更多,因為錯誤是如此難以理解。
uj5u.com熱心網友回復:
解決此問題的另一種臨時方法是以另一種方式創建shift帶有over視窗的結果。
假設我們有以下組、編號的觀察值和總數。
import numpy as np
import polars as pl
df = pl.DataFrame(
{
"group": ["a", "a", "b", "a", "b", "b"],
"obs": [1, 2, 1, 3, 2, 3],
"total": [1.0, 2, 3, 4, 5, np.NaN],
}
)
df
shape: (6, 3)
┌───────┬─────┬───────┐
│ group ┆ obs ┆ total │
│ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ f64 │
╞═══════╪═════╪═══════╡
│ a ┆ 1 ┆ 1.0 │
├???????┼?????┼???????┤
│ a ┆ 2 ┆ 2.0 │
├???????┼?????┼???????┤
│ b ┆ 1 ┆ 3.0 │
├???????┼?????┼???????┤
│ a ┆ 3 ┆ 4.0 │
├???????┼?????┼???????┤
│ b ┆ 2 ┆ 5.0 │
├???????┼?????┼???????┤
│ b ┆ 3 ┆ NaN │
└───────┴─────┴───────┘
以下代碼將得到與組相同的結果shift:
df = (
df.sort(["group", "obs"])
.with_column(pl.col("total").shift().alias("total_shifted"))
.with_column(
pl.when(pl.col("group").is_first())
.then(None)
.otherwise(pl.col("total_shifted"))
.alias("result")
)
)
df
shape: (6, 5)
┌───────┬─────┬───────┬───────────────┬────────┐
│ group ┆ obs ┆ total ┆ total_shifted ┆ result │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ f64 ┆ f64 ┆ f64 │
╞═══════╪═════╪═══════╪═══════════════╪════════╡
│ a ┆ 1 ┆ 1.0 ┆ null ┆ null │
├???????┼?????┼???????┼???????????????┼????????┤
│ a ┆ 2 ┆ 2.0 ┆ 1.0 ┆ 1.0 │
├???????┼?????┼???????┼???????????????┼????????┤
│ a ┆ 3 ┆ 4.0 ┆ 2.0 ┆ 2.0 │
├???????┼?????┼???????┼???????????????┼????????┤
│ b ┆ 1 ┆ 3.0 ┆ 4.0 ┆ null │
├???????┼?????┼???????┼???????????????┼????????┤
│ b ┆ 2 ┆ 5.0 ┆ 3.0 ┆ 3.0 │
├???????┼?????┼???????┼???????????????┼????????┤
│ b ┆ 3 ┆ NaN ┆ 5.0 ┆ 5.0 │
└───────┴─────┴───────┴───────────────┴────────┘
(我已將資料集中的中間計算留待檢查,以展示演算法的作業原理。)
請注意,該result列與您從shift多個組中獲得的值相同。然后,您可以在result列上運行聚合,而無需使用 shift。
df.select([
pl.col('result').ewm_mean(half_life = 10).over('group')
])
當然,您必須使其適應您的特定代碼,但它應該可以作業。
uj5u.com熱心網友回復:
這確實看起來像一個錯誤。它來自 when在包含視窗函式 ( )中的值shift的運算式上呼叫。NaNover
import polars as pl
import numpy as np
df = pl.DataFrame(
{
"group": ["a", "a", "a", "b", "b", "b"],
"total": [1.0, 2, 3, 4, 5, np.NaN],
}
)
df.select([
pl.col('total').shift().over('group')
])
thread '<unnamed>' panicked at 'assertion failed: `(left == right)`
left: `Float64[4, 5, NaN]`,
right: `Float64[4, 5, NaN]`', /github/workspace/polars/polars-core/src/series/unstable.rs:39:9
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/corey/.virtualenvs/StackOverflow3.10/lib/python3.10/site-packages/polars/internals/frame.py", line 4253, in select
self.lazy()
File "/home/corey/.virtualenvs/StackOverflow3.10/lib/python3.10/site-packages/polars/internals/lazy_frame.py", line 476, in collect
return self._dataframe_class._from_pydf(ldf.collect())
pyo3_runtime.PanicException: assertion failed: `(left == right)`
left: `Float64[4, 5, NaN]`,
right: `Float64[4, 5, NaN]`
由于您正在使用sum聚合,您可以使用fill_nan(0)來解決這個問題嗎?或者你需要NaN在這些情況下保留價值嗎?
df.select([
pl.col('total').fill_nan(0).shift().sum().over('group')
])
shape: (6, 1)
┌─────────┐
│ literal │
│ --- │
│ f64 │
╞═════════╡
│ 3.0 │
├?????????┤
│ 3.0 │
├?????????┤
│ 3.0 │
├?????????┤
│ 9.0 │
├?????????┤
│ 9.0 │
├?????????┤
│ 9.0 │
└─────────┘
我將在 GitHub 上為它創建一個問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/455935.html
