python-3.x - Altair 通过绑定(bind)范围 slider 对日期时间值进行选择和转换过滤器似乎不适用于相等条件或选择器本身

标签 python-3.x altair vega-lite

我想将范围 slider 与日期时间值绑定(bind),以仅过滤图表中特定日期的数据。使用股票数据,我想要做的是让 x 轴显示公司,y 轴显示用户通过范围 slider 选择的特定日期的股票价格。

基于 this answer 的输入还有这个issue我有下面的代码显示了一些东西 当 slider 在一个特定值之后移动时(使用 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) 以及其他方法,但没有任何效果。

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

任何帮助将不胜感激。

最佳答案

这里有几个问题:

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

记住所有这些,最好的做法可能是调整 slider 值并根据匹配的年份和月份进行过滤,而不是尝试在确切的时间戳中实现相等。结果如下所示:

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 editor .

关于python-3.x - Altair 通过绑定(bind)范围 slider 对日期时间值进行选择和转换过滤器似乎不适用于相等条件或选择器本身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63707521/

相关文章:

python - 在 Altair 中为分层图表保持特定的 Y 轴顺序/排序

python - 如何在 Altair 中创建簇状条形图

Altair:合并图层图表中的图例

python - 如何使用python返回mysql查询结果

python - 在Python中从数组中获取特定元素

Python PyQt5 QTreeView 设置行背景颜色

python - Altair 的累积计数

python - 为什么*内置* python 模块 'sys' 需要使用 'import' 语句显式导入?

powerbi - 如何垂直对齐符号,以便它们与 y 轴标签对齐?

elasticsearch - 在Vega/Vega-lite中绘制漏斗图