Altair 通过binding_range滑块对日期时间值的选择和transform_filter似乎不适用于相等条件或选择器本身



我想用日期时间值绑定一个范围滑块,以便在图表中只筛选特定日期的数据。使用股票数据,我想做的是让x轴显示公司,y轴显示用户通过范围滑块选择的特定日期的股票价格。

根据这个答案和这个问题的输入,我有下面的代码,它显示了一些东西当滑块在一个特定值之后移动时(transform_filter中的不等式条件(,但其余值为空。特别的是,如果我有不等式算子,那么至少它显示了一些东西,但当它的==时,所有东西都是空的。

import altair as alt
from vega_datasets import data
source = data.stocks()
def timestamp(t):
return pd.to_datetime(t).timestamp()
slider = alt.binding_range(step=86400, min=timestamp(min(source['date'])), max=timestamp(max(source['date']))) #86400 is the difference b/w consequetive days
select_date = alt.selection_single(fields=['date'], bind=slider, init={'date': timestamp(min(source['date']))})
alt.Chart(source).mark_bar().encode(
x='symbol',
y='price',
).add_selection(select_date).transform_filter(alt.datum.date == select_date.date)

由于输出为空,我倾向于得出结论,是transform_filter造成了问题,但我已经使用了6个多小时,并尝试了使用alt.expr.toDate和其他转换的所有排列和组合,但我无法使其工作。

也只尝试了transform_filter(select_date.date)transform_filter(date)以及其他东西,但没有什么效果。

预期输出是,当用户拖动滑块时,条形图的高度会发生变化(由于数据按日期过滤(。

如有任何帮助,我们将不胜感激。

这里有几个问题:

  • 在Vega Lite中,时间戳以毫秒而非秒表示
  • 您正在筛选数字时间戳和日期的字符串表示之间的相等性
  • 即使您解析过滤器表达式中的日期,Python日期解析和Javascript日期解析的行为也不同,结果通常不会匹配。即使在javascript中,日期解析行为也可能因浏览器而异;所有这些都意味着,在Python和Javascript时间戳相等的情况下进行过滤通常是有问题的
  • 您使用的数据有每月的时间戳,因此滑块步骤应该考虑到这一点

记住所有这些,最好的方法可能是调整滑块值并过滤匹配的年份和月份,而不是试图在确切的时间戳中实现相等。结果如下:

import altair as alt
from vega_datasets import data
import pandas as pd
source = data.stocks()
def timestamp(t):
return pd.to_datetime(t).timestamp() * 1000
slider = alt.binding_range(
step=30 * 24 * 60 * 60 * 1000, # 30 days in milliseconds
min=timestamp(min(source['date'])),
max=timestamp(max(source['date'])))
select_date = alt.selection_single(
fields=['date'],
bind=slider,
init={'date': timestamp(min(source['date']))},
name='slider')
alt.Chart(source).mark_bar().encode(
x='symbol',
y='price',
).add_selection(select_date).transform_filter(
"(year(datum.date) == year(slider.date[0])) && "
"(month(datum.date) == month(slider.date[0]))"
)

你可以在这里查看结果:vega编辑器。

最新更新