[FEATURE]: Make Plotly Express dataframe implementation-agnostic
還沒有人認領這個 Issue。
評估
- 難度
- 4/5
- 預估耗時
- 3-5 天
- 新手友好度
- 58/100
- Issue 類型
- 功能
- 描述清晰度
- 基本清楚
- 活躍度
- 冷清
- 技術堆疊
- pandas, python
研究方向
從 plotly/express/_core.py 開始,閱讀 to_named_series() 和 process_args_into_dataframe(),然後檢視 Narwhals 如何接收原生 dataframe namespace。在 pandas 無法使用且已安裝 Polars 的情況下執行 Getting Started 長條圖範例,並確認範例可以正常運作,同時在兩個 provider 都無法使用時,缺少 provider 的錯誤仍然包含有用的資訊。
由索引模型根據 Issue 內容生成。
描述
[FEATURE]: Make Plotly Express dataframe implementation-agnostic
Description
For a long time, there's been questions around how tightly Plotly Express depends on pandas. For example, here's a program from the Getting Started page that's supposed to show how easy it is to make a simple plot with Plotly Express:
import plotly.express as px
fig = px.bar(x=["a", "b", "c"], y=[1, 3, 2])
fig.show()
But if you run this with only plotly[express] installed, you get an error stating that pandas is required:
Traceback (most recent call last):
File "/.../plotly/express/_core.py", line 1210, in to_named_series
import pandas as pd
ModuleNotFoundError: No module named 'pandas'
...
NotImplementedError: Pandas installation is required if no dataframe is provided.
I think I understand this error; Plotly doesn't want to require pandas, when there are other dataframe-based libraries that people are choosing such as Polars. However, this message appears even if you have Polars installed. I think we can make Plotly Express more agnostic toward dataframe providers by looking for an available provider, rather than exiting if pandas is not found.
Why should this feature be added?
Plotly claims to not require pandas, but it still requires pandas in places where other dataframe implementations seem to work.
Mocks/ designs
I made some small changes to plotly/express/_core.py, which allows the above example to work with Polars installed. First, add a new function to look for an existing library that supports dataframes through narwhals:
def get_df_implementation():
"""Get an installed dataframe implementation."""
for df_implementation in ("pandas", "polars"):
try:
return import_module(df_implementation)
except ImportError:
pass
msg = (
"A dataframe implementation such as Pandas or Polars is required if "
"no dataframe is provided."
)
raise NotImplementedError(msg)
This POC version looks for pandas first, and then Polars.
The only change in the function to_named_series() is to call get_df_implemenation() in the else block, instead of doing its own check for pandas:
def to_named_series(x, name=None, native_namespace=None):
...
if isinstance(x, nw.Series):
return x.rename(name)
elif native_namespace is not None:
return nw.new_series(name=name, values=x, native_namespace=native_namespace)
else:
df_implementation = get_df_implementation()
return nw.new_series(name=name, values=x, native_namespace=df_implementation)
The existing function process_args_into_dataframe() needs one call to get_df_implemenation() as well:
def process_args_into_dataframe(
args, wide_mode, var_name, value_name, is_pd_like, native_namespace
):
...
length = len(df_output[next(iter(df_output))]) if len(df_output) else 0
if native_namespace is None:
native_namespace = get_df_implementation()
if ranges:
import numpy as np
...
With these changes, the above example runs without errors when Polars is installed. When pandas and Polars are both unavailable, the error states that one of these libraries must be installed.
Notes
I'm not tied to this particular implementation in any way, this was just a proof of concept to see if we could make Plotly more agnostic about the dataframe provider.
Is this a direction that's worth pursuing? I'm happy to work on a PR if it is, or happy to see others more versed in Plotly's internals implement it.
- 主要語言
- Python
- 星號
- 18.8k
- 分支
- 2.8k
- 平均合併
- 16 小時 26 分鐘
- 30 天內合併 PR
- 21
貢獻指南
從這裡開始
- 先讀完整個 Issue,再讀專案的貢獻指南。
- 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
- Fork 儲存庫,在一個分支上完成修改。
- 送出 Pull Request,並在描述裡引用這個 Issue 編號。
plotly/plotly.py 的其他 Issue
-
P3 size: 1 task
難度 2/5 1-3 小時 新手友好度 72/100
-
bug P1
難度 1/5 1 小時以內 新手友好度 68/100
-
feature P3
難度 2/5 1-3 小時 新手友好度 62/100
-
feature P3
難度 2/5 1-3 小時 新手友好度 72/100
-
難度 3/5 1-2 天 新手友好度 35/100
相似的 Issue
-
bug
難度 2/5 1-3 小時 新手友好度 86/100
zostera/django-bootstrap4#894 ·
-
難度 2/5 1-3 小時 新手友好度 78/100
use-agent-os/agent-os#3276 ·
-
難度 2/5 1-3 小時 新手友好度 88/100
zephyrproject-rtos/zephyr#119726 ·
-
area/auth bug comp/agent P3 platform/discord type/security
難度 2/5 1-3 小時 新手友好度 88/100
NousResearch/hermes-agent#117848 ·
-
難度 2/5 1-3 小時 新手友好度 82/100
zilliztech/memsearch#759 ·