如何在 Plotly 中使用 Polars 而不转换为 Pandas?

fab*_*klr 11 python plotly-python python-polars

我想用 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()
Run Code Online (Sandbox Code Playgroud)

我希望这段代码在 Jupyter 笔记本中显示条形图,但它返回一个错误:

/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")
Run Code Online (Sandbox Code Playgroud)

可以使用 . 将 Polars 数据帧转换为 Pandas 数据帧df = df.to_pandas()。然后,它就起作用了。然而,还有另一种更简单、更优雅的解决方案吗?

Way*_*yne 12

是的,不需要转换为 Pandas 数据帧。有人 ( sa- ) 请求在此处支持更好的选项,并提供解决方法。

“我现在使用的解决方法是 px.line(x=df["a"], y=df["b"]),但如果数据框的名称太大,它会变得笨拙”

对于OP的代码示例,显式指定数据框列的方法是有效的。
我发现除了用px.bar(x=df["names"], y=df["random"])- 或 -指定数据框列之外px.bar(df, x=df["names"], y=df["random"]),转换为列表也可以工作:

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"]))
Run Code Online (Sandbox Code Playgroud)

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

那里发布的示例更简单,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"])
Run Code Online (Sandbox Code Playgroud)

(请注意,使用plotly.express需要安装 Pandas,请参阅此处此处。我在答案中使用plotly.express它是因为它更接近OP。plotly.graph_objects如果不想安装和参与 Pandas,则可以调整代码以适应使用。 )