Альтаир с Vaex

Я пытаюсь использовать Vaex вместе с Altair, но у меня возникли проблемы с передачей фреймов данных Vaex в Altair.

При попытке создать простую линейную диаграмму

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, проверка дополнительных свойств

Дополнительные свойства не разрешены ('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'))

person shamalaia    schedule 12.10.2020    source источник


Ответы (1)


Альтаир несовместим с Vaex. Самый простой способ продолжить - преобразовать фрейм данных Vaex в pandas при использовании его в диаграмме altair; Например:

alt.Chart(df.to_pandas_df())

У этого преобразования очень мало недостатков: панды - жесткое требование Альтаира, и Альтаир всегда будет сериализовать данные в 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 везде, где принят фрейм данных pandas.

person jakevdp    schedule 12.10.2020