可视化时间序列的最佳实践

通过在同一个仪表板上组织时间序列图表来讲述故事。

我们将探讨比较不同时间段内指标的不同策略,例如比较本周与上周,或去年与上一年。我们将使用Metabase中包含的示例数据库,以便您可以跟上。此示例数据库包括一个从2015年到2020年存在的真实公司(并非虚构)的订单信息。为了锻炼我们的查询构建器技能,我们感兴趣的是2018年的订单与2019年的订单如何比较。

本文基于之前的关于时间序列比较的文章,但这里我们讨论了两种不同的策略

在仪表板上并列比较时间段

A dashboard with two columns, Date 1 on the left, Date 2 on the right, each with cards connected to their respective filter widget. A third widget is connected to cards in both columns to filter for product category.

此模式易于维护和扩展(可以通过修改卡片或添加新卡片来实现),当您想要比较多个指标时尤其有用。

这里的第一步是提出一个问题。对于我们的数据,我们将选择Orders表。我们将总结订单数量,并按月份分组。然后我们将把问题保存为“每月订单”。

Notebook view of our question that summarizes the count of orders grouped by month

接下来,我们将把“每月订单”问题添加到新的仪表板中,并将其命名为“并列比较”,或任何其他名称。然后我们将再次添加相同的问题,“每月订单”,到仪表板中(即作为第二个卡片),并将其放置在原始问题的右侧。

我们在这里做的是在我们的仪表板上创建两列:左侧列将有一个日期范围,右侧列将有一个第二个日期范围。我们将附加一个过滤器来控制左侧卡片上的日期范围,以及另一个将控制右侧列日期范围的过滤器。

我们将使用每个过滤器的“介于”选项设置默认日期范围(您可以输入日期而不是点击日历)。

  • 日期1范围:01/01/201812/31/2018
  • 日期2范围:01/01/201912/31/2019

Attaching the Date 1 filter to each card on the left column (but not the right column).

保存您的更改,并刷新页面以更新结果。我们还可以将其他过滤器附加到仪表板,并将其连接到两列中的卡片,例如,如果我们想按某个类别筛选订单。

您可以添加包含时间序列的额外卡片,并将它们连接到相应列的过滤器。

并列比较的技巧

请注意,当在手机上查看时,这种模式会分解,因为Metabase会将每张卡片折叠成单列。您仍然可以理解仪表板,但需要仔细查看每张卡片的日期。

为每个列使用相同的问题

这样,如果您想修改问题,只需更新一个问题,两个列都会得到更新。

确保两块卡片上的轴相同

Metabase默认自动调整y轴以考虑值,但这可能会使看到两个卡片之间的差异变得困难,如果一个卡片的顶部在500,另一个在1000。在仪表板编辑模式下,将鼠标悬停在卡片上并单击调色板图标以编辑可视化设置。单击“坐标轴”选项卡,关闭“自动y轴范围”,并设置“y轴最大值”(您应该将最小值保留为0)。

Setting the y-axis Max value to 600.

使用目标线或趋势线

添加线条可以使人们更容易区分图表间的指标性能。很明显,2019年的订单超过目标的情况比2018年更常见。

为了使人们更容易理解分割设置,我们可以添加表示每列对应一个过滤器的文本卡片:左侧列对应日期1,右侧列对应日期2。在仪表板编辑模式下,您可以通过将鼠标悬停在卡片上并单击“调色板图标”来编辑文本卡片的可视化设置。例如,对于具有## 日期1的卡片,我们已将“垂直对齐”设置为“顶部”,“水平对齐”设置为“居中”,并关闭了“显示背景”设置。

使用颜色区分列

您可以使用不同的颜色区分每列中的卡片。将鼠标悬停在卡片上并单击“调色板图标”以更新卡片的可视化设置。

有关仪表板的更多提示,请参阅BI仪表板最佳实践

在同一个图表上叠加两个时间序列

现在转向一个基本不同的方法。这里我们将介绍两种模式

使用自定义列来分组静态日期范围

这里我们将使用一个case语句创建自定义列。我们可以使用between表达式。在这里,我们将使用一个自定义表达式创建一个新列。

case(between([Created At], "2018-01-01", "2018-12-31"), "2018", between([Created At], "2019-01-01", "2019-12-31"), "2019")

这个表达式意味着为结果中的每个记录(行)添加一个新列。如果Created At字段在2018年1月1日至2018年12月31日之间,则在记录的年份列中放入“2018”的值。如果Created At日期落在那个2019范围内,则放入“2019”代替。否则,留空。接下来,我们想要过滤出所有“年份”列不为空的记录。

The query builder contains a custom column called year, filters out years that are empty, and counts the orders, and groups by year and Created at by month of year.

在这里,我们有2018年与2019年的两个时间序列,在同一图表上

Two time series on the same chart.

您也可以将其可视化为柱状图

The same series, but as bar chart.

现在,如果您想比较相对于当前日期的日期,您可以在一个case语句中使用interval函数,但我们将介绍interval的不同用例。

使用自定义表达式来比较上周与上周

在之前的文章《时间序列比较》中,我们介绍了一种比较时间段的方法,文章中提到了 时间序列比较CountIf 聚合和 between 函数。这次我们将使用 interval 函数,该函数允许我们指定相对于当前日期的持续时间。

示例数据库只包含到2020年的数据(不知道公司发生了什么),所以你需要在自己的数据上尝试,以下是操作方法:

Orders 表作为起始数据,我们将添加两个汇总(指标)。在 汇总 部分,我们将定义一个名为“上周”的自定义表达式的汇总。

CountIf(interval([Created At], -1, "week"))

在区间表达中,0代表当前周,所以我们可以写-1来只统计那些 Created At 是上周日期的订单。我们也可以将“周”改为“天”、“月”、“年”或其他间隔;请查阅数据库文档,了解它支持哪些间隔。

接下来,我们将定义一个名为“上周”的第二个汇总。

CountIf(interval([Created At], -2, "week") AND NOT interval([Created At], -1, "week"))

这里我们说的是只统计上周以外(AND NOT)的上一周的订单。

最后,我们需要对汇总进行分组。因为我们想看到上周一的表现与上上周一(以及每周的其他日子)的表现,所以我们将按 星期几Created At 进行分组。

进一步阅读