1

我正在尝试将VaexAltair一起使用,但在将 Vaex 数据帧传递给 Altair 时遇到了一些麻烦。

尝试制作简单的折线图时

alt.Chart(df)\
.mark_line()\
.encode(alt.X('x'), alt.Y('y1'))

我收到一条错误消息

[the] encoding field[s] is[are] 未指定类型;无法自动推断类型,因为数据未指定为 pandas.DataFrame。

但是如果我尝试指定它们

alt.Chart(df)\
.mark_line()\
.encode(alt.X('x:T'), alt.Y('y1:Q'))

我收到一条错误消息

altair.vegalite.v4.api.Chart->0,验证“附加属性”

不允许附加属性('y1'、'x'、'y2' 是意外的)

在我看来,将 Vaex 数据框链接到 Altair 存在一些问题,但我不知道如何解决它......

这里是完整的代码:

import altair as alt
import numpy as np
import vaex
import datetime

base = datetime.datetime.today()
dates = [base - datetime.timedelta(days=x) for x in range(10)]

y1 = np.sin(range(10))
y2 = np.cos(range(10))

df = vaex.from_arrays(x=dates, y1=y1, y2=y2)

alt.Chart(df)\
.mark_line()\
.encode(alt.X('x:T'), alt.Y('y1:Q')) #.encode(alt.X('x'), alt.Y('y1'))
4

1 回答 1

1

Altair 与 Vaex 不兼容。最简单的方法是在 altair 图表中使用 Vaex 数据框时将其转换为 pandas;例如:

alt.Chart(df.to_pandas_df())

使用这种转换几乎没有缺点:pandas 是 Altair 的硬性要求,Altair 将始终将数据序列化为 JSON 以便将其传递给 Vega-Lite。对于 Altair 可以处理的数据集的大小,Vaex 提供的数据表示和序列化的效率并不是特别重要。

如果您希望这自动发生,您可以注册一个支持 vaex 的新数据转换器。这应该可以解决问题:

import altair as alt

def vaex_data_transformer(df):
  try:
    df = df.to_pandas_df()
  except AttributeError:
    pass
  return alt.data.default_data_transformer(df)

alt.data_transformers.register('vaex', vaex_data_transformer)
alt.data_transformers.enable('vaex')

启用此功能后,alt.Chart()将在接受 pandas 数据帧的任何地方接受 vaex 数据帧。

于 2020-10-12T15:17:05.207 回答