Python 3.x 牵牛星&x27;通过绑定日期时间值的范围滑块进行选择和转换过滤器';t似乎无法使用相等条件或选择器本身

Python 3.x 牵牛星&x27;通过绑定日期时间值的范围滑块进行选择和转换过滤器';t似乎无法使用相等条件或选择器本身,python-3.x,altair,vega-lite,Python 3.x,Altair,Vega Lite,我想用datetime值绑定一个范围滑块,以便只为特定日期的数据过滤图表。使用股票数据,我想做的是让x轴显示公司,y轴显示用户通过范围滑块选择的特定日期的股票价格 基于和的输入,我有下面的代码,它显示了一些东西 当滑块在一个特定值之后移动时(使用transform\u filter中的不等式条件),但其余值为空。 奇怪的是,如果我有不等式运算符,那么它至少会显示一些东西,但当它的==时,所有东西都是空的 将altair导入为alt 从vega_数据集导入数据 source=data.stocks

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

基于和的输入,我有下面的代码,它显示了一些东西 当滑块在一个特定值之后移动时(使用
transform\u filter
中的不等式条件),但其余值为空。 奇怪的是,如果我有不等式运算符,那么它至少会显示一些东西,但当它的
==
时,所有东西都是空的

将altair导入为alt
从vega_数据集导入数据
source=data.stocks()
def时间戳(t):
返回pd.to_datetime(t).timestamp()
slider=alt.binding_range(step=86400,min=timestamp(min(source['date']),max=timestamp(max(source['date'])))35400是与消耗天数的差值
选择_date=alt.selection_single(字段=['date'],bind=slider,init={'date':时间戳(min(源['date']))
alt.Chart(源).mark_bar().encode(
x='symbol',
y='price',
).add_selection(选择日期)。transform_filter(alt.datum.date==选择日期)
由于输出为空,我倾向于认为是
transform\u filter
导致了问题,但我已经做了6个多小时了,尝试了使用
alt.expr.toDate
和其他转换的所有排列和组合,但我无法让它工作

还尝试了
transform\u filter(选择_date.date)
transform\u 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 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]))"
)

您可以在此处查看结果:。

这真的很有帮助!但是,请您告诉我,您怎么知道我需要使用
slider.date[0]
而不是
slider.date
slider
。我的意思是,在您先前的一个答案中为datetime x轴修改的文档中,使用
[0]
是没有必要的(我选中了)。当时我没有质疑你的方法。但在我的例子中,这正是图表发挥作用的原因。你能告诉我你是怎么想到使用
[0]
的吗,因为我在文档中没有遇到过它&作为一个不熟悉内部结构的人,下一次我该如何计算呢?
selection.field
返回所选字段的列表-您可以通过在vega编辑器中打开图表并单击“数据”选项卡来查看。使用
[0]
比较时,不需要使用
==
,因为javascript等式会为您执行类型强制(类似于
1==“1”
将返回true的方式),这真的很有帮助!但是,请您告诉我,您怎么知道我需要使用
slider.date[0]
而不是
slider.date
slider
。我的意思是,在您先前的一个答案中为datetime x轴修改的文档中,使用
[0]
是没有必要的(我选中了)。当时我没有质疑你的方法。但在我的例子中,这正是图表发挥作用的原因。你能告诉我你是怎么想到使用
[0]
的吗,因为我在文档中没有遇到过它&作为一个不熟悉内部结构的人,下一次我该如何计算呢?
selection.field
返回所选字段的列表-您可以通过在vega编辑器中打开图表并单击“数据”选项卡来查看。使用
=
比较时,不需要
[0]
,因为javascript相等会为您执行类型强制(类似于
1==“1”