如何在不转换为 Pandas 的情况下将 Polars 与 Plotly 一起使用?

How to use Polars with Plotly without converting to Pandas?

我想用 Polars 替换 Pandas,但我无法找到如何在不转换为 Pandas 的情况下将 Polars 与 Plotly 一起使用。我想知道是否有办法完全切断 Pandas 的过程。

考虑以下测试数据:

import polars as pl
import numpy as np
import plotly.express as px

df = pl.DataFrame(
    {
        "nrs": [1, 2, 3, None, 5],
        "names": ["foo", "ham", "spam", "egg", None],
        "random": np.random.rand(5),
        "groups": ["A", "A", "B", "C", "B"],
    }
)

fig = px.bar(df, x='names', y='random')
fig.show()

我希望此代码在 Jupyter 笔记本中显示条形图,但 returns 出现错误:

/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/polars/internals/frame.py:1483: UserWarning: accessing series as Attribute of a DataFrame is deprecated
  warnings.warn("accessing series as Attribute of a DataFrame is deprecated")

可以使用 df = df.to_pandas() 将 Polars 数据帧转换为 Pandas 数据帧。然后,它起作用了。但是,有没有其他更简单优雅的解决方案呢?

是的,不需要Pandas参与。有人 (sa-) has requested supporting a better option here 并包含了解决方法。

"The workaround that I use right now is px.line(x=df["a"], y=df["b"]), but it gets unwieldy if the name of the data frame is too big"

解决方法中包含的示例更简单。
对于 OP 的代码示例,我发现除了指定数据框列外,还可以转换为列表:

import polars as pl
import numpy as np
import plotly.express as px

df = pl.DataFrame(
    {
        "nrs": [1, 2, 3, None, 5],
        "names": ["foo", "ham", "spam", "egg", None],
        "random": np.random.rand(5),
        "groups": ["A", "A", "B", "C", "B"],
    }
)

px.bar(df, x=list(df["names"]), y=list(df["random"]))

更好地了解极地,一旦您看到解决方法的想法,您可能会看到一些其他选项。

发布 there 的示例更简单,而不是像 Pandas 数据帧那样使用 px.line(df, x="a", y="b"),而是使用 px.line(x=df["a"], y=df["b"]。有极坐标,即:

import polars as pl
import plotly.express as px

df = pl.DataFrame({"a":[1,2,3,4,5], "b":[1,4,9,16,25]})

px.line(x=df["a"], y=df["b"])