Vaex的Altair

问题描述

我试图将VaexAltair一起使用,但是在将Vaex数据帧传递给altair时遇到一些麻烦。

尝试制作简单的line chart

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

我说错了

指定的编码字段没有类型;无法自动推断类型,因为未将数据指定为pandas.DataFrame。

但是如果我尝试指定它们

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

我说错了

altair.vegalite.v4.api.Chart-> 0,验证“ additionalProperties”

不允许使用其他属性(“ 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'))

解决方法

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

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()将在接受熊猫数据框的任何地方接受vaex数据框。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...